<?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>74661</bug_id>
          
          <creation_ts>2011-12-15 16:04:42 -0800</creation_ts>
          <short_desc>Web Inspector: CodeGeneratorInspector.py: use generated types in method parameters</short_desc>
          <delta_ts>2011-12-18 06:55:15 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>72861</dependson>
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Peter Rybin">peter.rybin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>peter.rybin</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>522298</commentid>
    <comment_count>0</comment_count>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-15 16:04:42 -0800</bug_when>
    <thetext>Re-implement CodeGeneratorInspector.py to set generated type to method parameters instead of generic InspectorObject.
Do it in annotation mode (i.e. in comments) so that client code has time to prepare.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522306</commentid>
    <comment_count>1</comment_count>
      <attachid>119514</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-15 16:11:46 -0800</bug_when>
    <thetext>Created attachment 119514
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522311</commentid>
    <comment_count>2</comment_count>
      <attachid>119516</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-15 16:17:52 -0800</bug_when>
    <thetext>Created attachment 119516
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522984</commentid>
    <comment_count>3</comment_count>
      <attachid>119661</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-16 13:27:25 -0800</bug_when>
    <thetext>Created attachment 119661
Sample of InspectorFrontend.h with new types annotated in comments for events.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523278</commentid>
    <comment_count>4</comment_count>
      <attachid>119516</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-12-17 01:11:47 -0800</bug_when>
    <thetext>Comment on attachment 119516
Patch

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

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:665
&gt; +                        output.append(&quot;        };\n\n&quot;)

wrong indent.

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1510
&gt; +                parameter_list.append(&quot;/*%s*/ %s %s&quot; % (param_type_binding.get_in_c_type_text(json_optional), c_type.get_text(), parameter_name))

I&apos;d like to see the suggested types in the comment section only if they differ from the current one.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523308</commentid>
    <comment_count>5</comment_count>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-17 09:40:03 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 119516 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=119516&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:665
&gt; &gt; +                        output.append(&quot;        };\n\n&quot;)
&gt; 
&gt; wrong indent.

Done

&gt; 
&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1510
&gt; &gt; +                parameter_list.append(&quot;/*%s*/ %s %s&quot; % (param_type_binding.get_in_c_type_text(json_optional), c_type.get_text(), parameter_name))
&gt; 
&gt; I&apos;d like to see the suggested types in the comment section only if they differ from the current one.

Done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523309</commentid>
    <comment_count>6</comment_count>
      <attachid>119727</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-17 09:41:56 -0800</bug_when>
    <thetext>Created attachment 119727
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523310</commentid>
    <comment_count>7</comment_count>
      <attachid>119728</attachid>
    <who name="Peter Rybin">peter.rybin</who>
    <bug_when>2011-12-17 09:43:31 -0800</bug_when>
    <thetext>Created attachment 119728
Sample of InspectorFrontend.h with new types annotated in comments for events.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523331</commentid>
    <comment_count>8</comment_count>
      <attachid>119727</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-12-17 10:54:31 -0800</bug_when>
    <thetext>Comment on attachment 119727
Patch

lgtm</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523446</commentid>
    <comment_count>9</comment_count>
      <attachid>119727</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-12-18 06:55:02 -0800</bug_when>
    <thetext>Comment on attachment 119727
Patch

Clearing flags on attachment: 119727

Committed r103173: &lt;http://trac.webkit.org/changeset/103173&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523447</commentid>
    <comment_count>10</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-12-18 06:55:15 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119514</attachid>
            <date>2011-12-15 16:11:46 -0800</date>
            <delta_ts>2011-12-15 16:17:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74661-20111216041144.patch</filename>
            <type>text/plain</type>
            <size>7292</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAyOTU4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTY2MWFiOTlmNjE1YmZk
ZGFjNWVhOGQ1YmY3OWM2ZmFlOWVlZTA3YS4uZGQxMjhiZjE4OWEyMWI3YmUzODc3NWM0NmEyMDkw
ZTRlNTJhM2QxOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM5IEBACisyMDExLTEyLTE1ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5OiB1c2UgZ2VuZXJhdGVkIHR5cGVzIGluIG1ldGhv
ZCBwYXJhbWV0ZXJzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03NDY2MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFR5cGUgYmluZGluZyBvYmplY3QgaXMgYWRkZWQgdG8gcmF3X3R5cGUgb2JqZWN0LgorCisg
ICAgICAgICogaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHk6CisgICAgICAgIChU
eXBlQmluZGluZ3MuY3JlYXRlX2Zvcl9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkVudW1CaW5kaW5n
LmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX2Zv
cl9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkVudW1CaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6
CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX2Zvcl9uYW1lZF90eXBlX2RlY2xhcmF0aW9u
LkVudW1CaW5kaW5nKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5
cGVfZGVjbGFyYXRpb24uRW51bUJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAgICAg
KFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24uUGxhaW5TdHJp
bmcuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVf
Zm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24uUGxhaW5TdHJpbmcucmVkdWNlX3RvX3Jhd190eXBl
KToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRp
b24uUGxhaW5TdHJpbmcpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9mb3JfbmFtZWRf
dHlwZV9kZWNsYXJhdGlvbi5QbGFpblN0cmluZy5nZXRfaW5fY190eXBlX3RleHQpOgorICAgICAg
ICAoVHlwZUJpbmRpbmdzKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVk
X3R5cGVfZGVjbGFyYXRpb24uQ2xhc3NCaW5kaW5nKToKKyAgICAgICAgKGdldF9pbl9jX3R5cGVf
dGV4dCk6CisgICAgICAgIChyZWR1Y2VfdG9fcmF3X3R5cGUpOgorICAgICAgICAoUGxhaW5PYmpl
Y3RCaW5kaW5nLmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChQbGFpbk9iamVjdEJp
bmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFBsYWluT2JqZWN0QmluZGluZyk6
CisgICAgICAgIChQbGFpbk9iamVjdEJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAg
ICAgKFJhd1R5cGVzQmluZGluZy5nZW5lcmF0ZV90eXBlX2J1aWxkZXIpOgorICAgICAgICAoUmF3
VHlwZXNCaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6CisgICAgICAgIChSYXdUeXBlc0JpbmRp
bmcpOgorICAgICAgICAoUmF3VHlwZXNCaW5kaW5nLnJlZHVjZV90b19yYXdfdHlwZSk6CisgICAg
ICAgIChyZXNvbHZlX3BhcmFtX3R5cGUuUmF3VHlwZUJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBl
KToKKyAgICAgICAgKHJlc29sdmVfcGFyYW1fdHlwZS5SYXdUeXBlQmluZGluZyk6CisgICAgICAg
IChyZXNvbHZlX3BhcmFtX3R5cGUuUmF3VHlwZUJpbmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KToK
KyAgICAgICAgKHJlc29sdmVfcGFyYW1fdHlwZSk6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vz
c19ldmVudCk6CisKIDIwMTEtMTItMTUgIE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2Fs
aWEuY29tPgogCiAgICAgICAgIHBsdWdpbiBjcmFzaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHkgYi9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weQppbmRleCA0YTQzNjA1OTc3M2M5ODRj
ZjBiOTA3NjY2ODNiYzJiOTQwYzg2OTM1Li42YmNiZTMxNDg3OGNhMWJmYTYxNzY4ZjhmZGMyN2Zm
NjUzODQ1Mzc2IDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVy
YXRvckluc3BlY3Rvci5weQorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVy
YXRvckluc3BlY3Rvci5weQpAQCAtNTA1LDYgKzUwNSwxNCBAQCBjbGFzcyBUeXBlQmluZGluZ3M6
CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGVudW1fbmFtZSkKICAgICAg
ICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuXG4iKQogCisgICAgICAgICAgICAg
ICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlw
ZV90ZXh0KGNscywgb3B0aW9uYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNs
cy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwg
b3B0aW9uYWwpLmdldF90ZXh0KCkKKworICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9k
CisgICAgICAgICAgICAgICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3X3R5cGUoKToKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlcy5TdHJpbmcKKwogICAgICAgICAgICAgICAg
IHJldHVybiBFbnVtQmluZGluZwogICAgICAgICAgICAgZWxzZToKIApAQCAtNTE2LDEyICs1MjQs
MjMgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0
LmFwcGVuZCgidHlwZWRlZiBTdHJpbmcgIikKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dC5hcHBlbmQoZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUpCiAgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwdXQuYXBwZW5kKCI7XG5cbiIpCisKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXMuU3RyaW5nCisKKyAgICAgICAg
ICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5f
Y190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVW
RU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQorCiAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYWlu
U3RyaW5nCiAKICAgICAgICAgZWxpZiBqc29uX3R5cGVbInR5cGUiXSA9PSAib2JqZWN0IjoKICAg
ICAgICAgICAgIGlmICJwcm9wZXJ0aWVzIiBpbiBqc29uX3R5cGU6CiAKICAgICAgICAgICAgICAg
ICBjbGFzcyBDbGFzc0JpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWVfID0g
anNvbl90eXBlWyJpZCJdCisKICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAg
ICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2Fy
ZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9kb2Mob3V0cHV0KQpA
QCAtNjQzLDYgKzY2MiwxNiBAQCBjbGFzcyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgc2V0dGVyX25hbWUgaW4gSU5TUEVDVE9SX09CSkVDVF9TRVRURVJfTkFN
RVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICB1
c2luZyBJbnNwZWN0b3JPYmplY3Q6OiVzO1xuXG4iICUgc2V0dGVyX25hbWUpCiAKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICAgICAgfTtcblxuIikKKworICAgICAg
ICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9p
bl9jX3R5cGVfdGV4dChjbHMsIG9wdGlvbmFsKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiAiUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6IiArIGNvbnRleHRfZG9tYWluX25hbWUgKyAi
OjoiICsgY2xzLmNsYXNzX25hbWVfICsgIj4iCisKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXMuT2JqZWN0CisKICAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIn07XG5cbiIpCiAgICAgICAgICAgICAgICAg
cmV0dXJuIENsYXNzQmluZGluZwogICAgICAgICAgICAgZWxzZToKQEAgLTY1Miw2ICs2ODEsMTUg
QEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVf
dHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2FyZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAgICAg
ICAgICAgICAjIE5vLW9wCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAg
ICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5f
Y190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVW
RU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQorCisgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNt
ZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlZHVjZV90b19yYXdfdHlwZSgpOgorICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhd1R5cGVzLk9iamVjdAorCiAgICAgICAgICAg
ICAgICAgcmV0dXJuIFBsYWluT2JqZWN0QmluZGluZwogICAgICAgICBlbHNlOgogICAgICAgICAg
ICAgcmF3X3R5cGUgPSBSYXdUeXBlcy5nZXQoanNvbl90eXBlWyJ0eXBlIl0pCkBAIC02NjEsNiAr
Njk5LDE1IEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJh
dGVfdHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2FyZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAg
ICAgICAgICMgTm8tb3AKICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAg
ICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChj
bHMsIG9wdGlvbmFsKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5yZWR1Y2VfdG9f
cmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwgb3B0aW9uYWwpLmdl
dF90ZXh0KCkKKworICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAg
ICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBy
YXdfdHlwZQorCiAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXNCaW5kaW5nCiAKIApAQCAtNzI3
LDYgKzc3NCwyOCBAQCBjbGFzcyBUeXBlTWFwOgogICAgICAgICByZXR1cm4gc2VsZi5tYXBfW2Rv
bWFpbl9uYW1lXVt0eXBlX25hbWVdCiAKIAorZGVmIHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3Bh
cmFtZXRlciwgc2NvcGVfZG9tYWluX25hbWUpOgorICAgIGlmICIkcmVmIiBpbiBqc29uX3BhcmFt
ZXRlcjoKKyAgICAgICAganNvbl9yZWYgPSBqc29uX3BhcmFtZXRlclsiJHJlZiJdCisgICAgICAg
IHR5cGVfZGF0YSA9IGdldF9yZWZfZGF0YShqc29uX3JlZiwgc2NvcGVfZG9tYWluX25hbWUpCisg
ICAgICAgIHJldHVybiB0eXBlX2RhdGEuZ2V0X2JpbmRpbmcoKQorICAgIGVsaWYgInR5cGUiIGlu
IGpzb25fcGFyYW1ldGVyOgorICAgICAgICBqc29uX3R5cGUgPSBqc29uX3BhcmFtZXRlclsidHlw
ZSJdCisgICAgICAgIHJhd190eXBlID0gUmF3VHlwZXMuZ2V0KGpzb25fdHlwZSkKKworICAgICAg
ICBjbGFzcyBSYXdUeXBlQmluZGluZzoKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAg
ICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3X3R5cGUoKToKKyAgICAgICAgICAgICAgICByZXR1cm4g
cmF3X3R5cGUKKworICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIGdl
dF9pbl9jX3R5cGVfdGV4dChvcHRpb25hbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhd190
eXBlLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQo
KQorCisgICAgICAgIHJldHVybiBSYXdUeXBlQmluZGluZworICAgIGVsc2U6CisgICAgICAgIHJh
aXNlIEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIikKKwogZGVmIHJlc29sdmVfcGFyYW1fcmF3X3R5
cGUoanNvbl9wYXJhbWV0ZXIsIHNjb3BlX2RvbWFpbl9uYW1lKToKICAgICBpZiAiJHJlZiIgaW4g
anNvbl9wYXJhbWV0ZXI6CiAgICAgICAgIGpzb25fcmVmID0ganNvbl9wYXJhbWV0ZXJbIiRyZWYi
XQpAQCAtMTQzNiw3ICsxNTA1LDkgQEAgY2xhc3MgR2VuZXJhdG9yOgogCiAgICAgICAgICAgICAg
ICAgb3B0aW9uYWwgPSBvcHRpb25hbF9tYXNrIGFuZCBqc29uX29wdGlvbmFsCiAKLSAgICAgICAg
ICAgICAgICBwYXJhbWV0ZXJfbGlzdC5hcHBlbmQoIiVzICVzIiAlIChjX3R5cGUuZ2V0X3RleHQo
KSwgcGFyYW1ldGVyX25hbWUpKQorICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVfYmluZGluZyA9
IHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgZG9tYWluX25hbWUpCisKKyAgICAg
ICAgICAgICAgICBwYXJhbWV0ZXJfbGlzdC5hcHBlbmQoIi8qJXMqLyAlcyAlcyIgJSAocGFyYW1f
dHlwZV9iaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dChqc29uX29wdGlvbmFsKSwgY190eXBlLmdl
dF90ZXh0KCksIHBhcmFtZXRlcl9uYW1lKSkKIAogICAgICAgICAgICAgICAgIHNldHRlcl9hcmd1
bWVudCA9IGNfdHlwZS5nZXRfc2V0dGVyX2Zvcm1hdCgpICUgcGFyYW1ldGVyX25hbWUKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119516</attachid>
            <date>2011-12-15 16:17:52 -0800</date>
            <delta_ts>2011-12-17 09:41:44 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74661-20111216041750.patch</filename>
            <type>text/plain</type>
            <size>7292</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAyOTU4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTY2MWFiOTlmNjE1YmZk
ZGFjNWVhOGQ1YmY3OWM2ZmFlOWVlZTA3YS4uZGQxMjhiZjE4OWEyMWI3YmUzODc3NWM0NmEyMDkw
ZTRlNTJhM2QxOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM5IEBACisyMDExLTEyLTE1ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5OiB1c2UgZ2VuZXJhdGVkIHR5cGVzIGluIG1ldGhv
ZCBwYXJhbWV0ZXJzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03NDY2MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFR5cGUgYmluZGluZyBvYmplY3QgaXMgYWRkZWQgdG8gcmF3X3R5cGUgb2JqZWN0LgorCisg
ICAgICAgICogaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHk6CisgICAgICAgIChU
eXBlQmluZGluZ3MuY3JlYXRlX2Zvcl9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkVudW1CaW5kaW5n
LmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX2Zv
cl9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkVudW1CaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6
CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX2Zvcl9uYW1lZF90eXBlX2RlY2xhcmF0aW9u
LkVudW1CaW5kaW5nKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5
cGVfZGVjbGFyYXRpb24uRW51bUJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAgICAg
KFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24uUGxhaW5TdHJp
bmcuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVf
Zm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24uUGxhaW5TdHJpbmcucmVkdWNlX3RvX3Jhd190eXBl
KToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRp
b24uUGxhaW5TdHJpbmcpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9mb3JfbmFtZWRf
dHlwZV9kZWNsYXJhdGlvbi5QbGFpblN0cmluZy5nZXRfaW5fY190eXBlX3RleHQpOgorICAgICAg
ICAoVHlwZUJpbmRpbmdzKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVk
X3R5cGVfZGVjbGFyYXRpb24uQ2xhc3NCaW5kaW5nKToKKyAgICAgICAgKGdldF9pbl9jX3R5cGVf
dGV4dCk6CisgICAgICAgIChyZWR1Y2VfdG9fcmF3X3R5cGUpOgorICAgICAgICAoUGxhaW5PYmpl
Y3RCaW5kaW5nLmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChQbGFpbk9iamVjdEJp
bmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFBsYWluT2JqZWN0QmluZGluZyk6
CisgICAgICAgIChQbGFpbk9iamVjdEJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAg
ICAgKFJhd1R5cGVzQmluZGluZy5nZW5lcmF0ZV90eXBlX2J1aWxkZXIpOgorICAgICAgICAoUmF3
VHlwZXNCaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6CisgICAgICAgIChSYXdUeXBlc0JpbmRp
bmcpOgorICAgICAgICAoUmF3VHlwZXNCaW5kaW5nLnJlZHVjZV90b19yYXdfdHlwZSk6CisgICAg
ICAgIChyZXNvbHZlX3BhcmFtX3R5cGUuUmF3VHlwZUJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBl
KToKKyAgICAgICAgKHJlc29sdmVfcGFyYW1fdHlwZS5SYXdUeXBlQmluZGluZyk6CisgICAgICAg
IChyZXNvbHZlX3BhcmFtX3R5cGUuUmF3VHlwZUJpbmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KToK
KyAgICAgICAgKHJlc29sdmVfcGFyYW1fdHlwZSk6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vz
c19ldmVudCk6CisKIDIwMTEtMTItMTUgIE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2Fs
aWEuY29tPgogCiAgICAgICAgIHBsdWdpbiBjcmFzaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHkgYi9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weQppbmRleCA0YTQzNjA1OTc3M2M5ODRj
ZjBiOTA3NjY2ODNiYzJiOTQwYzg2OTM1Li42YmNiZTMxNDg3OGNhMWJmYTYxNzY4ZjhmZGMyN2Zm
NjUzODQ1Mzc2IDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVy
YXRvckluc3BlY3Rvci5weQorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVy
YXRvckluc3BlY3Rvci5weQpAQCAtNTA1LDYgKzUwNSwxNCBAQCBjbGFzcyBUeXBlQmluZGluZ3M6
CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGVudW1fbmFtZSkKICAgICAg
ICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuXG4iKQogCisgICAgICAgICAgICAg
ICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlw
ZV90ZXh0KGNscywgb3B0aW9uYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNs
cy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwg
b3B0aW9uYWwpLmdldF90ZXh0KCkKKworICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9k
CisgICAgICAgICAgICAgICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3X3R5cGUoKToKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlcy5TdHJpbmcKKwogICAgICAgICAgICAgICAg
IHJldHVybiBFbnVtQmluZGluZwogICAgICAgICAgICAgZWxzZToKIApAQCAtNTE2LDEyICs1MjQs
MjMgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0
LmFwcGVuZCgidHlwZWRlZiBTdHJpbmcgIikKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dC5hcHBlbmQoZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUpCiAgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwdXQuYXBwZW5kKCI7XG5cbiIpCisKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXMuU3RyaW5nCisKKyAgICAgICAg
ICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5f
Y190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVW
RU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQorCiAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYWlu
U3RyaW5nCiAKICAgICAgICAgZWxpZiBqc29uX3R5cGVbInR5cGUiXSA9PSAib2JqZWN0IjoKICAg
ICAgICAgICAgIGlmICJwcm9wZXJ0aWVzIiBpbiBqc29uX3R5cGU6CiAKICAgICAgICAgICAgICAg
ICBjbGFzcyBDbGFzc0JpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWVfID0g
anNvbl90eXBlWyJpZCJdCisKICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAg
ICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2Fy
ZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9kb2Mob3V0cHV0KQpA
QCAtNjQzLDYgKzY2MiwxNiBAQCBjbGFzcyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgc2V0dGVyX25hbWUgaW4gSU5TUEVDVE9SX09CSkVDVF9TRVRURVJfTkFN
RVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICB1
c2luZyBJbnNwZWN0b3JPYmplY3Q6OiVzO1xuXG4iICUgc2V0dGVyX25hbWUpCiAKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICAgICAgfTtcblxuIikKKworICAgICAg
ICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9p
bl9jX3R5cGVfdGV4dChjbHMsIG9wdGlvbmFsKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiAiUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6IiArIGNvbnRleHRfZG9tYWluX25hbWUgKyAi
OjoiICsgY2xzLmNsYXNzX25hbWVfICsgIj4iCisKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXMuT2JqZWN0CisKICAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIn07XG5cbiIpCiAgICAgICAgICAgICAgICAg
cmV0dXJuIENsYXNzQmluZGluZwogICAgICAgICAgICAgZWxzZToKQEAgLTY1Miw2ICs2ODEsMTUg
QEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVf
dHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2FyZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAgICAg
ICAgICAgICAjIE5vLW9wCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAg
ICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5f
Y190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVW
RU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQorCisgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNt
ZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlZHVjZV90b19yYXdfdHlwZSgpOgorICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhd1R5cGVzLk9iamVjdAorCiAgICAgICAgICAg
ICAgICAgcmV0dXJuIFBsYWluT2JqZWN0QmluZGluZwogICAgICAgICBlbHNlOgogICAgICAgICAg
ICAgcmF3X3R5cGUgPSBSYXdUeXBlcy5nZXQoanNvbl90eXBlWyJ0eXBlIl0pCkBAIC02NjEsNiAr
Njk5LDE1IEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJh
dGVfdHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2FyZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAg
ICAgICAgICMgTm8tb3AKICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAg
ICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChj
bHMsIG9wdGlvbmFsKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5yZWR1Y2VfdG9f
cmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwgb3B0aW9uYWwpLmdl
dF90ZXh0KCkKKworICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAg
ICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBy
YXdfdHlwZQorCiAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXNCaW5kaW5nCiAKIApAQCAtNzI3
LDYgKzc3NCwyOCBAQCBjbGFzcyBUeXBlTWFwOgogICAgICAgICByZXR1cm4gc2VsZi5tYXBfW2Rv
bWFpbl9uYW1lXVt0eXBlX25hbWVdCiAKIAorZGVmIHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3Bh
cmFtZXRlciwgc2NvcGVfZG9tYWluX25hbWUpOgorICAgIGlmICIkcmVmIiBpbiBqc29uX3BhcmFt
ZXRlcjoKKyAgICAgICAganNvbl9yZWYgPSBqc29uX3BhcmFtZXRlclsiJHJlZiJdCisgICAgICAg
IHR5cGVfZGF0YSA9IGdldF9yZWZfZGF0YShqc29uX3JlZiwgc2NvcGVfZG9tYWluX25hbWUpCisg
ICAgICAgIHJldHVybiB0eXBlX2RhdGEuZ2V0X2JpbmRpbmcoKQorICAgIGVsaWYgInR5cGUiIGlu
IGpzb25fcGFyYW1ldGVyOgorICAgICAgICBqc29uX3R5cGUgPSBqc29uX3BhcmFtZXRlclsidHlw
ZSJdCisgICAgICAgIHJhd190eXBlID0gUmF3VHlwZXMuZ2V0KGpzb25fdHlwZSkKKworICAgICAg
ICBjbGFzcyBSYXdUeXBlQmluZGluZzoKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAg
ICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3X3R5cGUoKToKKyAgICAgICAgICAgICAgICByZXR1cm4g
cmF3X3R5cGUKKworICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIGdl
dF9pbl9jX3R5cGVfdGV4dChvcHRpb25hbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhd190
eXBlLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQo
KQorCisgICAgICAgIHJldHVybiBSYXdUeXBlQmluZGluZworICAgIGVsc2U6CisgICAgICAgIHJh
aXNlIEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIikKKwogZGVmIHJlc29sdmVfcGFyYW1fcmF3X3R5
cGUoanNvbl9wYXJhbWV0ZXIsIHNjb3BlX2RvbWFpbl9uYW1lKToKICAgICBpZiAiJHJlZiIgaW4g
anNvbl9wYXJhbWV0ZXI6CiAgICAgICAgIGpzb25fcmVmID0ganNvbl9wYXJhbWV0ZXJbIiRyZWYi
XQpAQCAtMTQzNiw3ICsxNTA1LDkgQEAgY2xhc3MgR2VuZXJhdG9yOgogCiAgICAgICAgICAgICAg
ICAgb3B0aW9uYWwgPSBvcHRpb25hbF9tYXNrIGFuZCBqc29uX29wdGlvbmFsCiAKLSAgICAgICAg
ICAgICAgICBwYXJhbWV0ZXJfbGlzdC5hcHBlbmQoIiVzICVzIiAlIChjX3R5cGUuZ2V0X3RleHQo
KSwgcGFyYW1ldGVyX25hbWUpKQorICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVfYmluZGluZyA9
IHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgZG9tYWluX25hbWUpCisKKyAgICAg
ICAgICAgICAgICBwYXJhbWV0ZXJfbGlzdC5hcHBlbmQoIi8qJXMqLyAlcyAlcyIgJSAocGFyYW1f
dHlwZV9iaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dChqc29uX29wdGlvbmFsKSwgY190eXBlLmdl
dF90ZXh0KCksIHBhcmFtZXRlcl9uYW1lKSkKIAogICAgICAgICAgICAgICAgIHNldHRlcl9hcmd1
bWVudCA9IGNfdHlwZS5nZXRfc2V0dGVyX2Zvcm1hdCgpICUgcGFyYW1ldGVyX25hbWUKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>119661</attachid>
            <date>2011-12-16 13:27:25 -0800</date>
            <delta_ts>2011-12-17 09:43:31 -0800</delta_ts>
            <desc>Sample of InspectorFrontend.h with new types annotated in comments for events.</desc>
            <filename>InspectorFrontend.h</filename>
            <type>text/plain</type>
            <size>131939</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgojaWZuZGVmIEluc3BlY3RvckZyb250ZW5kX2gKI2RlZmluZSBJbnNw
ZWN0b3JGcm9udGVuZF9oCgojaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNsdWRlIDxQ
bGF0Zm9ybVN0cmluZy5oPgojaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KCm5hbWVzcGFjZSBX
ZWJDb3JlIHsKCmNsYXNzIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKCi8vIEJvdGggSW5zcGVj
dG9yT2JqZWN0IGFuZCBJbnNwZWN0b3JBcnJheSBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBh
dCB0aGlzIHBvaW50IGFzIGRlZmluZWQgYnkgRU5BQkxFRF9JTlNQRUNUT1IuCi8vIERvdWJsZS1j
aGVjayB3ZSBoYXZlIHRoZW0gYXQgbGVhc3QgYXMgZm9yd2FyZCBkZWNsYXJhdGlvbi4KY2xhc3Mg
SW5zcGVjdG9yQXJyYXk7CmNsYXNzIEluc3BlY3Rvck9iamVjdDsKCnR5cGVkZWYgU3RyaW5nIEVy
cm9yU3RyaW5nOwoKI2lmIEVOQUJMRShJTlNQRUNUT1IpCgpuYW1lc3BhY2UgVHlwZUJ1aWxkZXIg
ewpuYW1lc3BhY2UgSW5zcGVjdG9yIHsKfSAvLyBJbnNwZWN0b3IKCm5hbWVzcGFjZSBNZW1vcnkg
ewovKiBOdW1iZXIgb2Ygbm9kZXMgd2l0aCBnaXZlbiBuYW1lLiAqLwpjbGFzcyBOb2RlQ291bnQg
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9f
RklFTERTX1NFVCA9IDAsCiAgICAgICAgTk9ERV9OQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBD
T1VOVF9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoTk9ERV9OQU1FX1NF
VCB8IENPVU5UX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPE5vZGVDb3VudD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBOb2RlQ291bnQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBOT0RFX05BTUVfU0VUPiYgc2V0Tm9kZU5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOT0RFX05BTUVf
U0VUKSwgcHJvcGVydHlfbm9kZU5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJub2RlTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxOT0RFX05BTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IENPVU5UX1NFVD4mIHNldENvdW50KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDT1VOVF9TRVQpLCBwcm9wZXJ0eV9jb3VudF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvdW50IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENPVU5UX1NFVD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxOb2RlQ291bnQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPE5vZGVDb3Vu
dD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxO
b2RlQ291bnQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPE5vZGVDb3Vu
dD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxOb2RlQ291bnQ+IHJlc3VsdCA9IE5vZGVDb3VudDo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0Tm9kZU5hbWUoLi4uKQogICAgICogICAgIC5zZXRDb3VudCgu
Li4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQog
ICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBO
b2RlQ291bnQoKSkpOwogICAgfQogICAgICAgIH07CgpjbGFzcyBET01Hcm91cCA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VU
ID0gMCwKICAgICAgICBTSVpFX1NFVCA9IDEgPDwgMCwKICAgICAgICBUSVRMRV9TRVQgPSAxIDw8
IDEsCiAgICAgICAgTk9ERV9DT1VOVF9TRVQgPSAxIDw8IDIsCiAgICAgICAgQUxMX0ZJRUxEU19T
RVQgPSAoU0laRV9TRVQgfCBUSVRMRV9TRVQgfCBOT0RFX0NPVU5UX1NFVCkKICAgIH07CgogICAg
dGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAg
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxp
bnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+
KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPERPTUdyb3VwPiBw
dHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVM
RFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIERPTUdyb3VwOwog
ICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0laRV9TRVQ+JiBzZXRTaXplKGlu
dCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBT
SVpFX1NFVCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFNJWkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRJVExFX1NF
VD4mIHNldFRpdGxlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgVElUTEVfU0VUKSwgcHJvcGVydHlfdGl0bGVfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0aXRsZSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUSVRMRV9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9DT1VOVF9TRVQ+JiBzZXROb2RlQ291bnQoUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgTk9ERV9DT1VOVF9TRVQpLCBwcm9wZXJ0eV9ub2RlQ291bnRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoIm5vZGVDb3VudCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOT0RFX0NPVU5UX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxET01Hcm91cD4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8RE9NR3JvdXA+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBh
c3NSZWZQdHI8RE9NR3JvdXA+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PERPTUdyb3VwPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhl
dGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPERPTUdyb3VwPiByZXN1bHQgPSBET01Hcm91
cDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2l6ZSguLi4pCiAgICAgKiAgICAgLnNldFRpdGxl
KC4uLikKICAgICAqICAgICAuc2V0Tm9kZUNvdW50KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IERPTUdyb3VwKCkpKTsKICAgIH0KCiAgICB2
b2lkIHNldERvY3VtZW50VVJJKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0U3RyaW5nKCJkb2N1bWVudFVSSSIsIHZhbHVlKTsKICAgIH0KICAgICAgICB9OwoKfSAv
LyBNZW1vcnkKCm5hbWVzcGFjZSBQYWdlIHsKLyogUmVzb3VyY2UgdHlwZSBhcyBpdCB3YXMgcGVy
Y2VpdmVkIGJ5IHRoZSByZW5kZXJpbmcgZW5naW5lLiAqLwpuYW1lc3BhY2UgUmVzb3VyY2VUeXBl
IHsKY29uc3QgY2hhciogY29uc3QgZG9jdW1lbnQgPSAiRG9jdW1lbnQiOwpjb25zdCBjaGFyKiBj
b25zdCBzdHlsZXNoZWV0ID0gIlN0eWxlc2hlZXQiOwpjb25zdCBjaGFyKiBjb25zdCBpbWFnZSA9
ICJJbWFnZSI7CmNvbnN0IGNoYXIqIGNvbnN0IGZvbnQgPSAiRm9udCI7CmNvbnN0IGNoYXIqIGNv
bnN0IHNjcmlwdCA9ICJTY3JpcHQiOwpjb25zdCBjaGFyKiBjb25zdCB4aHIgPSAiWEhSIjsKY29u
c3QgY2hhciogY29uc3Qgd2ViU29ja2V0ID0gIldlYlNvY2tldCI7CmNvbnN0IGNoYXIqIGNvbnN0
IG90aGVyID0gIk90aGVyIjsKfSAvLyBuYW1lc3BhY2UgUmVzb3VyY2VUeXBlCgovKiBJbmZvcm1h
dGlvbiBhYm91dCB0aGUgRnJhbWUgb24gdGhlIHBhZ2UuICovCmNsYXNzIEZyYW1lIDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19T
RVQgPSAwLAogICAgICAgIElEX1NFVCA9IDEgPDwgMCwKICAgICAgICBMT0FERVJfSURfU0VUID0g
MSA8PCAxLAogICAgICAgIFVSTF9TRVQgPSAxIDw8IDIsCiAgICAgICAgTUlNRV9UWVBFX1NFVCA9
IDEgPDwgMywKICAgICAgICBBTExfRklFTERTX1NFVCA9IChJRF9TRVQgfCBMT0FERVJfSURfU0VU
IHwgVVJMX1NFVCB8IE1JTUVfVFlQRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFU
RT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVh
dGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAg
ICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBGcmFtZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IElEX1NFVD4mIHNldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSURfU0VUKSwgcHJvcGVydHlf
aWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJRF9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTE9BREVSX0lEX1NFVD4mIHNldExvYWRlcklkKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgTE9BREVSX0lEX1NFVCksIHByb3BlcnR5X2xvYWRlcklkX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibG9hZGVySWQiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8TE9BREVSX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBVUkxfU0VUPiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVVJMX1NFVCksIHBy
b3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
InVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVUkxfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE1JTUVfVFlQRV9TRVQ+JiBzZXRNaW1l
VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE1JTUVfVFlQRV9TRVQpLCBwcm9wZXJ0eV9taW1lVHlwZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1pbWVUeXBlIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1JTUVfVFlQRV9TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RnJhbWU+JiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZyYW1l
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEZy
YW1lPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxGcmFtZT4oKnRoaXMp
OwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoK
ICAgICAqIFJlZlB0cjxGcmFtZT4gcmVzdWx0ID0gRnJhbWU6OmNyZWF0ZSgpCiAgICAgKiAgICAg
LnNldElkKC4uLikKICAgICAqICAgICAuc2V0TG9hZGVySWQoLi4uKQogICAgICogICAgIC5zZXRV
cmwoLi4uKQogICAgICogICAgIC5zZXRNaW1lVHlwZSguLi4pOwogICAgICovCiAgICBzdGF0aWMg
QnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBGcmFtZSgpKSk7CiAgICB9CgogICAgdm9p
ZCBzZXRQYXJlbnRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dFN0cmluZygicGFyZW50SWQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXROYW1lKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuYW1lIiwgdmFs
dWUpOwogICAgfQogICAgICAgIH07CgovKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgRnJhbWUgaGll
cmFyY2h5IGFsb25nIHdpdGggdGhlaXIgY2FjaGVkIHJlc291cmNlcy4gKi8KY2xhc3MgRnJhbWVS
ZXNvdXJjZVRyZWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7
CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgRlJBTUVfU0VUID0gMSA8PCAwLAog
ICAgICAgIFJFU09VUkNFU19TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAo
RlJBTUVfU0VUIHwgUkVTT1VSQ0VTX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRF
PgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxT
VEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEZyYW1lUmVzb3VyY2VUcmVlOwog
ICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRlJBTUVfU0VUPiYgc2V0RnJhbWUo
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZSQU1FX1NFVCksIHByb3BlcnR5X2ZyYW1lX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiZnJhbWUiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RlJBTUVfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFJFU09VUkNFU19TRVQ+JiBzZXRSZXNvdXJjZXMoUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgUkVTT1VSQ0VTX1NFVCksIHByb3BlcnR5X3Jlc291cmNlc19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgicmVzb3VyY2VzIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJFU09VUkNFU19TRVQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+JiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQs
IHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8UmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4oKnRoaXMpOwogICAg
ICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAq
IFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4gcmVzdWx0ID0gRnJhbWVSZXNvdXJjZVRyZWU6OmNy
ZWF0ZSgpCiAgICAgKiAgICAgLnNldEZyYW1lKC4uLikKICAgICAqICAgICAuc2V0UmVzb3VyY2Vz
KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgp
CiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3
IEZyYW1lUmVzb3VyY2VUcmVlKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldENoaWxkRnJhbWVzKFBh
c3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFy
cmF5KCJjaGlsZEZyYW1lcyIsIHZhbHVlKTsKICAgIH0KICAgICAgICB9OwoKLyogU2VhcmNoIG1h
dGNoIGZvciByZXNvdXJjZS4gKi8KY2xhc3MgU2VhcmNoTWF0Y2ggOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgTElORV9OVU1CRVJfU0VUID0gMSA8PCAwLAogICAgICAgIExJTkVfQ09OVEVOVF9TRVQg
PSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoTElORV9OVU1CRVJfU0VUIHwgTElO
RV9DT05URU5UX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPFNlYXJjaE1hdGNoPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5f
bm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAg
ICAgICAgZnJpZW5kIGNsYXNzIFNlYXJjaE1hdGNoOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgTElORV9OVU1CRVJfU0VUPiYgc2V0TGluZU51bWJlcihkb3VibGUgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTElORV9OVU1C
RVJfU0VUKSwgcHJvcGVydHlfbGluZU51bWJlcl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8TElORV9OVU1CRVJfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IExJTkVfQ09OVEVOVF9TRVQ+JiBzZXRMaW5lQ29udGVudChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExJ
TkVfQ09OVEVOVF9TRVQpLCBwcm9wZXJ0eV9saW5lQ29udGVudF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImxpbmVDb250ZW50IiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPExJTkVfQ09OVEVOVF9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBSZWZQdHI8U2VhcmNoTWF0Y2g+JiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlYXJj
aE1hdGNoPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVm
UHRyPFNlYXJjaE1hdGNoPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxT
ZWFyY2hNYXRjaD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWFyY2hNYXRjaD4gcmVzdWx0ID0gU2Vh
cmNoTWF0Y2g6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldExpbmVOdW1iZXIoLi4uKQogICAgICog
ICAgIC5zZXRMaW5lQ29udGVudCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19G
SUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxE
U19TRVQ+KGFkb3B0UmVmKG5ldyBTZWFyY2hNYXRjaCgpKSk7CiAgICB9CiAgICAgICAgfTsKCi8q
IFNlYXJjaCByZXN1bHQgZm9yIHJlc291cmNlLiAqLwpjbGFzcyBTZWFyY2hSZXN1bHQgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERT
X1NFVCA9IDAsCiAgICAgICAgVVJMX1NFVCA9IDEgPDwgMCwKICAgICAgICBGUkFNRV9JRF9TRVQg
PSAxIDw8IDEsCiAgICAgICAgTUFUQ0hFU19DT1VOVF9TRVQgPSAxIDw8IDIsCiAgICAgICAgQUxM
X0ZJRUxEU19TRVQgPSAoVVJMX1NFVCB8IEZSQU1FX0lEX1NFVCB8IE1BVENIRVNfQ09VTlRfU0VU
KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAg
IHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAg
ICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxT
VEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQ
dHI8U2VhcmNoUmVzdWx0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3Rh
dGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5k
IGNsYXNzIFNlYXJjaFJlc3VsdDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IFVSTF9TRVQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwgcHJvcGVydHlfdXJsX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVSTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgRlJBTUVfSURfU0VUPiYgc2V0RnJhbWVJZChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZS
QU1FX0lEX1NFVCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEZSQU1FX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBNQVRDSEVTX0NPVU5UX1NFVD4mIHNldE1hdGNoZXNDb3VudChkb3VibGUgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTUFUQ0hFU19DT1VO
VF9TRVQpLCBwcm9wZXJ0eV9tYXRjaGVzQ291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJtYXRjaGVzQ291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8TUFUQ0hFU19DT1VOVF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBSZWZQdHI8U2VhcmNoUmVzdWx0PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxTZWFyY2hSZXN1
bHQ+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8
U2VhcmNoUmVzdWx0PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTZWFy
Y2hSZXN1bHQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0
aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2VhcmNoUmVzdWx0PiByZXN1bHQgPSBTZWFy
Y2hSZXN1bHQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNl
dEZyYW1lSWQoLi4uKQogICAgICogICAgIC5zZXRNYXRjaGVzQ291bnQoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICBy
ZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgU2VhcmNoUmVzdWx0KCkp
KTsKICAgIH0KICAgICAgICB9OwoKLyogQ29va2llIG9iamVjdCAqLwpjbGFzcyBDb29raWUgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklF
TERTX1NFVCA9IDAsCiAgICAgICAgTkFNRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgVkFMVUVfU0VU
ID0gMSA8PCAxLAogICAgICAgIERPTUFJTl9TRVQgPSAxIDw8IDIsCiAgICAgICAgUEFUSF9TRVQg
PSAxIDw8IDMsCiAgICAgICAgRVhQSVJFU19TRVQgPSAxIDw8IDQsCiAgICAgICAgU0laRV9TRVQg
PSAxIDw8IDUsCiAgICAgICAgSFRUUF9PTkxZX1NFVCA9IDEgPDwgNiwKICAgICAgICBTRUNVUkVf
U0VUID0gMSA8PCA3LAogICAgICAgIFNFU1NJT05fU0VUID0gMSA8PCA4LAogICAgICAgIEFMTF9G
SUVMRFNfU0VUID0gKE5BTUVfU0VUIHwgVkFMVUVfU0VUIHwgRE9NQUlOX1NFVCB8IFBBVEhfU0VU
IHwgRVhQSVJFU19TRVQgfCBTSVpFX1NFVCB8IEhUVFBfT05MWV9TRVQgfCBTRUNVUkVfU0VUIHwg
U0VTU0lPTl9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1
aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jl
c3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYg
Y2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXIoUGFzc1JlZlB0cjxDb29raWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgQ29va2llOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TkFNRV9TRVQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTkFNRV9TRVQpLCBwcm9wZXJ0eV9uYW1lX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOQU1FX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWQUxVRV9TRVQ+JiBzZXRWYWx1ZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZB
TFVFX1NFVCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VkFMVUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERPTUFJ
Tl9TRVQ+JiBzZXREb21haW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBET01BSU5fU0VUKSwgcHJvcGVydHlfZG9tYWlu
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiZG9tYWluIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERPTUFJTl9TRVQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUEFUSF9TRVQ+JiBzZXRQYXRoKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgUEFUSF9TRVQpLCBwcm9wZXJ0eV9wYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygicGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxQQVRIX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFWFBJ
UkVTX1NFVD4mIHNldEV4cGlyZXMoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIEVYUElSRVNfU0VUKSwgcHJvcGVydHlfZXhwaXJlc19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImV4cGlyZXMiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RVhQSVJFU19TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0laRV9TRVQ+JiBzZXRTaXplKGludCB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTSVpFX1NFVCks
IHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNJWkVfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhUVFBfT05MWV9TRVQ+JiBz
ZXRIdHRwT25seShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIEhUVFBfT05MWV9TRVQpLCBwcm9wZXJ0eV9odHRwT25seV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJodHRwT25seSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIVFRQX09OTFlfU0VUPigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNFQ1VSRV9TRVQ+JiBzZXRTZWN1cmUoYm9vbCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTRUNVUkVf
U0VUKSwgcHJvcGVydHlfc2VjdXJlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldEJvb2xlYW4oInNlY3VyZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxTRUNVUkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNFU1NJ
T05fU0VUPiYgc2V0U2Vzc2lvbihib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFNFU1NJT05fU0VUKSwgcHJvcGVydHlfc2Vzc2lvbl9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJzZXNzaW9uIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNFU1NJT05fU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENvb2tpZT4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q29v
a2llPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PENvb2tpZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q29va2llPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPENvb2tpZT4gcmVzdWx0ID0gQ29va2llOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUoLi4uKQogICAgICogICAg
IC5zZXREb21haW4oLi4uKQogICAgICogICAgIC5zZXRQYXRoKC4uLikKICAgICAqICAgICAuc2V0
RXhwaXJlcyguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRIdHRw
T25seSguLi4pCiAgICAgKiAgICAgLnNldFNlY3VyZSguLi4pCiAgICAgKiAgICAgLnNldFNlc3Np
b24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihu
ZXcgQ29va2llKCkpKTsKICAgIH0KICAgICAgICB9OwoKLyogVW5pcXVlIHNjcmlwdCBpZGVudGlm
aWVyLiAqLwp0eXBlZGVmIFN0cmluZyBTY3JpcHRJZGVudGlmaWVyOwoKfSAvLyBQYWdlCgpuYW1l
c3BhY2UgUnVudGltZSB7Ci8qIFVuaXF1ZSBvYmplY3QgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBT
dHJpbmcgUmVtb3RlT2JqZWN0SWQ7CgovKiBNaXJyb3Igb2JqZWN0IHJlZmVyZW5jaW5nIG9yaWdp
bmFsIEphdmFTY3JpcHQgb2JqZWN0LiAqLwpjbGFzcyBSZW1vdGVPYmplY3QgOiBwdWJsaWMgSW5z
cGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9
IDAsCiAgICAgICAgVFlQRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAo
VFlQRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxSZW1vdGVPYmplY3Q+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgUmVtb3RlT2JqZWN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgVFlQRV9TRVQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVFlQRV9TRVQpLCBwcm9wZXJ0
eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlw
ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUWVBFX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZW1vdGVPYmplY3Q+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPFJlbW90ZU9iamVjdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUGFzc1JlZlB0cjxSZW1vdGVPYmplY3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gUmVmUHRyPFJlbW90ZU9iamVjdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZW1vdGVPYmpl
Y3Q+IHJlc3VsdCA9IFJlbW90ZU9iamVjdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlwZSgu
Li4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQog
ICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBS
ZW1vdGVPYmplY3QoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3VidHlwZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic3VidHlwZSIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldENsYXNzTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewog
ICAgICAgIHRoaXMtPnNldFN0cmluZygiY2xhc3NOYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZv
aWQgc2V0VmFsdWUoUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0VmFsdWUoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVj
dG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXREZXNjcmlwdGlvbihjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiZGVzY3JpcHRpb24iLCB2
YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRPYmplY3RJZChjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygib2JqZWN0SWQiLCB2YWx1ZSk7CiAgICB9CiAg
ICAgICAgfTsKCi8qIE9iamVjdCBwcm9wZXJ0eSBkZXNjcmlwdG9yLiAqLwpjbGFzcyBQcm9wZXJ0
eURlc2NyaXB0b3IgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7
CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgTkFNRV9TRVQgPSAxIDw8IDAsCiAg
ICAgICAgV1JJVEFCTEVfU0VUID0gMSA8PCAxLAogICAgICAgIENPTkZJR1VSQUJMRV9TRVQgPSAx
IDw8IDIsCiAgICAgICAgRU5VTUVSQUJMRV9TRVQgPSAxIDw8IDMsCiAgICAgICAgQUxMX0ZJRUxE
U19TRVQgPSAoTkFNRV9TRVQgfCBXUklUQUJMRV9TRVQgfCBDT05GSUdVUkFCTEVfU0VUIHwgRU5V
TUVSQUJMRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1
aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jl
c3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYg
Y2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXIoUGFzc1JlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+IHB0cikKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRl
ZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAg
IH0KICAgICAgICBmcmllbmQgY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTkFNRV9TRVQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTkFN
RV9TRVQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxO
QU1FX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBXUklUQUJMRV9T
RVQ+JiBzZXRXcml0YWJsZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFdSSVRBQkxFX1NFVCksIHByb3BlcnR5X3dyaXRhYmxlX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oIndyaXRhYmxlIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFdSSVRBQkxFX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDT05GSUdVUkFCTEVfU0VUPiYgc2V0Q29uZmln
dXJhYmxlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgQ09ORklHVVJBQkxFX1NFVCksIHByb3BlcnR5X2NvbmZpZ3VyYWJsZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJjb25maWd1cmFibGUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q09ORklHVVJBQkxFX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFTlVNRVJBQkxFX1NFVD4mIHNldEVu
dW1lcmFibGUoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBFTlVNRVJBQkxFX1NFVCksIHByb3BlcnR5X2VudW1lcmFibGVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiZW51bWVyYWJsZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxFTlVNRVJBQkxFX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+JiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQs
IHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8UmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+ICgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4oKnRoaXMpOwog
ICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAg
ICAqIFJlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+IHJlc3VsdCA9IFByb3BlcnR5RGVzY3JpcHRv
cjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFdyaXRh
YmxlKC4uLikKICAgICAqICAgICAuc2V0Q29uZmlndXJhYmxlKC4uLikKICAgICAqICAgICAuc2V0
RW51bWVyYWJsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VU
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFk
b3B0UmVmKG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0VmFs
dWUoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldE9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAgICB1c2luZyBJbnNwZWN0b3JPYmpl
Y3Q6OnNldFZhbHVlOwoKCiAgICB2b2lkIHNldEdldChQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJnZXQiLCB2YWx1ZSk7CiAg
ICB9CgogICAgdm9pZCBzZXRTZXQoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQog
ICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgic2V0IiwgdmFsdWUpOwogICAgfQoKICAgIHZv
aWQgc2V0V2FzVGhyb3duKGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVh
bigid2FzVGhyb3duIiwgdmFsdWUpOwogICAgfQogICAgICAgIH07CgovKiBSZXByZXNlbnRzIGZ1
bmN0aW9uIGNhbGwgYXJndW1lbnQuIEVpdGhlciByZW1vdGUgb2JqZWN0IGlkIDxjb2RlPm9iamVj
dElkPC9jb2RlPiBvciBwcmltaXRpdmUgPGNvZGU+dmFsdWU8L2NvZGU+IG9yIG5laXRoZXIgb2Yg
KGZvciB1bmRlZmluZWQpIHRoZW0gc2hvdWxkIGJlIHNwZWNpZmllZC4gKi8KY2xhc3MgQ2FsbEFy
Z3VtZW50IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAg
ICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gMAogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q2FsbEFy
Z3VtZW50PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENh
bGxBcmd1bWVudDsKICAgIHB1YmxpYzoKCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxBcmd1
bWVudD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBB
TExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEFyZ3VtZW50Pio+KCZtX3Jlc3VsdCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4gKCkKICAgICAg
ICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEFyZ3VtZW50PigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPENhbGxBcmd1bWVudD4gcmVzdWx0ID0gQ2FsbEFyZ3VtZW50OjpjcmVhdGUoKTsKICAg
ICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAg
ICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ2FsbEFyZ3Vt
ZW50KCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFZhbHVlKFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFs
dWU+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFZhbHVlKCJ2YWx1ZSIsIHZhbHVlKTsK
ICAgIH0KICAgIHVzaW5nIEluc3BlY3Rvck9iamVjdDo6c2V0VmFsdWU7CgoKICAgIHZvaWQgc2V0
T2JqZWN0SWQoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldE9iamVjdCgib2JqZWN0SWQiLCB2YWx1ZSk7CiAgICB9CiAgICAgICAgfTsKCn0g
Ly8gUnVudGltZQoKbmFtZXNwYWNlIENvbnNvbGUgewovKiBDb25zb2xlIG1lc3NhZ2UuICovCmNs
YXNzIENvbnNvbGVNZXNzYWdlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFNPVVJDRV9TRVQgPSAx
IDw8IDAsCiAgICAgICAgTEVWRUxfU0VUID0gMSA8PCAxLAogICAgICAgIFRFWFRfU0VUID0gMSA8
PCAyLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFNPVVJDRV9TRVQgfCBMRVZFTF9TRVQgfCBU
RVhUX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPENvbnNvbGVNZXNzYWdlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIENvbnNvbGVNZXNzYWdlOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgU09VUkNFX1NFVD4mIHNldFNvdXJjZShjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNPVVJDRV9TRVQp
LCBwcm9wZXJ0eV9zb3VyY2VfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJzb3VyY2UiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U09V
UkNFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMRVZFTF9TRVQ+
JiBzZXRMZXZlbChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIExFVkVMX1NFVCksIHByb3BlcnR5X2xldmVsX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibGV2ZWwiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TEVWRUxfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFRFWFRfU0VUPiYgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRFWFRfU0VU
KSwgcHJvcGVydHlfdGV4dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRT
dHJpbmcoInRleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VEVYVF9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q29uc29sZU1lc3NhZ2U+
JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJ
RUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPENvbnNvbGVNZXNzYWdlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENvbnNvbGVNZXNzYWdlPiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDb25zb2xlTWVzc2FnZT4oKnRoaXMpOwogICAg
ICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAq
IFJlZlB0cjxDb25zb2xlTWVzc2FnZT4gcmVzdWx0ID0gQ29uc29sZU1lc3NhZ2U6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldFNvdXJjZSguLi4pCiAgICAgKiAgICAgLnNldExldmVsKC4uLikKICAg
ICAqICAgICAuc2V0VGV4dCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVM
RFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+KGFkb3B0UmVmKG5ldyBDb25zb2xlTWVzc2FnZSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRU
eXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0
eXBlIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICB9CgogICAg
dm9pZCBzZXRMaW5lKGludCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImxp
bmUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRSZXBlYXRDb3VudChpbnQgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJyZXBlYXRDb3VudCIsIHZhbHVlKTsKICAgIH0K
CiAgICB2b2lkIHNldFBhcmFtZXRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoInBhcmFtZXRlcnMiLCB2YWx1ZSk7CiAgICB9
CgogICAgdm9pZCBzZXRTdGFja1RyYWNlKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJzdGFja1RyYWNlIiwgdmFsdWUpOwogICAg
fQoKICAgIHZvaWQgc2V0TmV0d29ya1JlcXVlc3RJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldFN0cmluZygibmV0d29ya1JlcXVlc3RJZCIsIHZhbHVlKTsKICAg
IH0KICAgICAgICB9OwoKLyogU3RhY2sgZW50cnkgZm9yIGNvbnNvbGUgZXJyb3JzIGFuZCBhc3Nl
cnRpb25zLiAqLwpjbGFzcyBDYWxsRnJhbWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgRlVOQ1RJ
T05fTkFNRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgVVJMX1NFVCA9IDEgPDwgMSwKICAgICAgICBM
SU5FX05VTUJFUl9TRVQgPSAxIDw8IDIsCiAgICAgICAgQ09MVU1OX05VTUJFUl9TRVQgPSAxIDw8
IDMsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoRlVOQ1RJT05fTkFNRV9TRVQgfCBVUkxfU0VU
IHwgTElORV9OVU1CRVJfU0VUIHwgQ09MVU1OX05VTUJFUl9TRVQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWxsRnJhbWU+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ2FsbEZyYW1lOwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRlVOQ1RJT05fTkFNRV9TRVQ+JiBzZXRG
dW5jdGlvbk5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGVU5DVElPTl9OQU1FX1NFVCksIHByb3BlcnR5X2Z1bmN0
aW9uTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZ1
bmN0aW9uTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxGVU5DVElP
Tl9OQU1FX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVUkxfU0VU
PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVVJMX1NFVCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxVUkxfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IExJTkVfTlVNQkVSX1NFVD4mIHNldExpbmVOdW1iZXIoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMSU5F
X05VTUJFUl9TRVQpLCBwcm9wZXJ0eV9saW5lTnVtYmVyX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygibGluZU51bWJlciIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxMSU5FX05VTUJFUl9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgQ09MVU1OX05VTUJFUl9TRVQ+JiBzZXRDb2x1bW5OdW1iZXIoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBDT0xVTU5fTlVNQkVSX1NFVCksIHByb3BlcnR5X2NvbHVtbk51bWJlcl9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImNvbHVtbk51bWJlciIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT0xVTU5fTlVNQkVSX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDYWxsRnJhbWU+JiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPENhbGxGcmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxDYWxsRnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPENhbGxGcmFtZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWxsRnJhbWU+IHJlc3VsdCA9IENh
bGxGcmFtZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0RnVuY3Rpb25OYW1lKC4uLikKICAgICAq
ICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TGluZU51bWJlciguLi4pCiAgICAgKiAg
ICAgLnNldENvbHVtbk51bWJlciguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19G
SUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxE
U19TRVQ+KGFkb3B0UmVmKG5ldyBDYWxsRnJhbWUoKSkpOwogICAgfQogICAgICAgIH07Cgp9IC8v
IENvbnNvbGUKCm5hbWVzcGFjZSBOZXR3b3JrIHsKLyogVW5pcXVlIGxvYWRlciBpZGVudGlmaWVy
LiAqLwp0eXBlZGVmIFN0cmluZyBMb2FkZXJJZDsKCi8qIFVuaXF1ZSBmcmFtZSBpZGVudGlmaWVy
LiAqLwp0eXBlZGVmIFN0cmluZyBGcmFtZUlkOwoKLyogVW5pcXVlIHJlcXVlc3QgaWRlbnRpZmll
ci4gKi8KdHlwZWRlZiBTdHJpbmcgUmVxdWVzdElkOwoKLyogVGltaW5nIGluZm9ybWF0aW9uIGZv
ciB0aGUgcmVxdWVzdC4gKi8KY2xhc3MgUmVzb3VyY2VUaW1pbmcgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgUkVRVUVTVF9USU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBQUk9YWV9TVEFSVF9TRVQg
PSAxIDw8IDEsCiAgICAgICAgUFJPWFlfRU5EX1NFVCA9IDEgPDwgMiwKICAgICAgICBETlNfU1RB
UlRfU0VUID0gMSA8PCAzLAogICAgICAgIEROU19FTkRfU0VUID0gMSA8PCA0LAogICAgICAgIENP
Tk5FQ1RfU1RBUlRfU0VUID0gMSA8PCA1LAogICAgICAgIENPTk5FQ1RfRU5EX1NFVCA9IDEgPDwg
NiwKICAgICAgICBTU0xfU1RBUlRfU0VUID0gMSA8PCA3LAogICAgICAgIFNTTF9FTkRfU0VUID0g
MSA8PCA4LAogICAgICAgIFNFTkRfU1RBUlRfU0VUID0gMSA8PCA5LAogICAgICAgIFNFTkRfRU5E
X1NFVCA9IDEgPDwgMTAsCiAgICAgICAgUkVDRUlWRV9IRUFERVJTX0VORF9TRVQgPSAxIDw8IDEx
LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFJFUVVFU1RfVElNRV9TRVQgfCBQUk9YWV9TVEFS
VF9TRVQgfCBQUk9YWV9FTkRfU0VUIHwgRE5TX1NUQVJUX1NFVCB8IEROU19FTkRfU0VUIHwgQ09O
TkVDVF9TVEFSVF9TRVQgfCBDT05ORUNUX0VORF9TRVQgfCBTU0xfU1RBUlRfU0VUIHwgU1NMX0VO
RF9TRVQgfCBTRU5EX1NUQVJUX1NFVCB8IFNFTkRfRU5EX1NFVCB8IFJFQ0VJVkVfSEVBREVSU19F
TkRfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVy
IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RT
dGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVp
bGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8UmVzb3VyY2VUaW1pbmc+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgUmVzb3VyY2VUaW1pbmc7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBSRVFVRVNUX1RJTUVfU0VUPiYgc2V0UmVxdWVzdFRpbWUoZG91YmxlIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJFUVVFU1Rf
VElNRV9TRVQpLCBwcm9wZXJ0eV9yZXF1ZXN0VGltZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXROdW1iZXIoInJlcXVlc3RUaW1lIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFJFUVVFU1RfVElNRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgUFJPWFlfU1RBUlRfU0VUPiYgc2V0UHJveHlTdGFydChkb3VibGUgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUFJPWFlf
U1RBUlRfU0VUKSwgcHJvcGVydHlfcHJveHlTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXROdW1iZXIoInByb3h5U3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8UFJPWFlfU1RBUlRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFBST1hZX0VORF9TRVQ+JiBzZXRQcm94eUVuZChkb3VibGUgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUFJPWFlfRU5EX1NF
VCksIHByb3BlcnR5X3Byb3h5RW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldE51bWJlcigicHJveHlFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8UFJPWFlfRU5EX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBE
TlNfU1RBUlRfU0VUPiYgc2V0RG5zU3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEROU19TVEFSVF9TRVQpLCBwcm9wZXJ0eV9k
bnNTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImRu
c1N0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEROU19TVEFSVF9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRE5TX0VORF9TRVQ+JiBz
ZXREbnNFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIEROU19FTkRfU0VUKSwgcHJvcGVydHlfZG5zRW5kX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiZG5zRW5kIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPEROU19FTkRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IENPTk5FQ1RfU1RBUlRfU0VUPiYgc2V0Q29ubmVjdFN0YXJ0KGRvdWJs
ZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBD
T05ORUNUX1NUQVJUX1NFVCksIHByb3BlcnR5X2Nvbm5lY3RTdGFydF9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvbm5lY3RTdGFydCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT05ORUNUX1NUQVJUX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDT05ORUNUX0VORF9TRVQ+JiBzZXRDb25uZWN0RW5k
KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBDT05ORUNUX0VORF9TRVQpLCBwcm9wZXJ0eV9jb25uZWN0RW5kX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY29ubmVjdEVuZCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT05ORUNUX0VORF9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1NMX1NUQVJUX1NFVD4mIHNldFNzbFN0YXJ0KGRvdWJs
ZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBT
U0xfU1RBUlRfU0VUKSwgcHJvcGVydHlfc3NsU3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzc2xTdGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxTU0xfU1RBUlRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFNTTF9FTkRfU0VUPiYgc2V0U3NsRW5kKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTU0xfRU5EX1NFVCksIHByb3Bl
cnR5X3NzbEVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InNzbEVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTU0xfRU5EX1NF
VD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTRU5EX1NUQVJUX1NFVD4m
IHNldFNlbmRTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgU0VORF9TVEFSVF9TRVQpLCBwcm9wZXJ0eV9zZW5kU3RhcnRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzZW5kU3RhcnQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U0VORF9TVEFSVF9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0VORF9FTkRfU0VUPiYgc2V0U2VuZEVu
ZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgU0VORF9FTkRfU0VUKSwgcHJvcGVydHlfc2VuZEVuZF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNlbmRFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8U0VORF9FTkRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFJFQ0VJVkVfSEVBREVSU19FTkRfU0VUPiYgc2V0UmVjZWl2ZUhlYWRlcnNF
bmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFJFQ0VJVkVfSEVBREVSU19FTkRfU0VUKSwgcHJvcGVydHlfcmVjZWl2ZUhlYWRlcnNF
bmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJyZWNlaXZl
SGVhZGVyc0VuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSRUNFSVZF
X0hFQURFUlNfRU5EX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxS
ZXNvdXJjZVRpbWluZz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVzb3VyY2VUaW1pbmc+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmVzb3VyY2VUaW1p
bmc+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlc291cmNlVGltaW5n
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPFJlc291cmNlVGltaW5nPiByZXN1bHQgPSBSZXNvdXJjZVRp
bWluZzo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UmVxdWVzdFRpbWUoLi4uKQogICAgICogICAg
IC5zZXRQcm94eVN0YXJ0KC4uLikKICAgICAqICAgICAuc2V0UHJveHlFbmQoLi4uKQogICAgICog
ICAgIC5zZXREbnNTdGFydCguLi4pCiAgICAgKiAgICAgLnNldERuc0VuZCguLi4pCiAgICAgKiAg
ICAgLnNldENvbm5lY3RTdGFydCguLi4pCiAgICAgKiAgICAgLnNldENvbm5lY3RFbmQoLi4uKQog
ICAgICogICAgIC5zZXRTc2xTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFNzbEVuZCguLi4pCiAg
ICAgKiAgICAgLnNldFNlbmRTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFNlbmRFbmQoLi4uKQog
ICAgICogICAgIC5zZXRSZWNlaXZlSGVhZGVyc0VuZCguLi4pOwogICAgICovCiAgICBzdGF0aWMg
QnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBSZXNvdXJjZVRpbWluZygpKSk7CiAgICB9
CiAgICAgICAgfTsKCi8qIEhUVFAgcmVxdWVzdCBkYXRhLiAqLwpjbGFzcyBSZXF1ZXN0IDogcHVi
bGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxE
U19TRVQgPSAwLAogICAgICAgIFVSTF9TRVQgPSAxIDw8IDAsCiAgICAgICAgTUVUSE9EX1NFVCA9
IDEgPDwgMSwKICAgICAgICBIRUFERVJTX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERT
X1NFVCA9IChVUkxfU0VUIHwgTUVUSE9EX1NFVCB8IEhFQURFUlNfU0VUKQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UmVxdWVzdD4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERT
X1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9y
ZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZXF1ZXN0OwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVVJMX1NFVD4mIHNldFVybChjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFVSTF9TRVQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VVJMX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNRVRIT0Rf
U0VUPiYgc2V0TWV0aG9kKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTUVUSE9EX1NFVCksIHByb3BlcnR5X21ldGhvZF9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1ldGhvZCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNRVRIT0RfU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhFQURFUlNfU0VUPiYgc2V0SGVhZGVycyhQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgSEVBREVSU19TRVQpLCBwcm9wZXJ0eV9oZWFkZXJzX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIRUFERVJTX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZXF1ZXN0PiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZXF1
ZXN0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PFJlcXVlc3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlcXVlc3Q+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8UmVxdWVzdD4gcmVzdWx0ID0gUmVxdWVzdDo6Y3JlYXRlKCkK
ICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TWV0aG9kKC4uLikKICAgICAq
ICAgICAuc2V0SGVhZGVycyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVM
RFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+KGFkb3B0UmVmKG5ldyBSZXF1ZXN0KCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFBvc3REYXRh
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwb3N0
RGF0YSIsIHZhbHVlKTsKICAgIH0KICAgICAgICB9OwoKLyogSFRUUCByZXNwb25zZSBkYXRhLiAq
LwpjbGFzcyBSZXNwb25zZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBl
bnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBVUkxfU0VUID0gMSA8PCAw
LAogICAgICAgIFNUQVRVU19TRVQgPSAxIDw8IDEsCiAgICAgICAgU1RBVFVTX1RFWFRfU0VUID0g
MSA8PCAyLAogICAgICAgIEhFQURFUlNfU0VUID0gMSA8PCAzLAogICAgICAgIE1JTUVfVFlQRV9T
RVQgPSAxIDw8IDQsCiAgICAgICAgQ09OTkVDVElPTl9SRVVTRURfU0VUID0gMSA8PCA1LAogICAg
ICAgIENPTk5FQ1RJT05fSURfU0VUID0gMSA8PCA2LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0g
KFVSTF9TRVQgfCBTVEFUVVNfU0VUIHwgU1RBVFVTX1RFWFRfU0VUIHwgSEVBREVSU19TRVQgfCBN
SU1FX1RZUEVfU0VUIHwgQ09OTkVDVElPTl9SRVVTRURfU0VUIHwgQ09OTkVDVElPTl9JRF9TRVQp
CiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAg
cHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAg
ICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0
cjxSZXNwb25zZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBSZXNwb25zZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVSTF9TRVQ+
JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFVSTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU1RBVFVTX1NFVD4mIHNldFN0YXR1cyhkb3VibGUgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1RBVFVTX1NFVCksIHByb3BlcnR5
X3N0YXR1c19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0
YXR1cyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVEFUVVNfU0VUPigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUQVRVU19URVhUX1NFVD4mIHNl
dFN0YXR1c1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVEFUVVNfVEVYVF9TRVQpLCBwcm9wZXJ0eV9zdGF0dXNU
ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3RhdHVz
VGV4dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVEFUVVNfVEVYVF9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSEVBREVSU19TRVQ+JiBz
ZXRIZWFkZXJzKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIRUFERVJTX1NFVCksIHByb3BlcnR5
X2hlYWRlcnNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJo
ZWFkZXJzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhFQURFUlNfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE1JTUVfVFlQRV9TRVQ+JiBz
ZXRNaW1lVHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIE1JTUVfVFlQRV9TRVQpLCBwcm9wZXJ0eV9taW1lVHlwZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1pbWVUeXBlIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1JTUVfVFlQRV9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ09OTkVDVElPTl9SRVVTRURfU0VUPiYg
c2V0Q29ubmVjdGlvblJldXNlZChib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIENPTk5FQ1RJT05fUkVVU0VEX1NFVCksIHByb3BlcnR5X2Nv
bm5lY3Rpb25SZXVzZWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9v
bGVhbigiY29ubmVjdGlvblJldXNlZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxDT05ORUNUSU9OX1JFVVNFRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgQ09OTkVDVElPTl9JRF9TRVQ+JiBzZXRDb25uZWN0aW9uSWQoZG91YmxlIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENPTk5FQ1RJ
T05fSURfU0VUKSwgcHJvcGVydHlfY29ubmVjdGlvbklkX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldE51bWJlcigiY29ubmVjdGlvbklkIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPENPTk5FQ1RJT05fSURfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZXNwb25zZT4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxSZXNw
b25zZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UmVzcG9uc2U+KCp0
aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0
b3I6CiAgICAgKiBSZWZQdHI8UmVzcG9uc2U+IHJlc3VsdCA9IFJlc3BvbnNlOjpjcmVhdGUoKQog
ICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKQogICAgICog
ICAgIC5zZXRTdGF0dXNUZXh0KC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4pCiAgICAg
KiAgICAgLnNldE1pbWVUeXBlKC4uLikKICAgICAqICAgICAuc2V0Q29ubmVjdGlvblJldXNlZCgu
Li4pCiAgICAgKiAgICAgLnNldENvbm5lY3Rpb25JZCguLi4pOwogICAgICovCiAgICBzdGF0aWMg
QnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBSZXNwb25zZSgpKSk7CiAgICB9CgogICAg
dm9pZCBzZXRIZWFkZXJzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldFN0cmluZygiaGVhZGVyc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRS
ZXF1ZXN0SGVhZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0T2JqZWN0KCJyZXF1ZXN0SGVhZGVycyIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFJlcXVlc3RIZWFkZXJzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewog
ICAgICAgIHRoaXMtPnNldFN0cmluZygicmVxdWVzdEhlYWRlcnNUZXh0IiwgdmFsdWUpOwogICAg
fQoKICAgIHZvaWQgc2V0RnJvbURpc2tDYWNoZShib29sIHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldEJvb2xlYW4oImZyb21EaXNrQ2FjaGUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRUaW1pbmcoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldE9iamVjdCgidGltaW5nIiwgdmFsdWUpOwogICAgfQogICAgICAgIH07CgovKiBX
ZWJTb2NrZXQgcmVxdWVzdCBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXF1ZXN0IDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19T
RVQgPSAwLAogICAgICAgIFJFUVVFU1RfS0VZM19TRVQgPSAxIDw8IDAsCiAgICAgICAgSEVBREVS
U19TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoUkVRVUVTVF9LRVkzX1NF
VCB8IEhFQURFUlNfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFz
cyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RF
UD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyKFBhc3NSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVh
dGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAg
ICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRSZXF1ZXN0OwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUkVRVUVTVF9LRVkzX1NFVD4mIHNldFJlcXVlc3RLZXkz
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgUkVRVUVTVF9LRVkzX1NFVCksIHByb3BlcnR5X3JlcXVlc3RLZXkzX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygicmVxdWVzdEtleTMiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UkVRVUVTVF9LRVkzX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIRUFERVJTX1NFVD4mIHNldEhlYWRl
cnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhFQURFUlNfU0VUKSwgcHJvcGVydHlfaGVhZGVy
c19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SEVBREVSU19TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NF
VCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPFdlYlNvY2tldFJlcXVlc3Q+IHJlc3VsdCA9IFdlYlNvY2tldFJlcXVlc3Q6OmNyZWF0
ZSgpCiAgICAgKiAgICAgLnNldFJlcXVlc3RLZXkzKC4uLikKICAgICAqICAgICAuc2V0SGVhZGVy
cyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUo
KQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5l
dyBXZWJTb2NrZXRSZXF1ZXN0KCkpKTsKICAgIH0KICAgICAgICB9OwoKLyogV2ViU29ja2V0IHJl
c3BvbnNlIGRhdGEuICovCmNsYXNzIFdlYlNvY2tldFJlc3BvbnNlIDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAog
ICAgICAgIFNUQVRVU19TRVQgPSAxIDw8IDAsCiAgICAgICAgU1RBVFVTX1RFWFRfU0VUID0gMSA8
PCAxLAogICAgICAgIEhFQURFUlNfU0VUID0gMSA8PCAyLAogICAgICAgIENIQUxMRU5HRV9SRVNQ
T05TRV9TRVQgPSAxIDw8IDMsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoU1RBVFVTX1NFVCB8
IFNUQVRVU19URVhUX1NFVCB8IEhFQURFUlNfU0VUIHwgQ0hBTExFTkdFX1JFU1BPTlNFX1NFVCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PFdlYlNvY2tldFJlc3BvbnNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIFdlYlNvY2tldFJlc3BvbnNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU1RBVFVTX1NFVD4mIHNldFN0YXR1cyhkb3VibGUgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1RBVFVTX1NFVCksIHByb3BlcnR5
X3N0YXR1c19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0
YXR1cyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVEFUVVNfU0VUPigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUQVRVU19URVhUX1NFVD4mIHNl
dFN0YXR1c1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVEFUVVNfVEVYVF9TRVQpLCBwcm9wZXJ0eV9zdGF0dXNU
ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3RhdHVz
VGV4dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVEFUVVNfVEVYVF9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSEVBREVSU19TRVQ+JiBz
ZXRIZWFkZXJzKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIRUFERVJTX1NFVCksIHByb3BlcnR5
X2hlYWRlcnNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJo
ZWFkZXJzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhFQURFUlNfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENIQUxMRU5HRV9SRVNQT05T
RV9TRVQ+JiBzZXRDaGFsbGVuZ2VSZXNwb25zZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENIQUxMRU5HRV9SRVNQT05T
RV9TRVQpLCBwcm9wZXJ0eV9jaGFsbGVuZ2VSZXNwb25zZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImNoYWxsZW5nZVJlc3BvbnNlIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENIQUxMRU5HRV9SRVNQT05TRV9TRVQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+JiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQs
IHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8UmVmUHRyPFdlYlNvY2tldFJlc3BvbnNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFdlYlNvY2tldFJlc3BvbnNlPiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4oKnRoaXMpOwogICAg
ICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAq
IFJlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4gcmVzdWx0ID0gV2ViU29ja2V0UmVzcG9uc2U6OmNy
ZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0YXR1cyguLi4pCiAgICAgKiAgICAgLnNldFN0YXR1c1Rl
eHQoLi4uKQogICAgICogICAgIC5zZXRIZWFkZXJzKC4uLikKICAgICAqICAgICAuc2V0Q2hhbGxl
bmdlUmVzcG9uc2UoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NF
VD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihh
ZG9wdFJlZihuZXcgV2ViU29ja2V0UmVzcG9uc2UoKSkpOwogICAgfQogICAgICAgIH07CgovKiBJ
bmZvcm1hdGlvbiBhYm91dCB0aGUgY2FjaGVkIHJlc291cmNlLiAqLwpjbGFzcyBDYWNoZWRSZXNv
dXJjZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBVUkxfU0VUID0gMSA8PCAwLAogICAgICAgIFRZ
UEVfU0VUID0gMSA8PCAxLAogICAgICAgIFJFU1BPTlNFX1NFVCA9IDEgPDwgMiwKICAgICAgICBC
T0RZX1NJWkVfU0VUID0gMSA8PCAzLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFVSTF9TRVQg
fCBUWVBFX1NFVCB8IFJFU1BPTlNFX1NFVCB8IEJPRFlfU0laRV9TRVQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWNoZWRSZXNvdXJj
ZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9f
RklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAg
ICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZWRS
ZXNvdXJjZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVSTF9TRVQ+JiBz
ZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFVSTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVFlQRV9TRVQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVFlQRV9TRVQpLCBwcm9wZXJ0eV90
eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUWVBFX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSRVNQT05TRV9TRVQ+JiBzZXRSZXNwb25zZShQ
YXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgUkVTUE9OU0VfU0VUKSwgcHJvcGVydHlfcmVzcG9uc2Vf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJyZXNwb25zZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSRVNQT05TRV9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQk9EWV9TSVpFX1NFVD4mIHNldEJvZHlT
aXplKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBCT0RZX1NJWkVfU0VUKSwgcHJvcGVydHlfYm9keVNpemVfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJib2R5U2l6ZSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxCT0RZX1NJWkVfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPENhY2hlZFJlc291cmNlPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDYWNo
ZWRSZXNvdXJjZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFz
c1JlZlB0cjxDYWNoZWRSZXNvdXJjZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBS
ZWZQdHI8Q2FjaGVkUmVzb3VyY2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+
IHJlc3VsdCA9IENhY2hlZFJlc291cmNlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRVcmwoLi4u
KQogICAgICogICAgIC5zZXRUeXBlKC4uLikKICAgICAqICAgICAuc2V0UmVzcG9uc2UoLi4uKQog
ICAgICogICAgIC5zZXRCb2R5U2l6ZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxO
T19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJ
RUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDYWNoZWRSZXNvdXJjZSgpKSk7CiAgICB9CiAgICAgICAg
fTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0IGluaXRpYXRvci4gKi8KY2xhc3Mg
SW5pdGlhdG9yIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewog
ICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFRZUEVfU0VUID0gMSA8PCAwLAogICAg
ICAgIEFMTF9GSUVMRFNfU0VUID0gKFRZUEVfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8SW5pdGlhdG9yPiBwdHIpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEluaXRpYXRvcjsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRZUEVfU0VUPiYgc2V0VHlwZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRZ
UEVfU0VUKSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
VFlQRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SW5pdGlhdG9y
PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9G
SUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PFJlZlB0cjxJbml0aWF0b3I+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SW5pdGlhdG9yPiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxJbml0aWF0b3I+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8SW5pdGlh
dG9yPiByZXN1bHQgPSBJbml0aWF0b3I6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4u
KTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAg
IHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgSW5p
dGlhdG9yKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YWNrVHJhY2UoUGFzc1JlZlB0cjxJbnNw
ZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoInN0YWNrVHJh
Y2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgIH0KCiAgICB2
b2lkIHNldExpbmVOdW1iZXIoZG91YmxlIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51
bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAgIH0KICAgICAgICB9OwoKfSAvLyBOZXR3b3Jr
CgojaWYgRU5BQkxFKFNRTF9EQVRBQkFTRSkKbmFtZXNwYWNlIERhdGFiYXNlIHsKLyogRGF0YWJh
c2Ugb2JqZWN0LiAqLwpjbGFzcyBEYXRhYmFzZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qgewpw
dWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBJRF9T
RVQgPSAxIDw8IDAsCiAgICAgICAgRE9NQUlOX1NFVCA9IDEgPDwgMSwKICAgICAgICBOQU1FX1NF
VCA9IDEgPDwgMiwKICAgICAgICBWRVJTSU9OX1NFVCA9IDEgPDwgMywKICAgICAgICBBTExfRklF
TERTX1NFVCA9IChJRF9TRVQgfCBET01BSU5fU0VUIHwgTkFNRV9TRVQgfCBWRVJTSU9OX1NFVCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PERhdGFiYXNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwog
ICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNz
IERhdGFiYXNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSURfU0VUPiYg
c2V0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBJRF9TRVQpLCBwcm9wZXJ0eV9pZF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPElEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBET01BSU5fU0VUPiYgc2V0RG9tYWluKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRE9NQUlOX1NFVCksIHByb3BlcnR5
X2RvbWFpbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImRv
bWFpbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxET01BSU5fU0VUPigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5BTUVfU0VUPiYgc2V0TmFtZShj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIE5BTUVfU0VUKSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8TkFNRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgVkVSU0lPTl9TRVQ+JiBzZXRWZXJzaW9uKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVkVSU0lPTl9TRVQpLCBwcm9w
ZXJ0eV92ZXJzaW9uX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygidmVyc2lvbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxWRVJTSU9O
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxEYXRhYmFzZT4mICgp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERT
X1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxSZWZQdHI8RGF0YWJhc2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFBhc3NSZWZQdHI8RGF0YWJhc2U+ICgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gUmVmUHRyPERhdGFiYXNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgog
ICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPERhdGFiYXNlPiByZXN1
bHQgPSBEYXRhYmFzZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0SWQoLi4uKQogICAgICogICAg
IC5zZXREb21haW4oLi4uKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0
VmVyc2lvbiguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBj
cmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0
UmVmKG5ldyBEYXRhYmFzZSgpKSk7CiAgICB9CiAgICAgICAgfTsKCn0gLy8gRGF0YWJhc2UKCiNl
bmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQpuYW1lc3BhY2UgRE9NU3RvcmFnZSB7Ci8qIERP
TSBTdG9yYWdlIGVudHJ5LiAqLwpjbGFzcyBFbnRyeSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qg
ewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBI
T1NUX1NFVCA9IDEgPDwgMCwKICAgICAgICBJU19MT0NBTF9TVE9SQUdFX1NFVCA9IDEgPDwgMSwK
ICAgICAgICBJRF9TRVQgPSAxIDw8IDIsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoSE9TVF9T
RVQgfCBJU19MT0NBTF9TVE9SQUdFX1NFVCB8IElEX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEVudHJ5PiBwdHIpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEVudHJ5OwogICAgcHVibGljOgoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgSE9TVF9TRVQ+JiBzZXRIb3N0KGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSE9TVF9T
RVQpLCBwcm9wZXJ0eV9ob3N0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygiaG9zdCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIT1NU
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJU19MT0NBTF9TVE9S
QUdFX1NFVD4mIHNldElzTG9jYWxTdG9yYWdlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSVNfTE9DQUxfU1RPUkFHRV9TRVQpLCBwcm9w
ZXJ0eV9pc0xvY2FsU3RvcmFnZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRCb29sZWFuKCJpc0xvY2FsU3RvcmFnZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxJU19MT0NBTF9TVE9SQUdFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBJRF9TRVQ+JiBzZXRJZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSURfU0VUKSwgcHJvcGVydHlfaWRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJpZCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBSZWZQdHI8RW50cnk+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEVudHJ5Pio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEVudHJ5PiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxFbnRyeT4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxFbnRyeT4gcmVzdWx0ID0gRW50cnk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEhvc3QoLi4u
KQogICAgICogICAgIC5zZXRJc0xvY2FsU3RvcmFnZSguLi4pCiAgICAgKiAgICAgLnNldElkKC4u
Lik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IEVu
dHJ5KCkpKTsKICAgIH0KICAgICAgICB9OwoKfSAvLyBET01TdG9yYWdlCgpuYW1lc3BhY2UgQXBw
bGljYXRpb25DYWNoZSB7Ci8qIERldGFpbGVkIGFwcGxpY2F0aW9uIGNhY2hlIHJlc291cmNlIGlu
Zm9ybWF0aW9uLiAqLwpjbGFzcyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UgOiBwdWJsaWMgSW5z
cGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9
IDAsCiAgICAgICAgVVJMX1NFVCA9IDEgPDwgMCwKICAgICAgICBTSVpFX1NFVCA9IDEgPDwgMSwK
ICAgICAgICBUWVBFX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChVUkxf
U0VUIHwgU0laRV9TRVQgfCBUWVBFX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRF
PgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxT
VEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERT
X1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9y
ZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBBcHBsaWNhdGlvbkNh
Y2hlUmVzb3VyY2U7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVUkxfU0VU
PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVVJMX1NFVCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxVUkxfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFNJWkVfU0VUPiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0laRV9TRVQpLCBwcm9wZXJ0eV9zaXplX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTSVpFX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUWVBFX1NFVD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUWVBF
X1NFVCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRZ
UEVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEFwcGxpY2F0aW9u
Q2FjaGVSZXNvdXJjZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNl
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEFw
cGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBS
ZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsK
CiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEFwcGxp
Y2F0aW9uQ2FjaGVSZXNvdXJjZT4gcmVzdWx0ID0gQXBwbGljYXRpb25DYWNoZVJlc291cmNlOjpj
cmVhdGUoKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRTaXplKC4uLikK
ICAgICAqICAgICAuc2V0VHlwZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19G
SUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxE
U19TRVQ+KGFkb3B0UmVmKG5ldyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UoKSkpOwogICAgfQog
ICAgICAgIH07CgovKiBEZXRhaWxlZCBhcHBsaWNhdGlvbiBjYWNoZSBpbmZvcm1hdGlvbi4gKi8K
Y2xhc3MgQXBwbGljYXRpb25DYWNoZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBNQU5JRkVTVF9V
X1JfTF9TRVQgPSAxIDw8IDAsCiAgICAgICAgU0laRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgQ1JF
QVRJT05fVElNRV9TRVQgPSAxIDw8IDIsCiAgICAgICAgVVBEQVRFX1RJTUVfU0VUID0gMSA8PCAz
LAogICAgICAgIFJFU09VUkNFU19TRVQgPSAxIDw8IDQsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQg
PSAoTUFOSUZFU1RfVV9SX0xfU0VUIHwgU0laRV9TRVQgfCBDUkVBVElPTl9USU1FX1NFVCB8IFVQ
REFURV9USU1FX1NFVCB8IFJFU09VUkNFU19TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxBcHBsaWNhdGlvbkNhY2hlPiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VU
LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3Vs
dCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEFwcGxpY2F0aW9uQ2FjaGU7
CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNQU5JRkVTVF9VX1JfTF9TRVQ+
JiBzZXRNYW5pZmVzdFVSTChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1BTklGRVNUX1VfUl9MX1NFVCksIHByb3BlcnR5
X21hbmlmZXN0VVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygibWFuaWZlc3RVUkwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TUFO
SUZFU1RfVV9SX0xfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNJ
WkVfU0VUPiYgc2V0U2l6ZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgU0laRV9TRVQpLCBwcm9wZXJ0eV9zaXplX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTSVpFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBDUkVBVElPTl9USU1FX1NFVD4mIHNldENyZWF0aW9uVGltZShkb3VibGUg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ1JF
QVRJT05fVElNRV9TRVQpLCBwcm9wZXJ0eV9jcmVhdGlvblRpbWVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjcmVhdGlvblRpbWUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q1JFQVRJT05fVElNRV9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVVBEQVRFX1RJTUVfU0VUPiYgc2V0VXBkYXRlVGltZShk
b3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgVVBEQVRFX1RJTUVfU0VUKSwgcHJvcGVydHlfdXBkYXRlVGltZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInVwZGF0ZVRpbWUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8VVBEQVRFX1RJTUVfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFJFU09VUkNFU19TRVQ+JiBzZXRSZXNvdXJjZXMoUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgUkVTT1VSQ0VTX1NFVCksIHByb3BlcnR5X3Jlc291cmNlc19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgicmVzb3VyY2VzIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJFU09VUkNFU19TRVQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4mICgpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwg
cmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxBcHBsaWNhdGlvbkNhY2hlPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlPigqdGhpcyk7CiAgICAgICAg
fQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVm
UHRyPEFwcGxpY2F0aW9uQ2FjaGU+IHJlc3VsdCA9IEFwcGxpY2F0aW9uQ2FjaGU6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldE1hbmlmZXN0VVJMKC4uLikKICAgICAqICAgICAuc2V0U2l6ZSguLi4p
CiAgICAgKiAgICAgLnNldENyZWF0aW9uVGltZSguLi4pCiAgICAgKiAgICAgLnNldFVwZGF0ZVRp
bWUoLi4uKQogICAgICogICAgIC5zZXRSZXNvdXJjZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGlj
IEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQXBwbGljYXRpb25DYWNoZSgpKSk7CiAg
ICB9CiAgICAgICAgfTsKCi8qIEZyYW1lIGlkZW50aWZpZXIgLSBtYW5pZmVzdCBVUkwgcGFpci4g
Ki8KY2xhc3MgRnJhbWVXaXRoTWFuaWZlc3QgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgRlJBTUVf
SURfU0VUID0gMSA8PCAwLAogICAgICAgIE1BTklGRVNUX1VfUl9MX1NFVCA9IDEgPDwgMSwKICAg
ICAgICBTVEFUVVNfU0VUID0gMSA8PCAyLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKEZSQU1F
X0lEX1NFVCB8IE1BTklGRVNUX1VfUl9MX1NFVCB8IFNUQVRVU19TRVQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxGcmFtZVdpdGhNYW5p
ZmVzdD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
Tk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBGcmFt
ZVdpdGhNYW5pZmVzdDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEZSQU1F
X0lEX1NFVD4mIHNldEZyYW1lSWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGUkFNRV9JRF9TRVQpLCBwcm9wZXJ0eV9m
cmFtZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiZnJh
bWVJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxGUkFNRV9JRF9TRVQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTUFOSUZFU1RfVV9SX0xfU0VU
PiYgc2V0TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNQU5JRkVTVF9VX1JfTF9TRVQpLCBwcm9wZXJ0
eV9tYW5pZmVzdFVSTF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJp
bmcoIm1hbmlmZXN0VVJMIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1B
TklGRVNUX1VfUl9MX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBT
VEFUVVNfU0VUPiYgc2V0U3RhdHVzKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVEFUVVNfU0VUKSwgcHJvcGVydHlfc3RhdHVzX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3RhdHVzIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNUQVRVU19TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+JiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPEZyYW1lV2l0aE1hbmlmZXN0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxGcmFtZVdpdGhNYW5pZmVzdD4gcmVzdWx0ID0gRnJhbWVXaXRoTWFuaWZlc3Q6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldEZyYW1lSWQoLi4uKQogICAgICogICAgIC5zZXRNYW5pZmVzdFVSTCgu
Li4pCiAgICAgKiAgICAgLnNldFN0YXR1cyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBGcmFtZVdpdGhNYW5pZmVzdCgpKSk7CiAgICB9CiAg
ICAgICAgfTsKCn0gLy8gQXBwbGljYXRpb25DYWNoZQoKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkK
bmFtZXNwYWNlIEZpbGVTeXN0ZW0gewp9IC8vIEZpbGVTeXN0ZW0KCiNlbmRpZiAvLyBFTkFCTEUo
RklMRV9TWVNURU0pCm5hbWVzcGFjZSBET00gewovKiBET00gaW50ZXJhY3Rpb24gaXMgaW1wbGVt
ZW50ZWQgaW4gdGVybXMgb2YgbWlycm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIGFjdHVh
bCBET00gbm9kZXMuIERPTU5vZGUgaXMgYSBiYXNlIG5vZGUgbWlycm9yIHR5cGUuICovCmNsYXNz
IE5vZGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAg
ICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgTk9ERV9JRF9TRVQgPSAxIDw8IDAsCiAgICAg
ICAgTk9ERV9UWVBFX1NFVCA9IDEgPDwgMSwKICAgICAgICBOT0RFX05BTUVfU0VUID0gMSA8PCAy
LAogICAgICAgIExPQ0FMX05BTUVfU0VUID0gMSA8PCAzLAogICAgICAgIE5PREVfVkFMVUVfU0VU
ID0gMSA8PCA0LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKE5PREVfSURfU0VUIHwgTk9ERV9U
WVBFX1NFVCB8IE5PREVfTkFNRV9TRVQgfCBMT0NBTF9OQU1FX1NFVCB8IE5PREVfVkFMVUVfU0VU
KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAg
IHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAg
ICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxT
VEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQ
dHI8Tm9kZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBO
b2RlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9JRF9TRVQ+JiBz
ZXROb2RlSWQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIE5PREVfSURfU0VUKSwgcHJvcGVydHlfbm9kZUlkX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibm9kZUlkIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPE5PREVfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE5PREVfVFlQRV9TRVQ+JiBzZXROb2RlVHlwZShpbnQgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTk9ERV9UWVBFX1NFVCks
IHByb3BlcnR5X25vZGVUeXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dE51bWJlcigibm9kZVR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
Tk9ERV9UWVBFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOT0RF
X05BTUVfU0VUPiYgc2V0Tm9kZU5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOT0RFX05BTUVfU0VUKSwgcHJvcGVy
dHlfbm9kZU5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJub2RlTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOT0RFX05B
TUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExPQ0FMX05BTUVf
U0VUPiYgc2V0TG9jYWxOYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTE9DQUxfTkFNRV9TRVQpLCBwcm9wZXJ0eV9s
b2NhbE5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJs
b2NhbE5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TE9DQUxfTkFN
RV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9WQUxVRV9T
RVQ+JiBzZXROb2RlVmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOT0RFX1ZBTFVFX1NFVCksIHByb3BlcnR5X25v
ZGVWYWx1ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5v
ZGVWYWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOT0RFX1ZBTFVF
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxOb2RlPiYgKCkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VU
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxOb2RlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBQYXNzUmVmUHRyPE5vZGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PE5vZGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0gTm9kZTo6Y3JlYXRlKCkK
ICAgICAqICAgICAuc2V0Tm9kZUlkKC4uLikKICAgICAqICAgICAuc2V0Tm9kZVR5cGUoLi4uKQog
ICAgICogICAgIC5zZXROb2RlTmFtZSguLi4pCiAgICAgKiAgICAgLnNldExvY2FsTmFtZSguLi4p
CiAgICAgKiAgICAgLnNldE5vZGVWYWx1ZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBOb2RlKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldENo
aWxkTm9kZUNvdW50KGludCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImNo
aWxkTm9kZUNvdW50IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0Q2hpbGRyZW4oUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXko
ImNoaWxkcmVuIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0QXR0cmlidXRlcyhQYXNzUmVm
UHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgi
YXR0cmlidXRlcyIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldERvY3VtZW50VVJMKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVS
TCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFB1YmxpY0lkKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwdWJsaWNJZCIsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIHNldFN5c3RlbUlkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0U3RyaW5nKCJzeXN0ZW1JZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dEludGVybmFsU3Vic2V0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJpbnRlcm5hbFN1YnNldCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFht
bFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoInhtbFZlcnNpb24iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5z
cGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCiAgICAgICAgfTsKCi8qIERPTSBpbnRlcmFjdGlvbiBp
cyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBtaXJyb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCB0
aGUgYWN0dWFsIERPTSBub2Rlcy4gRE9NTm9kZSBpcyBhIGJhc2Ugbm9kZSBtaXJyb3IgdHlwZS4g
Ki8KY2xhc3MgRXZlbnRMaXN0ZW5lciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBUWVBFX1NFVCA9
IDEgPDwgMCwKICAgICAgICBVU0VfQ0FQVFVSRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgSVNfQVRU
UklCVVRFX1NFVCA9IDEgPDwgMiwKICAgICAgICBOT0RFX0lEX1NFVCA9IDEgPDwgMywKICAgICAg
ICBIQU5ETEVSX0JPRFlfU0VUID0gMSA8PCA0LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFRZ
UEVfU0VUIHwgVVNFX0NBUFRVUkVfU0VUIHwgSVNfQVRUUklCVVRFX1NFVCB8IE5PREVfSURfU0VU
IHwgSEFORExFUl9CT0RZX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPEV2ZW50TGlzdGVuZXI+IHB0cikKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRXZlbnRMaXN0ZW5lcjsKICAgIHB1YmxpYzoKCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFRZUEVfU0VUPiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRZUEVf
U0VUKSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VFlQ
RV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVVNFX0NBUFRVUkVf
U0VUPiYgc2V0VXNlQ2FwdHVyZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFVTRV9DQVBUVVJFX1NFVCksIHByb3BlcnR5X3VzZUNhcHR1
cmVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigidXNlQ2Fw
dHVyZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVU0VfQ0FQVFVSRV9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSVNfQVRUUklCVVRFX1NF
VD4mIHNldElzQXR0cmlidXRlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgSVNfQVRUUklCVVRFX1NFVCksIHByb3BlcnR5X2lzQXR0cmli
dXRlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImlzQXR0
cmlidXRlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElTX0FUVFJJQlVU
RV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9JRF9TRVQ+
JiBzZXROb2RlSWQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIE5PREVfSURfU0VUKSwgcHJvcGVydHlfbm9kZUlkX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibm9kZUlkIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPE5PREVfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IEhBTkRMRVJfQk9EWV9TRVQ+JiBzZXRIYW5kbGVyQm9keShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIEhBTkRMRVJfQk9EWV9TRVQpLCBwcm9wZXJ0eV9oYW5kbGVyQm9keV9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImhhbmRsZXJCb2R5IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhBTkRMRVJfQk9EWV9TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8RXZlbnRMaXN0ZW5lcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxFdmVudExpc3RlbmVyPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEV2ZW50TGlzdGVu
ZXI+IHJlc3VsdCA9IEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUo
Li4uKQogICAgICogICAgIC5zZXRVc2VDYXB0dXJlKC4uLikKICAgICAqICAgICAuc2V0SXNBdHRy
aWJ1dGUoLi4uKQogICAgICogICAgIC5zZXROb2RlSWQoLi4uKQogICAgICogICAgIC5zZXRIYW5k
bGVyQm9keSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBj
cmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0
UmVmKG5ldyBFdmVudExpc3RlbmVyKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldExvY2F0aW9uKFBh
c3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRP
YmplY3QoImxvY2F0aW9uIiwgdmFsdWUpOwogICAgfQogICAgICAgIH07CgovKiBBIHN0cnVjdHVy
ZSBob2xkaW5nIGFuIFJHQkEgY29sb3IuICovCi8vIFR5cGUgb3JpZ2luYWxseSB3YXMgbmFtZWQg
J1JHQkEnLgpjbGFzcyBSZ2JhIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFJfU0VUID0gMSA8PCAw
LAogICAgICAgIEdfU0VUID0gMSA8PCAxLAogICAgICAgIEJfU0VUID0gMSA8PCAyLAogICAgICAg
IEFMTF9GSUVMRFNfU0VUID0gKFJfU0VUIHwgR19TRVQgfCBCX1NFVCkKICAgIH07CgogICAgdGVt
cGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQg
U1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRo
aXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJnYmE+IHB0cikKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQs
IGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0
ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmdiYTsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJfU0VUPiYgc2V0UihpbnQgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUl9TRVQpLCBwcm9wZXJ0eV9y
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiciIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSX1NFVD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBHX1NFVD4mIHNldEcoaW50IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEdfU0VUKSwgcHJvcGVydHlfZ19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImciLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8R19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgQl9TRVQ+JiBzZXRCKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBCX1NFVCksIHByb3BlcnR5X2JfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJiIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPEJfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUmVmUHRyPFJnYmE+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJnYmE+Kj4oJm1fcmVzdWx0KTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmdiYT4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8UmdiYT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07Cgog
ICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZ2JhPiBy
ZXN1bHQgPSBSZ2JhOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRSKC4uLikKICAgICAqICAgICAu
c2V0RyguLi4pCiAgICAgKiAgICAgLnNldEIoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
T19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgUmdiYSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRB
KGRvdWJsZSB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImEiLCB2YWx1ZSk7
CiAgICB9CiAgICAgICAgfTsKCi8qIENvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGhpZ2hsaWdo
dGluZyBvZiBwYWdlIGVsZW1lbnRzLiAqLwpjbGFzcyBIaWdobGlnaHRDb25maWcgOiBwdWJsaWMg
SW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NF
VCA9IDAsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAwCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxIaWdobGlnaHRDb25maWc+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgSGlnaGxpZ2h0Q29uZmln
OwogICAgcHVibGljOgoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiYg
KCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVM
RFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PFJlZlB0cjxIaWdobGlnaHRDb25maWc+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxIaWdobGlnaHRDb25maWc+KCp0aGlzKTsKICAg
ICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAg
KiBSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiByZXN1bHQgPSBIaWdobGlnaHRDb25maWc6OmNyZWF0
ZSgpOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQog
ICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBI
aWdobGlnaHRDb25maWcoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0U2hvd0luZm8oYm9vbCB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29sZWFuKCJzaG93SW5mbyIsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIHNldENvbnRlbnRDb2xvcihQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJjb250ZW50Q29sb3IiLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBzZXRQYWRkaW5nQ29sb3IoUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicGFkZGluZ0NvbG9y
IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0Qm9yZGVyQ29sb3IoUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiYm9yZGVy
Q29sb3IiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRNYXJnaW5Db2xvcihQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJt
YXJnaW5Db2xvciIsIHZhbHVlKTsKICAgIH0KICAgICAgICB9OwoKfSAvLyBET00KCm5hbWVzcGFj
ZSBDU1MgewovKiBUaGlzIG9iamVjdCBpZGVudGlmaWVzIGEgQ1NTIHN0eWxlIGluIGEgdW5pcXVl
IHdheS4gKi8KY2xhc3MgQ1NTU3R5bGVJZCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJs
aWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTVFlMRV9T
SEVFVF9JRF9TRVQgPSAxIDw8IDAsCiAgICAgICAgT1JESU5BTF9TRVQgPSAxIDw8IDEsCiAgICAg
ICAgQUxMX0ZJRUxEU19TRVQgPSAoU1RZTEVfU0hFRVRfSURfU0VUIHwgT1JESU5BTF9TRVQpCiAg
ICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJp
dmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAg
dGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRF
IHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxD
U1NTdHlsZUlkPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwog
ICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNz
IENTU1N0eWxlSWQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTVFlMRV9T
SEVFVF9JRF9TRVQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVFlMRV9TSEVFVF9JRF9T
RVQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8U1RZTEVfU0hFRVRfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE9SRElOQUxfU0VUPiYgc2V0T3JkaW5hbChpbnQgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT1JESU5BTF9TRVQpLCBwcm9w
ZXJ0eV9vcmRpbmFsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJl
cigib3JkaW5hbCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPUkRJTkFM
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZUlkPiYg
KCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVM
RFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PFJlZlB0cjxDU1NTdHlsZUlkPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlSWQ+ICgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxlSWQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5
bGVJZD4gcmVzdWx0ID0gQ1NTU3R5bGVJZDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVT
aGVldElkKC4uLikKICAgICAqICAgICAuc2V0T3JkaW5hbCguLi4pOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBC
dWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZUlkKCkpKTsKICAgIH0K
ICAgICAgICB9OwoKLyogVGhpcyBvYmplY3QgaWRlbnRpZmllcyBhIENTUyBydWxlIGluIGEgdW5p
cXVlIHdheS4gKi8KY2xhc3MgQ1NTUnVsZUlkIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1
YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFNUWUxF
X1NIRUVUX0lEX1NFVCA9IDEgPDwgMCwKICAgICAgICBPUkRJTkFMX1NFVCA9IDEgPDwgMSwKICAg
ICAgICBBTExfRklFTERTX1NFVCA9IChTVFlMRV9TSEVFVF9JRF9TRVQgfCBPUkRJTkFMX1NFVCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PENTU1J1bGVJZD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBDU1NSdWxlSWQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTVFlMRV9T
SEVFVF9JRF9TRVQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVFlMRV9TSEVFVF9JRF9T
RVQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8U1RZTEVfU0hFRVRfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE9SRElOQUxfU0VUPiYgc2V0T3JkaW5hbChpbnQgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT1JESU5BTF9TRVQpLCBwcm9w
ZXJ0eV9vcmRpbmFsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJl
cigib3JkaW5hbCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPUkRJTkFM
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NSdWxlSWQ+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxE
U19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPENTU1J1bGVJZD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NSdWxlSWQ+ICgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gUmVmUHRyPENTU1J1bGVJZD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NSdWxlSWQ+
IHJlc3VsdCA9IENTU1J1bGVJZDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVTaGVldElk
KC4uLikKICAgICAqICAgICAuc2V0T3JkaW5hbCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVy
PE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDU1NSdWxlSWQoKSkpOwogICAgfQogICAgICAg
IH07CgovKiBDU1MgcnVsZSBjb2xsZWN0aW9uIGZvciBhIHNpbmdsZSBwc2V1ZG8gc3R5bGUuICov
CmNsYXNzIFBzZXVkb0lkUnVsZXMgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgog
ICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgUFNFVURPX0lEX1NF
VCA9IDEgPDwgMCwKICAgICAgICBSVUxFU19TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxE
U19TRVQgPSAoUFNFVURPX0lEX1NFVCB8IFJVTEVTX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFBzZXVkb0lkUnVsZXM+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUHNldWRvSWRSdWxlczsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFBTRVVET19JRF9TRVQ+JiBzZXRQ
c2V1ZG9JZChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgUFNFVURPX0lEX1NFVCksIHByb3BlcnR5X3BzZXVkb0lkX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicHNldWRvSWQiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8UFNFVURPX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBSVUxFU19TRVQ+JiBzZXRSdWxlcyhQYXNzUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBSVUxFU19TRVQpLCBwcm9wZXJ0eV9ydWxlc19hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRBcnJheSgicnVsZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8UlVMRVNfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPFBzZXVkb0lkUnVsZXM+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFBzZXVkb0lkUnVsZXM+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UHNldWRvSWRS
dWxlcz4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UHNldWRvSWRSdWxl
cz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxQc2V1ZG9JZFJ1bGVzPiByZXN1bHQgPSBQc2V1ZG9JZFJ1
bGVzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRQc2V1ZG9JZCguLi4pCiAgICAgKiAgICAgLnNl
dFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRS
ZWYobmV3IFBzZXVkb0lkUnVsZXMoKSkpOwogICAgfQogICAgICAgIH07CgovKiBDU1MgcnVsZSBj
b2xsZWN0aW9uIGZvciBhIHNpbmdsZSBwc2V1ZG8gc3R5bGUuICovCmNsYXNzIEluaGVyaXRlZFN0
eWxlRW50cnkgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAg
ICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgTUFUQ0hFRF9DU1NfUlVMRVNfU0VUID0g
MSA8PCAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKE1BVENIRURfQ1NTX1JVTEVTX1NFVCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PEluaGVyaXRlZFN0eWxlRW50cnk+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgSW5oZXJpdGVkU3R5bGVFbnRyeTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE1BVENIRURfQ1NTX1JVTEVTX1NFVD4mIHNldE1hdGNoZWRDU1NSdWxlcyhQ
YXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNQVRDSEVEX0NTU19SVUxFU19TRVQpLCBwcm9wZXJ0eV9t
YXRjaGVkQ1NTUnVsZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJy
YXkoIm1hdGNoZWRDU1NSdWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxNQVRDSEVEX0NTU19SVUxFU19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8SW5oZXJpdGVkU3R5bGVFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8SW5oZXJpdGVkU3R5
bGVFbnRyeT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
IFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAg
ICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEluaGVyaXRl
ZFN0eWxlRW50cnk+IHJlc3VsdCA9IEluaGVyaXRlZFN0eWxlRW50cnk6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldE1hdGNoZWRDU1NSdWxlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBJbmhlcml0ZWRTdHlsZUVudHJ5KCkpKTsKICAgIH0K
CiAgICB2b2lkIHNldElubGluZVN0eWxlKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoImlubGluZVN0eWxlIiwgdmFsdWUpOwog
ICAgfQogICAgICAgIH07CgovKiBDU1Mgc3R5bGUgaW5mb3JtYXRpb24gZm9yIGEgRE9NIHN0eWxl
IGF0dHJpYnV0ZS4gKi8KY2xhc3MgQ1NTU3R5bGVBdHRyaWJ1dGUgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgTkFNRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgU1RZTEVfU0VUID0gMSA8PCAxLAogICAg
ICAgIEFMTF9GSUVMRFNfU0VUID0gKE5BTUVfU0VUIHwgU1RZTEVfU0VUKQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVBdHRy
aWJ1dGU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NT
U3R5bGVBdHRyaWJ1dGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOQU1F
X1NFVD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOQU1FX1NFVCksIHByb3BlcnR5X25hbWVfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5BTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFNUWUxFX1NFVD4mIHNldFN0eWxlKFBhc3NSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBTVFlMRV9TRVQpLCBwcm9wZXJ0eV9zdHlsZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoInN0eWxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFNUWUxFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1
dGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8
Q1NTU3R5bGVBdHRyaWJ1dGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PENTU1N0eWxlQXR0cmlidXRlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1N0eWxlQXR0cmlidXRl
PiByZXN1bHQgPSBDU1NTdHlsZUF0dHJpYnV0ZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFt
ZSguLi4pCiAgICAgKiAgICAgLnNldFN0eWxlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8
Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IENTU1N0eWxlQXR0cmlidXRlKCkpKTsKICAgIH0K
ICAgICAgICB9OwoKLyogQ1NTIHN0eWxlc2hlZXQgbWV0YWluZm9ybWF0aW9uLiAqLwpjbGFzcyBD
U1NTdHlsZVNoZWV0SGVhZGVyIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFNUWUxFX1NIRUVUX0lE
X1NFVCA9IDEgPDwgMCwKICAgICAgICBTT1VSQ0VfVV9SX0xfU0VUID0gMSA8PCAxLAogICAgICAg
IFRJVExFX1NFVCA9IDEgPDwgMiwKICAgICAgICBESVNBQkxFRF9TRVQgPSAxIDw8IDMsCiAgICAg
ICAgQUxMX0ZJRUxEU19TRVQgPSAoU1RZTEVfU0hFRVRfSURfU0VUIHwgU09VUkNFX1VfUl9MX1NF
VCB8IFRJVExFX1NFVCB8IERJU0FCTEVEX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVTaGVldEhl
YWRlcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUWUxFX1NIRUVUX0lE
X1NFVD4mIHNldFN0eWxlU2hlZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNUWUxFX1NIRUVUX0lEX1NFVCksIHBy
b3BlcnR5X3N0eWxlU2hlZXRJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoInN0eWxlU2hlZXRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxTVFlMRV9TSEVFVF9JRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgU09VUkNFX1VfUl9MX1NFVD4mIHNldFNvdXJjZVVSTChjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNPVVJDRV9V
X1JfTF9TRVQpLCBwcm9wZXJ0eV9zb3VyY2VVUkxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJzb3VyY2VVUkwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8U09VUkNFX1VfUl9MX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBUSVRMRV9TRVQ+JiBzZXRUaXRsZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRJVExFX1NFVCksIHBy
b3BlcnR5X3RpdGxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygidGl0bGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VElUTEVfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERJU0FCTEVEX1NFVD4mIHNl
dERpc2FibGVkKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgRElTQUJMRURfU0VUKSwgcHJvcGVydHlfZGlzYWJsZWRfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiZGlzYWJsZWQiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RElTQUJMRURfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+JiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4oKnRoaXMpOwogICAg
ICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAq
IFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiByZXN1bHQgPSBDU1NTdHlsZVNoZWV0SGVhZGVy
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdHlsZVNoZWV0SWQoLi4uKQogICAgICogICAgIC5z
ZXRTb3VyY2VVUkwoLi4uKQogICAgICogICAgIC5zZXRUaXRsZSguLi4pCiAgICAgKiAgICAgLnNl
dERpc2FibGVkKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRv
cHRSZWYobmV3IENTU1N0eWxlU2hlZXRIZWFkZXIoKSkpOwogICAgfQogICAgICAgIH07CgovKiBD
U1Mgc3R5bGVzaGVldCBjb250ZW50cy4gKi8KY2xhc3MgQ1NTU3R5bGVTaGVldEJvZHkgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERT
X1NFVCA9IDAsCiAgICAgICAgU1RZTEVfU0hFRVRfSURfU0VUID0gMSA8PCAwLAogICAgICAgIFJV
TEVTX1NFVCA9IDEgPDwgMSwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChTVFlMRV9TSEVFVF9J
RF9TRVQgfCBSVUxFU19TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNs
YXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9j
cmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAg
ICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDU1NTdHlsZVNoZWV0Qm9keTsKICAgIHB1Ymxp
YzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUWUxFX1NIRUVUX0lEX1NFVD4mIHNldFN0eWxl
U2hlZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFNUWUxFX1NIRUVUX0lEX1NFVCksIHByb3BlcnR5X3N0eWxlU2hl
ZXRJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0eWxl
U2hlZXRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVFlMRV9TSEVF
VF9JRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUlVMRVNfU0VU
PiYgc2V0UnVsZXMoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUlVMRVNfU0VUKSwgcHJvcGVydHlf
cnVsZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInJ1bGVz
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJVTEVTX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NF
VCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+ICgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5PigqdGhpcyk7CiAg
ICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAg
ICogUmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5PiByZXN1bHQgPSBDU1NTdHlsZVNoZWV0Qm9keTo6
Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVTaGVldElkKC4uLikKICAgICAqICAgICAuc2V0
UnVsZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJl
ZihuZXcgQ1NTU3R5bGVTaGVldEJvZHkoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0VGV4dChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygidGV4dCIsIHZh
bHVlKTsKICAgIH0KICAgICAgICB9OwoKLyogQ1NTIHJ1bGUgcmVwcmVzZW50YXRpb24uICovCmNs
YXNzIENTU1J1bGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7
CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgU0VMRUNUT1JfVEVYVF9TRVQgPSAx
IDw8IDAsCiAgICAgICAgU09VUkNFX0xJTkVfU0VUID0gMSA8PCAxLAogICAgICAgIE9SSUdJTl9T
RVQgPSAxIDw8IDIsCiAgICAgICAgU1RZTEVfU0VUID0gMSA8PCAzLAogICAgICAgIEFMTF9GSUVM
RFNfU0VUID0gKFNFTEVDVE9SX1RFWFRfU0VUIHwgU09VUkNFX0xJTkVfU0VUIHwgT1JJR0lOX1NF
VCB8IFNUWUxFX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPENTU1J1bGU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgQ1NTUnVsZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFNFTEVDVE9SX1RFWFRfU0VUPiYgc2V0U2VsZWN0b3JUZXh0KGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0VMRUNU
T1JfVEVYVF9TRVQpLCBwcm9wZXJ0eV9zZWxlY3RvclRleHRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzZWxlY3RvclRleHQiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8U0VMRUNUT1JfVEVYVF9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgU09VUkNFX0xJTkVfU0VUPiYgc2V0U291cmNlTGluZShpbnQg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU09V
UkNFX0xJTkVfU0VUKSwgcHJvcGVydHlfc291cmNlTGluZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNvdXJjZUxpbmUiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8U09VUkNFX0xJTkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IE9SSUdJTl9TRVQ+JiBzZXRPcmlnaW4oY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPUklHSU5f
U0VUKSwgcHJvcGVydHlfb3JpZ2luX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygib3JpZ2luIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PE9SSUdJTl9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1RZTEVf
U0VUPiYgc2V0U3R5bGUoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNUWUxFX1NFVCksIHByb3Bl
cnR5X3N0eWxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgi
c3R5bGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U1RZTEVfU0VUPigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1J1bGU+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPENTU1J1bGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFBhc3NSZWZQdHI8Q1NTUnVsZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQ
dHI8Q1NTUnVsZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NSdWxlPiByZXN1bHQgPSBDU1NSdWxl
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTZWxlY3RvclRleHQoLi4uKQogICAgICogICAgIC5z
ZXRTb3VyY2VMaW5lKC4uLikKICAgICAqICAgICAuc2V0T3JpZ2luKC4uLikKICAgICAqICAgICAu
c2V0U3R5bGUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4g
Y3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9w
dFJlZihuZXcgQ1NTUnVsZSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRSdWxlSWQoUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgi
cnVsZUlkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U291cmNlVVJMKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzb3VyY2VVUkwiLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTZWxlY3RvclJhbmdlKFBhc3NSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInNlbGVjdG9yUmFu
Z2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRNZWRpYShQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgibWVkaWEiLCB2YWx1
ZSk7CiAgICB9CiAgICAgICAgfTsKCi8qIFRleHQgcmFuZ2Ugd2l0aGluIGEgcmVzb3VyY2UuICov
CmNsYXNzIFNvdXJjZVJhbmdlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFNUQVJUX1NFVCA9IDEg
PDwgMCwKICAgICAgICBFTkRfU0VUID0gMSA8PCAxLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0g
KFNUQVJUX1NFVCB8IEVORF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAg
IGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTb3VyY2VSYW5nZT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVh
dGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAg
ICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBTb3VyY2VSYW5nZTsKICAgIHB1YmxpYzoKCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFNUQVJUX1NFVD4mIHNldFN0YXJ0KGludCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVEFSVF9TRVQpLCBwcm9w
ZXJ0eV9zdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNUQVJUX1NFVD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFTkRfU0VUPiYgc2V0RW5kKGlu
dCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBF
TkRfU0VUKSwgcHJvcGVydHlfZW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldE51bWJlcigiZW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEVO
RF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U291cmNlUmFuZ2U+
JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJ
RUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNvdXJjZVJhbmdlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNvdXJjZVJhbmdlPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxTb3VyY2VSYW5nZT4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxT
b3VyY2VSYW5nZT4gcmVzdWx0ID0gU291cmNlUmFuZ2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dFN0YXJ0KC4uLikKICAgICAqICAgICAuc2V0RW5kKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFNvdXJjZVJhbmdlKCkpKTsKICAgIH0KICAg
ICAgICB9OwoKY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5IDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAog
ICAgICAgIE5BTUVfU0VUID0gMSA8PCAwLAogICAgICAgIFZBTFVFX1NFVCA9IDEgPDwgMSwKICAg
ICAgICBBTExfRklFTERTX1NFVCA9IChOQU1FX1NFVCB8IFZBTFVFX1NFVCkKICAgIH07CgogICAg
dGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAg
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxp
bnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+
KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU0NvbXB1dGVk
U3R5bGVQcm9wZXJ0eT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBOQU1FX1NFVD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOQU1FX1NFVCksIHByb3Bl
cnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJu
YW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5BTUVfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFZBTFVFX1NFVD4mIHNldFZhbHVlKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgVkFMVUVfU0VUKSwgcHJvcGVydHlfdmFsdWVfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxWQUxVRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5PiYgKCkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3Jl
YWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NDb21w
dXRlZFN0eWxlUHJvcGVydHk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFBhc3NSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5PiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+KCp0aGlzKTsK
ICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAg
ICAgKiBSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5PiByZXN1bHQgPSBDU1NDb21wdXRl
ZFN0eWxlUHJvcGVydHk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldE5hbWUoLi4uKQogICAgICog
ICAgIC5zZXRWYWx1ZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNf
U0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+
KGFkb3B0UmVmKG5ldyBDU1NDb21wdXRlZFN0eWxlUHJvcGVydHkoKSkpOwogICAgfQogICAgICAg
IH07CgovKiBDU1Mgc3R5bGUgcmVwcmVzZW50YXRpb24uICovCmNsYXNzIENTU1N0eWxlIDogcHVi
bGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxE
U19TRVQgPSAwLAogICAgICAgIENTU19QUk9QRVJUSUVTX1NFVCA9IDEgPDwgMCwKICAgICAgICBT
SE9SVEhBTkRfRU5UUklFU19TRVQgPSAxIDw8IDEsCiAgICAgICAgV0lEVEhfU0VUID0gMSA8PCAy
LAogICAgICAgIEhFSUdIVF9TRVQgPSAxIDw8IDMsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAo
Q1NTX1BST1BFUlRJRVNfU0VUIHwgU0hPUlRIQU5EX0VOVFJJRVNfU0VUIHwgV0lEVEhfU0VUIHwg
SEVJR0hUX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPENTU1N0eWxlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIENTU1N0eWxlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgQ1NTX1BST1BFUlRJRVNfU0VUPiYgc2V0Q3NzUHJvcGVydGllcyhQYXNzUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBDU1NfUFJPUEVSVElFU19TRVQpLCBwcm9wZXJ0eV9jc3NQcm9wZXJ0aWVzX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJjc3NQcm9wZXJ0aWVzIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENTU19QUk9QRVJUSUVTX1NFVD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTSE9SVEhBTkRfRU5UUklFU19T
RVQ+JiBzZXRTaG9ydGhhbmRFbnRyaWVzKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNIT1JUSEFO
RF9FTlRSSUVTX1NFVCksIHByb3BlcnR5X3Nob3J0aGFuZEVudHJpZXNfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInNob3J0aGFuZEVudHJpZXMiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U0hPUlRIQU5EX0VOVFJJRVNfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFdJRFRIX1NFVD4mIHNldFdpZHRoKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgV0lEVEhfU0VUKSwgcHJvcGVydHlfd2lkdGhfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ3aWR0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxXSURUSF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgSEVJR0hUX1NFVD4mIHNldEhlaWdodChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhFSUdIVF9TRVQpLCBwcm9w
ZXJ0eV9oZWlnaHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJoZWlnaHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SEVJR0hUX1NF
VD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZT4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NF
VCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTU3R5bGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFBhc3NSZWZQdHI8Q1NTU3R5bGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gUmVmUHRyPENTU1N0eWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1N0eWxlPiByZXN1bHQg
PSBDU1NTdHlsZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0Q3NzUHJvcGVydGllcyguLi4pCiAg
ICAgKiAgICAgLnNldFNob3J0aGFuZEVudHJpZXMoLi4uKQogICAgICogICAgIC5zZXRXaWR0aCgu
Li4pCiAgICAgKiAgICAgLnNldEhlaWdodCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5P
X0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZSgpKSk7CiAgICB9CgogICAgdm9pZCBz
ZXRTdHlsZUlkKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRPYmplY3QoInN0eWxlSWQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRD
c3NUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5n
KCJjc3NUZXh0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UmFuZ2UoUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicmFu
Z2UiLCB2YWx1ZSk7CiAgICB9CiAgICAgICAgfTsKCi8qIENTUyBzdHlsZSBlZmZlY3RpdmUgdmlz
dWFsIGRpbWVuc2lvbnMgYW5kIHNvdXJjZSBvZmZzZXRzLiAqLwpjbGFzcyBDU1NQcm9wZXJ0eSA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19G
SUVMRFNfU0VUID0gMCwKICAgICAgICBOQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBWQUxVRV9T
RVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoTkFNRV9TRVQgfCBWQUxVRV9T
RVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewog
ICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAg
ICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRl
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVy
PFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1Jl
ZlB0cjxDU1NQcm9wZXJ0eT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0
YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVu
ZCBjbGFzcyBDU1NQcm9wZXJ0eTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IE5BTUVfU0VUPiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5BTUVfU0VUKSwgcHJvcGVydHlfbmFtZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TkFNRV9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVkFMVUVfU0VUPiYgc2V0VmFsdWUoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBW
QUxVRV9TRVQpLCBwcm9wZXJ0eV92YWx1ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPFZBTFVFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NQ
cm9wZXJ0eT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTUHJvcGVydHk+Kj4oJm1fcmVzdWx0KTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NTUHJvcGVydHk+ICgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1Byb3BlcnR5PigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPENTU1Byb3BlcnR5PiByZXN1bHQgPSBDU1NQcm9wZXJ0eTo6Y3JlYXRlKCkKICAgICAq
ICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFZhbHVlKC4uLik7CiAgICAgKi8KICAg
IHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IENTU1Byb3BlcnR5KCkpKTsK
ICAgIH0KCiAgICB2b2lkIHNldFByaW9yaXR5KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwcmlvcml0eSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lk
IHNldEltcGxpY2l0KGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigi
aW1wbGljaXQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAg
fQoKICAgIHZvaWQgc2V0UGFyc2VkT2soYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRCb29sZWFuKCJwYXJzZWRPayIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YXR1cyhj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic3RhdHVz
IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U2hvcnRoYW5kTmFtZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic2hvcnRoYW5kTmFtZSIsIHZh
bHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJhbmdlKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJhbmdlIiwgdmFsdWUpOwog
ICAgfQogICAgICAgIH07CgovKiBDU1MgbWVkaWEgcXVlcnkgZGVzY3JpcHRvci4gKi8KY2xhc3Mg
Q1NTTWVkaWEgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAg
ICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgVEVYVF9TRVQgPSAxIDw8IDAsCiAgICAg
ICAgQUxMX0ZJRUxEU19TRVQgPSAoVEVYVF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NNZWRpYT4gcHRyKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRl
cl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7
CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDU1NNZWRpYTsKICAgIHB1YmxpYzoKCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFRFWFRfU0VUPiYgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRFWFRf
U0VUKSwgcHJvcGVydHlfdGV4dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoInRleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VEVY
VF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTTWVkaWE+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxE
U19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPENTU01lZGlhPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU01lZGlhPiAoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjxDU1NNZWRpYT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoK
ICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NNZWRpYT4gcmVz
dWx0ID0gQ1NTTWVkaWE6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRleHQoLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAg
ICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ1NTTWVkaWEoKSkp
OwogICAgfQoKICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzb3VyY2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRTb3VyY2VVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRT
dHJpbmcoInNvdXJjZVVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNvdXJjZUxpbmUo
aW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigic291cmNlTGluZSIsIHZh
bHVlKTsKICAgIH0KICAgICAgICB9OwoKfSAvLyBDU1MKCm5hbWVzcGFjZSBUaW1lbGluZSB7Ci8q
IFRpbWVsaW5lIHJlY29yZCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjb3JkZWQg
YWN0aXZpdHkuICovCmNsYXNzIFRpbWVsaW5lRXZlbnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAg
VFlQRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgREFUQV9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxM
X0ZJRUxEU19TRVQgPSAoVFlQRV9TRVQgfCBEQVRBX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFRpbWVsaW5lRXZlbnQ+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgVGltZWxpbmVFdmVudDsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRZUEVfU0VUPiYgc2V0VHlwZShj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFRZUEVfU0VUKSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VFlQRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgREFUQV9TRVQ+JiBzZXREYXRhKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEQVRBX1NFVCks
IHByb3BlcnR5X2RhdGFfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2Jq
ZWN0KCJkYXRhIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERBVEFfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFRpbWVsaW5lRXZlbnQ+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxE
U19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPFRpbWVsaW5lRXZlbnQ+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8VGltZWxpbmVFdmVudD4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8VGltZWxpbmVFdmVudD4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxUaW1lbGluZUV2ZW50PiByZXN1bHQgPSBUaW1lbGluZUV2ZW50OjpjcmVhdGUoKQogICAgICog
ICAgIC5zZXRUeXBlKC4uLikKICAgICAqICAgICAuc2V0RGF0YSguLi4pOwogICAgICovCiAgICBz
dGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVy
biBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBUaW1lbGluZUV2ZW50KCkpKTsK
ICAgIH0KCiAgICB2b2lkIHNldENoaWxkcmVuKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJjaGlsZHJlbiIsIHZhbHVlKTsKICAg
IH0KICAgICAgICB9OwoKfSAvLyBUaW1lbGluZQoKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVH
R0VSKQpuYW1lc3BhY2UgRGVidWdnZXIgewovKiBCcmVha3BvaW50IGlkZW50aWZpZXIuICovCnR5
cGVkZWYgU3RyaW5nIEJyZWFrcG9pbnRJZDsKCi8qIFVuaXF1ZSBzY3JpcHQgaWRlbnRpZmllci4g
Ki8KdHlwZWRlZiBTdHJpbmcgU2NyaXB0SWQ7CgovKiBDYWxsIGZyYW1lIGlkZW50aWZpZXIuICov
CnR5cGVkZWYgU3RyaW5nIENhbGxGcmFtZUlkOwoKLyogTG9jYXRpb24gaW4gdGhlIHNvdXJjZSBj
b2RlLiAqLwpjbGFzcyBMb2NhdGlvbiA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTQ1JJUFRfSURf
U0VUID0gMSA8PCAwLAogICAgICAgIExJTkVfTlVNQkVSX1NFVCA9IDEgPDwgMSwKICAgICAgICBB
TExfRklFTERTX1NFVCA9IChTQ1JJUFRfSURfU0VUIHwgTElORV9OVU1CRVJfU0VUKQogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8TG9jYXRp
b24+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5P
X0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAg
ICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgTG9jYXRp
b247CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTQ1JJUFRfSURfU0VUPiYg
c2V0U2NyaXB0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTQ1JJUFRfSURfU0VUKSwgcHJvcGVydHlfc2NyaXB0SWRf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzY3JpcHRJZCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTQ1JJUFRfSURfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExJTkVfTlVNQkVSX1NFVD4mIHNldExp
bmVOdW1iZXIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIExJTkVfTlVNQkVSX1NFVCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExJTkVfTlVNQkVSX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxMb2NhdGlvbj4mICgpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8
TG9jYXRpb24+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8TG9jYXRpb24+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPExv
Y2F0aW9uPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPExvY2F0aW9uPiByZXN1bHQgPSBMb2NhdGlvbjo6
Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2NyaXB0SWQoLi4uKQogICAgICogICAgIC5zZXRMaW5l
TnVtYmVyKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRS
ZWYobmV3IExvY2F0aW9uKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldENvbHVtbk51bWJlcihpbnQg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJjb2x1bW5OdW1iZXIiLCB2YWx1
ZSk7CiAgICB9CiAgICAgICAgfTsKCi8qIEphdmFTY3JpcHQgY2FsbCBmcmFtZS4gQXJyYXkgb2Yg
Y2FsbCBmcmFtZXMgZm9ybSB0aGUgY2FsbCBzdGFjay4gKi8KY2xhc3MgQ2FsbEZyYW1lIDogcHVi
bGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxE
U19TRVQgPSAwLAogICAgICAgIENBTExfRlJBTUVfSURfU0VUID0gMSA8PCAwLAogICAgICAgIEZV
TkNUSU9OX05BTUVfU0VUID0gMSA8PCAxLAogICAgICAgIExPQ0FUSU9OX1NFVCA9IDEgPDwgMiwK
ICAgICAgICBTQ09QRV9DSEFJTl9TRVQgPSAxIDw8IDMsCiAgICAgICAgVEhJU19TRVQgPSAxIDw8
IDQsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoQ0FMTF9GUkFNRV9JRF9TRVQgfCBGVU5DVElP
Tl9OQU1FX1NFVCB8IExPQ0FUSU9OX1NFVCB8IFNDT1BFX0NIQUlOX1NFVCB8IFRISVNfU0VUKQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
Q2FsbEZyYW1lPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwog
ICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNz
IENhbGxGcmFtZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENBTExfRlJB
TUVfSURfU0VUPiYgc2V0Q2FsbEZyYW1lSWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDQUxMX0ZSQU1FX0lEX1NFVCks
IHByb3BlcnR5X2NhbGxGcmFtZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygiY2FsbEZyYW1lSWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8Q0FMTF9GUkFNRV9JRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgRlVOQ1RJT05fTkFNRV9TRVQ+JiBzZXRGdW5jdGlvbk5hbWUoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGVU5D
VElPTl9OQU1FX1NFVCksIHByb3BlcnR5X2Z1bmN0aW9uTmFtZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZ1bmN0aW9uTmFtZSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxGVU5DVElPTl9OQU1FX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMT0NBVElPTl9TRVQ+JiBzZXRMb2NhdGlvbihQYXNzUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgTE9DQVRJT05fU0VUKSwgcHJvcGVydHlfbG9jYXRpb25fYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJsb2NhdGlvbiIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMT0NBVElPTl9TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0NPUEVfQ0hBSU5fU0VUPiYgc2V0U2NvcGVDaGFp
bihQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTQ09QRV9DSEFJTl9TRVQpLCBwcm9wZXJ0eV9zY29w
ZUNoYWluX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJzY29w
ZUNoYWluIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNDT1BFX0NIQUlO
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUSElTX1NFVD4mIHNl
dFRoaXMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRISVNfU0VUKSwgcHJvcGVydHlfdGhpc19h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoInRoaXMiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VEhJU19TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q2FsbEZyYW1lPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDYWxs
RnJhbWU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8Q2FsbEZyYW1lPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDYWxs
RnJhbWU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q2FsbEZyYW1lPiByZXN1bHQgPSBDYWxsRnJhbWU6
OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldENhbGxGcmFtZUlkKC4uLikKICAgICAqICAgICAuc2V0
RnVuY3Rpb25OYW1lKC4uLikKICAgICAqICAgICAuc2V0TG9jYXRpb24oLi4uKQogICAgICogICAg
IC5zZXRTY29wZUNoYWluKC4uLikKICAgICAqICAgICAuc2V0VGhpcyguLi4pOwogICAgICovCiAg
ICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBDYWxsRnJhbWUoKSkpOwog
ICAgfQogICAgICAgIH07CgovKiBTY29wZSBkZXNjcmlwdGlvbi4gKi8KY2xhc3MgU2NvcGUgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklF
TERTX1NFVCA9IDAsCiAgICAgICAgVFlQRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgT0JKRUNUX1NF
VCA9IDEgPDwgMSwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChUWVBFX1NFVCB8IE9CSkVDVF9T
RVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewog
ICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAg
ICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRl
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVy
PFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1Jl
ZlB0cjxTY29wZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBTY29wZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRZUEVfU0VUPiYg
c2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFRZUEVfU0VUKSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8VFlQRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgT0JKRUNUX1NFVD4mIHNldE9iamVjdChQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgT0JKRUNUX1NFVCksIHByb3BlcnR5X29iamVjdF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRPYmplY3QoIm9iamVjdCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxPQkpFQ1RfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPFNjb3BlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxTY29wZT4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTY29wZT4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8U2NvcGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2NvcGU+IHJl
c3VsdCA9IFNjb3BlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRUeXBlKC4uLikKICAgICAqICAg
ICAuc2V0T2JqZWN0KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4o
YWRvcHRSZWYobmV3IFNjb3BlKCkpKTsKICAgIH0KICAgICAgICB9OwoKfSAvLyBEZWJ1Z2dlcgoK
I2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJ
UFRfREVCVUdHRVIpCm5hbWVzcGFjZSBET01EZWJ1Z2dlciB7Ci8qIERPTSBicmVha3BvaW50IHR5
cGUuICovCm5hbWVzcGFjZSBET01CcmVha3BvaW50VHlwZSB7CmNvbnN0IGNoYXIqIGNvbnN0IHN1
YnRyZWVfbW9kaWZpZWQgPSAic3VidHJlZS1tb2RpZmllZCI7CmNvbnN0IGNoYXIqIGNvbnN0IGF0
dHJpYnV0ZV9tb2RpZmllZCA9ICJhdHRyaWJ1dGUtbW9kaWZpZWQiOwpjb25zdCBjaGFyKiBjb25z
dCBub2RlX3JlbW92ZWQgPSAibm9kZS1yZW1vdmVkIjsKfSAvLyBuYW1lc3BhY2UgRE9NQnJlYWtw
b2ludFR5cGUKCn0gLy8gRE9NRGVidWdnZXIKCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9E
RUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgUHJvZmls
ZXIgewp9IC8vIFByb2ZpbGVyCgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIp
CiNpZiBFTkFCTEUoV09SS0VSUykKbmFtZXNwYWNlIFdvcmtlciB7Cn0gLy8gV29ya2VyCgojZW5k
aWYgLy8gRU5BQkxFKFdPUktFUlMpCgp9IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgoKI2VuZGlm
IC8vIEVOQUJMRShJTlNQRUNUT1IpCgpjbGFzcyBJbnNwZWN0b3JGcm9udGVuZCB7CnB1YmxpYzoK
ICAgIEluc3BlY3RvckZyb250ZW5kKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCopOwoKCiAgICBj
bGFzcyBJbnNwZWN0b3IgewogICAgcHVibGljOgogICAgICAgIEluc3BlY3RvcihJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQg
ZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZCgvKmludCovIGludCB0ZXN0Q2FsbElkLCAvKmNvbnN0
IFN0cmluZyYqLyBjb25zdCBTdHJpbmcmIHNjcmlwdCk7CiAgICAgICAgdm9pZCBpbnNwZWN0KC8q
UGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBvYmplY3QsIC8qUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGhpbnRzKTsKICAgICAgICB2b2lkIGRpZENy
ZWF0ZVdvcmtlcigvKmludCovIGludCBpZCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5n
JiB1cmwsIC8qYm9vbCovIGJvb2wgaXNTaGFyZWQpOwogICAgICAgIHZvaWQgZGlkRGVzdHJveVdv
cmtlcigvKmludCovIGludCBpZCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
IHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2
YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7CiAgICB9OwoKICAgIEluc3BlY3RvciogaW5zcGVjdG9yKCkgeyByZXR1cm4gJm1f
aW5zcGVjdG9yOyB9CgogICAgY2xhc3MgTWVtb3J5IHsKICAgIHB1YmxpYzoKICAgICAgICBNZW1v
cnkoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDog
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0K
ICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAg
TWVtb3J5KiBtZW1vcnkoKSB7IHJldHVybiAmbV9tZW1vcnk7IH0KCiAgICBjbGFzcyBQYWdlIHsK
ICAgIHB1YmxpYzoKICAgICAgICBQYWdlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBkb21Db250ZW50RXZlbnRGaXJlZCgv
KmRvdWJsZSovIGRvdWJsZSB0aW1lc3RhbXApOwogICAgICAgIHZvaWQgbG9hZEV2ZW50RmlyZWQo
Lypkb3VibGUqLyBkb3VibGUgdGltZXN0YW1wKTsKICAgICAgICB2b2lkIGZyYW1lTmF2aWdhdGVk
KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UGFnZTo6RnJhbWU+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGZyYW1lKTsKICAgICAgICB2b2lkIGZyYW1lRGV0YWNoZWQoLypjb25zdCBT
dHJpbmcmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgUGFnZSogcGFnZSgpIHsgcmV0dXJuICZt
X3BhZ2U7IH0KCiAgICBjbGFzcyBSdW50aW1lIHsKICAgIHB1YmxpYzoKICAgICAgICBSdW50aW1l
KEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAg
ICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFJ1
bnRpbWUqIHJ1bnRpbWUoKSB7IHJldHVybiAmbV9ydW50aW1lOyB9CgogICAgY2xhc3MgQ29uc29s
ZSB7CiAgICBwdWJsaWM6CiAgICAgICAgQ29uc29sZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChp
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgbWVzc2FnZUFkZGVkKC8q
UGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6Q29uc29sZU1lc3NhZ2U+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2UpOwogICAgICAgIHZvaWQgbWVzc2FnZVJlcGVh
dENvdW50VXBkYXRlZCgvKmludCovIGludCBjb3VudCk7CiAgICAgICAgdm9pZCBtZXNzYWdlc0Ns
ZWFyZWQoKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyBy
ZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAg
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAg
IH07CgogICAgQ29uc29sZSogY29uc29sZSgpIHsgcmV0dXJuICZtX2NvbnNvbGU7IH0KCiAgICBj
bGFzcyBOZXR3b3JrIHsKICAgIHB1YmxpYzoKICAgICAgICBOZXR3b3JrKEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCByZXF1
ZXN0V2lsbEJlU2VudCgvKmNvbnN0IFN0cmluZyYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwg
Lypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0IFN0cmluZyYq
LyBjb25zdCBTdHJpbmcmIGxvYWRlcklkLCAvKmNvbnN0IFN0cmluZyYqLyBjb25zdCBTdHJpbmcm
IGRvY3VtZW50VVJMLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3Q+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QsIC8qZG91YmxlKi8gZG91Ymxl
IHRpbWVzdGFtcCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpJbml0aWF0b3I+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGluaXRpYXRvciwgLypQYXNzUmVmUHRyPElu
c3BlY3RvckFycmF5PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHN0YWNrVHJhY2UsIC8q
UGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVzcG9uc2U+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHJlZGlyZWN0UmVzcG9uc2UpOwogICAgICAgIHZvaWQgcmVxdWVzdFNl
cnZlZEZyb21DYWNoZSgvKmNvbnN0IFN0cmluZyYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCk7
CiAgICAgICAgdm9pZCByZXNwb25zZVJlY2VpdmVkKC8qY29uc3QgU3RyaW5nJiovIGNvbnN0IFN0
cmluZyYgcmVxdWVzdElkLCAvKmNvbnN0IFN0cmluZyYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQs
IC8qY29uc3QgU3RyaW5nJiovIGNvbnN0IFN0cmluZyYgbG9hZGVySWQsIC8qZG91YmxlKi8gZG91
YmxlIHRpbWVzdGFtcCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiB0eXBlLCAvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlc3BvbnNlPiovIFBhc3NSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXNwb25zZSk7CiAgICAgICAgdm9pZCBkYXRhUmVjZWl2ZWQoLypjb25z
dCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qZG91YmxlKi8gZG91YmxlIHRp
bWVzdGFtcCwgLyppbnQqLyBpbnQgZGF0YUxlbmd0aCwgLyppbnQqLyBpbnQgZW5jb2RlZERhdGFM
ZW5ndGgpOwogICAgICAgIHZvaWQgbG9hZGluZ0ZpbmlzaGVkKC8qY29uc3QgU3RyaW5nJiovIGNv
bnN0IFN0cmluZyYgcmVxdWVzdElkLCAvKmRvdWJsZSovIGRvdWJsZSB0aW1lc3RhbXApOwogICAg
ICAgIHZvaWQgbG9hZGluZ0ZhaWxlZCgvKmNvbnN0IFN0cmluZyYqLyBjb25zdCBTdHJpbmcmIHJl
cXVlc3RJZCwgLypkb3VibGUqLyBkb3VibGUgdGltZXN0YW1wLCAvKmNvbnN0IFN0cmluZyYqLyBj
b25zdCBTdHJpbmcmIGVycm9yVGV4dCwgLypjb25zdCBib29sKiBjb25zdCovIGNvbnN0IGJvb2wq
IGNvbnN0IGNhbmNlbGVkKTsKICAgICAgICB2b2lkIHJlcXVlc3RTZXJ2ZWRGcm9tTWVtb3J5Q2Fj
aGUoLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgU3Ry
aW5nJiovIGNvbnN0IFN0cmluZyYgZnJhbWVJZCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3Ry
aW5nJiBsb2FkZXJJZCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiBkb2N1bWVudFVS
TCwgLypkb3VibGUqLyBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OkluaXRpYXRvcj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gaW5pdGlh
dG9yLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkNhY2hlZFJlc291cmNlPiov
IFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNvdXJjZSk7CiAgICAgICAgdm9pZCB3ZWJT
b2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3QoLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3Ry
aW5nJiByZXF1ZXN0SWQsIC8qZG91YmxlKi8gZG91YmxlIHRpbWVzdGFtcCwgLypQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpXZWJTb2NrZXRSZXF1ZXN0PiovIFBhc3NSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXF1ZXN0KTsKICAgICAgICB2b2lkIHdlYlNvY2tldEhhbmRzaGFrZVJl
c3BvbnNlUmVjZWl2ZWQoLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQs
IC8qZG91YmxlKi8gZG91YmxlIHRpbWVzdGFtcCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpO
ZXR3b3JrOjpXZWJTb2NrZXRSZXNwb25zZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cmVzcG9uc2UpOwogICAgICAgIHZvaWQgd2ViU29ja2V0Q3JlYXRlZCgvKmNvbnN0IFN0cmluZyYq
LyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5n
JiB1cmwpOwogICAgICAgIHZvaWQgd2ViU29ja2V0Q2xvc2VkKC8qY29uc3QgU3RyaW5nJiovIGNv
bnN0IFN0cmluZyYgcmVxdWVzdElkLCAvKmRvdWJsZSovIGRvdWJsZSB0aW1lc3RhbXApOwogICAg
ICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBOZXR3
b3JrKiBuZXR3b3JrKCkgeyByZXR1cm4gJm1fbmV0d29yazsgfQoKI2lmIEVOQUJMRShTUUxfREFU
QUJBU0UpCiAgICBjbGFzcyBEYXRhYmFzZSB7CiAgICBwdWJsaWM6CiAgICAgICAgRGF0YWJhc2Uo
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAg
ICAgICB2b2lkIGFkZERhdGFiYXNlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RGF0YWJhc2U6
OkRhdGFiYXNlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkYXRhYmFzZSk7CiAgICAg
ICAgdm9pZCBzcWxUcmFuc2FjdGlvblN1Y2NlZWRlZCgvKmludCovIGludCB0cmFuc2FjdGlvbklk
LCAvKlBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJh
eT4gY29sdW1uTmFtZXMsIC8qUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4qLyBQYXNzUmVmUHRy
PEluc3BlY3RvckFycmF5PiB2YWx1ZXMpOwogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rpb25GYWls
ZWQoLyppbnQqLyBpbnQgdHJhbnNhY3Rpb25JZCwgLypQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc3FsRXJyb3IpOwogICAgICAgIHZvaWQg
c2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBEYXRhYmFzZSogZGF0
YWJhc2UoKSB7IHJldHVybiAmbV9kYXRhYmFzZTsgfQoKI2VuZGlmIC8vIEVOQUJMRShTUUxfREFU
QUJBU0UpCiAgICBjbGFzcyBET01TdG9yYWdlIHsKICAgIHB1YmxpYzoKICAgICAgICBET01TdG9y
YWdlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9
CiAgICAgICAgdm9pZCBhZGRET01TdG9yYWdlKC8qUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHN0b3JhZ2UpOwogICAgICAgIHZvaWQgdXBk
YXRlRE9NU3RvcmFnZSgvKmludCovIGludCBzdG9yYWdlSWQpOwogICAgICAgIHZvaWQgc2V0SW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBET01TdG9yYWdlKiBkb21zdG9y
YWdlKCkgeyByZXR1cm4gJm1fZG9tc3RvcmFnZTsgfQoKICAgIGNsYXNzIEFwcGxpY2F0aW9uQ2Fj
aGUgewogICAgcHVibGljOgogICAgICAgIEFwcGxpY2F0aW9uQ2FjaGUoSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGFwcGxp
Y2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkKC8qY29uc3QgU3RyaW5nJiovIGNvbnN0IFN0cmluZyYg
ZnJhbWVJZCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiBtYW5pZmVzdFVSTCwgLypp
bnQqLyBpbnQgc3RhdHVzKTsKICAgICAgICB2b2lkIG5ldHdvcmtTdGF0ZVVwZGF0ZWQoLypib29s
Ki8gYm9vbCBpc05vd09ubGluZSk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
IHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2
YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7CiAgICB9OwoKICAgIEFwcGxpY2F0aW9uQ2FjaGUqIGFwcGxpY2F0aW9uY2FjaGUo
KSB7IHJldHVybiAmbV9hcHBsaWNhdGlvbmNhY2hlOyB9CgojaWYgRU5BQkxFKEZJTEVfU1lTVEVN
KQogICAgY2xhc3MgRmlsZVN5c3RlbSB7CiAgICBwdWJsaWM6CiAgICAgICAgRmlsZVN5c3RlbShJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAg
ICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBGaWxl
U3lzdGVtKiBmaWxlc3lzdGVtKCkgeyByZXR1cm4gJm1fZmlsZXN5c3RlbTsgfQoKI2VuZGlmIC8v
IEVOQUJMRShGSUxFX1NZU1RFTSkKICAgIGNsYXNzIERPTSB7CiAgICBwdWJsaWM6CiAgICAgICAg
RE9NKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9
CiAgICAgICAgdm9pZCBkb2N1bWVudFVwZGF0ZWQoKTsKICAgICAgICB2b2lkIHNldENoaWxkTm9k
ZXMoLyppbnQqLyBpbnQgcGFyZW50SWQsIC8qUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4qLyBQ
YXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBub2Rlcyk7CiAgICAgICAgdm9pZCBhdHRyaWJ1dGVN
b2RpZmllZCgvKmludCovIGludCBub2RlSWQsIC8qY29uc3QgU3RyaW5nJiovIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSk7CiAgICAgICAg
dm9pZCBhdHRyaWJ1dGVSZW1vdmVkKC8qaW50Ki8gaW50IG5vZGVJZCwgLypjb25zdCBTdHJpbmcm
Ki8gY29uc3QgU3RyaW5nJiBuYW1lKTsKICAgICAgICB2b2lkIGlubGluZVN0eWxlSW52YWxpZGF0
ZWQoLypQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJy
YXk+IG5vZGVJZHMpOwogICAgICAgIHZvaWQgY2hhcmFjdGVyRGF0YU1vZGlmaWVkKC8qaW50Ki8g
aW50IG5vZGVJZCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiBjaGFyYWN0ZXJEYXRh
KTsKICAgICAgICB2b2lkIGNoaWxkTm9kZUNvdW50VXBkYXRlZCgvKmludCovIGludCBub2RlSWQs
IC8qaW50Ki8gaW50IGNoaWxkTm9kZUNvdW50KTsKICAgICAgICB2b2lkIGNoaWxkTm9kZUluc2Vy
dGVkKC8qaW50Ki8gaW50IHBhcmVudE5vZGVJZCwgLyppbnQqLyBpbnQgcHJldmlvdXNOb2RlSWQs
IC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpOb2RlPiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBub2RlKTsKICAgICAgICB2b2lkIGNoaWxkTm9kZVJlbW92ZWQoLyppbnQqLyBp
bnQgcGFyZW50Tm9kZUlkLCAvKmludCovIGludCBub2RlSWQpOwogICAgICAgIHZvaWQgc2V0SW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBET00qIGRvbSgpIHsgcmV0dXJu
ICZtX2RvbTsgfQoKICAgIGNsYXNzIENTUyB7CiAgICBwdWJsaWM6CiAgICAgICAgQ1NTKEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAg
dm9pZCBtZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCgpOwogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsg
fQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBDU1MqIGNzcygpIHsgcmV0dXJuICZtX2Nz
czsgfQoKICAgIGNsYXNzIFRpbWVsaW5lIHsKICAgIHB1YmxpYzoKICAgICAgICBUaW1lbGluZShJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAg
ICAgIHZvaWQgZXZlbnRSZWNvcmRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlRpbWVsaW5l
OjpUaW1lbGluZUV2ZW50PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZWNvcmQpOwog
ICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBU
aW1lbGluZSogdGltZWxpbmUoKSB7IHJldHVybiAmbV90aW1lbGluZTsgfQoKI2lmIEVOQUJMRShK
QVZBU0NSSVBUX0RFQlVHR0VSKQogICAgY2xhc3MgRGVidWdnZXIgewogICAgcHVibGljOgogICAg
ICAgIERlYnVnZ2VyKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkgeyB9CiAgICAgICAgdm9pZCBnbG9iYWxPYmplY3RDbGVhcmVkKCk7CiAgICAgICAgdm9p
ZCBzY3JpcHRQYXJzZWQoLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiBzY3JpcHRJZCwg
Lypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiB1cmwsIC8qaW50Ki8gaW50IHN0YXJ0TGlu
ZSwgLyppbnQqLyBpbnQgc3RhcnRDb2x1bW4sIC8qaW50Ki8gaW50IGVuZExpbmUsIC8qaW50Ki8g
aW50IGVuZENvbHVtbiwgLypjb25zdCBib29sKiBjb25zdCovIGNvbnN0IGJvb2wqIGNvbnN0IGlz
Q29udGVudFNjcmlwdCk7CiAgICAgICAgdm9pZCBzY3JpcHRGYWlsZWRUb1BhcnNlKC8qY29uc3Qg
U3RyaW5nJiovIGNvbnN0IFN0cmluZyYgdXJsLCAvKmNvbnN0IFN0cmluZyYqLyBjb25zdCBTdHJp
bmcmIHNjcmlwdFNvdXJjZSwgLyppbnQqLyBpbnQgc3RhcnRMaW5lLCAvKmludCovIGludCBlcnJv
ckxpbmUsIC8qY29uc3QgU3RyaW5nJiovIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKTsKICAg
ICAgICB2b2lkIGJyZWFrcG9pbnRSZXNvbHZlZCgvKmNvbnN0IFN0cmluZyYqLyBjb25zdCBTdHJp
bmcmIGJyZWFrcG9pbnRJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6TG9j
YXRpb24+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGxvY2F0aW9uKTsKICAgICAgICB2
b2lkIHBhdXNlZCgvKlBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JBcnJheT4gY2FsbEZyYW1lcywgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiBy
ZWFzb24sIC8qUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IGRhdGEpOwogICAgICAgIHZvaWQgcmVzdW1lZCgpOwogICAgICAgIHZvaWQgc2V0
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBn
ZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBEZWJ1Z2dlciogZGVidWdn
ZXIoKSB7IHJldHVybiAmbV9kZWJ1Z2dlcjsgfQoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBU
X0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBjbGFzcyBET01E
ZWJ1Z2dlciB7CiAgICBwdWJsaWM6CiAgICAgICAgRE9NRGVidWdnZXIoSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIHNldElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgRE9NRGVidWdnZXIqIGRvbWRl
YnVnZ2VyKCkgeyByZXR1cm4gJm1fZG9tZGVidWdnZXI7IH0KCiNlbmRpZiAvLyBFTkFCTEUoSkFW
QVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAgY2xh
c3MgUHJvZmlsZXIgewogICAgcHVibGljOgogICAgICAgIFByb2ZpbGVyKEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBhZGRQ
cm9maWxlSGVhZGVyKC8qUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IGhlYWRlcik7CiAgICAgICAgdm9pZCBhZGRIZWFwU25hcHNob3RDaHVu
aygvKmludCovIGludCB1aWQsIC8qY29uc3QgU3RyaW5nJiovIGNvbnN0IFN0cmluZyYgY2h1bmsp
OwogICAgICAgIHZvaWQgZmluaXNoSGVhcFNuYXBzaG90KC8qaW50Ki8gaW50IHVpZCk7CiAgICAg
ICAgdm9pZCBzZXRSZWNvcmRpbmdQcm9maWxlKC8qYm9vbCovIGJvb2wgaXNQcm9maWxpbmcpOwog
ICAgICAgIHZvaWQgcmVzZXRQcm9maWxlcygpOwogICAgICAgIHZvaWQgcmVwb3J0SGVhcFNuYXBz
aG90UHJvZ3Jlc3MoLyppbnQqLyBpbnQgZG9uZSwgLyppbnQqLyBpbnQgdG90YWwpOwogICAgICAg
IHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
ID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBQcm9maWxl
ciogcHJvZmlsZXIoKSB7IHJldHVybiAmbV9wcm9maWxlcjsgfQoKI2VuZGlmIC8vIEVOQUJMRShK
QVZBU0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKFdPUktFUlMpCiAgICBjbGFzcyBXb3JrZXIg
ewogICAgcHVibGljOgogICAgICAgIFdvcmtlcihJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgd29ya2VyQ3JlYXRlZCgvKmlu
dCovIGludCB3b3JrZXJJZCwgLypjb25zdCBTdHJpbmcmKi8gY29uc3QgU3RyaW5nJiB1cmwsIC8q
Ym9vbCovIGJvb2wgaW5zcGVjdG9yQ29ubmVjdGVkKTsKICAgICAgICB2b2lkIHdvcmtlclRlcm1p
bmF0ZWQoLyppbnQqLyBpbnQgd29ya2VySWQpOwogICAgICAgIHZvaWQgZGlzcGF0Y2hNZXNzYWdl
RnJvbVdvcmtlcigvKmludCovIGludCB3b3JrZXJJZCwgLypQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbWVzc2FnZSk7CiAgICAgICAgdm9p
ZCBkaXNjb25uZWN0ZWRGcm9tV29ya2VyKCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAg
ICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFdvcmtlciogd29ya2VyKCkgeyByZXR1cm4gJm1f
d29ya2VyOyB9CgojZW5kaWYgLy8gRU5BQkxFKFdPUktFUlMpCgpwcml2YXRlOgogICAgSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIEluc3Bl
Y3RvciBtX2luc3BlY3RvcjsKICAgIE1lbW9yeSBtX21lbW9yeTsKICAgIFBhZ2UgbV9wYWdlOwog
ICAgUnVudGltZSBtX3J1bnRpbWU7CiAgICBDb25zb2xlIG1fY29uc29sZTsKICAgIE5ldHdvcmsg
bV9uZXR3b3JrOwojaWYgRU5BQkxFKFNRTF9EQVRBQkFTRSkKICAgIERhdGFiYXNlIG1fZGF0YWJh
c2U7CiNlbmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQogICAgRE9NU3RvcmFnZSBtX2RvbXN0
b3JhZ2U7CiAgICBBcHBsaWNhdGlvbkNhY2hlIG1fYXBwbGljYXRpb25jYWNoZTsKI2lmIEVOQUJM
RShGSUxFX1NZU1RFTSkKICAgIEZpbGVTeXN0ZW0gbV9maWxlc3lzdGVtOwojZW5kaWYgLy8gRU5B
QkxFKEZJTEVfU1lTVEVNKQogICAgRE9NIG1fZG9tOwogICAgQ1NTIG1fY3NzOwogICAgVGltZWxp
bmUgbV90aW1lbGluZTsKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAgRGVidWdn
ZXIgbV9kZWJ1Z2dlcjsKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQojaWYg
RU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBET01EZWJ1Z2dlciBtX2RvbWRlYnVnZ2Vy
OwojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNpZiBFTkFCTEUoSkFWQVND
UklQVF9ERUJVR0dFUikKICAgIFByb2ZpbGVyIG1fcHJvZmlsZXI7CiNlbmRpZiAvLyBFTkFCTEUo
SkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShXT1JLRVJTKQogICAgV29ya2VyIG1fd29y
a2VyOwojZW5kaWYgLy8gRU5BQkxFKFdPUktFUlMpCn07Cgp9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CiNlbmRpZiAvLyAhZGVmaW5lZChJbnNwZWN0b3JGcm9udGVuZF9oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119727</attachid>
            <date>2011-12-17 09:41:56 -0800</date>
            <delta_ts>2011-12-18 06:55:02 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74661-20111217214154.patch</filename>
            <type>text/plain</type>
            <size>7637</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAyOTU4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTY2MWFiOTlmNjE1YmZk
ZGFjNWVhOGQ1YmY3OWM2ZmFlOWVlZTA3YS4uZGQxMjhiZjE4OWEyMWI3YmUzODc3NWM0NmEyMDkw
ZTRlNTJhM2QxOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM5IEBACisyMDExLTEyLTE1ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5OiB1c2UgZ2VuZXJhdGVkIHR5cGVzIGluIG1ldGhv
ZCBwYXJhbWV0ZXJzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03NDY2MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFR5cGUgYmluZGluZyBvYmplY3QgaXMgYWRkZWQgdG8gcmF3X3R5cGUgb2JqZWN0LgorCisg
ICAgICAgICogaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHk6CisgICAgICAgIChU
eXBlQmluZGluZ3MuY3JlYXRlX2Zvcl9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkVudW1CaW5kaW5n
LmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX2Zv
cl9uYW1lZF90eXBlX2RlY2xhcmF0aW9uLkVudW1CaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6
CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX2Zvcl9uYW1lZF90eXBlX2RlY2xhcmF0aW9u
LkVudW1CaW5kaW5nKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5
cGVfZGVjbGFyYXRpb24uRW51bUJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAgICAg
KFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24uUGxhaW5TdHJp
bmcuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVf
Zm9yX25hbWVkX3R5cGVfZGVjbGFyYXRpb24uUGxhaW5TdHJpbmcucmVkdWNlX3RvX3Jhd190eXBl
KToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVkX3R5cGVfZGVjbGFyYXRp
b24uUGxhaW5TdHJpbmcpOgorICAgICAgICAoVHlwZUJpbmRpbmdzLmNyZWF0ZV9mb3JfbmFtZWRf
dHlwZV9kZWNsYXJhdGlvbi5QbGFpblN0cmluZy5nZXRfaW5fY190eXBlX3RleHQpOgorICAgICAg
ICAoVHlwZUJpbmRpbmdzKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfZm9yX25hbWVk
X3R5cGVfZGVjbGFyYXRpb24uQ2xhc3NCaW5kaW5nKToKKyAgICAgICAgKGdldF9pbl9jX3R5cGVf
dGV4dCk6CisgICAgICAgIChyZWR1Y2VfdG9fcmF3X3R5cGUpOgorICAgICAgICAoUGxhaW5PYmpl
Y3RCaW5kaW5nLmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAgICAgIChQbGFpbk9iamVjdEJp
bmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFBsYWluT2JqZWN0QmluZGluZyk6
CisgICAgICAgIChQbGFpbk9iamVjdEJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKToKKyAgICAg
ICAgKFJhd1R5cGVzQmluZGluZy5nZW5lcmF0ZV90eXBlX2J1aWxkZXIpOgorICAgICAgICAoUmF3
VHlwZXNCaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6CisgICAgICAgIChSYXdUeXBlc0JpbmRp
bmcpOgorICAgICAgICAoUmF3VHlwZXNCaW5kaW5nLnJlZHVjZV90b19yYXdfdHlwZSk6CisgICAg
ICAgIChyZXNvbHZlX3BhcmFtX3R5cGUuUmF3VHlwZUJpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBl
KToKKyAgICAgICAgKHJlc29sdmVfcGFyYW1fdHlwZS5SYXdUeXBlQmluZGluZyk6CisgICAgICAg
IChyZXNvbHZlX3BhcmFtX3R5cGUuUmF3VHlwZUJpbmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KToK
KyAgICAgICAgKHJlc29sdmVfcGFyYW1fdHlwZSk6CisgICAgICAgIChHZW5lcmF0b3IucHJvY2Vz
c19ldmVudCk6CisKIDIwMTEtMTItMTUgIE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2Fs
aWEuY29tPgogCiAgICAgICAgIHBsdWdpbiBjcmFzaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHkgYi9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weQppbmRleCA0YTQzNjA1OTc3M2M5ODRj
ZjBiOTA3NjY2ODNiYzJiOTQwYzg2OTM1Li5kY2RiMzJkNTU2NDlmYTkwNTExM2Q5OTkyNDEyNDkw
ZGU1YWY4YTkyIDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVy
YXRvckluc3BlY3Rvci5weQorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVy
YXRvckluc3BlY3Rvci5weQpAQCAtNTA1LDYgKzUwNSwxNCBAQCBjbGFzcyBUeXBlQmluZGluZ3M6
CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGVudW1fbmFtZSkKICAgICAg
ICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuXG4iKQogCisgICAgICAgICAgICAg
ICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlw
ZV90ZXh0KGNscywgb3B0aW9uYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNs
cy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwg
b3B0aW9uYWwpLmdldF90ZXh0KCkKKworICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9k
CisgICAgICAgICAgICAgICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3X3R5cGUoKToKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlcy5TdHJpbmcKKwogICAgICAgICAgICAgICAg
IHJldHVybiBFbnVtQmluZGluZwogICAgICAgICAgICAgZWxzZToKIApAQCAtNTE2LDEyICs1MjQs
MjMgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0
LmFwcGVuZCgidHlwZWRlZiBTdHJpbmcgIikKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dC5hcHBlbmQoZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUpCiAgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwdXQuYXBwZW5kKCI7XG5cbiIpCisKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXMuU3RyaW5nCisKKyAgICAgICAg
ICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5f
Y190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVW
RU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQorCiAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYWlu
U3RyaW5nCiAKICAgICAgICAgZWxpZiBqc29uX3R5cGVbInR5cGUiXSA9PSAib2JqZWN0IjoKICAg
ICAgICAgICAgIGlmICJwcm9wZXJ0aWVzIiBpbiBqc29uX3R5cGU6CiAKICAgICAgICAgICAgICAg
ICBjbGFzcyBDbGFzc0JpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWVfID0g
anNvbl90eXBlWyJpZCJdCisKICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAg
ICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2Fy
ZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9kb2Mob3V0cHV0KQpA
QCAtNjQ0LDYgKzY2MywxNiBAQCBjbGFzcyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICB1c2luZyBJbnNwZWN0b3JPYmplY3Q6
OiVzO1xuXG4iICUgc2V0dGVyX25hbWUpCiAKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dC5hcHBlbmQoIn07XG5cbiIpCisKKyAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisg
ICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
OiIgKyBjb250ZXh0X2RvbWFpbl9uYW1lICsgIjo6IiArIGNscy5jbGFzc19uYW1lXyArICI+Igor
CisgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAg
ZGVmIHJlZHVjZV90b19yYXdfdHlwZSgpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IFJhd1R5cGVzLk9iamVjdAorCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5k
KCJ9O1xuXG4iKQogICAgICAgICAgICAgICAgIHJldHVybiBDbGFzc0JpbmRpbmcKICAgICAgICAg
ICAgIGVsc2U6CiAKQEAgLTY1Miw2ICs2ODEsMTUgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAg
ICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9idWlsZGVyKG91dHB1dCwgZm9yd2Fy
ZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vLW9wCiAgICAgICAgICAg
ICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisg
ICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgp
LmdldF9jX3BhcmFtX3R5cGUoUGFyYW1UeXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQor
CisgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAg
ZGVmIHJlZHVjZV90b19yYXdfdHlwZSgpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IFJhd1R5cGVzLk9iamVjdAorCiAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYWluT2JqZWN0Qmlu
ZGluZwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmF3X3R5cGUgPSBSYXdUeXBlcy5nZXQo
anNvbl90eXBlWyJ0eXBlIl0pCkBAIC02NjEsNiArNjk5LDE1IEBAIGNsYXNzIFR5cGVCaW5kaW5n
czoKICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9idWlsZGVyKG91dHB1dCwgZm9y
d2FyZF9saXN0ZW5lcik6CiAgICAgICAgICAgICAgICAgICAgICMgTm8tb3AKICAgICAgICAgICAg
ICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAg
ICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChjbHMsIG9wdGlvbmFsKToKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGNscy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBl
KFBhcmFtVHlwZS5FVkVOVCwgb3B0aW9uYWwpLmdldF90ZXh0KCkKKworICAgICAgICAgICAgICAg
IEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByYXdfdHlwZQorCiAgICAgICAgICAgICByZXR1
cm4gUmF3VHlwZXNCaW5kaW5nCiAKIApAQCAtNzI3LDYgKzc3NCwyOCBAQCBjbGFzcyBUeXBlTWFw
OgogICAgICAgICByZXR1cm4gc2VsZi5tYXBfW2RvbWFpbl9uYW1lXVt0eXBlX25hbWVdCiAKIAor
ZGVmIHJlc29sdmVfcGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgc2NvcGVfZG9tYWluX25hbWUp
OgorICAgIGlmICIkcmVmIiBpbiBqc29uX3BhcmFtZXRlcjoKKyAgICAgICAganNvbl9yZWYgPSBq
c29uX3BhcmFtZXRlclsiJHJlZiJdCisgICAgICAgIHR5cGVfZGF0YSA9IGdldF9yZWZfZGF0YShq
c29uX3JlZiwgc2NvcGVfZG9tYWluX25hbWUpCisgICAgICAgIHJldHVybiB0eXBlX2RhdGEuZ2V0
X2JpbmRpbmcoKQorICAgIGVsaWYgInR5cGUiIGluIGpzb25fcGFyYW1ldGVyOgorICAgICAgICBq
c29uX3R5cGUgPSBqc29uX3BhcmFtZXRlclsidHlwZSJdCisgICAgICAgIHJhd190eXBlID0gUmF3
VHlwZXMuZ2V0KGpzb25fdHlwZSkKKworICAgICAgICBjbGFzcyBSYXdUeXBlQmluZGluZzoKKyAg
ICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3X3R5
cGUoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmF3X3R5cGUKKworICAgICAgICAgICAgQHN0
YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChvcHRpb25hbCk6
CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhd190eXBlLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1U
eXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQorCisgICAgICAgIHJldHVybiBSYXdUeXBl
QmluZGluZworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVW5rbm93biB0eXBl
IikKKwogZGVmIHJlc29sdmVfcGFyYW1fcmF3X3R5cGUoanNvbl9wYXJhbWV0ZXIsIHNjb3BlX2Rv
bWFpbl9uYW1lKToKICAgICBpZiAiJHJlZiIgaW4ganNvbl9wYXJhbWV0ZXI6CiAgICAgICAgIGpz
b25fcmVmID0ganNvbl9wYXJhbWV0ZXJbIiRyZWYiXQpAQCAtMTMwNiw2ICsxMzc1LDEzIEBAICRk
b21haW5Jbml0aWFsaXplcnMKIAogdHlwZV9tYXAgPSBUeXBlTWFwKGpzb25fYXBpKQogCisKK2Rl
ZiBnZXRfYW5ub3RhdGVkX3R5cGVfdGV4dChyYXdfdHlwZSwgYW5ub3RhdGVkX3R5cGUpOgorICAg
IGlmIGFubm90YXRlZF90eXBlICE9IHJhd190eXBlOgorICAgICAgICByZXR1cm4gIi8qJXMqLyAl
cyIgJSAoYW5ub3RhdGVkX3R5cGUsIHJhd190eXBlKQorICAgIGVsc2U6CisgICAgICAgIHJldHVy
biByYXdfdHlwZQorCiBjbGFzcyBHZW5lcmF0b3I6CiAgICAgZnJvbnRlbmRfY2xhc3NfZmllbGRf
bGluZXMgPSBbXQogICAgIGZyb250ZW5kX2RvbWFpbl9jbGFzc19saW5lcyA9IFtdCkBAIC0xNDM2
LDcgKzE1MTIsMTEgQEAgY2xhc3MgR2VuZXJhdG9yOgogCiAgICAgICAgICAgICAgICAgb3B0aW9u
YWwgPSBvcHRpb25hbF9tYXNrIGFuZCBqc29uX29wdGlvbmFsCiAKLSAgICAgICAgICAgICAgICBw
YXJhbWV0ZXJfbGlzdC5hcHBlbmQoIiVzICVzIiAlIChjX3R5cGUuZ2V0X3RleHQoKSwgcGFyYW1l
dGVyX25hbWUpKQorICAgICAgICAgICAgICAgIHBhcmFtX3R5cGVfYmluZGluZyA9IHJlc29sdmVf
cGFyYW1fdHlwZShqc29uX3BhcmFtZXRlciwgZG9tYWluX25hbWUpCisKKyAgICAgICAgICAgICAg
ICBhbm5vdGF0ZWRfdHlwZSA9IGdldF9hbm5vdGF0ZWRfdHlwZV90ZXh0KGNfdHlwZS5nZXRfdGV4
dCgpLCBwYXJhbV90eXBlX2JpbmRpbmcuZ2V0X2luX2NfdHlwZV90ZXh0KGpzb25fb3B0aW9uYWwp
KQorCisgICAgICAgICAgICAgICAgcGFyYW1ldGVyX2xpc3QuYXBwZW5kKCIlcyAlcyIgJSAoYW5u
b3RhdGVkX3R5cGUsIHBhcmFtZXRlcl9uYW1lKSkKIAogICAgICAgICAgICAgICAgIHNldHRlcl9h
cmd1bWVudCA9IGNfdHlwZS5nZXRfc2V0dGVyX2Zvcm1hdCgpICUgcGFyYW1ldGVyX25hbWUKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>119728</attachid>
            <date>2011-12-17 09:43:31 -0800</date>
            <delta_ts>2011-12-17 09:43:31 -0800</delta_ts>
            <desc>Sample of InspectorFrontend.h with new types annotated in comments for events.</desc>
            <filename>InspectorFrontend.h</filename>
            <type>text/plain</type>
            <size>130016</size>
            <attacher name="Peter Rybin">peter.rybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgojaWZuZGVmIEluc3BlY3RvckZyb250ZW5kX2gKI2RlZmluZSBJbnNw
ZWN0b3JGcm9udGVuZF9oCgojaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNsdWRlIDxQ
bGF0Zm9ybVN0cmluZy5oPgojaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KCm5hbWVzcGFjZSBX
ZWJDb3JlIHsKCmNsYXNzIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKCi8vIEJvdGggSW5zcGVj
dG9yT2JqZWN0IGFuZCBJbnNwZWN0b3JBcnJheSBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBh
dCB0aGlzIHBvaW50IGFzIGRlZmluZWQgYnkgRU5BQkxFRF9JTlNQRUNUT1IuCi8vIERvdWJsZS1j
aGVjayB3ZSBoYXZlIHRoZW0gYXQgbGVhc3QgYXMgZm9yd2FyZCBkZWNsYXJhdGlvbi4KY2xhc3Mg
SW5zcGVjdG9yQXJyYXk7CmNsYXNzIEluc3BlY3Rvck9iamVjdDsKCnR5cGVkZWYgU3RyaW5nIEVy
cm9yU3RyaW5nOwoKI2lmIEVOQUJMRShJTlNQRUNUT1IpCgpuYW1lc3BhY2UgVHlwZUJ1aWxkZXIg
ewpuYW1lc3BhY2UgSW5zcGVjdG9yIHsKfSAvLyBJbnNwZWN0b3IKCm5hbWVzcGFjZSBNZW1vcnkg
ewovKiBOdW1iZXIgb2Ygbm9kZXMgd2l0aCBnaXZlbiBuYW1lLiAqLwpjbGFzcyBOb2RlQ291bnQg
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9f
RklFTERTX1NFVCA9IDAsCiAgICAgICAgTk9ERV9OQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBD
T1VOVF9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoTk9ERV9OQU1FX1NF
VCB8IENPVU5UX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPE5vZGVDb3VudD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBOb2RlQ291bnQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBOT0RFX05BTUVfU0VUPiYgc2V0Tm9kZU5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOT0RFX05BTUVf
U0VUKSwgcHJvcGVydHlfbm9kZU5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJub2RlTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxOT0RFX05BTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IENPVU5UX1NFVD4mIHNldENvdW50KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDT1VOVF9TRVQpLCBwcm9wZXJ0eV9jb3VudF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvdW50IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENPVU5UX1NFVD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxOb2RlQ291bnQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPE5vZGVDb3Vu
dD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxO
b2RlQ291bnQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPE5vZGVDb3Vu
dD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxOb2RlQ291bnQ+IHJlc3VsdCA9IE5vZGVDb3VudDo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0Tm9kZU5hbWUoLi4uKQogICAgICogICAgIC5zZXRDb3VudCgu
Li4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQog
ICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBO
b2RlQ291bnQoKSkpOwogICAgfQp9OwoKY2xhc3MgRE9NR3JvdXAgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgU0laRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgVElUTEVfU0VUID0gMSA8PCAxLAogICAg
ICAgIE5PREVfQ09VTlRfU0VUID0gMSA8PCAyLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFNJ
WkVfU0VUIHwgVElUTEVfU0VUIHwgTk9ERV9DT1VOVF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRl
PGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+
IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxET01Hcm91cD4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBET01Hcm91cDsKICAgIHB1Ymxp
YzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNJWkVfU0VUPiYgc2V0U2l6ZShpbnQgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0laRV9TRVQp
LCBwcm9wZXJ0eV9zaXplX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51
bWJlcigic2l6ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTSVpFX1NF
VD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUSVRMRV9TRVQ+JiBzZXRU
aXRsZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFRJVExFX1NFVCksIHByb3BlcnR5X3RpdGxlX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGl0bGUiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8VElUTEVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE5PREVfQ09VTlRfU0VUPiYgc2V0Tm9kZUNvdW50KFBhc3NSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIE5PREVfQ09VTlRfU0VUKSwgcHJvcGVydHlfbm9kZUNvdW50X2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJub2RlQ291bnQiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Tk9ERV9DT1VOVF9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBSZWZQdHI8RE9NR3JvdXA+JiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPERPTUdy
b3VwPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PERPTUdyb3VwPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxET01Hcm91
cD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxET01Hcm91cD4gcmVzdWx0ID0gRE9NR3JvdXA6OmNyZWF0
ZSgpCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRUaXRsZSguLi4pCiAg
ICAgKiAgICAgLnNldE5vZGVDb3VudCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxO
T19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJ
RUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBET01Hcm91cCgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRE
b2N1bWVudFVSSShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0
cmluZygiZG9jdW1lbnRVUkkiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIE1lbW9yeQoKbmFtZXNw
YWNlIFBhZ2UgewovKiBSZXNvdXJjZSB0eXBlIGFzIGl0IHdhcyBwZXJjZWl2ZWQgYnkgdGhlIHJl
bmRlcmluZyBlbmdpbmUuICovCm5hbWVzcGFjZSBSZXNvdXJjZVR5cGUgewpjb25zdCBjaGFyKiBj
b25zdCBkb2N1bWVudCA9ICJEb2N1bWVudCI7CmNvbnN0IGNoYXIqIGNvbnN0IHN0eWxlc2hlZXQg
PSAiU3R5bGVzaGVldCI7CmNvbnN0IGNoYXIqIGNvbnN0IGltYWdlID0gIkltYWdlIjsKY29uc3Qg
Y2hhciogY29uc3QgZm9udCA9ICJGb250IjsKY29uc3QgY2hhciogY29uc3Qgc2NyaXB0ID0gIlNj
cmlwdCI7CmNvbnN0IGNoYXIqIGNvbnN0IHhociA9ICJYSFIiOwpjb25zdCBjaGFyKiBjb25zdCB3
ZWJTb2NrZXQgPSAiV2ViU29ja2V0IjsKY29uc3QgY2hhciogY29uc3Qgb3RoZXIgPSAiT3RoZXIi
Owp9IC8vIG5hbWVzcGFjZSBSZXNvdXJjZVR5cGUKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBG
cmFtZSBvbiB0aGUgcGFnZS4gKi8KY2xhc3MgRnJhbWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAg
SURfU0VUID0gMSA8PCAwLAogICAgICAgIExPQURFUl9JRF9TRVQgPSAxIDw8IDEsCiAgICAgICAg
VVJMX1NFVCA9IDEgPDwgMiwKICAgICAgICBNSU1FX1RZUEVfU0VUID0gMSA8PCAzLAogICAgICAg
IEFMTF9GSUVMRFNfU0VUID0gKElEX1NFVCB8IExPQURFUl9JRF9TRVQgfCBVUkxfU0VUIHwgTUlN
RV9UWVBFX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPEZyYW1lPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIEZyYW1lOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSURf
U0VUPiYgc2V0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJRF9TRVQpLCBwcm9wZXJ0eV9pZF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImlkIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPElEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBMT0FERVJfSURfU0VUPiYgc2V0TG9hZGVySWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMT0FERVJfSURf
U0VUKSwgcHJvcGVydHlfbG9hZGVySWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJsb2FkZXJJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxMT0FERVJfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IFVSTF9TRVQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwgcHJvcGVydHlfdXJsX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVSTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgTUlNRV9UWVBFX1NFVD4mIHNldE1pbWVUeXBlKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
TUlNRV9UWVBFX1NFVCksIHByb3BlcnR5X21pbWVUeXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygibWltZVR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8TUlNRV9UWVBFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFJlZlB0cjxGcmFtZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RnJhbWU+Kj4oJm1fcmVzdWx0KTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RnJhbWU+ICgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZyYW1lPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEZy
YW1lPiByZXN1bHQgPSBGcmFtZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0SWQoLi4uKQogICAg
ICogICAgIC5zZXRMb2FkZXJJZCguLi4pCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAg
ICAgLnNldE1pbWVUeXBlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxE
U19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NF
VD4oYWRvcHRSZWYobmV3IEZyYW1lKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFBhcmVudElkKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwYXJlbnRJ
ZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICB9Cn07Cgov
KiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgRnJhbWUgaGllcmFyY2h5IGFsb25nIHdpdGggdGhlaXIg
Y2FjaGVkIHJlc291cmNlcy4gKi8KY2xhc3MgRnJhbWVSZXNvdXJjZVRyZWUgOiBwdWJsaWMgSW5z
cGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9
IDAsCiAgICAgICAgRlJBTUVfU0VUID0gMSA8PCAwLAogICAgICAgIFJFU09VUkNFU19TRVQgPSAx
IDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoRlJBTUVfU0VUIHwgUkVTT1VSQ0VTX1NF
VCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAg
ICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAg
ICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVm
UHRyPEZyYW1lUmVzb3VyY2VUcmVlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIEZyYW1lUmVzb3VyY2VUcmVlOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgRlJBTUVfU0VUPiYgc2V0RnJhbWUoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IEZSQU1FX1NFVCksIHByb3BlcnR5X2ZyYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldE9iamVjdCgiZnJhbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8RlJBTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJF
U09VUkNFU19TRVQ+JiBzZXRSZXNvdXJjZXMoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUkVTT1VS
Q0VTX1NFVCksIHByb3BlcnR5X3Jlc291cmNlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRBcnJheSgicmVzb3VyY2VzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFJFU09VUkNFU19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZyYW1lUmVzb3VyY2VU
cmVlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PEZyYW1lUmVzb3VyY2VUcmVlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxGcmFtZVJlc291cmNlVHJlZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxGcmFtZVJlc291cmNlVHJl
ZT4gcmVzdWx0ID0gRnJhbWVSZXNvdXJjZVRyZWU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEZy
YW1lKC4uLikKICAgICAqICAgICAuc2V0UmVzb3VyY2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1
aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IEZyYW1lUmVzb3VyY2VUcmVlKCkpKTsK
ICAgIH0KCiAgICB2b2lkIHNldENoaWxkRnJhbWVzKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJjaGlsZEZyYW1lcyIsIHZhbHVl
KTsKICAgIH0KfTsKCi8qIFNlYXJjaCBtYXRjaCBmb3IgcmVzb3VyY2UuICovCmNsYXNzIFNlYXJj
aE1hdGNoIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAg
ICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIExJTkVfTlVNQkVSX1NFVCA9IDEgPDwgMCwK
ICAgICAgICBMSU5FX0NPTlRFTlRfU0VUID0gMSA8PCAxLAogICAgICAgIEFMTF9GSUVMRFNfU0VU
ID0gKExJTkVfTlVNQkVSX1NFVCB8IExJTkVfQ09OVEVOVF9TRVQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTZWFyY2hNYXRjaD4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERT
X1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9y
ZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBTZWFyY2hNYXRjaDsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExJTkVfTlVNQkVSX1NFVD4mIHNl
dExpbmVOdW1iZXIoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIExJTkVfTlVNQkVSX1NFVCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExJTkVfTlVNQkVSX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMSU5FX0NPTlRFTlRfU0VUPiYgc2V0
TGluZUNvbnRlbnQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMSU5FX0NPTlRFTlRfU0VUKSwgcHJvcGVydHlfbGluZUNv
bnRlbnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJsaW5l
Q29udGVudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMSU5FX0NPTlRF
TlRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNlYXJjaE1hdGNo
PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9G
SUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PFJlZlB0cjxTZWFyY2hNYXRjaD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWFyY2hNYXRjaD4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8U2VhcmNoTWF0Y2g+KCp0aGlzKTsKICAgICAgICB9CiAg
ICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8
U2VhcmNoTWF0Y2g+IHJlc3VsdCA9IFNlYXJjaE1hdGNoOjpjcmVhdGUoKQogICAgICogICAgIC5z
ZXRMaW5lTnVtYmVyKC4uLikKICAgICAqICAgICAuc2V0TGluZUNvbnRlbnQoLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAg
ICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgU2VhcmNoTWF0Y2go
KSkpOwogICAgfQp9OwoKLyogU2VhcmNoIHJlc3VsdCBmb3IgcmVzb3VyY2UuICovCmNsYXNzIFNl
YXJjaFJlc3VsdCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBVUkxfU0VUID0gMSA8PCAwLAogICAg
ICAgIEZSQU1FX0lEX1NFVCA9IDEgPDwgMSwKICAgICAgICBNQVRDSEVTX0NPVU5UX1NFVCA9IDEg
PDwgMiwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChVUkxfU0VUIHwgRlJBTUVfSURfU0VUIHwg
TUFUQ0hFU19DT1VOVF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNs
YXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXIoUGFzc1JlZlB0cjxTZWFyY2hSZXN1bHQ+IHB0cikKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRl
ZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAg
IH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VhcmNoUmVzdWx0OwogICAgcHVibGljOgoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgVVJMX1NFVD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVSTF9TRVQpLCBw
cm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VVJMX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGUkFNRV9JRF9TRVQ+JiBzZXRGcmFt
ZUlkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgRlJBTUVfSURfU0VUKSwgcHJvcGVydHlfZnJhbWVJZF9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZyYW1lSWQiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RlJBTUVfSURfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IE1BVENIRVNfQ09VTlRfU0VUPiYgc2V0TWF0Y2hlc0NvdW50
KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBNQVRDSEVTX0NPVU5UX1NFVCksIHByb3BlcnR5X21hdGNoZXNDb3VudF9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm1hdGNoZXNDb3VudCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNQVRDSEVTX0NPVU5UX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxTZWFyY2hSZXN1bHQ+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPFNlYXJjaFJlc3VsdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUGFzc1JlZlB0cjxTZWFyY2hSZXN1bHQ+ICgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gUmVmUHRyPFNlYXJjaFJlc3VsdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWFyY2hSZXN1
bHQ+IHJlc3VsdCA9IFNlYXJjaFJlc3VsdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4u
LikKICAgICAqICAgICAuc2V0RnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldE1hdGNoZXNDb3Vu
dCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUo
KQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5l
dyBTZWFyY2hSZXN1bHQoKSkpOwogICAgfQp9OwoKLyogQ29va2llIG9iamVjdCAqLwpjbGFzcyBD
b29raWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAg
ICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgTkFNRV9TRVQgPSAxIDw8IDAsCiAgICAgICAg
VkFMVUVfU0VUID0gMSA8PCAxLAogICAgICAgIERPTUFJTl9TRVQgPSAxIDw8IDIsCiAgICAgICAg
UEFUSF9TRVQgPSAxIDw8IDMsCiAgICAgICAgRVhQSVJFU19TRVQgPSAxIDw8IDQsCiAgICAgICAg
U0laRV9TRVQgPSAxIDw8IDUsCiAgICAgICAgSFRUUF9PTkxZX1NFVCA9IDEgPDwgNiwKICAgICAg
ICBTRUNVUkVfU0VUID0gMSA8PCA3LAogICAgICAgIFNFU1NJT05fU0VUID0gMSA8PCA4LAogICAg
ICAgIEFMTF9GSUVMRFNfU0VUID0gKE5BTUVfU0VUIHwgVkFMVUVfU0VUIHwgRE9NQUlOX1NFVCB8
IFBBVEhfU0VUIHwgRVhQSVJFU19TRVQgfCBTSVpFX1NFVCB8IEhUVFBfT05MWV9TRVQgfCBTRUNV
UkVfU0VUIHwgU0VTU0lPTl9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAg
IGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDb29raWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9p
bl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0K
ICAgICAgICBmcmllbmQgY2xhc3MgQ29va2llOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgTkFNRV9TRVQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTkFNRV9TRVQpLCBwcm9wZXJ0
eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFt
ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOQU1FX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWQUxVRV9TRVQ+JiBzZXRWYWx1ZShjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFZBTFVFX1NFVCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VkFMVUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IERPTUFJTl9TRVQ+JiBzZXREb21haW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBET01BSU5fU0VUKSwgcHJvcGVy
dHlfZG9tYWluX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
ZG9tYWluIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERPTUFJTl9TRVQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUEFUSF9TRVQ+JiBzZXRQYXRo
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgUEFUSF9TRVQpLCBwcm9wZXJ0eV9wYXRoX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygicGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxQQVRIX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBFWFBJUkVTX1NFVD4mIHNldEV4cGlyZXMoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEVYUElSRVNfU0VUKSwgcHJvcGVydHlfZXhw
aXJlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImV4cGly
ZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RVhQSVJFU19TRVQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0laRV9TRVQ+JiBzZXRTaXplKGlu
dCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBT
SVpFX1NFVCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFNJWkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhUVFBfT05M
WV9TRVQ+JiBzZXRIdHRwT25seShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIEhUVFBfT05MWV9TRVQpLCBwcm9wZXJ0eV9odHRwT25seV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJodHRwT25seSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIVFRQX09OTFlfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNFQ1VSRV9TRVQ+JiBzZXRTZWN1cmUo
Ym9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTRUNVUkVfU0VUKSwgcHJvcGVydHlfc2VjdXJlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldEJvb2xlYW4oInNlY3VyZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxTRUNVUkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFNFU1NJT05fU0VUPiYgc2V0U2Vzc2lvbihib29sIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNFU1NJT05fU0VUKSwgcHJvcGVydHlfc2Vz
c2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJzZXNz
aW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNFU1NJT05fU0VUPigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENvb2tpZT4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8Q29va2llPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQ
YXNzUmVmUHRyPENvb2tpZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
Q29va2llPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENvb2tpZT4gcmVzdWx0ID0gQ29va2llOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUoLi4uKQog
ICAgICogICAgIC5zZXREb21haW4oLi4uKQogICAgICogICAgIC5zZXRQYXRoKC4uLikKICAgICAq
ICAgICAuc2V0RXhwaXJlcyguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAg
IC5zZXRIdHRwT25seSguLi4pCiAgICAgKiAgICAgLnNldFNlY3VyZSguLi4pCiAgICAgKiAgICAg
LnNldFNlc3Npb24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NF
VD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihh
ZG9wdFJlZihuZXcgQ29va2llKCkpKTsKICAgIH0KfTsKCi8qIFVuaXF1ZSBzY3JpcHQgaWRlbnRp
Zmllci4gKi8KdHlwZWRlZiBTdHJpbmcgU2NyaXB0SWRlbnRpZmllcjsKCn0gLy8gUGFnZQoKbmFt
ZXNwYWNlIFJ1bnRpbWUgewovKiBVbmlxdWUgb2JqZWN0IGlkZW50aWZpZXIuICovCnR5cGVkZWYg
U3RyaW5nIFJlbW90ZU9iamVjdElkOwoKLyogTWlycm9yIG9iamVjdCByZWZlcmVuY2luZyBvcmln
aW5hbCBKYXZhU2NyaXB0IG9iamVjdC4gKi8KY2xhc3MgUmVtb3RlT2JqZWN0IDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQg
PSAwLAogICAgICAgIFRZUEVfU0VUID0gMSA8PCAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0g
KFRZUEVfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8UmVtb3RlT2JqZWN0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIFJlbW90ZU9iamVjdDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFRZUEVfU0VUPiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRZUEVfU0VUKSwgcHJvcGVy
dHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5
cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VFlQRV9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVtb3RlT2JqZWN0PiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCBy
ZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PFJlZlB0cjxSZW1vdGVPYmplY3Q+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFBhc3NSZWZQdHI8UmVtb3RlT2JqZWN0PiAoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjxSZW1vdGVPYmplY3Q+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8UmVtb3RlT2Jq
ZWN0PiByZXN1bHQgPSBSZW1vdGVPYmplY3Q6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkK
ICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcg
UmVtb3RlT2JqZWN0KCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFN1YnR5cGUoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInN1YnR5cGUiLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRDbGFzc05hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImNsYXNzTmFtZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2
b2lkIHNldFZhbHVlKFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVlKQogICAgewogICAg
ICAgIHRoaXMtPnNldFZhbHVlKCJ2YWx1ZSIsIHZhbHVlKTsKICAgIH0KICAgIHVzaW5nIEluc3Bl
Y3Rvck9iamVjdDo6c2V0VmFsdWU7CgoKICAgIHZvaWQgc2V0RGVzY3JpcHRpb24oY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImRlc2NyaXB0aW9uIiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0T2JqZWN0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoIm9iamVjdElkIiwgdmFsdWUpOwogICAgfQp9
OwoKLyogT2JqZWN0IHByb3BlcnR5IGRlc2NyaXB0b3IuICovCmNsYXNzIFByb3BlcnR5RGVzY3Jp
cHRvciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBOQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBX
UklUQUJMRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgQ09ORklHVVJBQkxFX1NFVCA9IDEgPDwgMiwK
ICAgICAgICBFTlVNRVJBQkxFX1NFVCA9IDEgPDwgMywKICAgICAgICBBTExfRklFTERTX1NFVCA9
IChOQU1FX1NFVCB8IFdSSVRBQkxFX1NFVCB8IENPTkZJR1VSQUJMRV9TRVQgfCBFTlVNRVJBQkxF
X1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBQcm9wZXJ0eURlc2NyaXB0b3I7CiAgICBwdWJsaWM6CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBOQU1FX1NFVD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOQU1FX1NFVCks
IHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5BTUVfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFdSSVRBQkxFX1NFVD4mIHNl
dFdyaXRhYmxlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgV1JJVEFCTEVfU0VUKSwgcHJvcGVydHlfd3JpdGFibGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigid3JpdGFibGUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8V1JJVEFCTEVfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IENPTkZJR1VSQUJMRV9TRVQ+JiBzZXRDb25maWd1cmFibGUo
Ym9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBDT05GSUdVUkFCTEVfU0VUKSwgcHJvcGVydHlfY29uZmlndXJhYmxlX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImNvbmZpZ3VyYWJsZSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT05GSUdVUkFCTEVfU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEVOVU1FUkFCTEVfU0VUPiYgc2V0RW51bWVyYWJs
ZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIEVOVU1FUkFCTEVfU0VUKSwgcHJvcGVydHlfZW51bWVyYWJsZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJlbnVtZXJhYmxlIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEVOVU1FUkFCTEVfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8UHJvcGVydHlEZXNjcmlwdG9yPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPigqdGhpcyk7CiAgICAgICAg
fQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVm
UHRyPFByb3BlcnR5RGVzY3JpcHRvcj4gcmVzdWx0ID0gUHJvcGVydHlEZXNjcmlwdG9yOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0V3JpdGFibGUoLi4u
KQogICAgICogICAgIC5zZXRDb25maWd1cmFibGUoLi4uKQogICAgICogICAgIC5zZXRFbnVtZXJh
YmxlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0
ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYo
bmV3IFByb3BlcnR5RGVzY3JpcHRvcigpKSk7CiAgICB9CgogICAgdm9pZCBzZXRWYWx1ZShQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2Jq
ZWN0KCJ2YWx1ZSIsIHZhbHVlKTsKICAgIH0KICAgIHVzaW5nIEluc3BlY3Rvck9iamVjdDo6c2V0
VmFsdWU7CgoKICAgIHZvaWQgc2V0R2V0KFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoImdldCIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFNldChQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0T2JqZWN0KCJzZXQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRX
YXNUaHJvd24oYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29sZWFuKCJ3YXNU
aHJvd24iLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBSZXByZXNlbnRzIGZ1bmN0aW9uIGNhbGwgYXJn
dW1lbnQuIEVpdGhlciByZW1vdGUgb2JqZWN0IGlkIDxjb2RlPm9iamVjdElkPC9jb2RlPiBvciBw
cmltaXRpdmUgPGNvZGU+dmFsdWU8L2NvZGU+IG9yIG5laXRoZXIgb2YgKGZvciB1bmRlZmluZWQp
IHRoZW0gc2hvdWxkIGJlIHNwZWNpZmllZC4gKi8KY2xhc3MgQ2FsbEFyZ3VtZW50IDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19T
RVQgPSAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gMAogICAgfTsKCiAgICB0ZW1wbGF0ZTxp
bnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBC
dWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q2FsbEFyZ3VtZW50PiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VU
LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3Vs
dCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENhbGxBcmd1bWVudDsKICAg
IHB1YmxpYzoKCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxBcmd1bWVudD4mICgpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwg
cmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxSZWZQdHI8Q2FsbEFyZ3VtZW50Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4gKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiBSZWZQdHI8Q2FsbEFyZ3VtZW50PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAg
ICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENhbGxBcmd1
bWVudD4gcmVzdWx0ID0gQ2FsbEFyZ3VtZW50OjpjcmVhdGUoKTsKICAgICAqLwogICAgc3RhdGlj
IEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ2FsbEFyZ3VtZW50KCkpKTsKICAgIH0K
CiAgICB2b2lkIHNldFZhbHVlKFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldFZhbHVlKCJ2YWx1ZSIsIHZhbHVlKTsKICAgIH0KICAgIHVzaW5n
IEluc3BlY3Rvck9iamVjdDo6c2V0VmFsdWU7CgoKICAgIHZvaWQgc2V0T2JqZWN0SWQoUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVj
dCgib2JqZWN0SWQiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIFJ1bnRpbWUKCm5hbWVzcGFjZSBD
b25zb2xlIHsKLyogQ29uc29sZSBtZXNzYWdlLiAqLwpjbGFzcyBDb25zb2xlTWVzc2FnZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVM
RFNfU0VUID0gMCwKICAgICAgICBTT1VSQ0VfU0VUID0gMSA8PCAwLAogICAgICAgIExFVkVMX1NF
VCA9IDEgPDwgMSwKICAgICAgICBURVhUX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERT
X1NFVCA9IChTT1VSQ0VfU0VUIHwgTEVWRUxfU0VUIHwgVEVYVF9TRVQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDb25zb2xlTWVzc2Fn
ZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9f
RklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAg
ICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDb25zb2xl
TWVzc2FnZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNPVVJDRV9TRVQ+
JiBzZXRTb3VyY2UoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTT1VSQ0VfU0VUKSwgcHJvcGVydHlfc291cmNlX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNPVVJDRV9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTEVWRUxfU0VUPiYgc2V0TGV2ZWwoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBM
RVZFTF9TRVQpLCBwcm9wZXJ0eV9sZXZlbF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoImxldmVsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPExFVkVMX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBURVhU
X1NFVD4mIHNldFRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBURVhUX1NFVCksIHByb3BlcnR5X3RleHRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRFWFRfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPENvbnNvbGVNZXNzYWdlPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDb25z
b2xlTWVzc2FnZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFz
c1JlZlB0cjxDb25zb2xlTWVzc2FnZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBS
ZWZQdHI8Q29uc29sZU1lc3NhZ2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q29uc29sZU1lc3NhZ2U+
IHJlc3VsdCA9IENvbnNvbGVNZXNzYWdlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTb3VyY2Uo
Li4uKQogICAgICogICAgIC5zZXRMZXZlbCguLi4pCiAgICAgKiAgICAgLnNldFRleHQoLi4uKTsK
ICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ29uc29s
ZU1lc3NhZ2UoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TGluZShpbnQgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJsaW5lIiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0UmVwZWF0Q291bnQoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51
bWJlcigicmVwZWF0Q291bnQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRQYXJhbWV0ZXJz
KFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dEFycmF5KCJwYXJhbWV0ZXJzIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhY2tUcmFj
ZShQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRBcnJheSgic3RhY2tUcmFjZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE5ldHdvcmtS
ZXF1ZXN0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoIm5ldHdvcmtSZXF1ZXN0SWQiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBTdGFjayBlbnRyeSBm
b3IgY29uc29sZSBlcnJvcnMgYW5kIGFzc2VydGlvbnMuICovCmNsYXNzIENhbGxGcmFtZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVM
RFNfU0VUID0gMCwKICAgICAgICBGVU5DVElPTl9OQU1FX1NFVCA9IDEgPDwgMCwKICAgICAgICBV
UkxfU0VUID0gMSA8PCAxLAogICAgICAgIExJTkVfTlVNQkVSX1NFVCA9IDEgPDwgMiwKICAgICAg
ICBDT0xVTU5fTlVNQkVSX1NFVCA9IDEgPDwgMywKICAgICAgICBBTExfRklFTERTX1NFVCA9IChG
VU5DVElPTl9OQU1FX1NFVCB8IFVSTF9TRVQgfCBMSU5FX05VTUJFUl9TRVQgfCBDT0xVTU5fTlVN
QkVSX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPENhbGxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBDYWxsRnJhbWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBGVU5DVElPTl9OQU1FX1NFVD4mIHNldEZ1bmN0aW9uTmFtZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZVTkNUSU9O
X05BTUVfU0VUKSwgcHJvcGVydHlfZnVuY3Rpb25OYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygiZnVuY3Rpb25OYW1lIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPEZVTkNUSU9OX05BTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFVSTF9TRVQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwg
cHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVSTF9TRVQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTElORV9OVU1CRVJfU0VUPiYgc2V0
TGluZU51bWJlcihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIExJTkVfTlVNQkVSX1NFVCksIHByb3BlcnR5X2xpbmVOdW1i
ZXJfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJsaW5lTnVt
YmVyIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExJTkVfTlVNQkVSX1NF
VD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDT0xVTU5fTlVNQkVSX1NF
VD4mIHNldENvbHVtbk51bWJlcihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENPTFVNTl9OVU1CRVJfU0VUKSwgcHJvcGVy
dHlfY29sdW1uTnVtYmVyX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0
cmluZygiY29sdW1uTnVtYmVyIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PENPTFVNTl9OVU1CRVJfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRy
PENhbGxGcmFtZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEZyYW1lPio+KCZtX3Jlc3VsdCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENhbGxGcmFtZT4gKCkKICAgICAg
ICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEZyYW1lPigqdGhpcyk7CiAgICAgICAg
fQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVm
UHRyPENhbGxGcmFtZT4gcmVzdWx0ID0gQ2FsbEZyYW1lOjpjcmVhdGUoKQogICAgICogICAgIC5z
ZXRGdW5jdGlvbk5hbWUoLi4uKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5z
ZXRMaW5lTnVtYmVyKC4uLikKICAgICAqICAgICAuc2V0Q29sdW1uTnVtYmVyKC4uLik7CiAgICAg
Ki8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAg
ICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IENhbGxGcmFtZSgp
KSk7CiAgICB9Cn07Cgp9IC8vIENvbnNvbGUKCm5hbWVzcGFjZSBOZXR3b3JrIHsKLyogVW5pcXVl
IGxvYWRlciBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBMb2FkZXJJZDsKCi8qIFVuaXF1
ZSBmcmFtZSBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBGcmFtZUlkOwoKLyogVW5pcXVl
IHJlcXVlc3QgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgUmVxdWVzdElkOwoKLyogVGlt
aW5nIGluZm9ybWF0aW9uIGZvciB0aGUgcmVxdWVzdC4gKi8KY2xhc3MgUmVzb3VyY2VUaW1pbmcg
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9f
RklFTERTX1NFVCA9IDAsCiAgICAgICAgUkVRVUVTVF9USU1FX1NFVCA9IDEgPDwgMCwKICAgICAg
ICBQUk9YWV9TVEFSVF9TRVQgPSAxIDw8IDEsCiAgICAgICAgUFJPWFlfRU5EX1NFVCA9IDEgPDwg
MiwKICAgICAgICBETlNfU1RBUlRfU0VUID0gMSA8PCAzLAogICAgICAgIEROU19FTkRfU0VUID0g
MSA8PCA0LAogICAgICAgIENPTk5FQ1RfU1RBUlRfU0VUID0gMSA8PCA1LAogICAgICAgIENPTk5F
Q1RfRU5EX1NFVCA9IDEgPDwgNiwKICAgICAgICBTU0xfU1RBUlRfU0VUID0gMSA8PCA3LAogICAg
ICAgIFNTTF9FTkRfU0VUID0gMSA8PCA4LAogICAgICAgIFNFTkRfU1RBUlRfU0VUID0gMSA8PCA5
LAogICAgICAgIFNFTkRfRU5EX1NFVCA9IDEgPDwgMTAsCiAgICAgICAgUkVDRUlWRV9IRUFERVJT
X0VORF9TRVQgPSAxIDw8IDExLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFJFUVVFU1RfVElN
RV9TRVQgfCBQUk9YWV9TVEFSVF9TRVQgfCBQUk9YWV9FTkRfU0VUIHwgRE5TX1NUQVJUX1NFVCB8
IEROU19FTkRfU0VUIHwgQ09OTkVDVF9TVEFSVF9TRVQgfCBDT05ORUNUX0VORF9TRVQgfCBTU0xf
U1RBUlRfU0VUIHwgU1NMX0VORF9TRVQgfCBTRU5EX1NUQVJUX1NFVCB8IFNFTkRfRU5EX1NFVCB8
IFJFQ0VJVkVfSEVBREVSU19FTkRfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+
CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNU
QVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UmVzb3VyY2VUaW1pbmc+IHB0cikKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxk
ZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRy
OwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmVzb3VyY2VUaW1pbmc7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSRVFVRVNUX1RJTUVfU0VUPiYgc2V0UmVxdWVz
dFRpbWUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFJFUVVFU1RfVElNRV9TRVQpLCBwcm9wZXJ0eV9yZXF1ZXN0VGltZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInJlcXVlc3RUaW1lIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJFUVVFU1RfVElNRV9TRVQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUFJPWFlfU1RBUlRfU0VUPiYgc2V0UHJv
eHlTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgUFJPWFlfU1RBUlRfU0VUKSwgcHJvcGVydHlfcHJveHlTdGFydF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInByb3h5U3RhcnQiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UFJPWFlfU1RBUlRfU0VUPigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFBST1hZX0VORF9TRVQ+JiBzZXRQcm94eUVu
ZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgUFJPWFlfRU5EX1NFVCksIHByb3BlcnR5X3Byb3h5RW5kX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicHJveHlFbmQiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8UFJPWFlfRU5EX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBETlNfU1RBUlRfU0VUPiYgc2V0RG5zU3RhcnQoZG91YmxlIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEROU19TVEFS
VF9TRVQpLCBwcm9wZXJ0eV9kbnNTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXROdW1iZXIoImRuc1N0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPEROU19TVEFSVF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgRE5TX0VORF9TRVQ+JiBzZXREbnNFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEROU19FTkRfU0VUKSwgcHJvcGVydHlfZG5z
RW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiZG5zRW5k
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEROU19FTkRfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENPTk5FQ1RfU1RBUlRfU0VUPiYgc2V0
Q29ubmVjdFN0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBDT05ORUNUX1NUQVJUX1NFVCksIHByb3BlcnR5X2Nvbm5lY3RTdGFy
dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvbm5lY3RT
dGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT05ORUNUX1NUQVJU
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDT05ORUNUX0VORF9T
RVQ+JiBzZXRDb25uZWN0RW5kKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDT05ORUNUX0VORF9TRVQpLCBwcm9wZXJ0eV9jb25uZWN0
RW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY29ubmVj
dEVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDT05ORUNUX0VORF9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1NMX1NUQVJUX1NFVD4m
IHNldFNzbFN0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBTU0xfU1RBUlRfU0VUKSwgcHJvcGVydHlfc3NsU3RhcnRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzc2xTdGFydCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTU0xfU1RBUlRfU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNTTF9FTkRfU0VUPiYgc2V0U3NsRW5kKGRvdWJs
ZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBT
U0xfRU5EX1NFVCksIHByb3BlcnR5X3NzbEVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoInNzbEVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxTU0xfRU5EX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBTRU5EX1NUQVJUX1NFVD4mIHNldFNlbmRTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0VORF9TVEFSVF9TRVQpLCBwcm9w
ZXJ0eV9zZW5kU3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJzZW5kU3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U0VO
RF9TVEFSVF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU0VORF9F
TkRfU0VUPiYgc2V0U2VuZEVuZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0VORF9FTkRfU0VUKSwgcHJvcGVydHlfc2VuZEVuZF9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNlbmRFbmQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U0VORF9FTkRfU0VUPigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJFQ0VJVkVfSEVBREVSU19FTkRfU0VUPiYg
c2V0UmVjZWl2ZUhlYWRlcnNFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJFQ0VJVkVfSEVBREVSU19FTkRfU0VUKSwgcHJvcGVy
dHlfcmVjZWl2ZUhlYWRlcnNFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0TnVtYmVyKCJyZWNlaXZlSGVhZGVyc0VuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxSRUNFSVZFX0hFQURFUlNfRU5EX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFJlZlB0cjxSZXNvdXJjZVRpbWluZz4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVzb3Vy
Y2VUaW1pbmc+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8UmVzb3VyY2VUaW1pbmc+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPFJlc291cmNlVGltaW5nPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFJlc291cmNlVGltaW5nPiBy
ZXN1bHQgPSBSZXNvdXJjZVRpbWluZzo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UmVxdWVzdFRp
bWUoLi4uKQogICAgICogICAgIC5zZXRQcm94eVN0YXJ0KC4uLikKICAgICAqICAgICAuc2V0UHJv
eHlFbmQoLi4uKQogICAgICogICAgIC5zZXREbnNTdGFydCguLi4pCiAgICAgKiAgICAgLnNldERu
c0VuZCguLi4pCiAgICAgKiAgICAgLnNldENvbm5lY3RTdGFydCguLi4pCiAgICAgKiAgICAgLnNl
dENvbm5lY3RFbmQoLi4uKQogICAgICogICAgIC5zZXRTc2xTdGFydCguLi4pCiAgICAgKiAgICAg
LnNldFNzbEVuZCguLi4pCiAgICAgKiAgICAgLnNldFNlbmRTdGFydCguLi4pCiAgICAgKiAgICAg
LnNldFNlbmRFbmQoLi4uKQogICAgICogICAgIC5zZXRSZWNlaXZlSGVhZGVyc0VuZCguLi4pOwog
ICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewog
ICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBSZXNvdXJj
ZVRpbWluZygpKSk7CiAgICB9Cn07CgovKiBIVFRQIHJlcXVlc3QgZGF0YS4gKi8KY2xhc3MgUmVx
dWVzdCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBVUkxfU0VUID0gMSA8PCAwLAogICAgICAgIE1F
VEhPRF9TRVQgPSAxIDw8IDEsCiAgICAgICAgSEVBREVSU19TRVQgPSAxIDw8IDIsCiAgICAgICAg
QUxMX0ZJRUxEU19TRVQgPSAoVVJMX1NFVCB8IE1FVEhPRF9TRVQgfCBIRUFERVJTX1NFVCkKICAg
IH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2
YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0
ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJl
cXVlc3Q+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmVx
dWVzdDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVSTF9TRVQ+JiBzZXRV
cmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBVUkxfU0VUKSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFVSTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgTUVUSE9EX1NFVD4mIHNldE1ldGhvZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1FVEhPRF9TRVQpLCBwcm9wZXJ0
eV9tZXRob2RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJt
ZXRob2QiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TUVUSE9EX1NFVD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIRUFERVJTX1NFVD4mIHNldEhl
YWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhFQURFUlNfU0VUKSwgcHJvcGVydHlfaGVh
ZGVyc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRl
cnMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SEVBREVSU19TRVQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVxdWVzdD4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8UmVxdWVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxSZXF1ZXN0PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxSZXF1ZXN0PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhl
dGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFJlcXVlc3Q+IHJlc3VsdCA9IFJlcXVlc3Q6
OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNldE1ldGhvZCgu
Li4pCiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
T19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgUmVxdWVzdCgpKSk7CiAgICB9CgogICAgdm9pZCBz
ZXRQb3N0RGF0YShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0
cmluZygicG9zdERhdGEiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBIVFRQIHJlc3BvbnNlIGRhdGEu
ICovCmNsYXNzIFJlc3BvbnNlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFVSTF9TRVQgPSAxIDw8
IDAsCiAgICAgICAgU1RBVFVTX1NFVCA9IDEgPDwgMSwKICAgICAgICBTVEFUVVNfVEVYVF9TRVQg
PSAxIDw8IDIsCiAgICAgICAgSEVBREVSU19TRVQgPSAxIDw8IDMsCiAgICAgICAgTUlNRV9UWVBF
X1NFVCA9IDEgPDwgNCwKICAgICAgICBDT05ORUNUSU9OX1JFVVNFRF9TRVQgPSAxIDw8IDUsCiAg
ICAgICAgQ09OTkVDVElPTl9JRF9TRVQgPSAxIDw8IDYsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQg
PSAoVVJMX1NFVCB8IFNUQVRVU19TRVQgfCBTVEFUVVNfVEVYVF9TRVQgfCBIRUFERVJTX1NFVCB8
IE1JTUVfVFlQRV9TRVQgfCBDT05ORUNUSU9OX1JFVVNFRF9TRVQgfCBDT05ORUNUSU9OX0lEX1NF
VCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAg
ICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAg
ICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVm
UHRyPFJlc3BvbnNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUp
OwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNs
YXNzIFJlc3BvbnNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVVJMX1NF
VD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFVSTF9TRVQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8VVJMX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBTVEFUVVNfU0VUPiYgc2V0U3RhdHVzKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVEFUVVNfU0VUKSwgcHJvcGVy
dHlfc3RhdHVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigi
c3RhdHVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNUQVRVU19TRVQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1RBVFVTX1RFWFRfU0VUPiYg
c2V0U3RhdHVzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNUQVRVU19URVhUX1NFVCksIHByb3BlcnR5X3N0YXR1
c1RleHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdGF0
dXNUZXh0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNUQVRVU19URVhU
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIRUFERVJTX1NFVD4m
IHNldEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhFQURFUlNfU0VUKSwgcHJvcGVy
dHlfaGVhZGVyc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3Qo
ImhlYWRlcnMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SEVBREVSU19T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTUlNRV9UWVBFX1NFVD4m
IHNldE1pbWVUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgTUlNRV9UWVBFX1NFVCksIHByb3BlcnR5X21pbWVUeXBl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibWltZVR5cGUi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TUlNRV9UWVBFX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDT05ORUNUSU9OX1JFVVNFRF9TRVQ+
JiBzZXRDb25uZWN0aW9uUmV1c2VkKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ09OTkVDVElPTl9SRVVTRURfU0VUKSwgcHJvcGVydHlf
Y29ubmVjdGlvblJldXNlZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRC
b29sZWFuKCJjb25uZWN0aW9uUmV1c2VkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPENPTk5FQ1RJT05fUkVVU0VEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBDT05ORUNUSU9OX0lEX1NFVD4mIHNldENvbm5lY3Rpb25JZChkb3VibGUgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ09OTkVD
VElPTl9JRF9TRVQpLCBwcm9wZXJ0eV9jb25uZWN0aW9uSWRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjb25uZWN0aW9uSWQiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8Q09OTkVDVElPTl9JRF9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBSZWZQdHI8UmVzcG9uc2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJlc3BvbnNl
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFJl
c3BvbnNlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxSZXNwb25zZT4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxSZXNwb25zZT4gcmVzdWx0ID0gUmVzcG9uc2U6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNldFN0YXR1cyguLi4pCiAgICAg
KiAgICAgLnNldFN0YXR1c1RleHQoLi4uKQogICAgICogICAgIC5zZXRIZWFkZXJzKC4uLikKICAg
ICAqICAgICAuc2V0TWltZVR5cGUoLi4uKQogICAgICogICAgIC5zZXRDb25uZWN0aW9uUmV1c2Vk
KC4uLikKICAgICAqICAgICAuc2V0Q29ubmVjdGlvbklkKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1
aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFJlc3BvbnNlKCkpKTsKICAgIH0KCiAg
ICB2b2lkIHNldEhlYWRlcnNUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJoZWFkZXJzVGV4dCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dFJlcXVlc3RIZWFkZXJzKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJlcXVlc3RIZWFkZXJzIiwgdmFsdWUpOwogICAgfQoK
ICAgIHZvaWQgc2V0UmVxdWVzdEhlYWRlcnNUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJyZXF1ZXN0SGVhZGVyc1RleHQiLCB2YWx1ZSk7CiAg
ICB9CgogICAgdm9pZCBzZXRGcm9tRGlza0NhY2hlKGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0Qm9vbGVhbigiZnJvbURpc2tDYWNoZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lk
IHNldFRpbWluZyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0T2JqZWN0KCJ0aW1pbmciLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBXZWJTb2Nr
ZXQgcmVxdWVzdCBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXF1ZXN0IDogcHVibGljIEluc3Bl
Y3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAw
LAogICAgICAgIFJFUVVFU1RfS0VZM19TRVQgPSAxIDw8IDAsCiAgICAgICAgSEVBREVSU19TRVQg
PSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoUkVRVUVTVF9LRVkzX1NFVCB8IEhF
QURFUlNfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRSZXF1ZXN0OwogICAgcHVibGljOgoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgUkVRVUVTVF9LRVkzX1NFVD4mIHNldFJlcXVlc3RLZXkzKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgUkVRVUVTVF9LRVkzX1NFVCksIHByb3BlcnR5X3JlcXVlc3RLZXkzX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygicmVxdWVzdEtleTMiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UkVRVUVTVF9LRVkzX1NFVD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIRUFERVJTX1NFVD4mIHNldEhlYWRlcnMoUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIEhFQURFUlNfU0VUKSwgcHJvcGVydHlfaGVhZGVyc19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SEVBREVSU19TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PigqdGhpcyk7CiAgICAgICAgfQog
ICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRy
PFdlYlNvY2tldFJlcXVlc3Q+IHJlc3VsdCA9IFdlYlNvY2tldFJlcXVlc3Q6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldFJlcXVlc3RLZXkzKC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAg
ewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBXZWJT
b2NrZXRSZXF1ZXN0KCkpKTsKICAgIH0KfTsKCi8qIFdlYlNvY2tldCByZXNwb25zZSBkYXRhLiAq
LwpjbGFzcyBXZWJTb2NrZXRSZXNwb25zZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJs
aWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTVEFUVVNf
U0VUID0gMSA8PCAwLAogICAgICAgIFNUQVRVU19URVhUX1NFVCA9IDEgPDwgMSwKICAgICAgICBI
RUFERVJTX1NFVCA9IDEgPDwgMiwKICAgICAgICBDSEFMTEVOR0VfUkVTUE9OU0VfU0VUID0gMSA8
PCAzLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFNUQVRVU19TRVQgfCBTVEFUVVNfVEVYVF9T
RVQgfCBIRUFERVJTX1NFVCB8IENIQUxMRU5HRV9SRVNQT05TRV9TRVQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXNw
b25zZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
Tk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBXZWJT
b2NrZXRSZXNwb25zZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUQVRV
U19TRVQ+JiBzZXRTdGF0dXMoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFNUQVRVU19TRVQpLCBwcm9wZXJ0eV9zdGF0dXNfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U1RBVFVTX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTVEFUVVNfVEVYVF9TRVQ+JiBzZXRTdGF0dXNUZXh0KGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU1RBVFVTX1RFWFRfU0VUKSwgcHJvcGVydHlfc3RhdHVzVGV4dF9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0YXR1c1RleHQiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U1RBVFVTX1RFWFRfU0VUPigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhFQURFUlNfU0VUPiYgc2V0SGVhZGVycyhQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgSEVBREVSU19TRVQpLCBwcm9wZXJ0eV9oZWFkZXJzX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIRUFERVJTX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDSEFMTEVOR0VfUkVTUE9OU0VfU0VUPiYgc2V0Q2hh
bGxlbmdlUmVzcG9uc2UoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDSEFMTEVOR0VfUkVTUE9OU0VfU0VUKSwgcHJvcGVy
dHlfY2hhbGxlbmdlUmVzcG9uc2VfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJjaGFsbGVuZ2VSZXNwb25zZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxDSEFMTEVOR0VfUkVTUE9OU0VfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUmVmUHRyPFdlYlNvY2tldFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxXZWJT
b2NrZXRSZXNwb25zZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiBSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8V2ViU29j
a2V0UmVzcG9uc2U+IHJlc3VsdCA9IFdlYlNvY2tldFJlc3BvbnNlOjpjcmVhdGUoKQogICAgICog
ICAgIC5zZXRTdGF0dXMoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXNUZXh0KC4uLikKICAgICAq
ICAgICAuc2V0SGVhZGVycyguLi4pCiAgICAgKiAgICAgLnNldENoYWxsZW5nZVJlc3BvbnNlKC4u
Lik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFdl
YlNvY2tldFJlc3BvbnNlKCkpKTsKICAgIH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBj
YWNoZWQgcmVzb3VyY2UuICovCmNsYXNzIENhY2hlZFJlc291cmNlIDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAog
ICAgICAgIFVSTF9TRVQgPSAxIDw8IDAsCiAgICAgICAgVFlQRV9TRVQgPSAxIDw8IDEsCiAgICAg
ICAgUkVTUE9OU0VfU0VUID0gMSA8PCAyLAogICAgICAgIEJPRFlfU0laRV9TRVQgPSAxIDw8IDMs
CiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoVVJMX1NFVCB8IFRZUEVfU0VUIHwgUkVTUE9OU0Vf
U0VUIHwgQk9EWV9TSVpFX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPENhY2hlZFJlc291cmNlPiBwdHIpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2Ny
ZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAg
ICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENhY2hlZFJlc291cmNlOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVVJMX1NFVD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVSTF9T
RVQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VVJMX1NF
VD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUWVBFX1NFVD4mIHNldFR5
cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBUWVBFX1NFVCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFRZUEVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFJFU1BPTlNFX1NFVD4mIHNldFJlc3BvbnNlKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBSRVNQT05TRV9TRVQpLCBwcm9wZXJ0eV9yZXNwb25zZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoInJlc3BvbnNlIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFJFU1BPTlNFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBCT0RZX1NJWkVfU0VUPiYgc2V0Qm9keVNpemUoZG91YmxlIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEJPRFlfU0laRV9TRVQp
LCBwcm9wZXJ0eV9ib2R5U2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXROdW1iZXIoImJvZHlTaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PEJPRFlfU0laRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q2Fj
aGVkUmVzb3VyY2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENhY2hlZFJlc291cmNlPio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENhY2hlZFJlc291cmNl
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDYWNoZWRSZXNvdXJjZT4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxDYWNoZWRSZXNvdXJjZT4gcmVzdWx0ID0gQ2FjaGVkUmVzb3Vy
Y2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNldFR5cGUo
Li4uKQogICAgICogICAgIC5zZXRSZXNwb25zZSguLi4pCiAgICAgKiAgICAgLnNldEJvZHlTaXpl
KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgp
CiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3
IENhY2hlZFJlc291cmNlKCkpKTsKICAgIH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBy
ZXF1ZXN0IGluaXRpYXRvci4gKi8KY2xhc3MgSW5pdGlhdG9yIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAg
ICAgIFRZUEVfU0VUID0gMSA8PCAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFRZUEVfU0VU
KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAg
IHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAg
ICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxT
VEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQ
dHI8SW5pdGlhdG9yPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUp
OwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNs
YXNzIEluaXRpYXRvcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRZUEVf
U0VUPiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRZUEVfU0VUKSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VFlQRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBSZWZQdHI8SW5pdGlhdG9yPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxJbml0aWF0b3I+
Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SW5p
dGlhdG9yPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxJbml0aWF0b3I+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8SW5pdGlhdG9yPiByZXN1bHQgPSBJbml0aWF0b3I6OmNyZWF0
ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19G
SUVMRFNfU0VUPihhZG9wdFJlZihuZXcgSW5pdGlhdG9yKCkpKTsKICAgIH0KCiAgICB2b2lkIHNl
dFN0YWNrVHJhY2UoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0QXJyYXkoInN0YWNrVHJhY2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmco
InVybCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldExpbmVOdW1iZXIoZG91YmxlIHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAg
IH0KfTsKCn0gLy8gTmV0d29yawoKI2lmIEVOQUJMRShTUUxfREFUQUJBU0UpCm5hbWVzcGFjZSBE
YXRhYmFzZSB7Ci8qIERhdGFiYXNlIG9iamVjdC4gKi8KY2xhc3MgRGF0YWJhc2UgOiBwdWJsaWMg
SW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NF
VCA9IDAsCiAgICAgICAgSURfU0VUID0gMSA8PCAwLAogICAgICAgIERPTUFJTl9TRVQgPSAxIDw8
IDEsCiAgICAgICAgTkFNRV9TRVQgPSAxIDw8IDIsCiAgICAgICAgVkVSU0lPTl9TRVQgPSAxIDw8
IDMsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoSURfU0VUIHwgRE9NQUlOX1NFVCB8IE5BTUVf
U0VUIHwgVkVSU0lPTl9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNs
YXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXIoUGFzc1JlZlB0cjxEYXRhYmFzZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBEYXRhYmFzZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IElEX1NFVD4mIHNldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSURfU0VUKSwgcHJvcGVydHlfaWRf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJRF9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgRE9NQUlOX1NFVD4mIHNldERvbWFpbihjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIERP
TUFJTl9TRVQpLCBwcm9wZXJ0eV9kb21haW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJkb21haW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8RE9NQUlOX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBO
QU1FX1NFVD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOQU1FX1NFVCksIHByb3BlcnR5X25hbWVfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5BTUVfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFZFUlNJT05fU0VUPiYgc2V0VmVyc2lvbihjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFZFUlNJT05fU0VUKSwgcHJvcGVydHlfdmVyc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRTdHJpbmcoInZlcnNpb24iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VkVSU0lPTl9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8RGF0YWJhc2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPERhdGFiYXNlPio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPERhdGFiYXNlPiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxEYXRhYmFzZT4oKnRoaXMpOwogICAgICAg
IH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJl
ZlB0cjxEYXRhYmFzZT4gcmVzdWx0ID0gRGF0YWJhc2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dElkKC4uLikKICAgICAqICAgICAuc2V0RG9tYWluKC4uLikKICAgICAqICAgICAuc2V0TmFtZSgu
Li4pCiAgICAgKiAgICAgLnNldFZlcnNpb24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
T19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgRGF0YWJhc2UoKSkpOwogICAgfQp9OwoKfSAvLyBE
YXRhYmFzZQoKI2VuZGlmIC8vIEVOQUJMRShTUUxfREFUQUJBU0UpCm5hbWVzcGFjZSBET01TdG9y
YWdlIHsKLyogRE9NIFN0b3JhZ2UgZW50cnkuICovCmNsYXNzIEVudHJ5IDogcHVibGljIEluc3Bl
Y3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAw
LAogICAgICAgIEhPU1RfU0VUID0gMSA8PCAwLAogICAgICAgIElTX0xPQ0FMX1NUT1JBR0VfU0VU
ID0gMSA8PCAxLAogICAgICAgIElEX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERTX1NF
VCA9IChIT1NUX1NFVCB8IElTX0xPQ0FMX1NUT1JBR0VfU0VUIHwgSURfU0VUKQogICAgfTsKCiAg
ICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRl
PGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+
Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RW50cnk+IHB0
cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxE
U19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRW50cnk7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIT1NUX1NFVD4mIHNldEhvc3QoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBIT1NUX1NFVCksIHByb3BlcnR5X2hvc3RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJob3N0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPEhPU1RfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IElT
X0xPQ0FMX1NUT1JBR0VfU0VUPiYgc2V0SXNMb2NhbFN0b3JhZ2UoYm9vbCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJU19MT0NBTF9TVE9SQUdF
X1NFVCksIHByb3BlcnR5X2lzTG9jYWxTdG9yYWdlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldEJvb2xlYW4oImlzTG9jYWxTdG9yYWdlIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPElTX0xPQ0FMX1NUT1JBR0VfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IElEX1NFVD4mIHNldElkKGRvdWJsZSB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJRF9TRVQpLCBwcm9wZXJ0
eV9pZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImlkIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElEX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RW50cnk+
Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RW50
cnk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEVudHJ5PigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPEVudHJ5PiByZXN1bHQgPSBFbnRyeTo6Y3JlYXRlKCkKICAgICAqICAgICAu
c2V0SG9zdCguLi4pCiAgICAgKiAgICAgLnNldElzTG9jYWxTdG9yYWdlKC4uLikKICAgICAqICAg
ICAuc2V0SWQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4g
Y3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9w
dFJlZihuZXcgRW50cnkoKSkpOwogICAgfQp9OwoKfSAvLyBET01TdG9yYWdlCgpuYW1lc3BhY2Ug
QXBwbGljYXRpb25DYWNoZSB7Ci8qIERldGFpbGVkIGFwcGxpY2F0aW9uIGNhY2hlIHJlc291cmNl
IGluZm9ybWF0aW9uLiAqLwpjbGFzcyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UgOiBwdWJsaWMg
SW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NF
VCA9IDAsCiAgICAgICAgVVJMX1NFVCA9IDEgPDwgMCwKICAgICAgICBTSVpFX1NFVCA9IDEgPDwg
MSwKICAgICAgICBUWVBFX1NFVCA9IDEgPDwgMiwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChV
UkxfU0VUIHwgU0laRV9TRVQgfCBUWVBFX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4g
cHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklF
TERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBBcHBsaWNhdGlv
bkNhY2hlUmVzb3VyY2U7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVUkxf
U0VUPiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgVVJMX1NFVCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVUkxfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFNJWkVfU0VUPiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0laRV9TRVQpLCBwcm9wZXJ0eV9zaXpl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTSVpFX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUWVBFX1NFVD4mIHNldFR5cGUoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBU
WVBFX1NFVCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFRZUEVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEFwcGxpY2F0
aW9uQ2FjaGVSZXNvdXJjZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291
cmNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biBSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEFw
cGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gcmVzdWx0ID0gQXBwbGljYXRpb25DYWNoZVJlc291cmNl
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRTaXplKC4u
LikKICAgICAqICAgICAuc2V0VHlwZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxO
T19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJ
RUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UoKSkpOwogICAg
fQp9OwoKLyogRGV0YWlsZWQgYXBwbGljYXRpb24gY2FjaGUgaW5mb3JtYXRpb24uICovCmNsYXNz
IEFwcGxpY2F0aW9uQ2FjaGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAg
ZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgTUFOSUZFU1RfVV9SX0xf
U0VUID0gMSA8PCAwLAogICAgICAgIFNJWkVfU0VUID0gMSA8PCAxLAogICAgICAgIENSRUFUSU9O
X1RJTUVfU0VUID0gMSA8PCAyLAogICAgICAgIFVQREFURV9USU1FX1NFVCA9IDEgPDwgMywKICAg
ICAgICBSRVNPVVJDRVNfU0VUID0gMSA8PCA0LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKE1B
TklGRVNUX1VfUl9MX1NFVCB8IFNJWkVfU0VUIHwgQ1JFQVRJT05fVElNRV9TRVQgfCBVUERBVEVf
VElNRV9TRVQgfCBSRVNPVVJDRVNfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+
CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNU
QVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBBcHBsaWNhdGlvbkNhY2hlOwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTUFOSUZFU1RfVV9SX0xfU0VUPiYgc2V0
TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNQU5JRkVTVF9VX1JfTF9TRVQpLCBwcm9wZXJ0eV9tYW5p
ZmVzdFVSTF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1h
bmlmZXN0VVJMIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1BTklGRVNU
X1VfUl9MX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTSVpFX1NF
VD4mIHNldFNpemUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFNJWkVfU0VUKSwgcHJvcGVydHlfc2l6ZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNpemUiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8U0laRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgQ1JFQVRJT05fVElNRV9TRVQ+JiBzZXRDcmVhdGlvblRpbWUoZG91YmxlIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENSRUFUSU9O
X1RJTUVfU0VUKSwgcHJvcGVydHlfY3JlYXRpb25UaW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldE51bWJlcigiY3JlYXRpb25UaW1lIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPENSRUFUSU9OX1RJTUVfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFVQREFURV9USU1FX1NFVD4mIHNldFVwZGF0ZVRpbWUoZG91Ymxl
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVQ
REFURV9USU1FX1NFVCksIHByb3BlcnR5X3VwZGF0ZVRpbWVfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ1cGRhdGVUaW1lIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFVQREFURV9USU1FX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBSRVNPVVJDRVNfU0VUPiYgc2V0UmVzb3VyY2VzKFBhc3NSZWZQdHI8
SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFJFU09VUkNFU19TRVQpLCBwcm9wZXJ0eV9yZXNvdXJjZXNfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInJlc291cmNlcyIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSRVNPVVJDRVNfU0VUPigpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+JiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPEFwcGxpY2F0aW9uQ2FjaGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiBSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxB
cHBsaWNhdGlvbkNhY2hlPiByZXN1bHQgPSBBcHBsaWNhdGlvbkNhY2hlOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXRNYW5pZmVzdFVSTCguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAg
ICogICAgIC5zZXRDcmVhdGlvblRpbWUoLi4uKQogICAgICogICAgIC5zZXRVcGRhdGVUaW1lKC4u
LikKICAgICAqICAgICAuc2V0UmVzb3VyY2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8
Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IEFwcGxpY2F0aW9uQ2FjaGUoKSkpOwogICAgfQp9
OwoKLyogRnJhbWUgaWRlbnRpZmllciAtIG1hbmlmZXN0IFVSTCBwYWlyLiAqLwpjbGFzcyBGcmFt
ZVdpdGhNYW5pZmVzdCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBGUkFNRV9JRF9TRVQgPSAxIDw8
IDAsCiAgICAgICAgTUFOSUZFU1RfVV9SX0xfU0VUID0gMSA8PCAxLAogICAgICAgIFNUQVRVU19T
RVQgPSAxIDw8IDIsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoRlJBTUVfSURfU0VUIHwgTUFO
SUZFU1RfVV9SX0xfU0VUIHwgU1RBVFVTX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19GSUVMRFNfU0VU
LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3Vs
dCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEZyYW1lV2l0aE1hbmlmZXN0
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRlJBTUVfSURfU0VUPiYgc2V0
RnJhbWVJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIEZSQU1FX0lEX1NFVCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEZSQU1FX0lEX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNQU5JRkVTVF9VX1JfTF9TRVQ+JiBzZXRNYW5pZmVz
dFVSTChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE1BTklGRVNUX1VfUl9MX1NFVCksIHByb3BlcnR5X21hbmlmZXN0VVJM
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibWFuaWZlc3RV
UkwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TUFOSUZFU1RfVV9SX0xf
U0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUQVRVU19TRVQ+JiBz
ZXRTdGF0dXMoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFNUQVRVU19TRVQpLCBwcm9wZXJ0eV9zdGF0dXNfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8U1RBVFVTX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFJlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFk
eSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RnJhbWVXaXRo
TWFuaWZlc3Q+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
UmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEZyYW1lV2l0aE1h
bmlmZXN0PiByZXN1bHQgPSBGcmFtZVdpdGhNYW5pZmVzdDo6Y3JlYXRlKCkKICAgICAqICAgICAu
c2V0RnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldE1hbmlmZXN0VVJMKC4uLikKICAgICAqICAg
ICAuc2V0U3RhdHVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4o
YWRvcHRSZWYobmV3IEZyYW1lV2l0aE1hbmlmZXN0KCkpKTsKICAgIH0KfTsKCn0gLy8gQXBwbGlj
YXRpb25DYWNoZQoKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKbmFtZXNwYWNlIEZpbGVTeXN0ZW0g
ewp9IC8vIEZpbGVTeXN0ZW0KCiNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCm5hbWVzcGFj
ZSBET00gewovKiBET00gaW50ZXJhY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgbWly
cm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIGFjdHVhbCBET00gbm9kZXMuIERPTU5vZGUg
aXMgYSBiYXNlIG5vZGUgbWlycm9yIHR5cGUuICovCmNsYXNzIE5vZGUgOiBwdWJsaWMgSW5zcGVj
dG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAs
CiAgICAgICAgTk9ERV9JRF9TRVQgPSAxIDw8IDAsCiAgICAgICAgTk9ERV9UWVBFX1NFVCA9IDEg
PDwgMSwKICAgICAgICBOT0RFX05BTUVfU0VUID0gMSA8PCAyLAogICAgICAgIExPQ0FMX05BTUVf
U0VUID0gMSA8PCAzLAogICAgICAgIE5PREVfVkFMVUVfU0VUID0gMSA8PCA0LAogICAgICAgIEFM
TF9GSUVMRFNfU0VUID0gKE5PREVfSURfU0VUIHwgTk9ERV9UWVBFX1NFVCB8IE5PREVfTkFNRV9T
RVQgfCBMT0NBTF9OQU1FX1NFVCB8IE5PREVfVkFMVUVfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0
ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQ
PiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Tm9kZT4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBOb2RlOwogICAgcHVibGljOgoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9JRF9TRVQ+JiBzZXROb2RlSWQoaW50IHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5PREVfSURfU0VU
KSwgcHJvcGVydHlfbm9kZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dE51bWJlcigibm9kZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5P
REVfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5PREVfVFlQ
RV9TRVQ+JiBzZXROb2RlVHlwZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgTk9ERV9UWVBFX1NFVCksIHByb3BlcnR5X25vZGVUeXBlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibm9kZVR5cGUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Tk9ERV9UWVBFX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOT0RFX05BTUVfU0VUPiYgc2V0Tm9kZU5h
bWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBOT0RFX05BTUVfU0VUKSwgcHJvcGVydHlfbm9kZU5hbWVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJub2RlTmFtZSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOT0RFX05BTUVfU0VUPigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExPQ0FMX05BTUVfU0VUPiYgc2V0TG9jYWxOYW1lKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgTE9DQUxfTkFNRV9TRVQpLCBwcm9wZXJ0eV9sb2NhbE5hbWVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJsb2NhbE5hbWUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TE9DQUxfTkFNRV9TRVQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTk9ERV9WQUxVRV9TRVQ+JiBzZXROb2RlVmFsdWUoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBOT0RFX1ZBTFVFX1NFVCksIHByb3BlcnR5X25vZGVWYWx1ZV9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5vZGVWYWx1ZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOT0RFX1ZBTFVFX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFJlZlB0cjxOb2RlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxOb2RlPio+KCZt
X3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPE5vZGU+ICgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPE5vZGU+KCp0aGlzKTsKICAgICAg
ICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBS
ZWZQdHI8Tm9kZT4gcmVzdWx0ID0gTm9kZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0Tm9kZUlk
KC4uLikKICAgICAqICAgICAuc2V0Tm9kZVR5cGUoLi4uKQogICAgICogICAgIC5zZXROb2RlTmFt
ZSguLi4pCiAgICAgKiAgICAgLnNldExvY2FsTmFtZSguLi4pCiAgICAgKiAgICAgLnNldE5vZGVW
YWx1ZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVh
dGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVm
KG5ldyBOb2RlKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldENoaWxkTm9kZUNvdW50KGludCB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImNoaWxkTm9kZUNvdW50IiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0Q2hpbGRyZW4oUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4g
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoImNoaWxkcmVuIiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0QXR0cmlidXRlcyhQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgiYXR0cmlidXRlcyIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldERvY3VtZW50VVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVSTCIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFB1YmxpY0lkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0U3RyaW5nKCJwdWJsaWNJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN5c3Rl
bUlkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJz
eXN0ZW1JZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEludGVybmFsU3Vic2V0KGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJpbnRlcm5hbFN1
YnNldCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFhtbFZlcnNpb24oY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInhtbFZlcnNpb24iLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0
VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmco
InZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1
ZTsKCn07CgovKiBET00gaW50ZXJhY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgbWly
cm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIGFjdHVhbCBET00gbm9kZXMuIERPTU5vZGUg
aXMgYSBiYXNlIG5vZGUgbWlycm9yIHR5cGUuICovCmNsYXNzIEV2ZW50TGlzdGVuZXIgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERT
X1NFVCA9IDAsCiAgICAgICAgVFlQRV9TRVQgPSAxIDw8IDAsCiAgICAgICAgVVNFX0NBUFRVUkVf
U0VUID0gMSA8PCAxLAogICAgICAgIElTX0FUVFJJQlVURV9TRVQgPSAxIDw8IDIsCiAgICAgICAg
Tk9ERV9JRF9TRVQgPSAxIDw8IDMsCiAgICAgICAgSEFORExFUl9CT0RZX1NFVCA9IDEgPDwgNCwK
ICAgICAgICBBTExfRklFTERTX1NFVCA9IChUWVBFX1NFVCB8IFVTRV9DQVBUVVJFX1NFVCB8IElT
X0FUVFJJQlVURV9TRVQgfCBOT0RFX0lEX1NFVCB8IEhBTkRMRVJfQk9EWV9TRVQpCiAgICB9OwoK
ICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToK
ICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxh
dGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RF
UD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxFdmVudExp
c3RlbmVyPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEV2
ZW50TGlzdGVuZXI7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUWVBFX1NF
VD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUWVBFX1NFVCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRZUEVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IFVTRV9DQVBUVVJFX1NFVD4mIHNldFVzZUNhcHR1cmUoYm9vbCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVU0VfQ0FQ
VFVSRV9TRVQpLCBwcm9wZXJ0eV91c2VDYXB0dXJlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldEJvb2xlYW4oInVzZUNhcHR1cmUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8VVNFX0NBUFRVUkVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IElTX0FUVFJJQlVURV9TRVQ+JiBzZXRJc0F0dHJpYnV0ZShib29sIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIElTX0FUVFJJ
QlVURV9TRVQpLCBwcm9wZXJ0eV9pc0F0dHJpYnV0ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRCb29sZWFuKCJpc0F0dHJpYnV0ZSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxJU19BVFRSSUJVVEVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IE5PREVfSURfU0VUPiYgc2V0Tm9kZUlkKGludCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOT0RFX0lEX1NFVCksIHBy
b3BlcnR5X25vZGVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1i
ZXIoIm5vZGVJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOT0RFX0lE
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIQU5ETEVSX0JPRFlf
U0VUPiYgc2V0SGFuZGxlckJvZHkoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIQU5ETEVSX0JPRFlfU0VUKSwgcHJvcGVy
dHlfaGFuZGxlckJvZHlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJoYW5kbGVyQm9keSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxI
QU5ETEVSX0JPRFlfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEV2
ZW50TGlzdGVuZXI+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEV2ZW50TGlzdGVuZXI+Kj4oJm1fcmVzdWx0
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RXZlbnRMaXN0ZW5lcj4g
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4oKnRo
aXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3Rv
cjoKICAgICAqIFJlZlB0cjxFdmVudExpc3RlbmVyPiByZXN1bHQgPSBFdmVudExpc3RlbmVyOjpj
cmVhdGUoKQogICAgICogICAgIC5zZXRUeXBlKC4uLikKICAgICAqICAgICAuc2V0VXNlQ2FwdHVy
ZSguLi4pCiAgICAgKiAgICAgLnNldElzQXR0cmlidXRlKC4uLikKICAgICAqICAgICAuc2V0Tm9k
ZUlkKC4uLikKICAgICAqICAgICAuc2V0SGFuZGxlckJvZHkoLi4uKTsKICAgICAqLwogICAgc3Rh
dGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgRXZlbnRMaXN0ZW5lcigpKSk7CiAg
ICB9CgogICAgdm9pZCBzZXRMb2NhdGlvbihQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJsb2NhdGlvbiIsIHZhbHVlKTsKICAg
IH0KfTsKCi8qIEEgc3RydWN0dXJlIGhvbGRpbmcgYW4gUkdCQSBjb2xvci4gKi8KLy8gVHlwZSBv
cmlnaW5hbGx5IHdhcyBuYW1lZCAnUkdCQScuCmNsYXNzIFJnYmEgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAg
ICAgICAgUl9TRVQgPSAxIDw8IDAsCiAgICAgICAgR19TRVQgPSAxIDw8IDEsCiAgICAgICAgQl9T
RVQgPSAxIDw8IDIsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoUl9TRVQgfCBHX1NFVCB8IEJf
U0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsK
ICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7Cgog
ICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0
ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NS
ZWZQdHI8UmdiYT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBSZ2JhOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUl9TRVQ+JiBzZXRS
KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBSX1NFVCksIHByb3BlcnR5X3JfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0TnVtYmVyKCJyIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEdfU0VUPiYgc2V0RyhpbnQg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgR19T
RVQpLCBwcm9wZXJ0eV9nX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51
bWJlcigiZyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxHX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBCX1NFVD4mIHNldEIoaW50IHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEJfU0VUKSwg
cHJvcGVydHlfYl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
ImIiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Ql9TRVQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmdiYT4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Umdi
YT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxS
Z2JhPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxSZ2JhPigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPFJnYmE+IHJlc3VsdCA9IFJnYmE6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dFIoLi4uKQogICAgICogICAgIC5zZXRHKC4uLikKICAgICAqICAgICAuc2V0QiguLi4pOwogICAg
ICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VUPiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFkb3B0UmVmKG5ldyBSZ2JhKCkpKTsK
ICAgIH0KCiAgICB2b2lkIHNldEEoZG91YmxlIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dE51bWJlcigiYSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIENvbmZpZ3VyYXRpb24gZGF0YSBmb3Ig
dGhlIGhpZ2hsaWdodGluZyBvZiBwYWdlIGVsZW1lbnRzLiAqLwpjbGFzcyBIaWdobGlnaHRDb25m
aWcgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAg
Tk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAwCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxIaWdobGlnaHRD
b25maWc+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgSGln
aGxpZ2h0Q29uZmlnOwogICAgcHVibGljOgoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SGlnaGxp
Z2h0Q29uZmlnPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxIaWdobGlnaHRDb25maWc+Kj4oJm1fcmVzdWx0
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SGlnaGxpZ2h0Q29uZmln
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxIaWdobGlnaHRDb25maWc+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiByZXN1bHQgPSBIaWdobGlnaHRD
b25maWc6OmNyZWF0ZSgpOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNfU0VU
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+KGFk
b3B0UmVmKG5ldyBIaWdobGlnaHRDb25maWcoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0U2hvd0lu
Zm8oYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29sZWFuKCJzaG93SW5mbyIs
IHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldENvbnRlbnRDb2xvcihQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJjb250ZW50
Q29sb3IiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRQYWRkaW5nQ29sb3IoUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgi
cGFkZGluZ0NvbG9yIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0Qm9yZGVyQ29sb3IoUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9i
amVjdCgiYm9yZGVyQ29sb3IiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRNYXJnaW5Db2xv
cihQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0T2JqZWN0KCJtYXJnaW5Db2xvciIsIHZhbHVlKTsKICAgIH0KfTsKCn0gLy8gRE9NCgpuYW1l
c3BhY2UgQ1NTIHsKLyogVGhpcyBvYmplY3QgaWRlbnRpZmllcyBhIENTUyBzdHlsZSBpbiBhIHVu
aXF1ZSB3YXkuICovCmNsYXNzIENTU1N0eWxlSWQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgU1RZ
TEVfU0hFRVRfSURfU0VUID0gMSA8PCAwLAogICAgICAgIE9SRElOQUxfU0VUID0gMSA8PCAxLAog
ICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFNUWUxFX1NIRUVUX0lEX1NFVCB8IE9SRElOQUxfU0VU
KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAg
IHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAg
ICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxT
VEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQ
dHI8Q1NTU3R5bGVJZD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBDU1NTdHlsZUlkOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1RZ
TEVfU0hFRVRfSURfU0VUPiYgc2V0U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1RZTEVfU0hFRVRf
SURfU0VUKSwgcHJvcGVydHlfc3R5bGVTaGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygic3R5bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNUWUxFX1NIRUVUX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBPUkRJTkFMX1NFVD4mIHNldE9yZGluYWwoaW50IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE9SRElOQUxfU0VUKSwg
cHJvcGVydHlfb3JkaW5hbF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoIm9yZGluYWwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T1JE
SU5BTF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTU3R5bGVJ
ZD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExf
RklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTU3R5bGVJZD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZUlkPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZUlkPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENT
U1N0eWxlSWQ+IHJlc3VsdCA9IENTU1N0eWxlSWQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0
eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAgLnNldE9yZGluYWwoLi4uKTsKICAgICAqLwogICAg
c3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1
cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ1NTU3R5bGVJZCgpKSk7CiAg
ICB9Cn07CgovKiBUaGlzIG9iamVjdCBpZGVudGlmaWVzIGEgQ1NTIHJ1bGUgaW4gYSB1bmlxdWUg
d2F5LiAqLwpjbGFzcyBDU1NSdWxlSWQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGlj
OgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgU1RZTEVfU0hF
RVRfSURfU0VUID0gMSA8PCAwLAogICAgICAgIE9SRElOQUxfU0VUID0gMSA8PCAxLAogICAgICAg
IEFMTF9GSUVMRFNfU0VUID0gKFNUWUxFX1NIRUVUX0lEX1NFVCB8IE9SRElOQUxfU0VUKQogICAg
fTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZh
dGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRl
bXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8
IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NT
UnVsZUlkPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOT19GSUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENT
U1J1bGVJZDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNUWUxFX1NIRUVU
X0lEX1NFVD4mIHNldFN0eWxlU2hlZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNUWUxFX1NIRUVUX0lEX1NFVCks
IHByb3BlcnR5X3N0eWxlU2hlZXRJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInN0eWxlU2hlZXRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxTVFlMRV9TSEVFVF9JRF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgT1JESU5BTF9TRVQ+JiBzZXRPcmRpbmFsKGludCB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPUkRJTkFMX1NFVCksIHByb3BlcnR5
X29yZGluYWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJv
cmRpbmFsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE9SRElOQUxfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1J1bGVJZD4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NF
VCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTUnVsZUlkPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPENTU1J1bGVJZD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiBSZWZQdHI8Q1NTUnVsZUlkPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgog
ICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1J1bGVJZD4gcmVz
dWx0ID0gQ1NTUnVsZUlkOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdHlsZVNoZWV0SWQoLi4u
KQogICAgICogICAgIC5zZXRPcmRpbmFsKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVy
PE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9f
RklFTERTX1NFVD4oYWRvcHRSZWYobmV3IENTU1J1bGVJZCgpKSk7CiAgICB9Cn07CgovKiBDU1Mg
cnVsZSBjb2xsZWN0aW9uIGZvciBhIHNpbmdsZSBwc2V1ZG8gc3R5bGUuICovCmNsYXNzIFBzZXVk
b0lkUnVsZXMgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAg
ICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAgUFNFVURPX0lEX1NFVCA9IDEgPDwgMCwK
ICAgICAgICBSVUxFU19TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoUFNF
VURPX0lEX1NFVCB8IFJVTEVTX1NFVCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFBzZXVkb0lkUnVsZXM+IHB0cikKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJf
Y3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwog
ICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUHNldWRvSWRSdWxlczsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFBTRVVET19JRF9TRVQ+JiBzZXRQc2V1ZG9JZChpbnQg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUFNF
VURPX0lEX1NFVCksIHByb3BlcnR5X3BzZXVkb0lkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE51bWJlcigicHNldWRvSWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8UFNFVURPX0lEX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBSVUxFU19TRVQ+JiBzZXRSdWxlcyhQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSVUxF
U19TRVQpLCBwcm9wZXJ0eV9ydWxlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRBcnJheSgicnVsZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
UlVMRVNfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFBzZXVkb0lk
UnVsZXM+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFBzZXVkb0lkUnVsZXM+Kj4oJm1fcmVzdWx0KTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UHNldWRvSWRSdWxlcz4gKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UHNldWRvSWRSdWxlcz4oKnRoaXMpOwog
ICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAg
ICAqIFJlZlB0cjxQc2V1ZG9JZFJ1bGVzPiByZXN1bHQgPSBQc2V1ZG9JZFJ1bGVzOjpjcmVhdGUo
KQogICAgICogICAgIC5zZXRQc2V1ZG9JZCguLi4pCiAgICAgKiAgICAgLnNldFJ1bGVzKC4uLik7
CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7
CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFBzZXVk
b0lkUnVsZXMoKSkpOwogICAgfQp9OwoKLyogQ1NTIHJ1bGUgY29sbGVjdGlvbiBmb3IgYSBzaW5n
bGUgcHNldWRvIHN0eWxlLiAqLwpjbGFzcyBJbmhlcml0ZWRTdHlsZUVudHJ5IDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQg
PSAwLAogICAgICAgIE1BVENIRURfQ1NTX1JVTEVTX1NFVCA9IDEgPDwgMCwKICAgICAgICBBTExf
RklFTERTX1NFVCA9IChNQVRDSEVEX0NTU19SVUxFU19TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRl
PGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+
IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19G
SUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAg
ICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEluaGVyaXRl
ZFN0eWxlRW50cnk7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNQVRDSEVE
X0NTU19SVUxFU19TRVQ+JiBzZXRNYXRjaGVkQ1NTUnVsZXMoUGFzc1JlZlB0cjxJbnNwZWN0b3JB
cnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgTUFUQ0hFRF9DU1NfUlVMRVNfU0VUKSwgcHJvcGVydHlfbWF0Y2hlZENTU1J1bGVzX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJtYXRjaGVkQ1NTUnVsZXMi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TUFUQ0hFRF9DU1NfUlVMRVNf
U0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEluaGVyaXRlZFN0eWxl
RW50cnk+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+Kj4oJm1fcmVzdWx0
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SW5oZXJpdGVkU3R5bGVF
bnRyeT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8SW5oZXJpdGVkU3R5
bGVFbnRyeT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiByZXN1bHQg
PSBJbmhlcml0ZWRTdHlsZUVudHJ5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRNYXRjaGVkQ1NT
UnVsZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJl
ZihuZXcgSW5oZXJpdGVkU3R5bGVFbnRyeSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRJbmxpbmVT
dHlsZShQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0T2JqZWN0KCJpbmxpbmVTdHlsZSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIENTUyBzdHls
ZSBpbmZvcm1hdGlvbiBmb3IgYSBET00gc3R5bGUgYXR0cmlidXRlLiAqLwpjbGFzcyBDU1NTdHls
ZUF0dHJpYnV0ZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBOQU1FX1NFVCA9IDEgPDwgMCwKICAg
ICAgICBTVFlMRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoTkFNRV9T
RVQgfCBTVFlMRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNz
IEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBt
X3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
PiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXIoUGFzc1JlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVh
dGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAg
ICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDU1NTdHlsZUF0dHJpYnV0ZTsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5BTUVfU0VUPiYgc2V0TmFtZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5B
TUVfU0VUKSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
TkFNRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU1RZTEVfU0VU
PiYgc2V0U3R5bGUoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNUWUxFX1NFVCksIHByb3BlcnR5
X3N0eWxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgic3R5
bGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U1RZTEVfU0VUPigpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNf
U0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PFJlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4gKCkKICAgICAg
ICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+KCp0aGlzKTsK
ICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAg
ICAgKiBSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+IHJlc3VsdCA9IENTU1N0eWxlQXR0cmlidXRl
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0U3R5bGUo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkK
ICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcg
Q1NTU3R5bGVBdHRyaWJ1dGUoKSkpOwogICAgfQp9OwoKLyogQ1NTIHN0eWxlc2hlZXQgbWV0YWlu
Zm9ybWF0aW9uLiAqLwpjbGFzcyBDU1NTdHlsZVNoZWV0SGVhZGVyIDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAog
ICAgICAgIFNUWUxFX1NIRUVUX0lEX1NFVCA9IDEgPDwgMCwKICAgICAgICBTT1VSQ0VfVV9SX0xf
U0VUID0gMSA8PCAxLAogICAgICAgIFRJVExFX1NFVCA9IDEgPDwgMiwKICAgICAgICBESVNBQkxF
RF9TRVQgPSAxIDw8IDMsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAoU1RZTEVfU0hFRVRfSURf
U0VUIHwgU09VUkNFX1VfUl9MX1NFVCB8IFRJVExFX1NFVCB8IERJU0FCTEVEX1NFVCkKICAgIH07
CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRl
OgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1w
bGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0
eWxlU2hlZXRIZWFkZXI+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgQ1NTU3R5bGVTaGVldEhlYWRlcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFNUWUxFX1NIRUVUX0lEX1NFVD4mIHNldFN0eWxlU2hlZXRJZChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNU
WUxFX1NIRUVUX0lEX1NFVCksIHByb3BlcnR5X3N0eWxlU2hlZXRJZF9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0eWxlU2hlZXRJZCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVFlMRV9TSEVFVF9JRF9TRVQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU09VUkNFX1VfUl9MX1NFVD4mIHNldFNvdXJjZVVS
TChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFNPVVJDRV9VX1JfTF9TRVQpLCBwcm9wZXJ0eV9zb3VyY2VVUkxfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzb3VyY2VVUkwiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U09VUkNFX1VfUl9MX1NFVD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUSVRMRV9TRVQ+JiBzZXRUaXRsZShjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFRJVExFX1NFVCksIHByb3BlcnR5X3RpdGxlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygidGl0bGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VElUTEVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IERJU0FCTEVEX1NFVD4mIHNldERpc2FibGVkKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRElTQUJMRURfU0VUKSwgcHJvcGVydHlf
ZGlzYWJsZWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigi
ZGlzYWJsZWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RElTQUJMRURf
U0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlU2hlZXRI
ZWFkZXI+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+Kj4oJm1fcmVzdWx0
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEhl
YWRlcj4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTU3R5bGVTaGVl
dEhlYWRlcj4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiByZXN1bHQg
PSBDU1NTdHlsZVNoZWV0SGVhZGVyOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdHlsZVNoZWV0
SWQoLi4uKQogICAgICogICAgIC5zZXRTb3VyY2VVUkwoLi4uKQogICAgICogICAgIC5zZXRUaXRs
ZSguLi4pCiAgICAgKiAgICAgLnNldERpc2FibGVkKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IENTU1N0eWxlU2hlZXRIZWFkZXIoKSkpOwog
ICAgfQp9OwoKLyogQ1NTIHN0eWxlc2hlZXQgY29udGVudHMuICovCmNsYXNzIENTU1N0eWxlU2hl
ZXRCb2R5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAg
ICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFNUWUxFX1NIRUVUX0lEX1NFVCA9IDEgPDwg
MCwKICAgICAgICBSVUxFU19TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJRUxEU19TRVQgPSAo
U1RZTEVfU0hFRVRfSURfU0VUIHwgUlVMRVNfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5PX0ZJRUxEU19T
RVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVTaGVldEJv
ZHk7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTVFlMRV9TSEVFVF9JRF9T
RVQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVFlMRV9TSEVFVF9JRF9TRVQpLCBwcm9w
ZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8U1RZTEVfU0hFRVRfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFJVTEVTX1NFVD4mIHNldFJ1bGVzKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJVTEVTX1NF
VCksIHByb3BlcnR5X3J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dEFycmF5KCJydWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSVUxF
U19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTU3R5bGVTaGVl
dEJvZHk+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QUxMX0ZJRUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5Pio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9k
eT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4gcmVzdWx0ID0gQ1NTU3R5
bGVTaGVldEJvZHk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAg
ICAgKiAgICAgLnNldFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJ
RUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERT
X1NFVD4oYWRvcHRSZWYobmV3IENTU1N0eWxlU2hlZXRCb2R5KCkpKTsKICAgIH0KCiAgICB2b2lk
IHNldFRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoInRleHQiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBDU1MgcnVsZSByZXByZXNlbnRhdGlvbi4g
Ki8KY2xhc3MgQ1NTUnVsZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBl
bnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTRUxFQ1RPUl9URVhUX1NF
VCA9IDEgPDwgMCwKICAgICAgICBTT1VSQ0VfTElORV9TRVQgPSAxIDw8IDEsCiAgICAgICAgT1JJ
R0lOX1NFVCA9IDEgPDwgMiwKICAgICAgICBTVFlMRV9TRVQgPSAxIDw8IDMsCiAgICAgICAgQUxM
X0ZJRUxEU19TRVQgPSAoU0VMRUNUT1JfVEVYVF9TRVQgfCBTT1VSQ0VfTElORV9TRVQgfCBPUklH
SU5fU0VUIHwgU1RZTEVfU0VUKQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBj
bGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwg
U1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTUnVsZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBDU1NSdWxlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU0VMRUNUT1JfVEVYVF9TRVQ+JiBzZXRTZWxlY3RvclRleHQoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBT
RUxFQ1RPUl9URVhUX1NFVCksIHByb3BlcnR5X3NlbGVjdG9yVGV4dF9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNlbGVjdG9yVGV4dCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTRUxFQ1RPUl9URVhUX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTT1VSQ0VfTElORV9TRVQ+JiBzZXRTb3VyY2VMaW5l
KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTT1VSQ0VfTElORV9TRVQpLCBwcm9wZXJ0eV9zb3VyY2VMaW5lX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic291cmNlTGluZSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTT1VSQ0VfTElORV9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgT1JJR0lOX1NFVD4mIHNldE9yaWdpbihjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE9S
SUdJTl9TRVQpLCBwcm9wZXJ0eV9vcmlnaW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJvcmlnaW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8T1JJR0lOX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBT
VFlMRV9TRVQ+JiBzZXRTdHlsZShQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU1RZTEVfU0VUKSwg
cHJvcGVydHlfc3R5bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2Jq
ZWN0KCJzdHlsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTVFlMRV9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTUnVsZT4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NF
VCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTUnVsZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUGFzc1JlZlB0cjxDU1NSdWxlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
IFJlZlB0cjxDU1NSdWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1J1bGU+IHJlc3VsdCA9IENT
U1J1bGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNlbGVjdG9yVGV4dCguLi4pCiAgICAgKiAg
ICAgLnNldFNvdXJjZUxpbmUoLi4uKQogICAgICogICAgIC5zZXRPcmlnaW4oLi4uKQogICAgICog
ICAgIC5zZXRTdHlsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOT19GSUVMRFNf
U0VUPiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+
KGFkb3B0UmVmKG5ldyBDU1NSdWxlKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFJ1bGVJZChQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2Jq
ZWN0KCJydWxlSWQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTb3VyY2VVUkwoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInNvdXJjZVVSTCIs
IHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNlbGVjdG9yUmFuZ2UoUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgic2VsZWN0
b3JSYW5nZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE1lZGlhKFBhc3NSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJtZWRpYSIs
IHZhbHVlKTsKICAgIH0KfTsKCi8qIFRleHQgcmFuZ2Ugd2l0aGluIGEgcmVzb3VyY2UuICovCmNs
YXNzIFNvdXJjZVJhbmdlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVu
dW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFNUQVJUX1NFVCA9IDEgPDwg
MCwKICAgICAgICBFTkRfU0VUID0gMSA8PCAxLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFNU
QVJUX1NFVCB8IEVORF9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNs
YXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXIoUGFzc1JlZlB0cjxTb3VyY2VSYW5nZT4gcHRyKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVk
X2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAg
fQogICAgICAgIGZyaWVuZCBjbGFzcyBTb3VyY2VSYW5nZTsKICAgIHB1YmxpYzoKCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IFNUQVJUX1NFVD4mIHNldFN0YXJ0KGludCB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTVEFSVF9TRVQpLCBwcm9wZXJ0
eV9zdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0
YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNUQVJUX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFTkRfU0VUPiYgc2V0RW5kKGludCB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBFTkRf
U0VUKSwgcHJvcGVydHlfZW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dE51bWJlcigiZW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEVORF9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U291cmNlUmFuZ2U+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJRUxE
U19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPFNvdXJjZVJhbmdlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNvdXJjZVJhbmdlPiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxTb3VyY2VSYW5nZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTb3Vy
Y2VSYW5nZT4gcmVzdWx0ID0gU291cmNlUmFuZ2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0
YXJ0KC4uLikKICAgICAqICAgICAuc2V0RW5kKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8
Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFNvdXJjZVJhbmdlKCkpKTsKICAgIH0KfTsKCmNs
YXNzIENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qgewpw
dWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBOQU1F
X1NFVCA9IDEgPDwgMCwKICAgICAgICBWQUxVRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJ
RUxEU19TRVQgPSAoTkFNRV9TRVQgfCBWQUxVRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVy
dHk+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5P
X0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAg
ICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTQ29t
cHV0ZWRTdHlsZVByb3BlcnR5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TkFNRV9TRVQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTkFNRV9TRVQpLCBwcm9wZXJ0eV9uYW1lX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOQU1FX1NFVD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWQUxVRV9TRVQ+JiBzZXRWYWx1ZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZB
TFVFX1NFVCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VkFMVUVfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU0Nv
bXB1dGVkU3R5bGVQcm9wZXJ0eT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVBy
b3BlcnR5Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVm
UHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiBSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5PigqdGhpcyk7CiAgICAgICAgfQog
ICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRy
PENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4gcmVzdWx0ID0gQ1NTQ29tcHV0ZWRTdHlsZVByb3Bl
cnR5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFs
dWUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihu
ZXcgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5KCkpKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZSBy
ZXByZXNlbnRhdGlvbi4gKi8KY2xhc3MgQ1NTU3R5bGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTk9fRklFTERTX1NFVCA9IDAsCiAgICAgICAg
Q1NTX1BST1BFUlRJRVNfU0VUID0gMSA8PCAwLAogICAgICAgIFNIT1JUSEFORF9FTlRSSUVTX1NF
VCA9IDEgPDwgMSwKICAgICAgICBXSURUSF9TRVQgPSAxIDw8IDIsCiAgICAgICAgSEVJR0hUX1NF
VCA9IDEgPDwgMywKICAgICAgICBBTExfRklFTERTX1NFVCA9IChDU1NfUFJPUEVSVElFU19TRVQg
fCBTSE9SVEhBTkRfRU5UUklFU19TRVQgfCBXSURUSF9TRVQgfCBIRUlHSFRfU0VUKQogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5
bGU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5P
X0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAg
ICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5
bGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDU1NfUFJPUEVSVElFU19T
RVQ+JiBzZXRDc3NQcm9wZXJ0aWVzKFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENTU19QUk9QRVJU
SUVTX1NFVCksIHByb3BlcnR5X2Nzc1Byb3BlcnRpZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0QXJyYXkoImNzc1Byb3BlcnRpZXMiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8Q1NTX1BST1BFUlRJRVNfU0VUPigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFNIT1JUSEFORF9FTlRSSUVTX1NFVD4mIHNldFNob3J0aGFuZEVu
dHJpZXMoUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0hPUlRIQU5EX0VOVFJJRVNfU0VUKSwgcHJv
cGVydHlfc2hvcnRoYW5kRW50cmllc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRBcnJheSgic2hvcnRoYW5kRW50cmllcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxTSE9SVEhBTkRfRU5UUklFU19TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgV0lEVEhfU0VUPiYgc2V0V2lkdGgoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBXSURUSF9TRVQp
LCBwcm9wZXJ0eV93aWR0aF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRT
dHJpbmcoIndpZHRoIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFdJRFRI
X1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIRUlHSFRfU0VUPiYg
c2V0SGVpZ2h0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgSEVJR0hUX1NFVCksIHByb3BlcnR5X2hlaWdodF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImhlaWdodCIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIRUlHSFRfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3Jl
YWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NTdHls
ZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxD
U1NTdHlsZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTU3R5bGU+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGU+IHJlc3VsdCA9IENTU1N0eWxlOjpjcmVhdGUo
KQogICAgICogICAgIC5zZXRDc3NQcm9wZXJ0aWVzKC4uLikKICAgICAqICAgICAuc2V0U2hvcnRo
YW5kRW50cmllcyguLi4pCiAgICAgKiAgICAgLnNldFdpZHRoKC4uLikKICAgICAqICAgICAuc2V0
SGVpZ2h0KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRS
ZWYobmV3IENTU1N0eWxlKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFN0eWxlSWQoUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgi
c3R5bGVJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldENzc1RleHQoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImNzc1RleHQiLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRSYW5nZShQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJyYW5nZSIsIHZhbHVlKTsKICAgIH0K
fTsKCi8qIENTUyBzdHlsZSBlZmZlY3RpdmUgdmlzdWFsIGRpbWVuc2lvbnMgYW5kIHNvdXJjZSBv
ZmZzZXRzLiAqLwpjbGFzcyBDU1NQcm9wZXJ0eSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qgewpw
dWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBOQU1F
X1NFVCA9IDEgPDwgMCwKICAgICAgICBWQUxVRV9TRVQgPSAxIDw8IDEsCiAgICAgICAgQUxMX0ZJ
RUxEU19TRVQgPSAoTkFNRV9TRVQgfCBWQUxVRV9TRVQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NQcm9wZXJ0eT4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTk9fRklFTERTX1NFVCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDU1NQcm9wZXJ0eTsKICAgIHB1
YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5BTUVfU0VUPiYgc2V0TmFtZShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIE5BTUVfU0VUKSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8TkFNRV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVkFM
VUVfU0VUPiYgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWQUxVRV9TRVQpLCBwcm9wZXJ0eV92YWx1ZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZhbHVlIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFZBTFVFX1NFVD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NQcm9wZXJ0eT4mICgpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8
Q1NTUHJvcGVydHk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBh
c3NSZWZQdHI8Q1NTUHJvcGVydHk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPENTU1Byb3BlcnR5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1Byb3BlcnR5PiByZXN1bHQg
PSBDU1NQcm9wZXJ0eTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAg
ICAgLnNldFZhbHVlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4o
YWRvcHRSZWYobmV3IENTU1Byb3BlcnR5KCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFByaW9yaXR5
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwcmlv
cml0eSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEltcGxpY2l0KGJvb2wgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigiaW1wbGljaXQiLCB2YWx1ZSk7CiAgICB9Cgog
ICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UGFyc2VkT2soYm9v
bCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29sZWFuKCJwYXJzZWRPayIsIHZhbHVl
KTsKICAgIH0KCiAgICB2b2lkIHNldFN0YXR1cyhjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewog
ICAgICAgIHRoaXMtPnNldFN0cmluZygic3RhdHVzIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQg
c2V0U2hvcnRoYW5kTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldFN0cmluZygic2hvcnRoYW5kTmFtZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJh
bmdlKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlz
LT5zZXRPYmplY3QoInJhbmdlIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIG1lZGlhIHF1ZXJ5
IGRlc2NyaXB0b3IuICovCmNsYXNzIENTU01lZGlhIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5PX0ZJRUxEU19TRVQgPSAwLAogICAgICAgIFRF
WFRfU0VUID0gMSA8PCAwLAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFRFWFRfU0VUKQogICAg
fTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZh
dGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRl
bXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8
IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NT
TWVkaWE+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NT
TWVkaWE7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBURVhUX1NFVD4mIHNl
dFRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBURVhUX1NFVCksIHByb3BlcnR5X3RleHRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFRFWFRfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUmVmUHRyPENTU01lZGlhPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFMTF9GSUVMRFNfU0VULCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NNZWRpYT4qPigmbV9yZXN1
bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NNZWRpYT4gKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTTWVkaWE+KCp0aGlzKTsKICAg
ICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAg
KiBSZWZQdHI8Q1NTTWVkaWE+IHJlc3VsdCA9IENTU01lZGlhOjpjcmVhdGUoKQogICAgICogICAg
IC5zZXRUZXh0KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRv
cHRSZWYobmV3IENTU01lZGlhKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFNvdXJjZShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic291cmNlIiwgdmFs
dWUpOwogICAgfQoKICAgIHZvaWQgc2V0U291cmNlVVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzb3VyY2VVUkwiLCB2YWx1ZSk7CiAgICB9Cgog
ICAgdm9pZCBzZXRTb3VyY2VMaW5lKGludCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRO
dW1iZXIoInNvdXJjZUxpbmUiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIENTUwoKbmFtZXNwYWNl
IFRpbWVsaW5lIHsKLyogVGltZWxpbmUgcmVjb3JkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0
IHRoZSByZWNvcmRlZCBhY3Rpdml0eS4gKi8KY2xhc3MgVGltZWxpbmVFdmVudCA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VU
ID0gMCwKICAgICAgICBUWVBFX1NFVCA9IDEgPDwgMCwKICAgICAgICBEQVRBX1NFVCA9IDEgPDwg
MSwKICAgICAgICBBTExfRklFTERTX1NFVCA9IChUWVBFX1NFVCB8IERBVEFfU0VUKQogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8VGltZWxp
bmVFdmVudD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBU
aW1lbGluZUV2ZW50OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVFlQRV9T
RVQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgVFlQRV9TRVQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUWVBFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBEQVRBX1NFVD4mIHNldERhdGEoUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIERBVEFfU0VUKSwgcHJvcGVydHlfZGF0YV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRPYmplY3QoImRhdGEiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8REFUQV9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8VGlt
ZWxpbmVFdmVudD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8VGltZWxpbmVFdmVudD4qPigmbV9yZXN1bHQp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxUaW1lbGluZUV2ZW50PiAo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxUaW1lbGluZUV2ZW50PigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPFRpbWVsaW5lRXZlbnQ+IHJlc3VsdCA9IFRpbWVsaW5lRXZlbnQ6OmNy
ZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXREYXRhKC4uLik7
CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19TRVQ+IGNyZWF0ZSgpCiAgICB7
CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4oYWRvcHRSZWYobmV3IFRpbWVs
aW5lRXZlbnQoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0Q2hpbGRyZW4oUGFzc1JlZlB0cjxJbnNw
ZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoImNoaWxkcmVu
IiwgdmFsdWUpOwogICAgfQp9OwoKfSAvLyBUaW1lbGluZQoKI2lmIEVOQUJMRShKQVZBU0NSSVBU
X0RFQlVHR0VSKQpuYW1lc3BhY2UgRGVidWdnZXIgewovKiBCcmVha3BvaW50IGlkZW50aWZpZXIu
ICovCnR5cGVkZWYgU3RyaW5nIEJyZWFrcG9pbnRJZDsKCi8qIFVuaXF1ZSBzY3JpcHQgaWRlbnRp
Zmllci4gKi8KdHlwZWRlZiBTdHJpbmcgU2NyaXB0SWQ7CgovKiBDYWxsIGZyYW1lIGlkZW50aWZp
ZXIuICovCnR5cGVkZWYgU3RyaW5nIENhbGxGcmFtZUlkOwoKLyogTG9jYXRpb24gaW4gdGhlIHNv
dXJjZSBjb2RlLiAqLwpjbGFzcyBMb2NhdGlvbiA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qgewpw
dWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0gMCwKICAgICAgICBTQ1JJ
UFRfSURfU0VUID0gMSA8PCAwLAogICAgICAgIExJTkVfTlVNQkVSX1NFVCA9IDEgPDwgMSwKICAg
ICAgICBBTExfRklFTERTX1NFVCA9IChTQ1JJUFRfSURfU0VUIHwgTElORV9OVU1CRVJfU0VUKQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
TG9jYXRpb24+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5PX0ZJRUxEU19TRVQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAg
ICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3Mg
TG9jYXRpb247CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTQ1JJUFRfSURf
U0VUPiYgc2V0U2NyaXB0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTQ1JJUFRfSURfU0VUKSwgcHJvcGVydHlfc2Ny
aXB0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzY3Jp
cHRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTQ1JJUFRfSURfU0VU
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExJTkVfTlVNQkVSX1NFVD4m
IHNldExpbmVOdW1iZXIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIExJTkVfTlVNQkVSX1NFVCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExJTkVfTlVNQkVSX1NFVD4oKTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxMb2NhdGlvbj4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8TG9jYXRpb24+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFBhc3NSZWZQdHI8TG9jYXRpb24+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPExvY2F0aW9uPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3lu
dGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPExvY2F0aW9uPiByZXN1bHQgPSBMb2Nh
dGlvbjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2NyaXB0SWQoLi4uKQogICAgICogICAgIC5z
ZXRMaW5lTnVtYmVyKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5PX0ZJRUxEU19T
RVQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4o
YWRvcHRSZWYobmV3IExvY2F0aW9uKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldENvbHVtbk51bWJl
cihpbnQgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJjb2x1bW5OdW1iZXIi
LCB2YWx1ZSk7CiAgICB9Cn07CgovKiBKYXZhU2NyaXB0IGNhbGwgZnJhbWUuIEFycmF5IG9mIGNh
bGwgZnJhbWVzIGZvcm0gdGhlIGNhbGwgc3RhY2suICovCmNsYXNzIENhbGxGcmFtZSA6IHB1Ymxp
YyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNf
U0VUID0gMCwKICAgICAgICBDQUxMX0ZSQU1FX0lEX1NFVCA9IDEgPDwgMCwKICAgICAgICBGVU5D
VElPTl9OQU1FX1NFVCA9IDEgPDwgMSwKICAgICAgICBMT0NBVElPTl9TRVQgPSAxIDw8IDIsCiAg
ICAgICAgU0NPUEVfQ0hBSU5fU0VUID0gMSA8PCAzLAogICAgICAgIFRISVNfU0VUID0gMSA8PCA0
LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKENBTExfRlJBTUVfSURfU0VUIHwgRlVOQ1RJT05f
TkFNRV9TRVQgfCBMT0NBVElPTl9TRVQgfCBTQ09QRV9DSEFJTl9TRVQgfCBUSElTX1NFVCkKICAg
IH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2
YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0
ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENh
bGxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTk9fRklFTERTX1NFVCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBD
YWxsRnJhbWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDQUxMX0ZSQU1F
X0lEX1NFVD4mIHNldENhbGxGcmFtZUlkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ0FMTF9GUkFNRV9JRF9TRVQpLCBw
cm9wZXJ0eV9jYWxsRnJhbWVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoImNhbGxGcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPENBTExfRlJBTUVfSURfU0VUPigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IEZVTkNUSU9OX05BTUVfU0VUPiYgc2V0RnVuY3Rpb25OYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRlVOQ1RJ
T05fTkFNRV9TRVQpLCBwcm9wZXJ0eV9mdW5jdGlvbk5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmdW5jdGlvbk5hbWUiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8RlVOQ1RJT05fTkFNRV9TRVQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgTE9DQVRJT05fU0VUPiYgc2V0TG9jYXRpb24oUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIExPQ0FUSU9OX1NFVCksIHByb3BlcnR5X2xvY2F0aW9uX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgibG9jYXRpb24iLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TE9DQVRJT05fU0VUPigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNDT1BFX0NIQUlOX1NFVD4mIHNldFNjb3BlQ2hhaW4o
UGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU0NPUEVfQ0hBSU5fU0VUKSwgcHJvcGVydHlfc2NvcGVD
aGFpbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgic2NvcGVD
aGFpbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTQ09QRV9DSEFJTl9T
RVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVEhJU19TRVQ+JiBzZXRU
aGlzKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUSElTX1NFVCksIHByb3BlcnR5X3RoaXNfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJ0aGlzIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRISVNfU0VUPigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxGcmFtZT4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBTExfRklFTERTX1NFVCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEZy
YW1lPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PENhbGxGcmFtZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEZy
YW1lPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPENhbGxGcmFtZT4gcmVzdWx0ID0gQ2FsbEZyYW1lOjpj
cmVhdGUoKQogICAgICogICAgIC5zZXRDYWxsRnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldEZ1
bmN0aW9uTmFtZSguLi4pCiAgICAgKiAgICAgLnNldExvY2F0aW9uKC4uLikKICAgICAqICAgICAu
c2V0U2NvcGVDaGFpbiguLi4pCiAgICAgKiAgICAgLnNldFRoaXMoLi4uKTsKICAgICAqLwogICAg
c3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1
cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihuZXcgQ2FsbEZyYW1lKCkpKTsKICAg
IH0KfTsKCi8qIFNjb3BlIGRlc2NyaXB0aW9uLiAqLwpjbGFzcyBTY29wZSA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOT19GSUVMRFNfU0VUID0g
MCwKICAgICAgICBUWVBFX1NFVCA9IDEgPDwgMCwKICAgICAgICBPQkpFQ1RfU0VUID0gMSA8PCAx
LAogICAgICAgIEFMTF9GSUVMRFNfU0VUID0gKFRZUEVfU0VUIHwgT0JKRUNUX1NFVCkKICAgIH07
CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRl
OgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1w
bGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNjb3Bl
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOT19G
SUVMRFNfU0VULCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAg
ICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNjb3BlOwog
ICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVFlQRV9TRVQ+JiBzZXRUeXBlKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgVFlQRV9TRVQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxUWVBFX1NFVD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBPQkpFQ1RfU0VUPiYgc2V0T2JqZWN0KFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPQkpFQ1Rf
U0VUKSwgcHJvcGVydHlfb2JqZWN0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldE9iamVjdCgib2JqZWN0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PE9CSkVDVF9TRVQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U2NvcGU+
JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQUxMX0ZJ
RUxEU19TRVQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNjb3BlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBQYXNzUmVmUHRyPFNjb3BlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxTY29wZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAq
IFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTY29wZT4gcmVzdWx0ID0gU2Nv
cGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRPYmpl
Y3QoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tk9fRklFTERTX1NFVD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOT19GSUVMRFNfU0VUPihhZG9wdFJlZihu
ZXcgU2NvcGUoKSkpOwogICAgfQp9OwoKfSAvLyBEZWJ1Z2dlcgoKI2VuZGlmIC8vIEVOQUJMRShK
QVZBU0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCm5hbWVz
cGFjZSBET01EZWJ1Z2dlciB7Ci8qIERPTSBicmVha3BvaW50IHR5cGUuICovCm5hbWVzcGFjZSBE
T01CcmVha3BvaW50VHlwZSB7CmNvbnN0IGNoYXIqIGNvbnN0IHN1YnRyZWVfbW9kaWZpZWQgPSAi
c3VidHJlZS1tb2RpZmllZCI7CmNvbnN0IGNoYXIqIGNvbnN0IGF0dHJpYnV0ZV9tb2RpZmllZCA9
ICJhdHRyaWJ1dGUtbW9kaWZpZWQiOwpjb25zdCBjaGFyKiBjb25zdCBub2RlX3JlbW92ZWQgPSAi
bm9kZS1yZW1vdmVkIjsKfSAvLyBuYW1lc3BhY2UgRE9NQnJlYWtwb2ludFR5cGUKCn0gLy8gRE9N
RGVidWdnZXIKCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJM
RShKQVZBU0NSSVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgUHJvZmlsZXIgewp9IC8vIFByb2ZpbGVy
CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNpZiBFTkFCTEUoV09SS0VS
UykKbmFtZXNwYWNlIFdvcmtlciB7Cn0gLy8gV29ya2VyCgojZW5kaWYgLy8gRU5BQkxFKFdPUktF
UlMpCgp9IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgoKI2VuZGlmIC8vIEVOQUJMRShJTlNQRUNU
T1IpCgpjbGFzcyBJbnNwZWN0b3JGcm9udGVuZCB7CnB1YmxpYzoKICAgIEluc3BlY3RvckZyb250
ZW5kKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCopOwoKCiAgICBjbGFzcyBJbnNwZWN0b3Igewog
ICAgcHVibGljOgogICAgICAgIEluc3BlY3RvcihJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgZXZhbHVhdGVGb3JUZXN0SW5G
cm9udGVuZChpbnQgdGVzdENhbGxJZCwgY29uc3QgU3RyaW5nJiBzY3JpcHQpOwogICAgICAgIHZv
aWQgaW5zcGVjdCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVj
dD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gb2JqZWN0LCBQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gaGludHMpOwogICAgICAgIHZvaWQgZGlkQ3JlYXRlV29ya2VyKGludCBpZCwg
Y29uc3QgU3RyaW5nJiB1cmwsIGJvb2wgaXNTaGFyZWQpOwogICAgICAgIHZvaWQgZGlkRGVzdHJv
eVdvcmtlcihpbnQgaWQpOwogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAg
ICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToK
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsOwogICAgfTsKCiAgICBJbnNwZWN0b3IqIGluc3BlY3RvcigpIHsgcmV0dXJuICZtX2luc3Bl
Y3RvcjsgfQoKICAgIGNsYXNzIE1lbW9yeSB7CiAgICBwdWJsaWM6CiAgICAgICAgTWVtb3J5KElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAg
ICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIE1lbW9y
eSogbWVtb3J5KCkgeyByZXR1cm4gJm1fbWVtb3J5OyB9CgogICAgY2xhc3MgUGFnZSB7CiAgICBw
dWJsaWM6CiAgICAgICAgUGFnZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgZG9tQ29udGVudEV2ZW50RmlyZWQoZG91Ymxl
IHRpbWVzdGFtcCk7CiAgICAgICAgdm9pZCBsb2FkRXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1w
KTsKICAgICAgICB2b2lkIGZyYW1lTmF2aWdhdGVkKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
UGFnZTo6RnJhbWU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGZyYW1lKTsKICAgICAg
ICB2b2lkIGZyYW1lRGV0YWNoZWQoY29uc3QgU3RyaW5nJiBmcmFtZUlkKTsKICAgICAgICB2b2lk
IHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgUGFnZSogcGFnZSgp
IHsgcmV0dXJuICZtX3BhZ2U7IH0KCiAgICBjbGFzcyBSdW50aW1lIHsKICAgIHB1YmxpYzoKICAg
ICAgICBSdW50aW1lKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkgeyB9CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsg
cmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAg
IEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAg
ICB9OwoKICAgIFJ1bnRpbWUqIHJ1bnRpbWUoKSB7IHJldHVybiAmbV9ydW50aW1lOyB9CgogICAg
Y2xhc3MgQ29uc29sZSB7CiAgICBwdWJsaWM6CiAgICAgICAgQ29uc29sZShJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgbWVz
c2FnZUFkZGVkKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6Q29uc29sZU1lc3Nh
Z2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2UpOwogICAgICAgIHZvaWQg
bWVzc2FnZVJlcGVhdENvdW50VXBkYXRlZChpbnQgY291bnQpOwogICAgICAgIHZvaWQgbWVzc2Fn
ZXNDbGVhcmVkKCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAg
ICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgp
IHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAg
ICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
CiAgICB9OwoKICAgIENvbnNvbGUqIGNvbnNvbGUoKSB7IHJldHVybiAmbV9jb25zb2xlOyB9Cgog
ICAgY2xhc3MgTmV0d29yayB7CiAgICBwdWJsaWM6CiAgICAgICAgTmV0d29yayhJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQg
cmVxdWVzdFdpbGxCZVNlbnQoY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGNvbnN0IFN0cmluZyYg
ZnJhbWVJZCwgY29uc3QgU3RyaW5nJiBsb2FkZXJJZCwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVS
TCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0PiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXF1ZXN0LCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkluaXRpYXRvcj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gaW5pdGlhdG9yLCBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBzdGFja1RyYWNl
LCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlc3BvbnNlPiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZWRpcmVjdFJlc3BvbnNlKTsKICAgICAgICB2b2lkIHJlcXVl
c3RTZXJ2ZWRGcm9tQ2FjaGUoY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQpOwogICAgICAgIHZvaWQg
cmVzcG9uc2VSZWNlaXZlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgY29uc3QgU3RyaW5nJiBm
cmFtZUlkLCBjb25zdCBTdHJpbmcmIGxvYWRlcklkLCBkb3VibGUgdGltZXN0YW1wLCBjb25zdCBT
dHJpbmcmIHR5cGUsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVzcG9uc2U+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlKTsKICAgICAgICB2b2lkIGRh
dGFSZWNlaXZlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRpbWVzdGFtcCwgaW50
IGRhdGFMZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCk7CiAgICAgICAgdm9pZCBsb2FkaW5n
RmluaXNoZWQoY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXApOwogICAg
ICAgIHZvaWQgbG9hZGluZ0ZhaWxlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRp
bWVzdGFtcCwgY29uc3QgU3RyaW5nJiBlcnJvclRleHQsIGNvbnN0IGJvb2wqIGNvbnN0IGNhbmNl
bGVkKTsKICAgICAgICB2b2lkIHJlcXVlc3RTZXJ2ZWRGcm9tTWVtb3J5Q2FjaGUoY29uc3QgU3Ry
aW5nJiByZXF1ZXN0SWQsIGNvbnN0IFN0cmluZyYgZnJhbWVJZCwgY29uc3QgU3RyaW5nJiBsb2Fk
ZXJJZCwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVSTCwgZG91YmxlIHRpbWVzdGFtcCwgLypQYXNz
UmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpJbml0aWF0b3I+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGluaXRpYXRvciwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3Jr
OjpDYWNoZWRSZXNvdXJjZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzb3VyY2Up
OwogICAgICAgIHZvaWQgd2ViU29ja2V0V2lsbFNlbmRIYW5kc2hha2VSZXF1ZXN0KGNvbnN0IFN0
cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxk
ZXI6Ok5ldHdvcms6OldlYlNvY2tldFJlcXVlc3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHJlcXVlc3QpOwogICAgICAgIHZvaWQgd2ViU29ja2V0SGFuZHNoYWtlUmVzcG9uc2VSZWNl
aXZlZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRpbWVzdGFtcCwgLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpXZWJTb2NrZXRSZXNwb25zZT4qLyBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2UpOwogICAgICAgIHZvaWQgd2ViU29ja2V0Q3JlYXRl
ZChjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgY29uc3QgU3RyaW5nJiB1cmwpOwogICAgICAgIHZv
aWQgd2ViU29ja2V0Q2xvc2VkKGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0
YW1wKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1
cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07
CgogICAgTmV0d29yayogbmV0d29yaygpIHsgcmV0dXJuICZtX25ldHdvcms7IH0KCiNpZiBFTkFC
TEUoU1FMX0RBVEFCQVNFKQogICAgY2xhc3MgRGF0YWJhc2UgewogICAgcHVibGljOgogICAgICAg
IERhdGFiYXNlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgeyB9CiAgICAgICAgdm9pZCBhZGREYXRhYmFzZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
OkRhdGFiYXNlOjpEYXRhYmFzZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YWJh
c2UpOwogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rpb25TdWNjZWVkZWQoaW50IHRyYW5zYWN0aW9u
SWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGNvbHVtbk5hbWVzLCBQYXNzUmVmUHRyPElu
c3BlY3RvckFycmF5PiB2YWx1ZXMpOwogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rpb25GYWlsZWQo
aW50IHRyYW5zYWN0aW9uSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzcWxFcnJvcik7
CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAg
IERhdGFiYXNlKiBkYXRhYmFzZSgpIHsgcmV0dXJuICZtX2RhdGFiYXNlOyB9CgojZW5kaWYgLy8g
RU5BQkxFKFNRTF9EQVRBQkFTRSkKICAgIGNsYXNzIERPTVN0b3JhZ2UgewogICAgcHVibGljOgog
ICAgICAgIERPTVN0b3JhZ2UoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGFkZERPTVN0b3JhZ2UoUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHN0b3JhZ2UpOwogICAgICAgIHZvaWQgdXBkYXRlRE9NU3RvcmFnZShpbnQg
c3RvcmFnZUlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAg
IEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkg
eyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAg
ICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsK
ICAgIH07CgogICAgRE9NU3RvcmFnZSogZG9tc3RvcmFnZSgpIHsgcmV0dXJuICZtX2RvbXN0b3Jh
Z2U7IH0KCiAgICBjbGFzcyBBcHBsaWNhdGlvbkNhY2hlIHsKICAgIHB1YmxpYzoKICAgICAgICBB
cHBsaWNhdGlvbkNhY2hlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBhcHBsaWNhdGlvbkNhY2hlU3RhdHVzVXBkYXRlZChj
b25zdCBTdHJpbmcmIGZyYW1lSWQsIGNvbnN0IFN0cmluZyYgbWFuaWZlc3RVUkwsIGludCBzdGF0
dXMpOwogICAgICAgIHZvaWQgbmV0d29ya1N0YXRlVXBkYXRlZChib29sIGlzTm93T25saW5lKTsK
ICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAg
QXBwbGljYXRpb25DYWNoZSogYXBwbGljYXRpb25jYWNoZSgpIHsgcmV0dXJuICZtX2FwcGxpY2F0
aW9uY2FjaGU7IH0KCiNpZiBFTkFCTEUoRklMRV9TWVNURU0pCiAgICBjbGFzcyBGaWxlU3lzdGVt
IHsKICAgIHB1YmxpYzoKICAgICAgICBGaWxlU3lzdGVtKEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9
CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIEZpbGVTeXN0ZW0qIGZpbGVzeXN0ZW0oKSB7
IHJldHVybiAmbV9maWxlc3lzdGVtOyB9CgojZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQog
ICAgY2xhc3MgRE9NIHsKICAgIHB1YmxpYzoKICAgICAgICBET00oSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGRvY3VtZW50
VXBkYXRlZCgpOwogICAgICAgIHZvaWQgc2V0Q2hpbGROb2RlcyhpbnQgcGFyZW50SWQsIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVzKTsKICAgICAgICB2b2lkIGF0dHJpYnV0ZU1vZGlm
aWVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7
CiAgICAgICAgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYg
bmFtZSk7CiAgICAgICAgdm9pZCBpbmxpbmVTdHlsZUludmFsaWRhdGVkKFBhc3NSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IG5vZGVJZHMpOwogICAgICAgIHZvaWQgY2hhcmFjdGVyRGF0YU1vZGlmaWVk
KGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgY2hhcmFjdGVyRGF0YSk7CiAgICAgICAgdm9pZCBj
aGlsZE5vZGVDb3VudFVwZGF0ZWQoaW50IG5vZGVJZCwgaW50IGNoaWxkTm9kZUNvdW50KTsKICAg
ICAgICB2b2lkIGNoaWxkTm9kZUluc2VydGVkKGludCBwYXJlbnROb2RlSWQsIGludCBwcmV2aW91
c05vZGVJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG5vZGUpOwogICAgICAgIHZvaWQgY2hpbGROb2RlUmVtb3ZlZChp
bnQgcGFyZW50Tm9kZUlkLCBpbnQgbm9kZUlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0K
ICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgRE9NKiBkb20oKSB7IHJldHVybiAmbV9kb207
IH0KCiAgICBjbGFzcyBDU1MgewogICAgcHVibGljOgogICAgICAgIENTUyhJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgbWVk
aWFRdWVyeVJlc3VsdENoYW5nZWQoKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHBy
aXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgQ1NTKiBjc3MoKSB7IHJldHVybiAmbV9jc3M7IH0KCiAg
ICBjbGFzcyBUaW1lbGluZSB7CiAgICBwdWJsaWM6CiAgICAgICAgVGltZWxpbmUoSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lk
IGV2ZW50UmVjb3JkZWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpUaW1lbGluZTo6VGltZWxp
bmVFdmVudD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVjb3JkKTsKICAgICAgICB2
b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgVGltZWxpbmUq
IHRpbWVsaW5lKCkgeyByZXR1cm4gJm1fdGltZWxpbmU7IH0KCiNpZiBFTkFCTEUoSkFWQVNDUklQ
VF9ERUJVR0dFUikKICAgIGNsYXNzIERlYnVnZ2VyIHsKICAgIHB1YmxpYzoKICAgICAgICBEZWJ1
Z2dlcihJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkg
OiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
fQogICAgICAgIHZvaWQgZ2xvYmFsT2JqZWN0Q2xlYXJlZCgpOwogICAgICAgIHZvaWQgc2NyaXB0
UGFyc2VkKGNvbnN0IFN0cmluZyYgc2NyaXB0SWQsIGNvbnN0IFN0cmluZyYgdXJsLCBpbnQgc3Rh
cnRMaW5lLCBpbnQgc3RhcnRDb2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBjb25z
dCBib29sKiBjb25zdCBpc0NvbnRlbnRTY3JpcHQpOwogICAgICAgIHZvaWQgc2NyaXB0RmFpbGVk
VG9QYXJzZShjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiBzY3JpcHRTb3VyY2UsIGlu
dCBzdGFydExpbmUsIGludCBlcnJvckxpbmUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKTsK
ICAgICAgICB2b2lkIGJyZWFrcG9pbnRSZXNvbHZlZChjb25zdCBTdHJpbmcmIGJyZWFrcG9pbnRJ
ZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6TG9jYXRpb24+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGxvY2F0aW9uKTsKICAgICAgICB2b2lkIHBhdXNlZChQYXNz
UmVmUHRyPEluc3BlY3RvckFycmF5PiBjYWxsRnJhbWVzLCBjb25zdCBTdHJpbmcmIHJlYXNvbiwg
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRhdGEpOwogICAgICAgIHZvaWQgcmVzdW1lZCgp
OwogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAg
ICBEZWJ1Z2dlciogZGVidWdnZXIoKSB7IHJldHVybiAmbV9kZWJ1Z2dlcjsgfQoKI2VuZGlmIC8v
IEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdH
RVIpCiAgICBjbGFzcyBET01EZWJ1Z2dlciB7CiAgICBwdWJsaWM6CiAgICAgICAgRE9NRGVidWdn
ZXIoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDog
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0K
ICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAg
RE9NRGVidWdnZXIqIGRvbWRlYnVnZ2VyKCkgeyByZXR1cm4gJm1fZG9tZGVidWdnZXI7IH0KCiNl
bmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBU
X0RFQlVHR0VSKQogICAgY2xhc3MgUHJvZmlsZXIgewogICAgcHVibGljOgogICAgICAgIFByb2Zp
bGVyKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9
CiAgICAgICAgdm9pZCBhZGRQcm9maWxlSGVhZGVyKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBoZWFkZXIpOwogICAgICAgIHZvaWQgYWRkSGVhcFNuYXBzaG90Q2h1bmsoaW50IHVpZCwgY29u
c3QgU3RyaW5nJiBjaHVuayk7CiAgICAgICAgdm9pZCBmaW5pc2hIZWFwU25hcHNob3QoaW50IHVp
ZCk7CiAgICAgICAgdm9pZCBzZXRSZWNvcmRpbmdQcm9maWxlKGJvb2wgaXNQcm9maWxpbmcpOwog
ICAgICAgIHZvaWQgcmVzZXRQcm9maWxlcygpOwogICAgICAgIHZvaWQgcmVwb3J0SGVhcFNuYXBz
aG90UHJvZ3Jlc3MoaW50IGRvbmUsIGludCB0b3RhbCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
OyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFByb2ZpbGVyKiBwcm9maWxlcigpIHsg
cmV0dXJuICZtX3Byb2ZpbGVyOyB9CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdH
RVIpCiNpZiBFTkFCTEUoV09SS0VSUykKICAgIGNsYXNzIFdvcmtlciB7CiAgICBwdWJsaWM6CiAg
ICAgICAgV29ya2VyKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkgeyB9CiAgICAgICAgdm9pZCB3b3JrZXJDcmVhdGVkKGludCB3b3JrZXJJZCwgY29uc3Qg
U3RyaW5nJiB1cmwsIGJvb2wgaW5zcGVjdG9yQ29ubmVjdGVkKTsKICAgICAgICB2b2lkIHdvcmtl
clRlcm1pbmF0ZWQoaW50IHdvcmtlcklkKTsKICAgICAgICB2b2lkIGRpc3BhdGNoTWVzc2FnZUZy
b21Xb3JrZXIoaW50IHdvcmtlcklkLCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbWVzc2Fn
ZSk7CiAgICAgICAgdm9pZCBkaXNjb25uZWN0ZWRGcm9tV29ya2VyKCk7CiAgICAgICAgdm9pZCBz
ZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFdvcmtlciogd29ya2Vy
KCkgeyByZXR1cm4gJm1fd29ya2VyOyB9CgojZW5kaWYgLy8gRU5BQkxFKFdPUktFUlMpCgpwcml2
YXRlOgogICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsKICAgIEluc3BlY3RvciBtX2luc3BlY3RvcjsKICAgIE1lbW9yeSBtX21lbW9yeTsKICAg
IFBhZ2UgbV9wYWdlOwogICAgUnVudGltZSBtX3J1bnRpbWU7CiAgICBDb25zb2xlIG1fY29uc29s
ZTsKICAgIE5ldHdvcmsgbV9uZXR3b3JrOwojaWYgRU5BQkxFKFNRTF9EQVRBQkFTRSkKICAgIERh
dGFiYXNlIG1fZGF0YWJhc2U7CiNlbmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQogICAgRE9N
U3RvcmFnZSBtX2RvbXN0b3JhZ2U7CiAgICBBcHBsaWNhdGlvbkNhY2hlIG1fYXBwbGljYXRpb25j
YWNoZTsKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgIEZpbGVTeXN0ZW0gbV9maWxlc3lzdGVt
OwojZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQogICAgRE9NIG1fZG9tOwogICAgQ1NTIG1f
Y3NzOwogICAgVGltZWxpbmUgbV90aW1lbGluZTsKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVH
R0VSKQogICAgRGVidWdnZXIgbV9kZWJ1Z2dlcjsKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBU
X0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBET01EZWJ1Z2dl
ciBtX2RvbWRlYnVnZ2VyOwojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgIFByb2ZpbGVyIG1fcHJvZmlsZXI7CiNl
bmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShXT1JLRVJTKQog
ICAgV29ya2VyIG1fd29ya2VyOwojZW5kaWYgLy8gRU5BQkxFKFdPUktFUlMpCn07Cgp9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCiNlbmRpZiAvLyAhZGVmaW5lZChJbnNwZWN0b3JGcm9udGVuZF9oKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>