<?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>77917</bug_id>
          
          <creation_ts>2012-02-06 17:27:36 -0800</creation_ts>
          <short_desc>Web Inspector: In Inspector.json PropertyDescriptor.writable should be declared optional</short_desc>
          <delta_ts>2012-02-14 06:27:28 -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>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Peter Rybin">prybin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>dglazkov</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>prybin</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>vsevik</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>550450</commentid>
    <comment_count>0</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-06 17:27:36 -0800</bug_when>
    <thetext>Property PropertyDescriptor.writable in de facto optional. It&apos;s also conceptually optional (because only it makes sense for &quot;data&quot; properties, not for &quot;accessor&quot; properties).

Inspector.json should be fixed accordingly.

Note that it formally breaks compatibility with &quot;1.0&quot; and &quot;0.1&quot;. Probably they should be patched retroactively too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550460</commentid>
    <comment_count>1</comment_count>
      <attachid>125738</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-06 17:34:55 -0800</bug_when>
    <thetext>Created attachment 125738
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550782</commentid>
    <comment_count>2</comment_count>
      <attachid>125738</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2012-02-07 03:26:38 -0800</bug_when>
    <thetext>Comment on attachment 125738
Patch

Why should it be optional?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550858</commentid>
    <comment_count>3</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 04:50:28 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 125738 [details])
&gt; Why should it be optional?

I&apos;m not sure it must be optional.

But it makes sense, because according to JS specification, &quot;writable&quot; exists only for &quot;data&quot; properties, i.e. there&apos;s no &quot;writable&quot; when there is getter or setter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550859</commentid>
    <comment_count>4</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 04:51:49 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; (From update of attachment 125738 [details] [details])
&gt; &gt; Why should it be optional?
&gt; 
&gt; I&apos;m not sure it must be optional.

Another option would be to patch the code to conform with Inspector.json</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551029</commentid>
    <comment_count>5</comment_count>
      <attachid>125850</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 08:54:44 -0800</bug_when>
    <thetext>Created attachment 125850
original InspectorTypeBuilder.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551031</commentid>
    <comment_count>6</comment_count>
      <attachid>125851</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 08:55:45 -0800</bug_when>
    <thetext>Created attachment 125851
original InspectorTypeBuilder.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551037</commentid>
    <comment_count>7</comment_count>
      <attachid>125853</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 09:01:30 -0800</bug_when>
    <thetext>Created attachment 125853
new InspectorTypeBuilder.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551039</commentid>
    <comment_count>8</comment_count>
      <attachid>125854</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 09:01:57 -0800</bug_when>
    <thetext>Created attachment 125854
new InspectorTypeBuilder.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551042</commentid>
    <comment_count>9</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 09:04:55 -0800</bug_when>
    <thetext>attachments 2-5 are added here by mistake.
see correct bug: https://bugs.webkit.org/show_bug.cgi?id=77919</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551400</commentid>
    <comment_count>10</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 14:36:17 -0800</bug_when>
    <thetext>I think &quot;writable&quot; is ok to be optional.
I looked at the code. It seems to be correct taking that &quot;writable&quot; is optional.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551605</commentid>
    <comment_count>11</comment_count>
      <attachid>125965</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 17:38:02 -0800</bug_when>
    <thetext>Created attachment 125965
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551612</commentid>
    <comment_count>12</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-07 17:42:38 -0800</bug_when>
    <thetext>Additional fix is about &quot;set&quot; and &quot;get&quot; properties. They may be &quot;undefined&quot; in JavaScript descriptor, that gets converted to &quot;null&quot; in JSON format.
&quot;Null&quot; is a problem, because our protocol doesn&apos;t have nullable types (only type &quot;any&quot; allows &quot;null&quot; value).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551895</commentid>
    <comment_count>13</comment_count>
      <attachid>125965</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2012-02-08 01:50:02 -0800</bug_when>
    <thetext>Comment on attachment 125965
Patch

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

&gt; Source/WebCore/inspector/InjectedScriptSource.js:236
&gt; +                        if (typeof descriptor.get != &quot;function&quot;) {

Should be !==, no need for {}

&gt; Source/WebCore/inspector/InjectedScriptSource.js:239
&gt; +                        if (typeof descriptor.set != &quot;function&quot;) {

ditto</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552573</commentid>
    <comment_count>14</comment_count>
      <attachid>126171</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-08 15:56:07 -0800</bug_when>
    <thetext>Created attachment 126171
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552591</commentid>
    <comment_count>15</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-08 16:11:14 -0800</bug_when>
    <thetext>New patch makes sure the output conforms with our protocol (in all cases, including when exception is thrown).

It doesn&apos;t lose &apos;undefined&apos; values of getters and setters, because conceptually accessor property HAS getter and setter, even if both are &apos;undefined&apos; (this can be checked by getOwnPropertyDescriptor call on such property).

This cases undefined getter/setter showing in UI. This may or may not need fixing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552706</commentid>
    <comment_count>16</comment_count>
      <attachid>126171</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-08 17:54:48 -0800</bug_when>
    <thetext>Comment on attachment 126171
Patch

Attachment 126171 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/11460668

New failing tests:
inspector/runtime/runtime-getProperties.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553073</commentid>
    <comment_count>17</comment_count>
      <attachid>126171</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-09 05:01:43 -0800</bug_when>
    <thetext>Comment on attachment 126171
Patch

Rejecting attachment 126171 from commit-queue.

New failing tests:
inspector/runtime/runtime-getProperties.html
Full output: http://queues.webkit.org/results/11447199</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553504</commentid>
    <comment_count>18</comment_count>
      <attachid>126373</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-02-09 14:24:51 -0800</bug_when>
    <thetext>Created attachment 126373
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555228</commentid>
    <comment_count>19</comment_count>
    <who name="Vsevolod Vlasov">vsevik</who>
    <bug_when>2012-02-13 06:28:12 -0800</bug_when>
    <thetext>Committed r107567: &lt;http://trac.webkit.org/changeset/107567&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>556271</commentid>
    <comment_count>20</comment_count>
      <attachid>126373</attachid>
    <who name="Vsevolod Vlasov">vsevik</who>
    <bug_when>2012-02-14 06:27:28 -0800</bug_when>
    <thetext>Comment on attachment 126373
Patch

Clearing r?</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125738</attachid>
            <date>2012-02-06 17:34:55 -0800</date>
            <delta_ts>2012-02-07 17:37:51 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77917-20120207053453.patch</filename>
            <type>text/plain</type>
            <size>5698</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2ODI3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOGI3YTI1YWZiMmJkOTEw
MTNkNDc1OWVkZWE0NjNiOTAzMGVmNzY2Zi4uNDU5OTRiZDc5NGY4MWI4ZDVjZWRjZjQyNjc4MDQ5
MDM4MzVhZmE0NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3IEBACisyMDEyLTAyLTA2ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBJbiBJbnNwZWN0b3IuanNvbiBQcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGUgc2hvdWxkIGJl
IGRlY2xhcmVkIG9wdGlvbmFsCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03NzkxNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFByb3BlcnR5IGRlc2NyaXB0b3IgaXMgZml4ZWQgaW4gSW5zcGVjdG9yLmpzb24u
IEFsc28gcmV0cm9hY3RpdmVseSBpbgorICAgICAgICAwLjEgYW5kIDEuMC4KKworICAgICAgICAq
IGluc3BlY3Rvci9JbnNwZWN0b3ItMC4xLmpzb246CisgICAgICAgICogaW5zcGVjdG9yL0luc3Bl
Y3Rvci0xLjAuanNvbjoKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yLmpzb246CisKIDIw
MTItMDItMDYgIEV1Z2VuZSBHaXJhcmQgIDxnaXJhcmRAY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IEluZGV4ZWREQiBjcmVhdGVPYmplY3RTdG9yZSBzaG91bGQgdGhyb3cgaWYgb3B0aW9ucyBhcmcg
aXMgaW52YWxpZApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rv
ci0wLjEuanNvbiBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3ItMC4xLmpzb24K
aW5kZXggMDA4NmQ5YTU4ZWYxNWVjOTA5ZjQ2NjgyNWRjY2Q4ZjQ0NGEwMzI3MC4uYTVjMDMwMzVj
YTRlYjkxMDQwZTE5Mzg2ZjBhMDAzMWJiZTAxOTZmNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvaW5zcGVjdG9yL0luc3BlY3Rvci0wLjEuanNvbgorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNw
ZWN0b3IvSW5zcGVjdG9yLTAuMS5qc29uCkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICAgICAgICAg
ICAgICAicHJvcGVydGllcyI6IFsKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJuYW1l
IiwgInR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IG5hbWUuIiB9LAog
ICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogInZhbHVlIiwgIiRyZWYiOiAiUmVtb3RlT2Jq
ZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBhc3NvY2lh
dGVkIHdpdGggdGhlIHByb3BlcnR5LiIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6
ICJ3cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0
aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCAoZGF0
YSBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAi
d3JpdGFibGUiLCAidHlwZSI6ICJib29sZWFuIiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0
aW9uIjogIlRydWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbWF5
IGJlIGNoYW5nZWQgKGRhdGEgZGVzY3JpcHRvcnMgb25seSkuIiB9LAogICAgICAgICAgICAgICAg
ICAgICB7ICJuYW1lIjogImdldCIsICIkcmVmIjogIlJlbW90ZU9iamVjdCIsICJvcHRpb25hbCI6
IHRydWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0aW9uIHdoaWNoIHNlcnZlcyBhcyBhIGdldHRl
ciBmb3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGlmIHRoZXJlIGlz
IG5vIGdldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRvcnMgb25seSkuIiB9LAogICAgICAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogInNldCIsICIkcmVmIjogIlJlbW90ZU9iamVjdCIsICJvcHRpb25h
bCI6IHRydWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0aW9uIHdoaWNoIHNlcnZlcyBhcyBhIHNl
dHRlciBmb3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGlmIHRoZXJl
IGlzIG5vIHNldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRvcnMgb25seSkuIiB9LAogICAgICAgICAg
ICAgICAgICAgICB7ICJuYW1lIjogImNvbmZpZ3VyYWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAi
ZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5IGRlc2NyaXB0
b3IgbWF5IGJlIGNoYW5nZWQgYW5kIGlmIHRoZSBwcm9wZXJ0eSBtYXkgYmUgZGVsZXRlZCBmcm9t
IHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdC4iIH0sCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yLTEuMC5qc29uIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3Rvci0xLjAuanNvbgppbmRleCAxZDNjYmRjMDIwYjA0ZWIzZTFlNDg0YWIyMWQ2ZWYw
MmE3NmI5NjJmLi5lMTllN2UwNjA5MWJjYzU1MTNiMmQ3MWI0MzMxOWRjYjBlYWJmZjE2IDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yLTEuMC5qc29uCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3ItMS4wLmpzb24KQEAgLTM3Niw3ICsz
NzYsNyBAQAogICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogWwogICAgICAgICAgICAgICAg
ICAgICB7ICJuYW1lIjogIm5hbWUiLCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAi
UHJvcGVydHkgbmFtZS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAidmFsdWUi
LCAiJHJlZiI6ICJSZW1vdGVPYmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24i
OiAiVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkuIiB9LAotICAgICAgICAg
ICAgICAgICAgICB7ICJuYW1lIjogIndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJkZXNj
cmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5
IG1heSBiZSBjaGFuZ2VkIChkYXRhIGRlc2NyaXB0b3JzIG9ubHkpLiIgfSwKKyAgICAgICAgICAg
ICAgICAgICAgeyAibmFtZSI6ICJ3cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAib3B0aW9u
YWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3
aXRoIHRoZSBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5KS4i
IH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiZ2V0IiwgIiRyZWYiOiAiUmVtb3Rl
T2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gd2hp
Y2ggc2VydmVzIGFzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVmaW5l
ZDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZ2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbmx5
KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAic2V0IiwgIiRyZWYiOiAiUmVt
b3RlT2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24g
d2hpY2ggc2VydmVzIGFzIGEgc2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVm
aW5lZDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBv
bmx5KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiY29uZmlndXJhYmxlIiwg
InR5cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB0eXBlIG9mIHRo
aXMgcHJvcGVydHkgZGVzY3JpcHRvciBtYXkgYmUgY2hhbmdlZCBhbmQgaWYgdGhlIHByb3BlcnR5
IG1heSBiZSBkZWxldGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LiIgfSwKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3IuanNvbiBiL1NvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3IuanNvbgppbmRleCAzMWU4ZDhhMTEwMmRiZWE4MmVi
MjkzNjAwZjNkNTNkN2NhMjU3NTcyLi44NDIxOTYyNTA0MTAwMjM0YTcxM2MzZGMwNGYxODAxZTMy
ZDMzZWJlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yLmpz
b24KKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci5qc29uCkBAIC0zNzcs
NyArMzc3LDcgQEAKICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IFsKICAgICAgICAgICAg
ICAgICAgICAgeyAibmFtZSI6ICJuYW1lIiwgInR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9u
IjogIlByb3BlcnR5IG5hbWUuIiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogInZh
bHVlIiwgIiRyZWYiOiAiUmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0
aW9uIjogIlRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5LiIgfSwKLSAgICAg
ICAgICAgICAgICAgICAgeyAibmFtZSI6ICJ3cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAi
ZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9w
ZXJ0eSBtYXkgYmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCisgICAgICAg
ICAgICAgICAgICAgIHsgIm5hbWUiOiAid3JpdGFibGUiLCAidHlwZSI6ICJib29sZWFuIiwgIm9w
dGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIlRydWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0
ZWQgd2l0aCB0aGUgcHJvcGVydHkgbWF5IGJlIGNoYW5nZWQgKGRhdGEgZGVzY3JpcHRvcnMgb25s
eSkuIiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogImdldCIsICIkcmVmIjogIlJl
bW90ZU9iamVjdCIsICJvcHRpb25hbCI6IHRydWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0aW9u
IHdoaWNoIHNlcnZlcyBhcyBhIGdldHRlciBmb3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51bmRl
ZmluZWQ8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGdldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRvcnMg
b25seSkuIiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogInNldCIsICIkcmVmIjog
IlJlbW90ZU9iamVjdCIsICJvcHRpb25hbCI6IHRydWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0
aW9uIHdoaWNoIHNlcnZlcyBhcyBhIHNldHRlciBmb3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51
bmRlZmluZWQ8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHNldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRv
cnMgb25seSkuIiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogImNvbmZpZ3VyYWJs
ZSIsICJ0eXBlIjogImJvb2xlYW4iLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdHlwZSBv
ZiB0aGlzIHByb3BlcnR5IGRlc2NyaXB0b3IgbWF5IGJlIGNoYW5nZWQgYW5kIGlmIHRoZSBwcm9w
ZXJ0eSBtYXkgYmUgZGVsZXRlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdC4iIH0sCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>125850</attachid>
            <date>2012-02-07 08:54:44 -0800</date>
            <delta_ts>2012-02-07 14:36:42 -0800</delta_ts>
            <desc>original InspectorTypeBuilder.h</desc>
            <filename>InspectorTypeBuilder.base.h</filename>
            <type>text/plain</type>
            <size>149618</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgoKI2lmbmRlZiBJbnNwZWN0b3JUeXBlQnVpbGRlcl9oCiNkZWZpbmUg
SW5zcGVjdG9yVHlwZUJ1aWxkZXJfaAoKI2lmIEVOQUJMRShJTlNQRUNUT1IpCgojaW5jbHVkZSAi
SW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNsdWRlIDxQbGF0Zm9ybVN0cmluZy5oPgojaW5jbHVkZSA8
d3RmL1Bhc3NSZWZQdHIuaD4KCm5hbWVzcGFjZSBXZWJDb3JlIHsKCm5hbWVzcGFjZSBUeXBlQnVp
bGRlciB7CgovLyBUaGlzIGNsYXNzIHByb3ZpZGVzICJUcmFpdHMiIHR5cGUgZm9yIHRoZSBpbnB1
dCB0eXBlIFQuIEl0IGlzIHByb2dyYW1tZWQgdXNpbmcgQysrIHRlbXBsYXRlIHNwZWNpYWxpemF0
aW9uCi8vIHRlY2huaXF1ZS4gQnkgZGVmYXVsdCBpdCBzaW1wbHkgdGFrZXMgIkl0ZW1UcmFpdHMi
IHR5cGUgZnJvbSBULCBidXQgaXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGJhc2UgdHlwZXMuCnRl
bXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBBcnJheUl0ZW1IZWxwZXIgewogICAgdHlwZWRlZiB0
eXBlbmFtZSBUOjpJdGVtVHJhaXRzIFRyYWl0czsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNs
YXNzIEFycmF5IDogcHVibGljIEluc3BlY3RvckFycmF5IHsKcHJpdmF0ZToKICAgIEFycmF5KCkg
eyB9CgpwdWJsaWM6CiAgICB2b2lkIGFkZEl0ZW0oUGFzc1JlZlB0cjxUPiB2YWx1ZSkKICAgIHsK
ICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6cHVzaFJlZlB0cih0aGlzLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBhZGRJdGVtKFQgdmFsdWUpCiAgICB7CiAgICAgICAgQXJyYXlJ
dGVtSGVscGVyPFQ+OjpUcmFpdHM6OnB1c2hSYXcodGhpcywgdmFsdWUpOwogICAgfQoKICAgIHN0
YXRpYyBQYXNzUmVmUHRyPEFycmF5PFQ+ID4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IEFycmF5PFQ+KCkpOwogICAgfQoKI2lmICFBU1NFUlRfRElTQUJMRUQKICAg
IHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpOwoj
ZW5kaWYgLy8gIUFTU0VSVF9ESVNBQkxFRAp9OwoKc3RydWN0IFN0cnVjdEl0ZW1UcmFpdHMgewog
ICAgc3RhdGljIHZvaWQgcHVzaFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICBhcnJheS0+cHVzaE9iamVj
dCh2YWx1ZSk7CiAgICB9CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0YXRpYyB2b2lk
IGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKICAgICAgICBUOjph
c3NlcnRDb3JyZWN0VmFsdWUodmFsdWUpOwogICAgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgQXJy
YXlJdGVtSGVscGVyPFN0cmluZz4gewogICAgc3RydWN0IFRyYWl0cyB7CiAgICAgICAgc3RhdGlj
IHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSogYXJyYXksIGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBhcnJheS0+cHVzaFN0cmluZyh2YWx1ZSk7CiAgICAgICAg
fQogICAgfTsKfTsKCnRlbXBsYXRlPD4Kc3RydWN0IEFycmF5SXRlbUhlbHBlcjxJbnNwZWN0b3JP
YmplY3Q+IHsKICAgIHN0cnVjdCBUcmFpdHMgewogICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSZWZQ
dHIoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBhcnJheS0+cHVzaE9iamVjdCh2YWx1ZSk7CiAgICAg
ICAgfQogICAgfTsKfTsKCi8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgpuYW1lc3BhY2UgQ29uc29s
ZSB7CmNsYXNzIENhbGxGcmFtZTsKfSAvLyBDb25zb2xlCgojaWYgRU5BQkxFKElOREVYRURfREFU
QUJBU0UpCm5hbWVzcGFjZSBJbmRleGVkREIgewpjbGFzcyBPYmplY3RTdG9yZTsKY2xhc3MgT2Jq
ZWN0U3RvcmVJbmRleDsKfSAvLyBJbmRleGVkREIKCiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9E
QVRBQkFTRSkKbmFtZXNwYWNlIENTUyB7CmNsYXNzIENTU1J1bGU7CmNsYXNzIFNvdXJjZVJhbmdl
OwpjbGFzcyBDU1NTdHlsZTsKY2xhc3MgQ1NTUHJvcGVydHk7CmNsYXNzIENTU01lZGlhOwp9IC8v
IENTUwoKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgRGVidWdnZXIg
ewpjbGFzcyBMb2NhdGlvbjsKY2xhc3MgU2NvcGU7Cn0gLy8gRGVidWdnZXIKCiNlbmRpZiAvLyBF
TkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKLy8gRW5kIG9mIGZvcndhcmQgZGVjbGFyYXRpb25z
LgoKLy8gVHlwZWRlZnMuCm5hbWVzcGFjZSBQYWdlIHsKLyogVW5pcXVlIHNjcmlwdCBpZGVudGlm
aWVyLiAqLwp0eXBlZGVmIFN0cmluZyBTY3JpcHRJZGVudGlmaWVyOwoKfSAvLyBQYWdlCgpuYW1l
c3BhY2UgUnVudGltZSB7Ci8qIFVuaXF1ZSBvYmplY3QgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBT
dHJpbmcgUmVtb3RlT2JqZWN0SWQ7Cgp9IC8vIFJ1bnRpbWUKCm5hbWVzcGFjZSBOZXR3b3JrIHsK
LyogVW5pcXVlIGxvYWRlciBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBMb2FkZXJJZDsK
Ci8qIFVuaXF1ZSBmcmFtZSBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBGcmFtZUlkOwoK
LyogVW5pcXVlIHJlcXVlc3QgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgUmVxdWVzdElk
OwoKfSAvLyBOZXR3b3JrCgojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCm5hbWVzcGFj
ZSBEZWJ1Z2dlciB7Ci8qIEJyZWFrcG9pbnQgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcg
QnJlYWtwb2ludElkOwoKLyogVW5pcXVlIHNjcmlwdCBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0
cmluZyBTY3JpcHRJZDsKCi8qIENhbGwgZnJhbWUgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJp
bmcgQ2FsbEZyYW1lSWQ7Cgp9IC8vIERlYnVnZ2VyCgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJ
UFRfREVCVUdHRVIpCi8vIEVuZCBvZiB0eXBlZGVmcy4KCgoKU3RyaW5nIGdldEVudW1Db25zdGFu
dFZhbHVlKGludCBjb2RlKTsKCm5hbWVzcGFjZSBNZW1vcnkgewovKiBOdW1iZXIgb2Ygbm9kZXMg
d2l0aCBnaXZlbiBuYW1lLiAqLwpjbGFzcyBOb2RlQ291bnQgOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IE5vZGVOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIENvdW50U2V0ID0gMSA8PCAxLAogICAgICAg
IEFsbEZpZWxkc1NldCA9IChOb2RlTmFtZVNldCB8IENvdW50U2V0KQogICAgfTsKCiAgICB0ZW1w
bGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBT
VEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhp
cyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Tm9kZUNvdW50PiBwdHIp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1Nl
dCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1
bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBOb2RlQ291bnQ7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2RlTmFtZVNldD4mIHNldE5vZGVOYW1l
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgTm9kZU5hbWVTZXQpLCBwcm9wZXJ0eV9ub2RlTmFtZV9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5vZGVOYW1lIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IENvdW50U2V0PiYgc2V0Q291bnQoaW50IHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENvdW50U2V0KSwgcHJvcGVy
dHlfY291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJj
b3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb3VudFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxOb2RlQ291bnQ+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1
bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJl
ZlB0cjxOb2RlQ291bnQ+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFBhc3NSZWZQdHI8Tm9kZUNvdW50PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJl
ZlB0cjxOb2RlQ291bnQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBT
eW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Tm9kZUNvdW50PiByZXN1bHQgPSBO
b2RlQ291bnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldE5vZGVOYW1lKC4uLikKICAgICAqICAg
ICAuc2V0Q291bnQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0
UmVmKG5ldyBOb2RlQ291bnQoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRz
IEl0ZW1UcmFpdHM7Cn07CgovKiBOdW1iZXIgb2YgSlMgZXZlbnQgbGlzdGVuZXJzIGJ5IGV2ZW50
IHR5cGUuICovCmNsYXNzIExpc3RlbmVyQ291bnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFR5cGVT
ZXQgPSAxIDw8IDAsCiAgICAgICAgQ291bnRTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRz
U2V0ID0gKFR5cGVTZXQgfCBDb3VudFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRF
PgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxT
VEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPExpc3RlbmVyQ291bnQ+IHB0cikKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsK
ICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIExpc3RlbmVyQ291bnQ7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5
cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxU
eXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENvdW50U2V0PiYg
c2V0Q291bnQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIENvdW50U2V0KSwgcHJvcGVydHlfY291bnRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxDb3VudFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxMaXN0ZW5lckNvdW50PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8TGlzdGVuZXJDb3VudD4qPigmbV9y
ZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxMaXN0ZW5lckNv
dW50PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxMaXN0ZW5lckNvdW50
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPExpc3RlbmVyQ291bnQ+IHJlc3VsdCA9IExpc3RlbmVyQ291
bnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRDb3Vu
dCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkK
ICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IExp
c3RlbmVyQ291bnQoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1U
cmFpdHM7Cn07CgovKiBDaGFyYWN0ZXIgZGF0YSBzdGF0aXN0aWNzIGZvciB0aGUgcGFnZS4gKi8K
Y2xhc3MgU3RyaW5nU3RhdGlzdGljcyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgRG9tU2V0ID0gMSA8
PCAwLAogICAgICAgIEpzU2V0ID0gMSA8PCAxLAogICAgICAgIFNoYXJlZFNldCA9IDEgPDwgMiwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoRG9tU2V0IHwgSnNTZXQgfCBTaGFyZWRTZXQpCiAgICB9
OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0
ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVt
cGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAg
ICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwg
U1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTdHJp
bmdTdGF0aXN0aWNzPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBTdHJpbmdTdGF0aXN0aWNzOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
RG9tU2V0PiYgc2V0RG9tKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBEb21TZXQpLCBwcm9wZXJ0eV9kb21fYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJkb20iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8RG9tU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IEpzU2V0PiYgc2V0SnMoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIEpzU2V0KSwgcHJvcGVydHlfanNfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJqcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxKc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBTaGFyZWRTZXQ+JiBzZXRTaGFyZWQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNoYXJlZFNldCksIHByb3BlcnR5X3NoYXJlZF9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNoYXJlZCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaGFyZWRTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBSZWZQdHI8U3RyaW5nU3RhdGlzdGljcz4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PFN0cmluZ1N0YXRpc3RpY3M+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFBhc3NSZWZQdHI8U3RyaW5nU3RhdGlzdGljcz4gKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiBSZWZQdHI8U3RyaW5nU3RhdGlzdGljcz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTdHJp
bmdTdGF0aXN0aWNzPiByZXN1bHQgPSBTdHJpbmdTdGF0aXN0aWNzOjpjcmVhdGUoKQogICAgICog
ICAgIC5zZXREb20oLi4uKQogICAgICogICAgIC5zZXRKcyguLi4pCiAgICAgKiAgICAgLnNldFNo
YXJlZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3
IFN0cmluZ1N0YXRpc3RpY3MoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRz
IEl0ZW1UcmFpdHM7Cn07CgpjbGFzcyBET01Hcm91cCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qg
ewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU2l6
ZVNldCA9IDEgPDwgMCwKICAgICAgICBUaXRsZVNldCA9IDEgPDwgMSwKICAgICAgICBOb2RlQ291
bnRTZXQgPSAxIDw8IDIsCiAgICAgICAgTGlzdGVuZXJDb3VudFNldCA9IDEgPDwgMywKICAgICAg
ICBBbGxGaWVsZHNTZXQgPSAoU2l6ZVNldCB8IFRpdGxlU2V0IHwgTm9kZUNvdW50U2V0IHwgTGlz
dGVuZXJDb3VudFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPERPTUdyb3VwPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9p
bml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAg
IGZyaWVuZCBjbGFzcyBET01Hcm91cDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFNpemVTZXQ+JiBzZXRTaXplKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTaXplU2V0KSwgcHJvcGVydHlfc2l6ZV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNpemUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2l6ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBUaXRsZVNldD4mIHNldFRpdGxlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVGl0bGVTZXQpLCBw
cm9wZXJ0eV90aXRsZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJp
bmcoInRpdGxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRpdGxlU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVDb3VudFNldD4mIHNl
dE5vZGVDb3VudCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpN
ZW1vcnk6Ok5vZGVDb3VudCA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOb2RlQ291bnRT
ZXQpLCBwcm9wZXJ0eV9ub2RlQ291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0QXJyYXkoIm5vZGVDb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxOb2RlQ291bnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TGlzdGVuZXJDb3VudFNldD4mIHNldExpc3RlbmVyQ291bnQoLypQYXNzUmVmUHRyPFR5cGVCdWls
ZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6TWVtb3J5OjpMaXN0ZW5lckNvdW50ID4gPiovIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIExpc3RlbmVyQ291bnRTZXQpLCBwcm9wZXJ0eV9saXN0ZW5lckNv
dW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJsaXN0ZW5l
ckNvdW50IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExpc3RlbmVyQ291
bnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RE9NR3JvdXA+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRz
U2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PFJlZlB0cjxET01Hcm91cD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxET01Hcm91cD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiBSZWZQdHI8RE9NR3JvdXA+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8RE9NR3JvdXA+IHJlc3Vs
dCA9IERPTUdyb3VwOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTaXplKC4uLikKICAgICAqICAg
ICAuc2V0VGl0bGUoLi4uKQogICAgICogICAgIC5zZXROb2RlQ291bnQoLi4uKQogICAgICogICAg
IC5zZXRMaXN0ZW5lckNvdW50KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmll
bGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0
PihhZG9wdFJlZihuZXcgRE9NR3JvdXAoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVt
VHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXREb2N1bWVudFVSSShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiZG9jdW1lbnRVUkkiLCB2YWx1
ZSk7CiAgICB9Cn07Cgp9IC8vIE1lbW9yeQoKbmFtZXNwYWNlIFBhZ2UgewovKiBSZXNvdXJjZSB0
eXBlIGFzIGl0IHdhcyBwZXJjZWl2ZWQgYnkgdGhlIHJlbmRlcmluZyBlbmdpbmUuICovCnN0cnVj
dCBSZXNvdXJjZVR5cGUgewogICAgZW51bSBFbnVtIHsKICAgICAgICBEb2N1bWVudCA9IDAsCiAg
ICAgICAgU3R5bGVzaGVldCA9IDEsCiAgICAgICAgSW1hZ2UgPSAyLAogICAgICAgIEZvbnQgPSAz
LAogICAgICAgIFNjcmlwdCA9IDQsCiAgICAgICAgWEhSID0gNSwKICAgICAgICBXZWJTb2NrZXQg
PSA2LAogICAgICAgIE90aGVyID0gNywKICAgIH07Cn07IC8vIHN0cnVjdCBSZXNvdXJjZVR5cGUK
Ci8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBGcmFtZSBvbiB0aGUgcGFnZS4gKi8KY2xhc3MgRnJh
bWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAg
Tm9GaWVsZHNTZXQgPSAwLAogICAgICAgIElkU2V0ID0gMSA8PCAwLAogICAgICAgIExvYWRlcklk
U2V0ID0gMSA8PCAxLAogICAgICAgIFVybFNldCA9IDEgPDwgMiwKICAgICAgICBNaW1lVHlwZVNl
dCA9IDEgPDwgMywKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoSWRTZXQgfCBMb2FkZXJJZFNldCB8
IFVybFNldCB8IE1pbWVUeXBlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAg
ICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRF
IHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RnJhbWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5f
bm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAg
ICAgICAgZnJpZW5kIGNsYXNzIEZyYW1lOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgSWRTZXQ+JiBzZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBMb2FkZXJJZFNldD4mIHNldExvYWRlcklkKC8qY29uc3QgVHlwZUJ1aWxk
ZXI6Ok5ldHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTG9hZGVySWRTZXQpLCBwcm9wZXJ0
eV9sb2FkZXJJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
ImxvYWRlcklkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExvYWRlcklk
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVybFNldD4mIHNldFVy
bChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFVybFNldCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxVcmxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TWltZVR5cGVTZXQ+JiBzZXRNaW1lVHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1pbWVUeXBlU2V0KSwgcHJvcGVy
dHlfbWltZVR5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJtaW1lVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNaW1lVHlw
ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxGcmFtZT4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQs
IHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8UmVmUHRyPEZyYW1lPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBQYXNzUmVmUHRyPEZyYW1lPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxGcmFtZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxGcmFtZT4gcmVzdWx0ID0gRnJhbWU6OmNyZWF0
ZSgpCiAgICAgKiAgICAgLnNldElkKC4uLikKICAgICAqICAgICAuc2V0TG9hZGVySWQoLi4uKQog
ICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRNaW1lVHlwZSguLi4pOwogICAg
ICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAg
ICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEZyYW1lKCkpKTsKICAg
IH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0
UGFyZW50SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoInBhcmVudElkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldFNlY3VyaXR5T3JpZ2luKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzZWN1cml0eU9yaWdpbiIsIHZhbHVlKTsKICAg
IH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBGcmFtZSBoaWVyYXJjaHkgYWxvbmcgd2l0
aCB0aGVpciBjYWNoZWQgcmVzb3VyY2VzLiAqLwpjbGFzcyBGcmFtZVJlc291cmNlVHJlZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0
eSBuYW1lICdyZXNvdXJjZXMnIHdoaWxlIGdlbmVyYXRpbmcgRnJhbWVSZXNvdXJjZVRyZWUuCiAg
ICBjbGFzcyBSZXNvdXJjZXMgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKICAgIHB1YmxpYzoK
ICAgICAgICBlbnVtIHsKICAgICAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgICAgICBV
cmxTZXQgPSAxIDw8IDAsCiAgICAgICAgICAgIFR5cGVTZXQgPSAxIDw8IDEsCiAgICAgICAgICAg
IE1pbWVUeXBlU2V0ID0gMSA8PCAyLAogICAgICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0
IHwgVHlwZVNldCB8IE1pbWVUeXBlU2V0KQogICAgICAgIH07CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgICAgICBjbGFzcyBCdWlsZGVyIHsKICAgICAgICBwcml2YXRlOgogICAgICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPFJlc291cmNlcz4gcHRyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgICAg
ICB9CiAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBSZXNvdXJjZXM7CiAgICAgICAgcHVibGljOgog
ICAgCiAgICAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFVybFNldCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShUeXBlQnVpbGRlcjo6UGFnZTo6UmVz
b3VyY2VUeXBlOjpFbnVtIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIGdldEVudW1Db25z
dGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVT
ZXQ+KCk7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlw
ZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUi
LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAg
ICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVTZXQ+
JiBzZXRNaW1lVHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTWltZVR5cGVTZXQpLCBwcm9wZXJ0eV9t
aW1lVHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJtaW1lVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWlt
ZVR5cGVTZXQ+KCk7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8UmVzb3VyY2VzPiYgKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVzb3VyY2VzPio+KCZt
X3Jlc3VsdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8
UmVzb3VyY2VzPiAoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gUmVmUHRy
PFJlc291cmNlcz4oKnRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLyoK
ICAgICAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgICAgICogUmVmUHRyPFJlc291
cmNlcz4gcmVzdWx0ID0gUmVzb3VyY2VzOjpjcmVhdGUoKQogICAgICAgICAqICAgICAuc2V0VXJs
KC4uLikKICAgICAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICAgICAqICAgICAuc2V0TWlt
ZVR5cGUoLi4uKTsKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4gY3JlYXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgUmVzb3VyY2VzKCkpKTsKICAgICAgICB9CiAgICAgICAgdHlwZWRl
ZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CiAgICB9OwoKICAgIGVudW0gewogICAgICAg
IE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBGcmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBSZXNv
dXJjZXNTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKEZyYW1lU2V0IHwgUmVz
b3VyY2VzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5f
bm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAg
ICAgICAgZnJpZW5kIGNsYXNzIEZyYW1lUmVzb3VyY2VUcmVlOwogICAgcHVibGljOgoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgRnJhbWVTZXQ+JiBzZXRGcmFtZSgvKlBhc3NSZWZQdHI8VHlwZUJ1
aWxkZXI6OlBhZ2U6OkZyYW1lPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGcmFtZVNldCks
IHByb3BlcnR5X2ZyYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9i
amVjdCgiZnJhbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnJhbWVT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUmVzb3VyY2VzU2V0PiYg
c2V0UmVzb3VyY2VzKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8UmVzb3VyY2VzID4g
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJlc291cmNlc1NldCksIHByb3BlcnR5X3Jlc291
cmNlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgicmVzb3Vy
Y2VzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJlc291cmNlc1NldD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4m
ICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVs
ZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4oKnRoaXMp
OwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoK
ICAgICAqIFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4gcmVzdWx0ID0gRnJhbWVSZXNvdXJjZVRy
ZWU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEZyYW1lKC4uLikKICAgICAqICAgICAuc2V0UmVz
b3VyY2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVh
dGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihu
ZXcgRnJhbWVSZXNvdXJjZVRyZWUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJh
aXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRDaGlsZEZyYW1lcygvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpQYWdlOjpGcmFtZVJlc291cmNlVHJlZSA+ID4q
LyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRBcnJheSgiY2hpbGRGcmFtZXMiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBTZWFyY2ggbWF0Y2gg
Zm9yIHJlc291cmNlLiAqLwpjbGFzcyBTZWFyY2hNYXRjaCA6IHB1YmxpYyBJbnNwZWN0b3JPYmpl
Y3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAg
TGluZU51bWJlclNldCA9IDEgPDwgMCwKICAgICAgICBMaW5lQ29udGVudFNldCA9IDEgPDwgMSwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoTGluZU51bWJlclNldCB8IExpbmVDb250ZW50U2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
U2VhcmNoTWF0Y2g+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNU
QVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwog
ICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNz
IFNlYXJjaE1hdGNoOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51
bWJlclNldD4mIHNldExpbmVOdW1iZXIoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExpbmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5l
TnVtYmVyX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibGlu
ZU51bWJlciIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVy
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExpbmVDb250ZW50U2V0
PiYgc2V0TGluZUNvbnRlbnQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMaW5lQ29udGVudFNldCksIHByb3BlcnR5X2xp
bmVDb250ZW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
bGluZUNvbnRlbnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGluZUNv
bnRlbnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U2VhcmNoTWF0
Y2g+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxs
RmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PFJlZlB0cjxTZWFyY2hNYXRjaD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWFyY2hNYXRjaD4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8U2VhcmNoTWF0Y2g+KCp0aGlzKTsKICAgICAgICB9CiAg
ICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8
U2VhcmNoTWF0Y2g+IHJlc3VsdCA9IFNlYXJjaE1hdGNoOjpjcmVhdGUoKQogICAgICogICAgIC5z
ZXRMaW5lTnVtYmVyKC4uLikKICAgICAqICAgICAuc2V0TGluZUNvbnRlbnQoLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBTZWFyY2hNYXRjaCgpKSk7
CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIFNl
YXJjaCByZXN1bHQgZm9yIHJlc291cmNlLiAqLwpjbGFzcyBTZWFyY2hSZXN1bHQgOiBwdWJsaWMg
SW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQg
PSAwLAogICAgICAgIFVybFNldCA9IDEgPDwgMCwKICAgICAgICBGcmFtZUlkU2V0ID0gMSA8PCAx
LAogICAgICAgIE1hdGNoZXNDb3VudFNldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQg
PSAoVXJsU2V0IHwgRnJhbWVJZFNldCB8IE1hdGNoZXNDb3VudFNldCkKICAgIH07CgogICAgdGVt
cGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQg
U1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRo
aXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNlYXJjaFJlc3VsdD4g
cHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVs
ZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VhcmNoUmVzdWx0
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGcmFt
ZUlkU2V0PiYgc2V0RnJhbWVJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlk
JiovIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgRnJhbWVJZFNldCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEZyYW1lSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgTWF0Y2hlc0NvdW50U2V0PiYgc2V0TWF0Y2hlc0NvdW50KGRvdWJs
ZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBN
YXRjaGVzQ291bnRTZXQpLCBwcm9wZXJ0eV9tYXRjaGVzQ291bnRfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJtYXRjaGVzQ291bnQiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWF0Y2hlc0NvdW50U2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPFNlYXJjaFJlc3VsdD4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlYXJj
aFJlc3VsdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxTZWFyY2hSZXN1bHQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PFNlYXJjaFJlc3VsdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWFyY2hSZXN1bHQ+IHJlc3VsdCA9
IFNlYXJjaFJlc3VsdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAg
ICAuc2V0RnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldE1hdGNoZXNDb3VudCguLi4pOwogICAg
ICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAg
ICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNlYXJjaFJlc3VsdCgp
KSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8q
IENvb2tpZSBvYmplY3QgKi8KY2xhc3MgQ29va2llIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOYW1l
U2V0ID0gMSA8PCAwLAogICAgICAgIFZhbHVlU2V0ID0gMSA8PCAxLAogICAgICAgIERvbWFpblNl
dCA9IDEgPDwgMiwKICAgICAgICBQYXRoU2V0ID0gMSA8PCAzLAogICAgICAgIEV4cGlyZXNTZXQg
PSAxIDw8IDQsCiAgICAgICAgU2l6ZVNldCA9IDEgPDwgNSwKICAgICAgICBIdHRwT25seVNldCA9
IDEgPDwgNiwKICAgICAgICBTZWN1cmVTZXQgPSAxIDw8IDcsCiAgICAgICAgU2Vzc2lvblNldCA9
IDEgPDwgOCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoTmFtZVNldCB8IFZhbHVlU2V0IHwgRG9t
YWluU2V0IHwgUGF0aFNldCB8IEV4cGlyZXNTZXQgfCBTaXplU2V0IHwgSHR0cE9ubHlTZXQgfCBT
ZWN1cmVTZXQgfCBTZXNzaW9uU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAg
ICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRF
IHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q29va2llPiBwdHIpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBDb29raWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9u
YW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFZhbHVlU2V0PiYgc2V0VmFsdWUoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBWYWx1ZVNldCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8VmFsdWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG9t
YWluU2V0PiYgc2V0RG9tYWluKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRG9tYWluU2V0KSwgcHJvcGVydHlfZG9tYWlu
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiZG9tYWluIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERvbWFpblNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBQYXRoU2V0PiYgc2V0UGF0aChjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFBhdGhTZXQpLCBwcm9wZXJ0eV9wYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygicGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxQYXRoU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEV4cGlyZXNT
ZXQ+JiBzZXRFeHBpcmVzKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBFeHBpcmVzU2V0KSwgcHJvcGVydHlfZXhwaXJlc19hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImV4cGlyZXMiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RXhwaXJlc1NldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBTaXplU2V0PiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2l6ZVNldCksIHByb3BlcnR5
X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzaXpl
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNpemVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSHR0cE9ubHlTZXQ+JiBzZXRIdHRwT25seShi
b29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IEh0dHBPbmx5U2V0KSwgcHJvcGVydHlfaHR0cE9ubHlfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiaHR0cE9ubHkiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8SHR0cE9ubHlTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU2VjdXJlU2V0PiYgc2V0U2VjdXJlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2VjdXJlU2V0KSwgcHJvcGVydHlfc2Vj
dXJlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oInNlY3Vy
ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTZWN1cmVTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2Vzc2lvblNldD4mIHNldFNlc3Npb24o
Ym9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTZXNzaW9uU2V0KSwgcHJvcGVydHlfc2Vzc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRCb29sZWFuKCJzZXNzaW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFNlc3Npb25TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8Q29va2llPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNU
QVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q29va2llPio+KCZtX3Jlc3VsdCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENvb2tpZT4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8Q29va2llPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsK
CiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENvb2tp
ZT4gcmVzdWx0ID0gQ29va2llOjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAg
ICAqICAgICAuc2V0VmFsdWUoLi4uKQogICAgICogICAgIC5zZXREb21haW4oLi4uKQogICAgICog
ICAgIC5zZXRQYXRoKC4uLikKICAgICAqICAgICAuc2V0RXhwaXJlcyguLi4pCiAgICAgKiAgICAg
LnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRIdHRwT25seSguLi4pCiAgICAgKiAgICAgLnNl
dFNlY3VyZSguLi4pCiAgICAgKiAgICAgLnNldFNlc3Npb24oLi4uKTsKICAgICAqLwogICAgc3Rh
dGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDb29raWUoKSkpOwogICAgfQogICAgdHlw
ZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07Cgp9IC8vIFBhZ2UKCm5hbWVzcGFj
ZSBSdW50aW1lIHsKLyogTWlycm9yIG9iamVjdCByZWZlcmVuY2luZyBvcmlnaW5hbCBKYXZhU2Ny
aXB0IG9iamVjdC4gKi8KY2xhc3MgUmVtb3RlT2JqZWN0IDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUnIHdoaWxl
IGdlbmVyYXRpbmcgUmVtb3RlT2JqZWN0LgogICAgc3RydWN0IFR5cGUgewogICAgICAgIGVudW0g
RW51bSB7CiAgICAgICAgICAgIE9iamVjdCA9IDgsCiAgICAgICAgICAgIEZ1bmN0aW9uID0gOSwK
ICAgICAgICAgICAgVW5kZWZpbmVkID0gMTAsCiAgICAgICAgICAgIFN0cmluZyA9IDExLAogICAg
ICAgICAgICBOdW1iZXIgPSAxMiwKICAgICAgICAgICAgQm9vbGVhbiA9IDEzLAogICAgICAgIH07
CiNpZiAhQVNTRVJUX0RJU0FCTEVECiAgICAgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZh
bHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSk7CiNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAog
ICAgfTsgLy8gc3RydWN0IFR5cGUKCiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdz
dWJ0eXBlJyB3aGlsZSBnZW5lcmF0aW5nIFJlbW90ZU9iamVjdC4KICAgIHN0cnVjdCBTdWJ0eXBl
IHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBBcnJheSA9IDE0LAogICAgICAgICAg
ICBOdWxsID0gMTUsCiAgICAgICAgICAgIE5vZGUgPSAxNiwKICAgICAgICAgICAgUmVnZXhwID0g
MTcsCiAgICAgICAgICAgIERhdGUgPSAxOCwKICAgICAgICB9OwojaWYgIUFTU0VSVF9ESVNBQkxF
RAogICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSog
dmFsdWUpOwojZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKICAgIH07IC8vIHN0cnVjdCBTdWJ0
eXBlCgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFR5cGVTZXQg
PSAxIDw8IDAsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFR5cGVTZXQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZW1vdGVPYmplY3Q+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFJlbW90ZU9iamVj
dDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBl
KFR5cGU6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUp
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNl
dCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVtb3RlT2JqZWN0PiYg
KCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxk
c1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxSZWZQdHI8UmVtb3RlT2JqZWN0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFJlbW90ZU9iamVjdD4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8UmVtb3RlT2JqZWN0PigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFJl
bW90ZU9iamVjdD4gcmVzdWx0ID0gUmVtb3RlT2JqZWN0OjpjcmVhdGUoKQogICAgICogICAgIC5z
ZXRUeXBlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVh
dGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihu
ZXcgUmVtb3RlT2JqZWN0KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJ
dGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0U3VidHlwZShTdWJ0eXBlOjpFbnVtIHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldFN0cmluZygic3VidHlwZSIsIGdldEVudW1Db25zdGFudFZhbHVl
KHZhbHVlKSk7CiAgICB9CgogICAgdm9pZCBzZXRTdWJ0eXBlKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdWJ0eXBlIiwgdmFsdWUpOwogICAgfQoK
ICAgIHZvaWQgc2V0Q2xhc3NOYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJjbGFzc05hbWUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRW
YWx1ZShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlz
LT5zZXRWYWx1ZSgidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAgICB1c2luZyBJbnNwZWN0b3JPYmpl
Y3Q6OnNldFZhbHVlOwoKCiAgICB2b2lkIHNldERlc2NyaXB0aW9uKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkZXNjcmlwdGlvbiIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldE9iamVjdElkKC8qY29uc3QgVHlwZUJ1aWxkZXI6OlJ1bnRpbWU6
OlJlbW90ZU9iamVjdElkJiovIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0U3RyaW5nKCJvYmplY3RJZCIsIHZhbHVlKTsKICAgIH0KICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFJlbW90ZU9iamVjdD4gcnVudGltZUNhc3QoUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4g
dmFsdWUpCiAgICB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gb2JqZWN0OwogICAg
ICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc09iamVjdCgmb2JqZWN0KTsKICAgICAgICBBU1NF
UlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwojaWYgIUFTU0VSVF9ESVNBQkxFRAogICAgICAg
IGFzc2VydENvcnJlY3RWYWx1ZShvYmplY3QuZ2V0KCkpOwojZW5kaWYgIC8vICFBU1NFUlRfRElT
QUJMRUQKICAgICAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoUmVtb3RlT2JqZWN0KSA9PSBzaXpl
b2YoSW5zcGVjdG9yT2JqZWN0KSwgdHlwZV9jYXN0X3Byb2JsZW0pOwogICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxSZW1vdGVPYmplY3QqPihvYmplY3QuZ2V0KCkpOwogICAgfQoKI2lmICFBU1NF
UlRfRElTQUJMRUQKICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JW
YWx1ZSogdmFsdWUpOwojZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKfTsKCi8qIE9iamVjdCBw
cm9wZXJ0eSBkZXNjcmlwdG9yLiAqLwpjbGFzcyBQcm9wZXJ0eURlc2NyaXB0b3IgOiBwdWJsaWMg
SW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQg
PSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgV3JpdGFibGVTZXQgPSAxIDw8
IDEsCiAgICAgICAgQ29uZmlndXJhYmxlU2V0ID0gMSA8PCAyLAogICAgICAgIEVudW1lcmFibGVT
ZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQgfCBXcml0YWJsZVNl
dCB8IENvbmZpZ3VyYWJsZVNldCB8IEVudW1lcmFibGVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRl
PGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+
IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFByb3BlcnR5RGVz
Y3JpcHRvcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBz
ZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgV3JpdGFibGVTZXQ+JiBzZXRXcml0YWJsZShib29sIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFdyaXRhYmxlU2V0KSwgcHJvcGVy
dHlfd3JpdGFibGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVh
bigid3JpdGFibGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8V3JpdGFi
bGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ29uZmlndXJhYmxl
U2V0PiYgc2V0Q29uZmlndXJhYmxlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ29uZmlndXJhYmxlU2V0KSwgcHJvcGVydHlfY29uZmln
dXJhYmxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImNv
bmZpZ3VyYWJsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb25maWd1
cmFibGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRW51bWVyYWJs
ZVNldD4mIHNldEVudW1lcmFibGUoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBFbnVtZXJhYmxlU2V0KSwgcHJvcGVydHlfZW51bWVyYWJs
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJlbnVtZXJh
YmxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEVudW1lcmFibGVTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9y
PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZp
ZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPio+KCZtX3Jlc3VsdCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4gKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4gcmVzdWx0ID0gUHJvcGVydHlE
ZXNjcmlwdG9yOjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAu
c2V0V3JpdGFibGUoLi4uKQogICAgICogICAgIC5zZXRDb25maWd1cmFibGUoLi4uKQogICAgICog
ICAgIC5zZXRFbnVtZXJhYmxlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmll
bGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0
PihhZG9wdFJlZihuZXcgUHJvcGVydHlEZXNjcmlwdG9yKCkpKTsKICAgIH0KICAgIHR5cGVkZWYg
U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0VmFsdWUoLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgidmFsdWUi
LCB2YWx1ZSk7CiAgICB9CiAgICB1c2luZyBJbnNwZWN0b3JPYmplY3Q6OnNldFZhbHVlOwoKCiAg
ICB2b2lkIHNldEdldCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9i
amVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0T2JqZWN0KCJnZXQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTZXQoLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgi
c2V0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0V2FzVGhyb3duKGJvb2wgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigid2FzVGhyb3duIiwgdmFsdWUpOwogICAgfQp9
OwoKLyogUmVwcmVzZW50cyBmdW5jdGlvbiBjYWxsIGFyZ3VtZW50LiBFaXRoZXIgcmVtb3RlIG9i
amVjdCBpZCA8Y29kZT5vYmplY3RJZDwvY29kZT4gb3IgcHJpbWl0aXZlIDxjb2RlPnZhbHVlPC9j
b2RlPiBvciBuZWl0aGVyIG9mIChmb3IgdW5kZWZpbmVkKSB0aGVtIHNob3VsZCBiZSBzcGVjaWZp
ZWQuICovCmNsYXNzIENhbGxBcmd1bWVudCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJs
aWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgQWxsRmllbGRz
U2V0ID0gMAogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVy
IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RT
dGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVp
bGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8Q2FsbEFyZ3VtZW50PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBDYWxsQXJndW1lbnQ7CiAgICBwdWJsaWM6CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxDYWxsQXJndW1lbnQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDYWxsQXJndW1lbnQ+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q2FsbEFyZ3VtZW50
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDYWxsQXJndW1lbnQ+KCp0
aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0
b3I6CiAgICAgKiBSZWZQdHI8Q2FsbEFyZ3VtZW50PiByZXN1bHQgPSBDYWxsQXJndW1lbnQ6OmNy
ZWF0ZSgpOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkK
ICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENh
bGxBcmd1bWVudCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKCiAgICB2b2lkIHNldFZhbHVlKFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldFZhbHVlKCJ2YWx1ZSIsIHZhbHVlKTsKICAgIH0KICAg
IHVzaW5nIEluc3BlY3Rvck9iamVjdDo6c2V0VmFsdWU7CgoKICAgIHZvaWQgc2V0T2JqZWN0SWQo
Lypjb25zdCBUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0SWQmKi8gY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoIm9iamVjdElkIiwgdmFs
dWUpOwogICAgfQp9OwoKfSAvLyBSdW50aW1lCgpuYW1lc3BhY2UgQ29uc29sZSB7Ci8qIENvbnNv
bGUgbWVzc2FnZS4gKi8KY2xhc3MgQ29uc29sZU1lc3NhZ2UgOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnc291cmNlJyB3
aGlsZSBnZW5lcmF0aW5nIENvbnNvbGVNZXNzYWdlLgogICAgc3RydWN0IFNvdXJjZSB7CiAgICAg
ICAgZW51bSBFbnVtIHsKICAgICAgICAgICAgSHRtbCA9IDE5LAogICAgICAgICAgICBXbWwgPSAy
MCwKICAgICAgICAgICAgWG1sID0gMjEsCiAgICAgICAgICAgIEphdmFzY3JpcHQgPSAyMiwKICAg
ICAgICAgICAgTmV0d29yayA9IDIzLAogICAgICAgICAgICBDb25zb2xlX2FwaSA9IDI0LAogICAg
ICAgICAgICBPdGhlciA9IDI1LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgU291cmNlCgog
ICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnbGV2ZWwnIHdoaWxlIGdlbmVyYXRpbmcg
Q29uc29sZU1lc3NhZ2UuCiAgICBzdHJ1Y3QgTGV2ZWwgewogICAgICAgIGVudW0gRW51bSB7CiAg
ICAgICAgICAgIFRpcCA9IDI2LAogICAgICAgICAgICBMb2cgPSAyNywKICAgICAgICAgICAgV2Fy
bmluZyA9IDI4LAogICAgICAgICAgICBFcnJvciA9IDI5LAogICAgICAgICAgICBEZWJ1ZyA9IDMw
LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgTGV2ZWwKCiAgICAvLyBOYW1lZCBhZnRlciBw
cm9wZXJ0eSBuYW1lICd0eXBlJyB3aGlsZSBnZW5lcmF0aW5nIENvbnNvbGVNZXNzYWdlLgogICAg
c3RydWN0IFR5cGUgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIExvZyA9IDI3LAog
ICAgICAgICAgICBEaXIgPSAzMSwKICAgICAgICAgICAgRGlyeG1sID0gMzIsCiAgICAgICAgICAg
IFRyYWNlID0gMzMsCiAgICAgICAgICAgIFN0YXJ0R3JvdXAgPSAzNCwKICAgICAgICAgICAgU3Rh
cnRHcm91cENvbGxhcHNlZCA9IDM1LAogICAgICAgICAgICBFbmRHcm91cCA9IDM2LAogICAgICAg
ICAgICBBc3NlcnQgPSAzNywKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IFR5cGUKCiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU291cmNlU2V0ID0gMSA8PCAw
LAogICAgICAgIExldmVsU2V0ID0gMSA8PCAxLAogICAgICAgIFRleHRTZXQgPSAxIDw8IDIsCiAg
ICAgICAgQWxsRmllbGRzU2V0ID0gKFNvdXJjZVNldCB8IExldmVsU2V0IHwgVGV4dFNldCkKICAg
IH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2
YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0
ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENv
bnNvbGVNZXNzYWdlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBDb25zb2xlTWVzc2FnZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNv
dXJjZVNldD4mIHNldFNvdXJjZShTb3VyY2U6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwg
Z2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxTb3VyY2VTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNl
U2V0PiYgc2V0U291cmNlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNvdXJjZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMZXZlbFNldD4mIHNldExldmVsKExldmVsOjpFbnVt
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExl
dmVsU2V0KSwgcHJvcGVydHlfbGV2ZWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJsZXZlbCIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGV2ZWxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgTGV2ZWxTZXQ+JiBzZXRMZXZlbChjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExldmVsU2V0KSwg
cHJvcGVydHlfbGV2ZWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJsZXZlbCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMZXZlbFNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUZXh0U2V0PiYgc2V0VGV4
dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFRleHRTZXQpLCBwcm9wZXJ0eV90ZXh0X2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGV4dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPENvbnNvbGVNZXNzYWdlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q29uc29sZU1lc3NhZ2U+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q29uc29sZU1l
c3NhZ2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENvbnNvbGVNZXNz
YWdlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPENvbnNvbGVNZXNzYWdlPiByZXN1bHQgPSBDb25zb2xl
TWVzc2FnZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U291cmNlKC4uLikKICAgICAqICAgICAu
c2V0TGV2ZWwoLi4uKQogICAgICogICAgIC5zZXRUZXh0KC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ29uc29sZU1lc3NhZ2UoKSkpOwogICAgfQog
ICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRUeXBl
KFR5cGU6OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0eXBlIiwg
Z2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgIH0KCiAgICB2b2lkIHNldFR5cGUoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInR5cGUiLCB2
YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dExpbmUoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigibGluZSIsIHZh
bHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJlcGVhdENvdW50KGludCB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXROdW1iZXIoInJlcGVhdENvdW50IiwgdmFsdWUpOwogICAgfQoKICAgIHZv
aWQgc2V0UGFyYW1ldGVycygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWls
ZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3QgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJh
eT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoInBhcmFtZXRlcnMiLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTdGFja1RyYWNlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRl
cjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OkNhbGxGcmFtZSA+ID4qLyBQYXNzUmVmUHRy
PEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgic3Rh
Y2tUcmFjZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE5ldHdvcmtSZXF1ZXN0SWQoLypj
b25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuZXR3b3JrUmVxdWVzdElkIiwgdmFs
dWUpOwogICAgfQp9OwoKLyogU3RhY2sgZW50cnkgZm9yIGNvbnNvbGUgZXJyb3JzIGFuZCBhc3Nl
cnRpb25zLiAqLwpjbGFzcyBDYWxsRnJhbWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIEZ1bmN0aW9u
TmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBVcmxTZXQgPSAxIDw8IDEsCiAgICAgICAgTGluZU51
bWJlclNldCA9IDEgPDwgMiwKICAgICAgICBDb2x1bW5OdW1iZXJTZXQgPSAxIDw8IDMsCiAgICAg
ICAgQWxsRmllbGRzU2V0ID0gKEZ1bmN0aW9uTmFtZVNldCB8IFVybFNldCB8IExpbmVOdW1iZXJT
ZXQgfCBDb2x1bW5OdW1iZXJTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAg
IGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWxsRnJhbWU+IHB0cikKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRf
aW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9
CiAgICAgICAgZnJpZW5kIGNsYXNzIENhbGxGcmFtZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IEZ1bmN0aW9uTmFtZVNldD4mIHNldEZ1bmN0aW9uTmFtZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IEZ1bmN0aW9uTmFtZVNldCksIHByb3BlcnR5X2Z1bmN0aW9uTmFtZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZ1bmN0aW9uTmFtZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxGdW5jdGlvbk5hbWVTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0
KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0
cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMaW5lTnVtYmVyU2V0PiYgc2V0
TGluZU51bWJlcihpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgTGluZU51bWJlclNldCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExpbmVOdW1iZXJTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ29sdW1uTnVtYmVyU2V0PiYgc2V0Q29sdW1uTnVt
YmVyKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBDb2x1bW5OdW1iZXJTZXQpLCBwcm9wZXJ0eV9jb2x1bW5OdW1iZXJfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjb2x1bW5OdW1iZXIiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29sdW1uTnVtYmVyU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxGcmFtZT4mICgpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19u
b3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENh
bGxGcmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxDYWxsRnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENh
bGxGcmFtZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWxsRnJhbWU+IHJlc3VsdCA9IENhbGxGcmFt
ZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0RnVuY3Rpb25OYW1lKC4uLikKICAgICAqICAgICAu
c2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TGluZU51bWJlciguLi4pCiAgICAgKiAgICAgLnNl
dENvbHVtbk51bWJlciguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRv
cHRSZWYobmV3IENhbGxGcmFtZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFp
dHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gQ29uc29sZQoKbmFtZXNwYWNlIE5ldHdvcmsgewovKiBU
aW1pbmcgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0LiAqLwpjbGFzcyBSZXNvdXJjZVRpbWlu
ZyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBO
b0ZpZWxkc1NldCA9IDAsCiAgICAgICAgUmVxdWVzdFRpbWVTZXQgPSAxIDw8IDAsCiAgICAgICAg
UHJveHlTdGFydFNldCA9IDEgPDwgMSwKICAgICAgICBQcm94eUVuZFNldCA9IDEgPDwgMiwKICAg
ICAgICBEbnNTdGFydFNldCA9IDEgPDwgMywKICAgICAgICBEbnNFbmRTZXQgPSAxIDw8IDQsCiAg
ICAgICAgQ29ubmVjdFN0YXJ0U2V0ID0gMSA8PCA1LAogICAgICAgIENvbm5lY3RFbmRTZXQgPSAx
IDw8IDYsCiAgICAgICAgU3NsU3RhcnRTZXQgPSAxIDw8IDcsCiAgICAgICAgU3NsRW5kU2V0ID0g
MSA8PCA4LAogICAgICAgIFNlbmRTdGFydFNldCA9IDEgPDwgOSwKICAgICAgICBTZW5kRW5kU2V0
ID0gMSA8PCAxMCwKICAgICAgICBSZWNlaXZlSGVhZGVyc0VuZFNldCA9IDEgPDwgMTEsCiAgICAg
ICAgQWxsRmllbGRzU2V0ID0gKFJlcXVlc3RUaW1lU2V0IHwgUHJveHlTdGFydFNldCB8IFByb3h5
RW5kU2V0IHwgRG5zU3RhcnRTZXQgfCBEbnNFbmRTZXQgfCBDb25uZWN0U3RhcnRTZXQgfCBDb25u
ZWN0RW5kU2V0IHwgU3NsU3RhcnRTZXQgfCBTc2xFbmRTZXQgfCBTZW5kU3RhcnRTZXQgfCBTZW5k
RW5kU2V0IHwgUmVjZWl2ZUhlYWRlcnNFbmRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZXNvdXJjZVRpbWluZz4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmVzb3VyY2VUaW1pbmc7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSZXF1ZXN0VGltZVNldD4mIHNldFJlcXVl
c3RUaW1lKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBSZXF1ZXN0VGltZVNldCksIHByb3BlcnR5X3JlcXVlc3RUaW1lX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicmVxdWVzdFRpbWUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UmVxdWVzdFRpbWVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUHJveHlTdGFydFNldD4mIHNldFByb3h5U3Rh
cnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFByb3h5U3RhcnRTZXQpLCBwcm9wZXJ0eV9wcm94eVN0YXJ0X2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicHJveHlTdGFydCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxQcm94eVN0YXJ0U2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFByb3h5RW5kU2V0PiYgc2V0UHJveHlFbmQoZG91YmxlIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFByb3h5
RW5kU2V0KSwgcHJvcGVydHlfcHJveHlFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0TnVtYmVyKCJwcm94eUVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxQcm94eUVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBEbnNTdGFydFNldD4mIHNldERuc1N0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEbnNTdGFydFNldCksIHByb3BlcnR5X2Ru
c1N0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiZG5z
U3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG5zU3RhcnRTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG5zRW5kU2V0PiYgc2V0RG5z
RW5kKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBEbnNFbmRTZXQpLCBwcm9wZXJ0eV9kbnNFbmRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJkbnNFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8RG5zRW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IENvbm5lY3RTdGFydFNldD4mIHNldENvbm5lY3RTdGFydChkb3VibGUgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ29ubmVjdFN0YXJ0
U2V0KSwgcHJvcGVydHlfY29ubmVjdFN0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldE51bWJlcigiY29ubmVjdFN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPENvbm5lY3RTdGFydFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBDb25uZWN0RW5kU2V0PiYgc2V0Q29ubmVjdEVuZChkb3VibGUgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ29ubmVjdEVuZFNl
dCksIHByb3BlcnR5X2Nvbm5lY3RFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0TnVtYmVyKCJjb25uZWN0RW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPENvbm5lY3RFbmRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgU3NsU3RhcnRTZXQ+JiBzZXRTc2xTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3NsU3RhcnRTZXQpLCBwcm9wZXJ0eV9z
c2xTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNz
bFN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNzbFN0YXJ0U2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNzbEVuZFNldD4mIHNldFNz
bEVuZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU3NsRW5kU2V0KSwgcHJvcGVydHlfc3NsRW5kX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3NsRW5kIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNzbEVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBTZW5kU3RhcnRTZXQ+JiBzZXRTZW5kU3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNlbmRTdGFydFNldCksIHBy
b3BlcnR5X3NlbmRTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoInNlbmRTdGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxT
ZW5kU3RhcnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VuZEVu
ZFNldD4mIHNldFNlbmRFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFNlbmRFbmRTZXQpLCBwcm9wZXJ0eV9zZW5kRW5kX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2VuZEVuZCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTZW5kRW5kU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJlY2VpdmVIZWFkZXJzRW5kU2V0PiYgc2V0UmVjZWl2
ZUhlYWRlcnNFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFJlY2VpdmVIZWFkZXJzRW5kU2V0KSwgcHJvcGVydHlfcmVjZWl2ZUhl
YWRlcnNFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJy
ZWNlaXZlSGVhZGVyc0VuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxS
ZWNlaXZlSGVhZGVyc0VuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0
cjxSZXNvdXJjZVRpbWluZz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJlc291cmNlVGltaW5nPio+KCZtX3Jl
c3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFJlc291cmNlVGlt
aW5nPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxSZXNvdXJjZVRpbWlu
Zz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZXNvdXJjZVRpbWluZz4gcmVzdWx0ID0gUmVzb3VyY2VU
aW1pbmc6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFJlcXVlc3RUaW1lKC4uLikKICAgICAqICAg
ICAuc2V0UHJveHlTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFByb3h5RW5kKC4uLikKICAgICAq
ICAgICAuc2V0RG5zU3RhcnQoLi4uKQogICAgICogICAgIC5zZXREbnNFbmQoLi4uKQogICAgICog
ICAgIC5zZXRDb25uZWN0U3RhcnQoLi4uKQogICAgICogICAgIC5zZXRDb25uZWN0RW5kKC4uLikK
ICAgICAqICAgICAuc2V0U3NsU3RhcnQoLi4uKQogICAgICogICAgIC5zZXRTc2xFbmQoLi4uKQog
ICAgICogICAgIC5zZXRTZW5kU3RhcnQoLi4uKQogICAgICogICAgIC5zZXRTZW5kRW5kKC4uLikK
ICAgICAqICAgICAuc2V0UmVjZWl2ZUhlYWRlcnNFbmQoLi4uKTsKICAgICAqLwogICAgc3RhdGlj
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBSZXNvdXJjZVRpbWluZygpKSk7CiAgICB9CiAg
ICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIEhUVFAgcmVxdWVz
dCBkYXRhLiAqLwpjbGFzcyBSZXF1ZXN0IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1Ymxp
YzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBVcmxTZXQgPSAx
IDw8IDAsCiAgICAgICAgTWV0aG9kU2V0ID0gMSA8PCAxLAogICAgICAgIEhlYWRlcnNTZXQgPSAx
IDw8IDIsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8IE1ldGhvZFNldCB8IEhlYWRl
cnNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxSZXF1ZXN0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBSZXF1ZXN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0
PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBNZXRob2RTZXQ+JiBzZXRNZXRob2QoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNZXRob2RTZXQpLCBwcm9w
ZXJ0eV9tZXRob2RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJtZXRob2QiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWV0aG9kU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhlYWRlcnNTZXQ+JiBzZXRI
ZWFkZXJzKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIZWFkZXJzU2V0KSwgcHJvcGVydHlfaGVh
ZGVyc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRl
cnMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SGVhZGVyc1NldD4oKTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZXF1ZXN0PiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8UmVxdWVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFz
c1JlZlB0cjxSZXF1ZXN0PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxS
ZXF1ZXN0PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFJlcXVlc3Q+IHJlc3VsdCA9IFJlcXVlc3Q6OmNy
ZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNldE1ldGhvZCguLi4p
CiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+KGFkb3B0UmVmKG5ldyBSZXF1ZXN0KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0
SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0UG9zdERhdGEoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInBvc3REYXRhIiwgdmFsdWUp
OwogICAgfQp9OwoKLyogSFRUUCByZXNwb25zZSBkYXRhLiAqLwpjbGFzcyBSZXNwb25zZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxk
c1NldCA9IDAsCiAgICAgICAgVXJsU2V0ID0gMSA8PCAwLAogICAgICAgIFN0YXR1c1NldCA9IDEg
PDwgMSwKICAgICAgICBTdGF0dXNUZXh0U2V0ID0gMSA8PCAyLAogICAgICAgIEhlYWRlcnNTZXQg
PSAxIDw8IDMsCiAgICAgICAgTWltZVR5cGVTZXQgPSAxIDw8IDQsCiAgICAgICAgQ29ubmVjdGlv
blJldXNlZFNldCA9IDEgPDwgNSwKICAgICAgICBDb25uZWN0aW9uSWRTZXQgPSAxIDw8IDYsCiAg
ICAgICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8IFN0YXR1c1NldCB8IFN0YXR1c1RleHRTZXQg
fCBIZWFkZXJzU2V0IHwgTWltZVR5cGVTZXQgfCBDb25uZWN0aW9uUmV1c2VkU2V0IHwgQ29ubmVj
dGlvbklkU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8UmVzcG9uc2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIFJlc3BvbnNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
VXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBTdGF0dXNTZXQ+JiBzZXRTdGF0dXMoZG91YmxlIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0YXR1c1NldCksIHByb3Bl
cnR5X3N0YXR1c19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InN0YXR1cyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhdHVzVGV4dFNldD4mIHNl
dFN0YXR1c1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdGF0dXNUZXh0U2V0KSwgcHJvcGVydHlfc3RhdHVzVGV4
dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0YXR1c1Rl
eHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3RhdHVzVGV4dFNldD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIZWFkZXJzU2V0PiYgc2V0SGVh
ZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSGVhZGVyc1NldCksIHByb3BlcnR5X2hlYWRl
cnNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJoZWFkZXJz
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhlYWRlcnNTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVTZXQ+JiBzZXRNaW1lVHlw
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIE1pbWVUeXBlU2V0KSwgcHJvcGVydHlfbWltZVR5cGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJtaW1lVHlwZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNaW1lVHlwZVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBDb25uZWN0aW9uUmV1c2VkU2V0PiYgc2V0Q29ubmVjdGlvblJl
dXNlZChib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIENvbm5lY3Rpb25SZXVzZWRTZXQpLCBwcm9wZXJ0eV9jb25uZWN0aW9uUmV1c2VkX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImNvbm5lY3Rpb25S
ZXVzZWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29ubmVjdGlvblJl
dXNlZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDb25uZWN0aW9u
SWRTZXQ+JiBzZXRDb25uZWN0aW9uSWQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENvbm5lY3Rpb25JZFNldCksIHByb3BlcnR5X2Nv
bm5lY3Rpb25JZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
ImNvbm5lY3Rpb25JZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb25u
ZWN0aW9uSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVzcG9u
c2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxs
RmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PFJlZlB0cjxSZXNwb25zZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxSZXNwb25zZT4gKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiBSZWZQdHI8UmVzcG9uc2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8UmVzcG9uc2U+
IHJlc3VsdCA9IFJlc3BvbnNlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAg
ICogICAgIC5zZXRTdGF0dXMoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXNUZXh0KC4uLikKICAg
ICAqICAgICAuc2V0SGVhZGVycyguLi4pCiAgICAgKiAgICAgLnNldE1pbWVUeXBlKC4uLikKICAg
ICAqICAgICAuc2V0Q29ubmVjdGlvblJldXNlZCguLi4pCiAgICAgKiAgICAgLnNldENvbm5lY3Rp
b25JZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3
IFJlc3BvbnNlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJh
aXRzOwoKICAgIHZvaWQgc2V0SGVhZGVyc1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImhlYWRlcnNUZXh0IiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0UmVxdWVzdEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicmVxdWVzdEhlYWRlcnMiLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRSZXF1ZXN0SGVhZGVyc1RleHQoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInJlcXVlc3RIZWFkZXJzVGV4dCIsIHZh
bHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEZyb21EaXNrQ2FjaGUoYm9vbCB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRCb29sZWFuKCJmcm9tRGlza0NhY2hlIiwgdmFsdWUpOwogICAgfQoK
ICAgIHZvaWQgc2V0VGltaW5nKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVz
b3VyY2VUaW1pbmc+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewog
ICAgICAgIHRoaXMtPnNldE9iamVjdCgidGltaW5nIiwgdmFsdWUpOwogICAgfQp9OwoKLyogV2Vi
U29ja2V0IHJlcXVlc3QgZGF0YS4gKi8KY2xhc3MgV2ViU29ja2V0UmVxdWVzdCA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9
IDAsCiAgICAgICAgUmVxdWVzdEtleTNTZXQgPSAxIDw8IDAsCiAgICAgICAgSGVhZGVyc1NldCA9
IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoUmVxdWVzdEtleTNTZXQgfCBIZWFkZXJz
U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsK
ICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7Cgog
ICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0
ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NS
ZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgV2ViU29ja2V0UmVxdWVzdDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFJlcXVlc3RLZXkzU2V0PiYgc2V0UmVxdWVzdEtleTMoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSZXF1
ZXN0S2V5M1NldCksIHByb3BlcnR5X3JlcXVlc3RLZXkzX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygicmVxdWVzdEtleTMiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8UmVxdWVzdEtleTNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgSGVhZGVyc1NldD4mIHNldEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIEhlYWRlcnNTZXQpLCBwcm9wZXJ0eV9oZWFkZXJzX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxIZWFkZXJzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUmVmUHRyPFdlYlNvY2tldFJlcXVlc3Q+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxXZWJTb2NrZXRSZXF1
ZXN0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PFdlYlNvY2tldFJlcXVlc3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PFdlYlNvY2tldFJlcXVlc3Q+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAg
KiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4g
cmVzdWx0ID0gV2ViU29ja2V0UmVxdWVzdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UmVxdWVz
dEtleTMoLi4uKQogICAgICogICAgIC5zZXRIZWFkZXJzKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgV2ViU29ja2V0UmVxdWVzdCgpKSk7CiAgICB9
CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIFdlYlNvY2tl
dCByZXNwb25zZSBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXNwb25zZSA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAs
CiAgICAgICAgU3RhdHVzU2V0ID0gMSA8PCAwLAogICAgICAgIFN0YXR1c1RleHRTZXQgPSAxIDw8
IDEsCiAgICAgICAgSGVhZGVyc1NldCA9IDEgPDwgMiwKICAgICAgICBDaGFsbGVuZ2VSZXNwb25z
ZVNldCA9IDEgPDwgMywKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU3RhdHVzU2V0IHwgU3RhdHVz
VGV4dFNldCB8IEhlYWRlcnNTZXQgfCBDaGFsbGVuZ2VSZXNwb25zZVNldCkKICAgIH07CgogICAg
dGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAg
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxp
bnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+
KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFdlYlNvY2tldFJl
c3BvbnNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBXZWJT
b2NrZXRSZXNwb25zZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0YXR1
c1NldD4mIHNldFN0YXR1cyhkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgU3RhdHVzU2V0KSwgcHJvcGVydHlfc3RhdHVzX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3RhdHVzIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0YXR1c1NldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBTdGF0dXNUZXh0U2V0PiYgc2V0U3RhdHVzVGV4dChjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFN0YXR1c1RleHRTZXQpLCBwcm9wZXJ0eV9zdGF0dXNUZXh0X2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3RhdHVzVGV4dCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IEhlYWRlcnNTZXQ+JiBzZXRIZWFkZXJzKFBhc3NSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBIZWFkZXJzU2V0KSwgcHJvcGVydHlfaGVhZGVyc19hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8SGVhZGVyc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBDaGFsbGVuZ2VSZXNwb25zZVNldD4mIHNldENoYWxsZW5nZVJlc3BvbnNl
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgQ2hhbGxlbmdlUmVzcG9uc2VTZXQpLCBwcm9wZXJ0eV9jaGFsbGVuZ2VSZXNw
b25zZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImNoYWxs
ZW5nZVJlc3BvbnNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENoYWxs
ZW5nZVJlc3BvbnNlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFdl
YlNvY2tldFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8V2ViU29ja2V0
UmVzcG9uc2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFdlYlNvY2tl
dFJlc3BvbnNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhl
dGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFdlYlNvY2tldFJlc3BvbnNlPiByZXN1bHQg
PSBXZWJTb2NrZXRSZXNwb25zZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3RhdHVzKC4uLikK
ICAgICAqICAgICAuc2V0U3RhdHVzVGV4dCguLi4pCiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4u
KQogICAgICogICAgIC5zZXRDaGFsbGVuZ2VSZXNwb25zZSguLi4pOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFdlYlNvY2tldFJlc3BvbnNlKCkpKTsKICAg
IH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogSW5mb3Jt
YXRpb24gYWJvdXQgdGhlIGNhY2hlZCByZXNvdXJjZS4gKi8KY2xhc3MgQ2FjaGVkUmVzb3VyY2Ug
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9G
aWVsZHNTZXQgPSAwLAogICAgICAgIFVybFNldCA9IDEgPDwgMCwKICAgICAgICBUeXBlU2V0ID0g
MSA8PCAxLAogICAgICAgIEJvZHlTaXplU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1Nl
dCA9IChVcmxTZXQgfCBUeXBlU2V0IHwgQm9keVNpemVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRl
PGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+
IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWNoZWRSZXNvdXJjZT4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGVkUmVzb3VyY2U7
CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8VXJsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVT
ZXQ+JiBzZXRUeXBlKFR5cGVCdWlsZGVyOjpQYWdlOjpSZXNvdXJjZVR5cGU6OkVudW0gdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCks
IHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJ0eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQm9keVNpemVTZXQ+JiBzZXRCb2R5U2l6ZShkb3VibGUg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQm9k
eVNpemVTZXQpLCBwcm9wZXJ0eV9ib2R5U2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoImJvZHlTaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEJvZHlTaXplU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPENhY2hlZFJlc291cmNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q2FjaGVkUmVz
b3VyY2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENhY2hlZFJlc291
cmNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPENhY2hlZFJlc291cmNlPiByZXN1bHQgPSBDYWNoZWRS
ZXNvdXJjZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0
VHlwZSguLi4pCiAgICAgKiAgICAgLnNldEJvZHlTaXplKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ2FjaGVkUmVzb3VyY2UoKSkpOwogICAgfQog
ICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRSZXNw
b25zZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlc3BvbnNlPiovIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmpl
Y3QoInJlc3BvbnNlIiwgdmFsdWUpOwogICAgfQp9OwoKLyogSW5mb3JtYXRpb24gYWJvdXQgdGhl
IHJlcXVlc3QgaW5pdGlhdG9yLiAqLwpjbGFzcyBJbml0aWF0b3IgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAndHlwZScg
d2hpbGUgZ2VuZXJhdGluZyBJbml0aWF0b3IuCiAgICBzdHJ1Y3QgVHlwZSB7CiAgICAgICAgZW51
bSBFbnVtIHsKICAgICAgICAgICAgUGFyc2VyID0gMzgsCiAgICAgICAgICAgIFNjcmlwdCA9IDM5
LAogICAgICAgICAgICBPdGhlciA9IDI1LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgVHlw
ZQoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0g
MSA8PCAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0KQogICAgfTsKCiAgICB0ZW1w
bGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBT
VEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhp
cyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8SW5pdGlhdG9yPiBwdHIp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1Nl
dCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1
bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBJbml0aWF0b3I7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShUeXBlOjpF
bnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidHlwZSIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9w
ZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
dHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEluaXRpYXRvcj4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPEluaXRpYXRvcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxJbml0aWF0b3I+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPEluaXRpYXRvcj4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxJbml0aWF0b3I+IHJlc3VsdCA9IElu
aXRpYXRvcjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlwZSguLi4pOwogICAgICovCiAgICBz
dGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEluaXRpYXRvcigpKSk7CiAgICB9CiAg
ICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFN0YWNr
VHJhY2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6Q29uc29s
ZTo6Q2FsbEZyYW1lID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldEFycmF5KCJzdGFja1RyYWNlIiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRMaW5lTnVtYmVyKGRvdWJs
ZSB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1
ZSk7CiAgICB9Cn07Cgp9IC8vIE5ldHdvcmsKCiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQpuYW1l
c3BhY2UgRGF0YWJhc2UgewovKiBEYXRhYmFzZSBvYmplY3QuICovCmNsYXNzIERhdGFiYXNlIDog
cHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmll
bGRzU2V0ID0gMCwKICAgICAgICBJZFNldCA9IDEgPDwgMCwKICAgICAgICBEb21haW5TZXQgPSAx
IDw8IDEsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMiwKICAgICAgICBWZXJzaW9uU2V0ID0gMSA8
PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChJZFNldCB8IERvbWFpblNldCB8IE5hbWVTZXQg
fCBWZXJzaW9uU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBC
dWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9y
ZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4m
IGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyKFBhc3NSZWZQdHI8RGF0YWJhc2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIERhdGFiYXNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgSWRTZXQ+JiBzZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBEb21haW5TZXQ+JiBzZXREb21haW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEb21haW5TZXQpLCBw
cm9wZXJ0eV9kb21haW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJkb21haW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG9tYWlu
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXRO
YW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVmVyc2lvblNldD4mIHNldFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWZXJzaW9uU2V0KSwgcHJv
cGVydHlfdmVyc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJp
bmcoInZlcnNpb24iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmVyc2lv
blNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxEYXRhYmFzZT4mICgp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNT
ZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8UmVmUHRyPERhdGFiYXNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPERhdGFiYXNlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxEYXRhYmFzZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxEYXRhYmFzZT4gcmVzdWx0
ID0gRGF0YWJhc2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldElkKC4uLikKICAgICAqICAgICAu
c2V0RG9tYWluKC4uLikKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFZl
cnNpb24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0
ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5l
dyBEYXRhYmFzZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKfTsKCn0gLy8gRGF0YWJhc2UKCiNlbmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQoj
aWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCm5hbWVzcGFjZSBJbmRleGVkREIgewovKiBTZWN1
cml0eSBvcmlnaW4gd2l0aCBkYXRhYmFzZSBuYW1lcy4gKi8KY2xhc3MgU2VjdXJpdHlPcmlnaW5X
aXRoRGF0YWJhc2VOYW1lcyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU2VjdXJpdHlPcmlnaW5TZXQg
PSAxIDw8IDAsCiAgICAgICAgRGF0YWJhc2VOYW1lc1NldCA9IDEgPDwgMSwKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoU2VjdXJpdHlPcmlnaW5TZXQgfCBEYXRhYmFzZU5hbWVzU2V0KQogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VjdXJp
dHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgU2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lczsKICAgIHB1Ymxp
YzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNlY3VyaXR5T3JpZ2luU2V0PiYgc2V0U2VjdXJp
dHlPcmlnaW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBTZWN1cml0eU9yaWdpblNldCksIHByb3BlcnR5X3NlY3VyaXR5
T3JpZ2luX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic2Vj
dXJpdHlPcmlnaW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2VjdXJp
dHlPcmlnaW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRGF0YWJh
c2VOYW1lc1NldD4mIHNldERhdGFiYXNlTmFtZXMoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpB
cnJheTxTdHJpbmcgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRGF0YWJhc2VOYW1lc1Nl
dCksIHByb3BlcnR5X2RhdGFiYXNlTmFtZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0QXJyYXkoImRhdGFiYXNlTmFtZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8RGF0YWJhc2VOYW1lc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFJlZlB0cjxTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzPiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFz
ZU5hbWVzPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTZWN1cml0eU9y
aWdpbldpdGhEYXRhYmFzZU5hbWVzPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgog
ICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNlY3VyaXR5T3JpZ2lu
V2l0aERhdGFiYXNlTmFtZXM+IHJlc3VsdCA9IFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFt
ZXM6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNlY3VyaXR5T3JpZ2luKC4uLikKICAgICAqICAg
ICAuc2V0RGF0YWJhc2VOYW1lcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0Zp
ZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4oYWRvcHRSZWYobmV3IFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXMoKSkpOwogICAg
fQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBEYXRhYmFz
ZSB3aXRoIGFuIGFycmF5IG9mIG9iamVjdCBzdG9yZXMuICovCmNsYXNzIERhdGFiYXNlV2l0aE9i
amVjdFN0b3JlcyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAgICAg
ICBWZXJzaW9uU2V0ID0gMSA8PCAxLAogICAgICAgIE9iamVjdFN0b3Jlc1NldCA9IDEgPDwgMiwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoTmFtZVNldCB8IFZlcnNpb25TZXQgfCBPYmplY3RTdG9y
ZXNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+IHB0cikKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRf
aW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9
CiAgICAgICAgZnJpZW5kIGNsYXNzIERhdGFiYXNlV2l0aE9iamVjdFN0b3JlczsKICAgIHB1Ymxp
YzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
TmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVmVyc2lvblNl
dD4mIHNldFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWZXJzaW9uU2V0KSwgcHJvcGVydHlfdmVyc2lvbl9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZlcnNpb24iLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmVyc2lvblNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPYmplY3RTdG9yZXNTZXQ+JiBzZXRPYmplY3RT
dG9yZXMoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6SW5kZXhl
ZERCOjpPYmplY3RTdG9yZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPYmplY3RTdG9y
ZXNTZXQpLCBwcm9wZXJ0eV9vYmplY3RTdG9yZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0QXJyYXkoIm9iamVjdFN0b3JlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxPYmplY3RTdG9yZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVy
YXRvciBSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RGF0
YWJhc2VXaXRoT2JqZWN0U3RvcmVzPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPERhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4gKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzPigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPERhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4gcmVzdWx0ID0gRGF0YWJh
c2VXaXRoT2JqZWN0U3RvcmVzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAg
ICAqICAgICAuc2V0VmVyc2lvbiguLi4pCiAgICAgKiAgICAgLnNldE9iamVjdFN0b3JlcyguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IERhdGFiYXNl
V2l0aE9iamVjdFN0b3JlcygpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMg
SXRlbVRyYWl0czsKfTsKCi8qIE9iamVjdCBzdG9yZS4gKi8KY2xhc3MgT2JqZWN0U3RvcmUgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVs
ZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgS2V5UGF0aFNldCA9
IDEgPDwgMSwKICAgICAgICBJbmRleGVzU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1Nl
dCA9IChOYW1lU2V0IHwgS2V5UGF0aFNldCB8IEluZGV4ZXNTZXQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxPYmplY3RTdG9yZT4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgT2JqZWN0U3RvcmU7CiAg
ICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEtl
eVBhdGhTZXQ+JiBzZXRLZXlQYXRoKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgS2V5UGF0aFNldCksIHByb3BlcnR5X2tl
eVBhdGhfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJrZXlQ
YXRoIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEtleVBhdGhTZXQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSW5kZXhlc1NldD4mIHNldEluZGV4
ZXMoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6SW5kZXhlZERC
OjpPYmplY3RTdG9yZUluZGV4ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEluZGV4ZXNT
ZXQpLCBwcm9wZXJ0eV9pbmRleGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldEFycmF5KCJpbmRleGVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PEluZGV4ZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8T2JqZWN0
U3RvcmU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PFJlZlB0cjxPYmplY3RTdG9yZT4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxPYmplY3RTdG9yZT4gKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8T2JqZWN0U3RvcmU+KCp0aGlzKTsKICAgICAgICB9
CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQ
dHI8T2JqZWN0U3RvcmU+IHJlc3VsdCA9IE9iamVjdFN0b3JlOjpjcmVhdGUoKQogICAgICogICAg
IC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0S2V5UGF0aCguLi4pCiAgICAgKiAgICAgLnNl
dEluZGV4ZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVm
KG5ldyBPYmplY3RTdG9yZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMg
SXRlbVRyYWl0czsKfTsKCi8qIE9iamVjdCBzdG9yZSBpbmRleC4gKi8KY2xhc3MgT2JqZWN0U3Rv
cmVJbmRleCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBL
ZXlQYXRoU2V0ID0gMSA8PCAxLAogICAgICAgIFVuaXF1ZVNldCA9IDEgPDwgMiwKICAgICAgICBN
dWx0aUVudHJ5U2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOYW1lU2V0IHwg
S2V5UGF0aFNldCB8IFVuaXF1ZVNldCB8IE11bHRpRW50cnlTZXQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxPYmplY3RTdG9yZUluZGV4
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBPYmplY3RTdG9y
ZUluZGV4OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFtZVNldD4mIHNl
dE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBLZXlQYXRoU2V0PiYgc2V0S2V5UGF0aChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEtleVBhdGhTZXQpLCBw
cm9wZXJ0eV9rZXlQYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0
cmluZygia2V5UGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxLZXlQ
YXRoU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVuaXF1ZVNldD4m
IHNldFVuaXF1ZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFVuaXF1ZVNldCksIHByb3BlcnR5X3VuaXF1ZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJ1bmlxdWUiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8VW5pcXVlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE11bHRpRW50cnlTZXQ+JiBzZXRNdWx0aUVudHJ5KGJvb2wgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTXVsdGlFbnRyeVNl
dCksIHByb3BlcnR5X211bHRpRW50cnlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0Qm9vbGVhbigibXVsdGlFbnRyeSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxNdWx0aUVudHJ5U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPE9iamVjdFN0b3JlSW5kZXg+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxPYmplY3RTdG9yZUluZGV4Pio+
KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPE9iamVj
dFN0b3JlSW5kZXg+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPE9iamVj
dFN0b3JlSW5kZXg+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50
aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8T2JqZWN0U3RvcmVJbmRleD4gcmVzdWx0
ID0gT2JqZWN0U3RvcmVJbmRleDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAg
ICAgKiAgICAgLnNldEtleVBhdGgoLi4uKQogICAgICogICAgIC5zZXRVbmlxdWUoLi4uKQogICAg
ICogICAgIC5zZXRNdWx0aUVudHJ5KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5v
RmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVJbmRleCgpKSk7CiAgICB9CiAgICB0eXBlZGVm
IFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gSW5kZXhlZERCCgojZW5kaWYg
Ly8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCm5hbWVzcGFjZSBET01TdG9yYWdlIHsKLyogRE9N
IFN0b3JhZ2UgZW50cnkuICovCmNsYXNzIEVudHJ5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBIb3N0
U2V0ID0gMSA8PCAwLAogICAgICAgIElzTG9jYWxTdG9yYWdlU2V0ID0gMSA8PCAxLAogICAgICAg
IElkU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChIb3N0U2V0IHwgSXNMb2Nh
bFN0b3JhZ2VTZXQgfCBJZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPEVudHJ5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBFbnRyeTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IEhvc3RTZXQ+JiBzZXRIb3N0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSG9zdFNldCksIHByb3BlcnR5X2hvc3Rf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJob3N0IiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhvc3RTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSXNMb2NhbFN0b3JhZ2VTZXQ+JiBzZXRJc0xvY2FsU3Rv
cmFnZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIElzTG9jYWxTdG9yYWdlU2V0KSwgcHJvcGVydHlfaXNMb2NhbFN0b3JhZ2VfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiaXNMb2NhbFN0b3JhZ2Ui
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SXNMb2NhbFN0b3JhZ2VTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSWRTZXQ+JiBzZXRJZChkb3Vi
bGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
SWRTZXQpLCBwcm9wZXJ0eV9pZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXROdW1iZXIoImlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElkU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEVudHJ5PiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8RW50cnk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBh
c3NSZWZQdHI8RW50cnk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEVu
dHJ5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPEVudHJ5PiByZXN1bHQgPSBFbnRyeTo6Y3JlYXRlKCkK
ICAgICAqICAgICAuc2V0SG9zdCguLi4pCiAgICAgKiAgICAgLnNldElzTG9jYWxTdG9yYWdlKC4u
LikKICAgICAqICAgICAuc2V0SWQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+KGFkb3B0UmVmKG5ldyBFbnRyeSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1U
cmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gRE9NU3RvcmFnZQoKbmFtZXNwYWNlIEFwcGxpY2F0
aW9uQ2FjaGUgewovKiBEZXRhaWxlZCBhcHBsaWNhdGlvbiBjYWNoZSByZXNvdXJjZSBpbmZvcm1h
dGlvbi4gKi8KY2xhc3MgQXBwbGljYXRpb25DYWNoZVJlc291cmNlIDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAg
ICAgICBVcmxTZXQgPSAxIDw8IDAsCiAgICAgICAgU2l6ZVNldCA9IDEgPDwgMSwKICAgICAgICBU
eXBlU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChVcmxTZXQgfCBTaXplU2V0
IHwgVHlwZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQXBwbGljYXRpb25DYWNoZVJlc291cmNlOwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaXplU2V0PiYg
c2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU2l6ZVNldCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFNpemVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
VHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1
bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJl
ZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3Vy
Y2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgKiBSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPiByZXN1bHQg
PSBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCgu
Li4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRUeXBlKC4uLik7CiAg
ICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQXBwbGljYXRpb25D
YWNoZVJlc291cmNlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVt
VHJhaXRzOwp9OwoKLyogRGV0YWlsZWQgYXBwbGljYXRpb24gY2FjaGUgaW5mb3JtYXRpb24uICov
CmNsYXNzIEFwcGxpY2F0aW9uQ2FjaGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGlj
OgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE1hbmlmZXN0VVJM
U2V0ID0gMSA8PCAwLAogICAgICAgIFNpemVTZXQgPSAxIDw8IDEsCiAgICAgICAgQ3JlYXRpb25U
aW1lU2V0ID0gMSA8PCAyLAogICAgICAgIFVwZGF0ZVRpbWVTZXQgPSAxIDw8IDMsCiAgICAgICAg
UmVzb3VyY2VzU2V0ID0gMSA8PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChNYW5pZmVzdFVS
TFNldCB8IFNpemVTZXQgfCBDcmVhdGlvblRpbWVTZXQgfCBVcGRhdGVUaW1lU2V0IHwgUmVzb3Vy
Y2VzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVy
IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RT
dGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVp
bGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgQXBwbGljYXRpb25DYWNoZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE1hbmlmZXN0VVJMU2V0PiYgc2V0TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBN
YW5pZmVzdFVSTFNldCksIHByb3BlcnR5X21hbmlmZXN0VVJMX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8TWFuaWZlc3RVUkxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgU2l6ZVNldD4mIHNldFNpemUoZG91YmxlIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNpemVTZXQpLCBwcm9wZXJ0
eV9zaXplX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6
ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaXplU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENyZWF0aW9uVGltZVNldD4mIHNldENyZWF0
aW9uVGltZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgQ3JlYXRpb25UaW1lU2V0KSwgcHJvcGVydHlfY3JlYXRpb25UaW1lX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY3JlYXRpb25UaW1lIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENyZWF0aW9uVGltZVNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcGRhdGVUaW1lU2V0PiYgc2V0VXBk
YXRlVGltZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgVXBkYXRlVGltZVNldCksIHByb3BlcnR5X3VwZGF0ZVRpbWVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ1cGRhdGVUaW1lIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVwZGF0ZVRpbWVTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUmVzb3VyY2VzU2V0PiYgc2V0UmVzb3VyY2VzKC8q
UGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkFwcGxpY2F0aW9uQ2Fj
aGU6OkFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFy
cmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBSZXNvdXJjZXNTZXQpLCBwcm9wZXJ0eV9yZXNvdXJjZXNfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInJlc291cmNlcyIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxSZXNvdXJjZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVy
YXRvciBSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkp
OwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEFwcGxpY2F0aW9u
Q2FjaGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8QXBwbGljYXRpb25DYWNoZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQ
dHI8QXBwbGljYXRpb25DYWNoZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hl
PiByZXN1bHQgPSBBcHBsaWNhdGlvbkNhY2hlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRNYW5p
ZmVzdFVSTCguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRDcmVh
dGlvblRpbWUoLi4uKQogICAgICogICAgIC5zZXRVcGRhdGVUaW1lKC4uLikKICAgICAqICAgICAu
c2V0UmVzb3VyY2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9w
dFJlZihuZXcgQXBwbGljYXRpb25DYWNoZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0
ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIEZyYW1lIGlkZW50aWZpZXIgLSBtYW5pZmVzdCBV
UkwgcGFpci4gKi8KY2xhc3MgRnJhbWVXaXRoTWFuaWZlc3QgOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IEZyYW1lSWRTZXQgPSAxIDw8IDAsCiAgICAgICAgTWFuaWZlc3RVUkxTZXQgPSAxIDw8IDEsCiAg
ICAgICAgU3RhdHVzU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChGcmFtZUlk
U2V0IHwgTWFuaWZlc3RVUkxTZXQgfCBTdGF0dXNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRnJhbWVXaXRoTWFuaWZl
c3Q7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGcmFtZUlkU2V0PiYgc2V0
RnJhbWVJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiovIGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgRnJhbWVJZFNldCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPEZyYW1lSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgTWFuaWZlc3RVUkxTZXQ+JiBzZXRNYW5pZmVzdFVSTChjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1hbmlmZXN0
VVJMU2V0KSwgcHJvcGVydHlfbWFuaWZlc3RVUkxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJtYW5pZmVzdFVSTCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxNYW5pZmVzdFVSTFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBTdGF0dXNTZXQ+JiBzZXRTdGF0dXMoaW50IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0YXR1c1NldCksIHByb3BlcnR5X3N0
YXR1c19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0YXR1
cyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+JiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4gKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+KCp0aGlzKTsKICAg
ICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAg
KiBSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+IHJlc3VsdCA9IEZyYW1lV2l0aE1hbmlmZXN0Ojpj
cmVhdGUoKQogICAgICogICAgIC5zZXRGcmFtZUlkKC4uLikKICAgICAqICAgICAuc2V0TWFuaWZl
c3RVUkwoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKTsKICAgICAqLwogICAgc3RhdGlj
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBGcmFtZVdpdGhNYW5pZmVzdCgpKSk7CiAgICB9
CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gQXBwbGlj
YXRpb25DYWNoZQoKbmFtZXNwYWNlIERPTSB7Ci8qIERPTSBpbnRlcmFjdGlvbiBpcyBpbXBsZW1l
bnRlZCBpbiB0ZXJtcyBvZiBtaXJyb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgYWN0dWFs
IERPTSBub2Rlcy4gRE9NTm9kZSBpcyBhIGJhc2Ugbm9kZSBtaXJyb3IgdHlwZS4gKi8KY2xhc3Mg
Tm9kZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTm9kZUlkU2V0ID0gMSA8PCAwLAogICAgICAgIE5v
ZGVUeXBlU2V0ID0gMSA8PCAxLAogICAgICAgIE5vZGVOYW1lU2V0ID0gMSA8PCAyLAogICAgICAg
IExvY2FsTmFtZVNldCA9IDEgPDwgMywKICAgICAgICBOb2RlVmFsdWVTZXQgPSAxIDw8IDQsCiAg
ICAgICAgQWxsRmllbGRzU2V0ID0gKE5vZGVJZFNldCB8IE5vZGVUeXBlU2V0IHwgTm9kZU5hbWVT
ZXQgfCBMb2NhbE5hbWVTZXQgfCBOb2RlVmFsdWVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxOb2RlPiBwdHIpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9j
cmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAg
ICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBOb2RlOwogICAgcHVibGljOgoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgTm9kZUlkU2V0PiYgc2V0Tm9kZUlkKGludCB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOb2RlSWRTZXQpLCBwcm9wZXJ0
eV9ub2RlSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJu
b2RlSWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Tm9kZUlkU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVUeXBlU2V0PiYgc2V0Tm9k
ZVR5cGUoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIE5vZGVUeXBlU2V0KSwgcHJvcGVydHlfbm9kZVR5cGVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJub2RlVHlwZSIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlVHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBOb2RlTmFtZVNldD4mIHNldE5vZGVOYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZU5h
bWVTZXQpLCBwcm9wZXJ0eV9ub2RlTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoIm5vZGVOYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPE5vZGVOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IExvY2FsTmFtZVNldD4mIHNldExvY2FsTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExvY2FsTmFtZVNldCksIHBy
b3BlcnR5X2xvY2FsTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRT
dHJpbmcoImxvY2FsTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxM
b2NhbE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTm9kZVZh
bHVlU2V0PiYgc2V0Tm9kZVZhbHVlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZVZhbHVlU2V0KSwgcHJvcGVydHlf
bm9kZVZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
bm9kZVZhbHVlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVWYWx1
ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxOb2RlPiYgKCkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwg
cmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxSZWZQdHI8Tm9kZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxOb2RlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxO
b2RlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPE5vZGU+IHJlc3VsdCA9IE5vZGU6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldE5vZGVJZCguLi4pCiAgICAgKiAgICAgLnNldE5vZGVUeXBlKC4uLikKICAg
ICAqICAgICAuc2V0Tm9kZU5hbWUoLi4uKQogICAgICogICAgIC5zZXRMb2NhbE5hbWUoLi4uKQog
ICAgICogICAgIC5zZXROb2RlVmFsdWUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+KGFkb3B0UmVmKG5ldyBOb2RlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRl
bVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0Q2hpbGROb2RlQ291bnQoaW50IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigiY2hpbGROb2RlQ291bnQiLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRDaGlsZHJlbigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFy
cmF5PFR5cGVCdWlsZGVyOjpET006Ok5vZGUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJh
eT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoImNoaWxkcmVuIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0QXR0cmlidXRlcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
OkFycmF5PFN0cmluZyA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgiYXR0cmlidXRlcyIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldERvY3VtZW50VVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dFB1YmxpY0lkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3Ry
aW5nKCJwdWJsaWNJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN5c3RlbUlkKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzeXN0ZW1JZCIs
IHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEludGVybmFsU3Vic2V0KGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJpbnRlcm5hbFN1YnNldCIsIHZh
bHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFhtbFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInhtbFZlcnNpb24iLCB2YWx1ZSk7CiAgICB9
CgogICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0VmFsdWUoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInZhbHVlIiwg
dmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAg
dm9pZCBzZXRDb250ZW50RG9jdW1lbnQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5v
ZGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldE9iamVjdCgiY29udGVudERvY3VtZW50IiwgdmFsdWUpOwogICAgfQp9OwoKLyogRE9N
IGludGVyYWN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIG1pcnJvciBvYmplY3RzIHRo
YXQgcmVwcmVzZW50IHRoZSBhY3R1YWwgRE9NIG5vZGVzLiBET01Ob2RlIGlzIGEgYmFzZSBub2Rl
IG1pcnJvciB0eXBlLiAqLwpjbGFzcyBFdmVudExpc3RlbmVyIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBUeXBlU2V0ID0gMSA8PCAwLAogICAgICAgIFVzZUNhcHR1cmVTZXQgPSAxIDw8IDEsCiAgICAg
ICAgSXNBdHRyaWJ1dGVTZXQgPSAxIDw8IDIsCiAgICAgICAgTm9kZUlkU2V0ID0gMSA8PCAzLAog
ICAgICAgIEhhbmRsZXJCb2R5U2V0ID0gMSA8PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChU
eXBlU2V0IHwgVXNlQ2FwdHVyZVNldCB8IElzQXR0cmlidXRlU2V0IHwgTm9kZUlkU2V0IHwgSGFu
ZGxlckJvZHlTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1
aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jl
c3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYg
Y2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXIoUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBFdmVudExpc3RlbmVyOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVy
dHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5
cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVc2VDYXB0dXJlU2V0PiYgc2V0VXNlQ2Fw
dHVyZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFVzZUNhcHR1cmVTZXQpLCBwcm9wZXJ0eV91c2VDYXB0dXJlX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oInVzZUNhcHR1cmUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXNlQ2FwdHVyZVNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJc0F0dHJpYnV0ZVNldD4mIHNldElzQXR0cmlidXRlKGJv
b2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
SXNBdHRyaWJ1dGVTZXQpLCBwcm9wZXJ0eV9pc0F0dHJpYnV0ZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJpc0F0dHJpYnV0ZSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJc0F0dHJpYnV0ZVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2RlSWRTZXQ+JiBzZXROb2RlSWQoaW50IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5vZGVJZFNldCksIHBy
b3BlcnR5X25vZGVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1i
ZXIoIm5vZGVJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlSWRT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSGFuZGxlckJvZHlTZXQ+
JiBzZXRIYW5kbGVyQm9keShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhhbmRsZXJCb2R5U2V0KSwgcHJvcGVydHlfaGFu
ZGxlckJvZHlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJo
YW5kbGVyQm9keSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIYW5kbGVy
Qm9keVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxFdmVudExpc3Rl
bmVyPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFs
bEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxSZWZQdHI8RXZlbnRMaXN0ZW5lcj4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxFdmVudExpc3RlbmVyPigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPEV2ZW50TGlzdGVuZXI+IHJlc3VsdCA9IEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRVc2VDYXB0dXJlKC4uLikKICAg
ICAqICAgICAuc2V0SXNBdHRyaWJ1dGUoLi4uKQogICAgICogICAgIC5zZXROb2RlSWQoLi4uKQog
ICAgICogICAgIC5zZXRIYW5kbGVyQm9keSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0Zp
ZWxkc1NldD4oYWRvcHRSZWYobmV3IEV2ZW50TGlzdGVuZXIoKSkpOwogICAgfQogICAgdHlwZWRl
ZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRMb2NhdGlvbigvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJsb2Nh
dGlvbiIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIEEgc3RydWN0dXJlIGhvbGRpbmcgYW4gUkdCQSBj
b2xvci4gKi8KLy8gVHlwZSBvcmlnaW5hbGx5IHdhcyBuYW1lZCAnUkdCQScuCmNsYXNzIFJnYmEg
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9G
aWVsZHNTZXQgPSAwLAogICAgICAgIFJTZXQgPSAxIDw8IDAsCiAgICAgICAgR1NldCA9IDEgPDwg
MSwKICAgICAgICBCU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChSU2V0IHwg
R1NldCB8IEJTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1
aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jl
c3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYg
Y2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXIoUGFzc1JlZlB0cjxSZ2JhPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0
YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVu
ZCBjbGFzcyBSZ2JhOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUlNldD4m
IHNldFIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFJTZXQpLCBwcm9wZXJ0eV9yX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldE51bWJlcigiciIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxS
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEdTZXQ+JiBzZXRHKGlu
dCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBH
U2V0KSwgcHJvcGVydHlfZ19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoImciLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8R1NldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBCU2V0PiYgc2V0QihpbnQgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQlNldCksIHBy
b3BlcnR5X2JfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJi
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEJTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmdiYT4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJnYmE+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmdiYT4g
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UmdiYT4oKnRoaXMpOwogICAg
ICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAq
IFJlZlB0cjxSZ2JhPiByZXN1bHQgPSBSZ2JhOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRSKC4u
LikKICAgICAqICAgICAuc2V0RyguLi4pCiAgICAgKiAgICAgLnNldEIoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBSZ2JhKCkpKTsKICAgIH0KICAg
IHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0QShkb3Vi
bGUgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJhIiwgdmFsdWUpOwogICAg
fQp9OwoKLyogQ29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgaGlnaGxpZ2h0aW5nIG9mIHBhZ2Ug
ZWxlbWVudHMuICovCmNsYXNzIEhpZ2hsaWdodENvbmZpZyA6IHB1YmxpYyBJbnNwZWN0b3JPYmpl
Y3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAg
QWxsRmllbGRzU2V0ID0gMAogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFz
cyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RF
UD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyKFBhc3NSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiBwdHIpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVk
X2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAg
fQogICAgICAgIGZyaWVuZCBjbGFzcyBIaWdobGlnaHRDb25maWc7CiAgICBwdWJsaWM6CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxIaWdobGlnaHRDb25maWc+JiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxIaWdo
bGlnaHRDb25maWc+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBh
c3NSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
IFJlZlB0cjxIaWdobGlnaHRDb25maWc+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8q
CiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8SGlnaGxpZ2h0Q29u
ZmlnPiByZXN1bHQgPSBIaWdobGlnaHRDb25maWc6OmNyZWF0ZSgpOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEhpZ2hsaWdodENvbmZpZygpKSk7CiAgICB9
CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFNo
b3dJbmZvKGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigic2hvd0lu
Zm8iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRDb250ZW50Q29sb3IoLypQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpET006OlJnYmE+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiY29udGVudENvbG9yIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0UGFkZGluZ0NvbG9yKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRl
cjo6RE9NOjpSZ2JhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRPYmplY3QoInBhZGRpbmdDb2xvciIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldEJvcmRlckNvbG9yKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpSZ2Jh
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlz
LT5zZXRPYmplY3QoImJvcmRlckNvbG9yIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TWFy
Z2luQ29sb3IoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006OlJnYmE+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgi
bWFyZ2luQ29sb3IiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIERPTQoKbmFtZXNwYWNlIENTUyB7
Ci8qIFRoaXMgb2JqZWN0IGlkZW50aWZpZXMgYSBDU1Mgc3R5bGUgaW4gYSB1bmlxdWUgd2F5LiAq
LwpjbGFzcyBDU1NTdHlsZUlkIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQg
PSAxIDw8IDAsCiAgICAgICAgT3JkaW5hbFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNT
ZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgT3JkaW5hbFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0eWxlSWQ+IHB0cikKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlSWQ7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTdHlsZVNoZWV0SWRTZXQ+JiBzZXRTdHlsZVNo
ZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBTdHlsZVNoZWV0SWRTZXQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0
SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTaGVldElkU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE9yZGluYWxTZXQ+JiBzZXRP
cmRpbmFsKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBPcmRpbmFsU2V0KSwgcHJvcGVydHlfb3JkaW5hbF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm9yZGluYWwiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8T3JkaW5hbFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFJlZlB0cjxDU1NTdHlsZUlkPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTU3R5bGVJZD4qPigmbV9y
ZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZUlk
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZUlkPigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPENTU1N0eWxlSWQ+IHJlc3VsdCA9IENTU1N0eWxlSWQ6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAgLnNldE9yZGluYWwo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NT
dHlsZUlkKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRz
OwogICAgc3RhdGljIFBhc3NSZWZQdHI8Q1NTU3R5bGVJZD4gcnVudGltZUNhc3QoUGFzc1JlZlB0
cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gb2JqZWN0OwogICAgICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc09iamVjdCgmb2Jq
ZWN0KTsKICAgICAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwojaWYgIUFTU0VS
VF9ESVNBQkxFRAogICAgICAgIGFzc2VydENvcnJlY3RWYWx1ZShvYmplY3QuZ2V0KCkpOwojZW5k
aWYgIC8vICFBU1NFUlRfRElTQUJMRUQKICAgICAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoQ1NT
U3R5bGVJZCkgPT0gc2l6ZW9mKEluc3BlY3Rvck9iamVjdCksIHR5cGVfY2FzdF9wcm9ibGVtKTsK
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NTU3R5bGVJZCo+KG9iamVjdC5nZXQoKSk7CiAg
ICB9CgojaWYgIUFTU0VSVF9ESVNBQkxFRAogICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZh
bHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSk7CiNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAp9
OwoKLyogVGhpcyBvYmplY3QgaWRlbnRpZmllcyBhIENTUyBydWxlIGluIGEgdW5pcXVlIHdheS4g
Ki8KY2xhc3MgQ1NTUnVsZUlkIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQg
PSAxIDw8IDAsCiAgICAgICAgT3JkaW5hbFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNT
ZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgT3JkaW5hbFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1J1bGVJZD4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTUnVsZUlkOwogICAgcHVibGlj
OgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTaGVldElkU2V0PiYgc2V0U3R5bGVTaGVl
dElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgU3R5bGVTaGVldElkU2V0KSwgcHJvcGVydHlfc3R5bGVTaGVldElkX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3R5bGVTaGVldElk
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0eWxlU2hlZXRJZFNldD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPcmRpbmFsU2V0PiYgc2V0T3Jk
aW5hbChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgT3JkaW5hbFNldCksIHByb3BlcnR5X29yZGluYWxfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJvcmRpbmFsIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPE9yZGluYWxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBSZWZQdHI8Q1NTUnVsZUlkPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTUnVsZUlkPio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1J1bGVJZD4gKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTUnVsZUlkPigqdGhpcyk7CiAg
ICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAg
ICogUmVmUHRyPENTU1J1bGVJZD4gcmVzdWx0ID0gQ1NTUnVsZUlkOjpjcmVhdGUoKQogICAgICog
ICAgIC5zZXRTdHlsZVNoZWV0SWQoLi4uKQogICAgICogICAgIC5zZXRPcmRpbmFsKC4uLik7CiAg
ICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTUnVsZUlkKCkp
KTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwogICAgc3Rh
dGljIFBhc3NSZWZQdHI8Q1NTUnVsZUlkPiBydW50aW1lQ2FzdChQYXNzUmVmUHRyPEluc3BlY3Rv
clZhbHVlPiB2YWx1ZSkKICAgIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBvYmpl
Y3Q7CiAgICAgICAgYm9vbCBjYXN0UmVzID0gdmFsdWUtPmFzT2JqZWN0KCZvYmplY3QpOwogICAg
ICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7CiNpZiAhQVNTRVJUX0RJU0FCTEVE
CiAgICAgICAgYXNzZXJ0Q29ycmVjdFZhbHVlKG9iamVjdC5nZXQoKSk7CiNlbmRpZiAgLy8gIUFT
U0VSVF9ESVNBQkxFRAogICAgICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihDU1NSdWxlSWQpID09
IHNpemVvZihJbnNwZWN0b3JPYmplY3QpLCB0eXBlX2Nhc3RfcHJvYmxlbSk7CiAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PENTU1J1bGVJZCo+KG9iamVjdC5nZXQoKSk7CiAgICB9CgojaWYgIUFT
U0VSVF9ESVNBQkxFRAogICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSk7CiNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAp9OwoKLyogQ1NTIHJ1
bGUgY29sbGVjdGlvbiBmb3IgYSBzaW5nbGUgcHNldWRvIHN0eWxlLiAqLwpjbGFzcyBQc2V1ZG9J
ZFJ1bGVzIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAg
ICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBQc2V1ZG9JZFNldCA9IDEgPDwgMCwKICAgICAg
ICBSdWxlc1NldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoUHNldWRvSWRTZXQg
fCBSdWxlc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPFBzZXVkb0lkUnVsZXM+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIFBzZXVkb0lkUnVsZXM7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBQc2V1ZG9JZFNldD4mIHNldFBzZXVkb0lkKGludCB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBQc2V1ZG9JZFNldCksIHByb3Bl
cnR5X3BzZXVkb0lkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJl
cigicHNldWRvSWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UHNldWRv
SWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUnVsZXNTZXQ+JiBz
ZXRSdWxlcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpDU1M6
OkNTU1J1bGUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUnVsZXNTZXQpLCBwcm9wZXJ0
eV9ydWxlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgicnVs
ZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UnVsZXNTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UHNldWRvSWRSdWxlcz4mICgpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPFBzZXVkb0lkUnVsZXM+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFBhc3NSZWZQdHI8UHNldWRvSWRSdWxlcz4gKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiBSZWZQdHI8UHNldWRvSWRSdWxlcz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07Cgog
ICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxQc2V1ZG9J
ZFJ1bGVzPiByZXN1bHQgPSBQc2V1ZG9JZFJ1bGVzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRQ
c2V1ZG9JZCguLi4pCiAgICAgKiAgICAgLnNldFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgUHNldWRvSWRSdWxlcygpKSk7CiAgICB9CiAg
ICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIENTUyBydWxlIGNv
bGxlY3Rpb24gZm9yIGEgc2luZ2xlIHBzZXVkbyBzdHlsZS4gKi8KY2xhc3MgSW5oZXJpdGVkU3R5
bGVFbnRyeSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTWF0Y2hlZENTU1J1bGVzU2V0ID0gMSA8PCAw
LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChNYXRjaGVkQ1NTUnVsZXNTZXQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxJbmhlcml0ZWRT
dHlsZUVudHJ5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBJ
bmhlcml0ZWRTdHlsZUVudHJ5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TWF0Y2hlZENTU1J1bGVzU2V0PiYgc2V0TWF0Y2hlZENTU1J1bGVzKC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQYXNzUmVmUHRy
PEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBNYXRjaGVkQ1NTUnVsZXNTZXQpLCBwcm9wZXJ0eV9tYXRjaGVkQ1NTUnVs
ZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoIm1hdGNoZWRD
U1NSdWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNYXRjaGVkQ1NT
UnVsZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SW5oZXJpdGVk
U3R5bGVFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SW5oZXJpdGVkU3R5
bGVFbnRyeT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8SW5oZXJpdGVk
U3R5bGVFbnRyeT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiByZXN1
bHQgPSBJbmhlcml0ZWRTdHlsZUVudHJ5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRNYXRjaGVk
Q1NTUnVsZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVm
KG5ldyBJbmhlcml0ZWRTdHlsZUVudHJ5KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRl
bVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0SW5saW5lU3R5bGUoLypQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpDU1M6OkNTU1N0eWxlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoImlubGluZVN0eWxlIiwgdmFs
dWUpOwogICAgfQp9OwoKLyogQ1NTIHN0eWxlIGluZm9ybWF0aW9uIGZvciBhIERPTSBzdHlsZSBh
dHRyaWJ1dGUuICovCmNsYXNzIENTU1N0eWxlQXR0cmlidXRlIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFN0eWxlU2V0ID0gMSA8PCAxLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChOYW1lU2V0IHwgU3R5bGVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVBdHRyaWJ1
dGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFt
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFN0eWxlU2V0PiYgc2V0U3R5bGUoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OkNT
U1N0eWxlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdHlsZVNldCksIHByb3BlcnR5X3N0
eWxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgic3R5bGUi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+JiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCBy
ZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PFJlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+KCp0aGlzKTsKICAgICAg
ICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBS
ZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+IHJlc3VsdCA9IENTU1N0eWxlQXR0cmlidXRlOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0U3R5bGUoLi4uKTsK
ICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAg
ICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZUF0
dHJpYnV0ZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0
czsKfTsKCi8qIENTUyBzdHlsZXNoZWV0IG1ldGFpbmZvcm1hdGlvbi4gKi8KY2xhc3MgQ1NTU3R5
bGVTaGVldEhlYWRlciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU3R5bGVTaGVldElkU2V0ID0gMSA8
PCAwLAogICAgICAgIFNvdXJjZVVSTFNldCA9IDEgPDwgMSwKICAgICAgICBUaXRsZVNldCA9IDEg
PDwgMiwKICAgICAgICBEaXNhYmxlZFNldCA9IDEgPDwgMywKICAgICAgICBBbGxGaWVsZHNTZXQg
PSAoU3R5bGVTaGVldElkU2V0IHwgU291cmNlVVJMU2V0IHwgVGl0bGVTZXQgfCBEaXNhYmxlZFNl
dCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAg
ICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAg
ICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVm
UHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hlZXRIZWFkZXI7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBTdHlsZVNoZWV0SWRTZXQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTdHlsZVNoZWV0SWRTZXQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTaGVldElkU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVVSTFNldD4mIHNldFNvdXJjZVVSTChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFNvdXJjZVVSTFNldCksIHByb3BlcnR5X3NvdXJjZVVSTF9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNvdXJjZVVSTCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VVUkxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgVGl0bGVTZXQ+JiBzZXRUaXRsZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRpdGxlU2V0
KSwgcHJvcGVydHlfdGl0bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJ0aXRsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUaXRs
ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEaXNhYmxlZFNldD4m
IHNldERpc2FibGVkKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgRGlzYWJsZWRTZXQpLCBwcm9wZXJ0eV9kaXNhYmxlZF9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJkaXNhYmxlZCIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxEaXNhYmxlZFNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+IHJlc3VsdCA9IENTU1N0eWxlU2hlZXRIZWFkZXI6
OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAgLnNl
dFNvdXJjZVVSTCguLi4pCiAgICAgKiAgICAgLnNldFRpdGxlKC4uLikKICAgICAqICAgICAuc2V0
RGlzYWJsZWQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVm
KG5ldyBDU1NTdHlsZVNoZWV0SGVhZGVyKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRl
bVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NTIHN0eWxlc2hlZXQgY29udGVudHMuICovCmNs
YXNzIENTU1N0eWxlU2hlZXRCb2R5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoK
ICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRT
ZXQgPSAxIDw8IDAsCiAgICAgICAgUnVsZXNTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRz
U2V0ID0gKFN0eWxlU2hlZXRJZFNldCB8IFJ1bGVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxp
bnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBC
dWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+IHB0
cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRz
U2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jl
c3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hlZXRC
b2R5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTaGVldElkU2V0
PiYgc2V0U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3R5bGVTaGVldElkU2V0KSwgcHJvcGVydHlf
c3R5bGVTaGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
Zygic3R5bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0
eWxlU2hlZXRJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSdWxl
c1NldD4mIHNldFJ1bGVzKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxk
ZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSdWxlc1NldCks
IHByb3BlcnR5X3J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFy
cmF5KCJydWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSdWxlc1Nl
dD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9k
eT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxG
aWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5Pio+KCZtX3Jlc3VsdCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5PiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4oKnRo
aXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3Rv
cjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4gcmVzdWx0ID0gQ1NTU3R5bGVTaGVl
dEJvZHk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAg
ICAgLnNldFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9w
dFJlZihuZXcgQ1NTU3R5bGVTaGVldEJvZHkoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJ
dGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgfQp9
OwoKLyogQ1NTIHJ1bGUgcmVwcmVzZW50YXRpb24uICovCmNsYXNzIENTU1J1bGUgOiBwdWJsaWMg
SW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFt
ZSAnb3JpZ2luJyB3aGlsZSBnZW5lcmF0aW5nIENTU1J1bGUuCiAgICBzdHJ1Y3QgT3JpZ2luIHsK
ICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBVc2VyID0gNDAsCiAgICAgICAgICAgIFVz
ZXJfYWdlbnQgPSA0MSwKICAgICAgICAgICAgSW5zcGVjdG9yID0gNDIsCiAgICAgICAgICAgIFJl
Z3VsYXIgPSA0MywKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IE9yaWdpbgoKICAgIGVudW0g
ewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTZWxlY3RvclRleHRTZXQgPSAxIDw8
IDAsCiAgICAgICAgU291cmNlTGluZVNldCA9IDEgPDwgMSwKICAgICAgICBPcmlnaW5TZXQgPSAx
IDw8IDIsCiAgICAgICAgU3R5bGVTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0g
KFNlbGVjdG9yVGV4dFNldCB8IFNvdXJjZUxpbmVTZXQgfCBPcmlnaW5TZXQgfCBTdHlsZVNldCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PENTU1J1bGU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENT
U1J1bGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWxlY3RvclRleHRT
ZXQ+JiBzZXRTZWxlY3RvclRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTZWxlY3RvclRleHRTZXQpLCBwcm9wZXJ0
eV9zZWxlY3RvclRleHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJzZWxlY3RvclRleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
U2VsZWN0b3JUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNv
dXJjZUxpbmVTZXQ+JiBzZXRTb3VyY2VMaW5lKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTb3VyY2VMaW5lU2V0KSwgcHJvcGVydHlfc291
cmNlTGluZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNv
dXJjZUxpbmUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U291cmNlTGlu
ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPcmlnaW5TZXQ+JiBz
ZXRPcmlnaW4oT3JpZ2luOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIGdldEVudW1Db25z
dGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T3JpZ2luU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE9yaWdpblNldD4mIHNldE9y
aWdpbihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPcmlnaW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgU3R5bGVTZXQ+JiBzZXRTdHlsZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxk
ZXI6OkNTUzo6Q1NTU3R5bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2V0KSwg
cHJvcGVydHlfc3R5bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2Jq
ZWN0KCJzdHlsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdHlsZVNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NSdWxlPiYgKCkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwg
cmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxSZWZQdHI8Q1NTUnVsZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUGFzc1JlZlB0cjxDU1NSdWxlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJl
ZlB0cjxDU1NSdWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3lu
dGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1J1bGU+IHJlc3VsdCA9IENTU1J1
bGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNlbGVjdG9yVGV4dCguLi4pCiAgICAgKiAgICAg
LnNldFNvdXJjZUxpbmUoLi4uKQogICAgICogICAgIC5zZXRPcmlnaW4oLi4uKQogICAgICogICAg
IC5zZXRTdHlsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4g
Y3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRS
ZWYobmV3IENTU1J1bGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0
ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRSdWxlSWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpD
U1M6OkNTU1J1bGVJZD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJydWxlSWQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9p
ZCBzZXRTb3VyY2VVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRTdHJpbmcoInNvdXJjZVVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNlbGVjdG9y
UmFuZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OlNvdXJjZVJhbmdlPiovIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmpl
Y3QoInNlbGVjdG9yUmFuZ2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRNZWRpYSgvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpDU1M6OkNTU01lZGlhID4g
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldEFycmF5KCJtZWRpYSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIFRleHQgcmFuZ2Ugd2l0aGlu
IGEgcmVzb3VyY2UuICovCmNsYXNzIFNvdXJjZVJhbmdlIDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBT
dGFydFNldCA9IDEgPDwgMCwKICAgICAgICBFbmRTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmll
bGRzU2V0ID0gKFN0YXJ0U2V0IHwgRW5kU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RB
VEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVy
PFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U291cmNlUmFuZ2U+IHB0cikKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsK
ICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNvdXJjZVJhbmdlOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhcnRTZXQ+JiBzZXRTdGFydChpbnQgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3RhcnRTZXQpLCBw
cm9wZXJ0eV9zdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1i
ZXIoInN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0YXJ0U2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEVuZFNldD4mIHNldEVuZChp
bnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
RW5kU2V0KSwgcHJvcGVydHlfZW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldE51bWJlcigiZW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEVu
ZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxTb3VyY2VSYW5nZT4m
ICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVs
ZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPFNvdXJjZVJhbmdlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNvdXJjZVJhbmdlPiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxTb3VyY2VSYW5nZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTb3Vy
Y2VSYW5nZT4gcmVzdWx0ID0gU291cmNlUmFuZ2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0
YXJ0KC4uLikKICAgICAqICAgICAuc2V0RW5kKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgU291cmNlUmFuZ2UoKSkpOwogICAgfQogICAgdHlwZWRl
ZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgpjbGFzcyBDU1NDb21wdXRlZFN0eWxl
UHJvcGVydHkgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAg
ICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAg
VmFsdWVTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQgfCBWYWx1
ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4gcHRyKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9p
bl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0K
ICAgICAgICBmcmllbmQgY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5OwogICAgcHVibGlj
OgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFtZVNldD4mIHNldE5hbWUoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBO
YW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWYWx1ZVNldD4m
IHNldFZhbHVlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVmFsdWVTZXQpLCBwcm9wZXJ0eV92YWx1ZV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFZhbHVlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+ICgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+IHJlc3VsdCA9IENT
U0NvbXB1dGVkU3R5bGVQcm9wZXJ0eTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4p
CiAgICAgKiAgICAgLnNldFZhbHVlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5v
RmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5KCkpKTsKICAgIH0KICAg
IHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NTIHN0eWxlIHJl
cHJlc2VudGF0aW9uLiAqLwpjbGFzcyBDU1NTdHlsZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qg
ewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgQ3Nz
UHJvcGVydGllc1NldCA9IDEgPDwgMCwKICAgICAgICBTaG9ydGhhbmRFbnRyaWVzU2V0ID0gMSA8
PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChDc3NQcm9wZXJ0aWVzU2V0IHwgU2hvcnRoYW5k
RW50cmllc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPENTU1N0eWxlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBDU1NTdHlsZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IENzc1Byb3BlcnRpZXNTZXQ+JiBzZXRDc3NQcm9wZXJ0aWVzKC8qUGFzc1JlZlB0cjxUeXBlQnVp
bGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUHJvcGVydHkgPiA+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgQ3NzUHJvcGVydGllc1NldCksIHByb3BlcnR5X2Nzc1Byb3BlcnRpZXNf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoImNzc1Byb3BlcnRp
ZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q3NzUHJvcGVydGllc1Nl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaG9ydGhhbmRFbnRyaWVz
U2V0PiYgc2V0U2hvcnRoYW5kRW50cmllcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5
PEluc3BlY3Rvck9iamVjdCA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTaG9ydGhhbmRF
bnRyaWVzU2V0KSwgcHJvcGVydHlfc2hvcnRoYW5kRW50cmllc19hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgic2hvcnRoYW5kRW50cmllcyIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaG9ydGhhbmRFbnRyaWVzU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NT
U3R5bGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8Q1NTU3R5bGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0
eWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1N0eWxlPiByZXN1bHQgPSBDU1NTdHlsZTo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0Q3NzUHJvcGVydGllcyguLi4pCiAgICAgKiAgICAgLnNldFNo
b3J0aGFuZEVudHJpZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBDU1NTdHlsZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFp
dHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFN0eWxlSWQoLypQYXNzUmVmUHRyPFR5cGVCdWls
ZGVyOjpDU1M6OkNTU1N0eWxlSWQ+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgic3R5bGVJZCIsIHZhbHVlKTsKICAgIH0K
CiAgICB2b2lkIHNldENzc1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0
aGlzLT5zZXRTdHJpbmcoImNzc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRSYW5n
ZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6U291cmNlUmFuZ2U+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgi
cmFuZ2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygid2lkdGgiLCB2YWx1ZSk7CiAgICB9
CgogICAgdm9pZCBzZXRIZWlnaHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0
aGlzLT5zZXRTdHJpbmcoImhlaWdodCIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZSBl
ZmZlY3RpdmUgdmlzdWFsIGRpbWVuc2lvbnMgYW5kIHNvdXJjZSBvZmZzZXRzLiAqLwpjbGFzcyBD
U1NQcm9wZXJ0eSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1l
ZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdzdGF0dXMnIHdoaWxlIGdlbmVyYXRpbmcgQ1NTUHJvcGVy
dHkuCiAgICBzdHJ1Y3QgU3RhdHVzIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBB
Y3RpdmUgPSA0NCwKICAgICAgICAgICAgSW5hY3RpdmUgPSA0NSwKICAgICAgICAgICAgRGlzYWJs
ZWQgPSA0NiwKICAgICAgICAgICAgU3R5bGUgPSA0NywKICAgICAgICB9OwogICAgfTsgLy8gc3Ry
dWN0IFN0YXR1cwoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBO
YW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZhbHVlU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZp
ZWxkc1NldCA9IChOYW1lU2V0IHwgVmFsdWVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NQcm9wZXJ0eT4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxk
ZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRy
OwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTUHJvcGVydHk7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5h
bWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxO
YW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFZhbHVlU2V0PiYg
c2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBWYWx1ZVNldCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmFsdWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBSZWZQdHI8Q1NTUHJvcGVydHk+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NQcm9wZXJ0eT4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NQ
cm9wZXJ0eT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTUHJvcGVy
dHk+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTUHJvcGVydHk+IHJlc3VsdCA9IENTU1Byb3BlcnR5
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NQ
cm9wZXJ0eSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0
czsKCiAgICB2b2lkIHNldFByaW9yaXR5KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0U3RyaW5nKCJwcmlvcml0eSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dEltcGxpY2l0KGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigiaW1w
bGljaXQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgfQoK
ICAgIHZvaWQgc2V0UGFyc2VkT2soYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRC
b29sZWFuKCJwYXJzZWRPayIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YXR1cyhTdGF0
dXM6OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCBn
ZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhdHVzKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMi
LCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTaG9ydGhhbmROYW1lKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzaG9ydGhhbmROYW1lIiwgdmFs
dWUpOwogICAgfQoKICAgIHZvaWQgc2V0UmFuZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpD
U1M6OlNvdXJjZVJhbmdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJhbmdlIiwgdmFsdWUpOwogICAgfQp9OwoKLyog
Q1NTIG1lZGlhIHF1ZXJ5IGRlc2NyaXB0b3IuICovCmNsYXNzIENTU01lZGlhIDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUg
J3NvdXJjZScgd2hpbGUgZ2VuZXJhdGluZyBDU1NNZWRpYS4KICAgIHN0cnVjdCBTb3VyY2Ugewog
ICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIE1lZGlhUnVsZSA9IDQ4LAogICAgICAgICAg
ICBJbXBvcnRSdWxlID0gNDksCiAgICAgICAgICAgIExpbmtlZFNoZWV0ID0gNTAsCiAgICAgICAg
ICAgIElubGluZVNoZWV0ID0gNTEsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBTb3VyY2UK
CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVGV4dFNldCA9IDEg
PDwgMCwKICAgICAgICBTb3VyY2VTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0g
KFRleHRTZXQgfCBTb3VyY2VTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAg
IGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NNZWRpYT4gcHRyKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9p
bl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0K
ICAgICAgICBmcmllbmQgY2xhc3MgQ1NTTWVkaWE7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBUZXh0U2V0PiYgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRleHRTZXQpLCBwcm9wZXJ0
eV90ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGV4
dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUZXh0U2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVNldD4mIHNldFNvdXJjZShTb3Vy
Y2U6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFs
dWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNlU2V0PiYgc2V0U291cmNlKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFNvdXJjZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0
cjxDU1NNZWRpYT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU01lZGlhPio+KCZtX3Jlc3VsdCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU01lZGlhPiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NNZWRpYT4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxD
U1NNZWRpYT4gcmVzdWx0ID0gQ1NTTWVkaWE6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRleHQo
Li4uKQogICAgICogICAgIC5zZXRTb3VyY2UoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NNZWRpYSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0
cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFNvdXJjZVVSTChjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic291cmNlVVJMIiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U291cmNlTGluZShpbnQgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0TnVtYmVyKCJzb3VyY2VMaW5lIiwgdmFsdWUpOwogICAgfQp9OwoKLyog
Q1NTIHNlbGVjdG9yIHByb2ZpbGUgZW50cnkuICovCmNsYXNzIFNlbGVjdG9yUHJvZmlsZUVudHJ5
IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5v
RmllbGRzU2V0ID0gMCwKICAgICAgICBTZWxlY3RvclNldCA9IDEgPDwgMCwKICAgICAgICBVcmxT
ZXQgPSAxIDw8IDEsCiAgICAgICAgTGluZU51bWJlclNldCA9IDEgPDwgMiwKICAgICAgICBUaW1l
U2V0ID0gMSA8PCAzLAogICAgICAgIEhpdENvdW50U2V0ID0gMSA8PCA0LAogICAgICAgIE1hdGNo
Q291bnRTZXQgPSAxIDw8IDUsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFNlbGVjdG9yU2V0IHwg
VXJsU2V0IHwgTGluZU51bWJlclNldCB8IFRpbWVTZXQgfCBIaXRDb3VudFNldCB8IE1hdGNoQ291
bnRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxTZWxlY3RvclByb2ZpbGVFbnRyeT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9u
b25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAg
ICAgICBmcmllbmQgY2xhc3MgU2VsZWN0b3JQcm9maWxlRW50cnk7CiAgICBwdWJsaWM6CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWxlY3RvclNldD4mIHNldFNlbGVjdG9yKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
U2VsZWN0b3JTZXQpLCBwcm9wZXJ0eV9zZWxlY3Rvcl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRTdHJpbmcoInNlbGVjdG9yIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFNlbGVjdG9yU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFVybFNldD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVybFNldCksIHByb3BlcnR5X3VybF9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVcmxTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51bWJlclNldD4mIHNldExpbmVOdW1iZXIoaW50IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExpbmVO
dW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVtYmVyX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE51bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFRpbWVTZXQ+JiBzZXRUaW1lKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUaW1lU2V0KSwgcHJvcGVydHlfdGltZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInRpbWUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VGltZVNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIaXRDb3VudFNldD4mIHNldEhpdENvdW50KGludCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIaXRDb3Vu
dFNldCksIHByb3BlcnR5X2hpdENvdW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldE51bWJlcigiaGl0Q291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8SGl0Q291bnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TWF0Y2hDb3VudFNldD4mIHNldE1hdGNoQ291bnQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1hdGNoQ291bnRTZXQpLCBwcm9wZXJ0eV9t
YXRjaENvdW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigi
bWF0Y2hDb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNYXRjaENv
dW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNlbGVjdG9yUHJv
ZmlsZUVudHJ5PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U2VsZWN0b3JQcm9maWxlRW50cnk+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2VsZWN0b3JQcm9m
aWxlRW50cnk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNlbGVjdG9y
UHJvZmlsZUVudHJ5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3lu
dGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5PiBy
ZXN1bHQgPSBTZWxlY3RvclByb2ZpbGVFbnRyeTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2Vs
ZWN0b3IoLi4uKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRMaW5lTnVt
YmVyKC4uLikKICAgICAqICAgICAuc2V0VGltZSguLi4pCiAgICAgKiAgICAgLnNldEhpdENvdW50
KC4uLikKICAgICAqICAgICAuc2V0TWF0Y2hDb3VudCguLi4pOwogICAgICovCiAgICBzdGF0aWMg
QnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRl
cjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNlbGVjdG9yUHJvZmlsZUVudHJ5KCkpKTsKICAg
IH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKY2xhc3MgU2Vs
ZWN0b3JQcm9maWxlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0g
ewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUb3RhbFRpbWVTZXQgPSAxIDw8IDAs
CiAgICAgICAgRGF0YVNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVG90YWxU
aW1lU2V0IHwgRGF0YVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xh
c3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNU
RVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcihQYXNzUmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRl
ZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAg
IH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VsZWN0b3JQcm9maWxlOwogICAgcHVibGljOgoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgVG90YWxUaW1lU2V0PiYgc2V0VG90YWxUaW1lKGRvdWJsZSB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUb3Rh
bFRpbWVTZXQpLCBwcm9wZXJ0eV90b3RhbFRpbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJ0b3RhbFRpbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VG90YWxUaW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IERhdGFTZXQ+JiBzZXREYXRhKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8
VHlwZUJ1aWxkZXI6OkNTUzo6U2VsZWN0b3JQcm9maWxlRW50cnkgPiA+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgRGF0YVNldCksIHByb3BlcnR5X2RhdGFfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoImRhdGEiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8RGF0YVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0
cjxTZWxlY3RvclByb2ZpbGU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxTZWxlY3RvclByb2ZpbGU+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2VsZWN0b3JQ
cm9maWxlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTZWxlY3RvclBy
b2ZpbGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2VsZWN0b3JQcm9maWxlPiByZXN1bHQgPSBTZWxl
Y3RvclByb2ZpbGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRvdGFsVGltZSguLi4pCiAgICAg
KiAgICAgLnNldERhdGEoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBTZWxlY3RvclByb2ZpbGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJ
dGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07Cgp9IC8vIENTUwoKbmFtZXNwYWNlIFRpbWVsaW5lIHsK
LyogVGltZWxpbmUgcmVjb3JkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNvcmRl
ZCBhY3Rpdml0eS4gKi8KY2xhc3MgVGltZWxpbmVFdmVudCA6IHB1YmxpYyBJbnNwZWN0b3JPYmpl
Y3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAg
VHlwZVNldCA9IDEgPDwgMCwKICAgICAgICBEYXRhU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZp
ZWxkc1NldCA9IChUeXBlU2V0IHwgRGF0YVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFRpbWVsaW5lRXZlbnQ+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFRpbWVsaW5lRXZlbnQ7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERhdGFTZXQ+
JiBzZXREYXRhKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEYXRhU2V0KSwgcHJvcGVydHlfZGF0
YV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImRhdGEiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RGF0YVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxUaW1lbGluZUV2ZW50PiYgKCkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8
VGltZWxpbmVFdmVudD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxUaW1lbGluZUV2ZW50PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
IFJlZlB0cjxUaW1lbGluZUV2ZW50PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgog
ICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFRpbWVsaW5lRXZlbnQ+
IHJlc3VsdCA9IFRpbWVsaW5lRXZlbnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4u
KQogICAgICogICAgIC5zZXREYXRhKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5v
RmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgVGltZWxpbmVFdmVudCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0
cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldENoaWxkcmVuKC8qUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OlRpbWVsaW5lOjpUaW1lbGluZUV2
ZW50ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldEFycmF5KCJjaGlsZHJlbiIsIHZhbHVlKTsKICAgIH0KfTsKCn0gLy8gVGltZWxp
bmUKCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKbmFtZXNwYWNlIERlYnVnZ2VyIHsK
LyogTG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLiAqLwpjbGFzcyBMb2NhdGlvbiA6IHB1Ymxp
YyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1Nl
dCA9IDAsCiAgICAgICAgU2NyaXB0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgTGluZU51bWJlclNl
dCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU2NyaXB0SWRTZXQgfCBMaW5lTnVt
YmVyU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVy
IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RT
dGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVp
bGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8TG9jYXRpb24+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3Rh
dGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5k
IGNsYXNzIExvY2F0aW9uOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2Ny
aXB0SWRTZXQ+JiBzZXRTY3JpcHRJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6U2Ny
aXB0SWQmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBTY3JpcHRJZFNldCksIHByb3BlcnR5X3NjcmlwdElkX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic2NyaXB0SWQiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2NyaXB0SWRTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51bWJlclNldD4mIHNldExpbmVOdW1iZXIo
aW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IExpbmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVtYmVyX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUmVmUHRyPExvY2F0aW9uPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8TG9jYXRpb24+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8TG9jYXRpb24+
ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPExvY2F0aW9uPigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPExvY2F0aW9uPiByZXN1bHQgPSBMb2NhdGlvbjo6Y3JlYXRlKCkKICAgICAq
ICAgICAuc2V0U2NyaXB0SWQoLi4uKQogICAgICogICAgIC5zZXRMaW5lTnVtYmVyKC4uLik7CiAg
ICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgTG9jYXRpb24oKSkp
OwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9p
ZCBzZXRDb2x1bW5OdW1iZXIoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJl
cigiY29sdW1uTnVtYmVyIiwgdmFsdWUpOwogICAgfQp9OwoKLyogSW5mb3JtYXRpb24gYWJvdXQg
dGhlIGZ1bmN0aW9uLiAqLwpjbGFzcyBGdW5jdGlvbkRldGFpbHMgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAg
ICAgIExvY2F0aW9uU2V0ID0gMSA8PCAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChMb2NhdGlv
blNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPEZ1bmN0aW9uRGV0YWlscz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgRnVuY3Rpb25EZXRhaWxzOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgTG9jYXRpb25TZXQ+JiBzZXRMb2NhdGlvbigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxk
ZXI6OkRlYnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTG9jYXRp
b25TZXQpLCBwcm9wZXJ0eV9sb2NhdGlvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRPYmplY3QoImxvY2F0aW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPExvY2F0aW9uU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRy
PEZ1bmN0aW9uRGV0YWlscz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZ1bmN0aW9uRGV0YWlscz4qPigmbV9y
ZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxGdW5jdGlvbkRl
dGFpbHM+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZ1bmN0aW9uRGV0
YWlscz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBj
b25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxGdW5jdGlvbkRldGFpbHM+IHJlc3VsdCA9IEZ1bmN0
aW9uRGV0YWlsczo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TG9jYXRpb24oLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBGdW5jdGlvbkRldGFpbHMo
KSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAg
dm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0RGlzcGxheU5hbWUoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImRpc3BsYXlO
YW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0SW5mZXJyZWROYW1lKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJpbmZlcnJlZE5hbWUiLCB2
YWx1ZSk7CiAgICB9Cn07CgovKiBKYXZhU2NyaXB0IGNhbGwgZnJhbWUuIEFycmF5IG9mIGNhbGwg
ZnJhbWVzIGZvcm0gdGhlIGNhbGwgc3RhY2suICovCmNsYXNzIENhbGxGcmFtZSA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9
IDAsCiAgICAgICAgQ2FsbEZyYW1lSWRTZXQgPSAxIDw8IDAsCiAgICAgICAgRnVuY3Rpb25OYW1l
U2V0ID0gMSA8PCAxLAogICAgICAgIExvY2F0aW9uU2V0ID0gMSA8PCAyLAogICAgICAgIFNjb3Bl
Q2hhaW5TZXQgPSAxIDw8IDMsCiAgICAgICAgVGhpc1NldCA9IDEgPDwgNCwKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoQ2FsbEZyYW1lSWRTZXQgfCBGdW5jdGlvbk5hbWVTZXQgfCBMb2NhdGlvblNl
dCB8IFNjb3BlQ2hhaW5TZXQgfCBUaGlzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RB
VEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVy
PFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q2FsbEZyYW1lPiBwdHIpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9j
cmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAg
ICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDYWxsRnJhbWU7CiAgICBwdWJsaWM6CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBDYWxsRnJhbWVJZFNldD4mIHNldENhbGxGcmFtZUlkKC8qY29u
c3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpDYWxsRnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENhbGxG
cmFtZUlkU2V0KSwgcHJvcGVydHlfY2FsbEZyYW1lSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJjYWxsRnJhbWVJZCIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxDYWxsRnJhbWVJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBGdW5jdGlvbk5hbWVTZXQ+JiBzZXRGdW5jdGlvbk5hbWUoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBGdW5jdGlvbk5hbWVTZXQpLCBwcm9wZXJ0eV9mdW5jdGlvbk5hbWVfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmdW5jdGlvbk5hbWUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnVuY3Rpb25OYW1lU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExvY2F0aW9uU2V0PiYgc2V0TG9jYXRpb24oLypQYXNz
UmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6TG9jYXRpb24+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIExvY2F0aW9uU2V0KSwgcHJvcGVydHlfbG9jYXRpb25fYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJsb2NhdGlvbiIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMb2NhdGlvblNldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBTY29wZUNoYWluU2V0PiYgc2V0U2NvcGVDaGFpbigvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6U2NvcGUgPiA+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2NvcGVDaGFpblNldCksIHByb3BlcnR5X3Njb3BlQ2hh
aW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInNjb3BlQ2hh
aW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2NvcGVDaGFpblNldD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUaGlzU2V0PiYgc2V0VGhpcygv
KlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVjdD4qLyBQYXNzUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgVGhpc1NldCksIHByb3BlcnR5X3RoaXNfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJ0aGlzIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFRoaXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBSZWZQdHI8Q2FsbEZyYW1lPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEZyYW1lPio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENhbGxGcmFtZT4gKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEZyYW1lPigqdGhpcyk7CiAg
ICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAg
ICogUmVmUHRyPENhbGxGcmFtZT4gcmVzdWx0ID0gQ2FsbEZyYW1lOjpjcmVhdGUoKQogICAgICog
ICAgIC5zZXRDYWxsRnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldEZ1bmN0aW9uTmFtZSguLi4p
CiAgICAgKiAgICAgLnNldExvY2F0aW9uKC4uLikKICAgICAqICAgICAuc2V0U2NvcGVDaGFpbigu
Li4pCiAgICAgKiAgICAgLnNldFRoaXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWxsRnJhbWUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1
Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBTY29wZSBkZXNjcmlwdGlvbi4gKi8KY2xh
c3MgU2NvcGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQg
YWZ0ZXIgcHJvcGVydHkgbmFtZSAndHlwZScgd2hpbGUgZ2VuZXJhdGluZyBTY29wZS4KICAgIHN0
cnVjdCBUeXBlIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBHbG9iYWwgPSA1MiwK
ICAgICAgICAgICAgTG9jYWwgPSA1MywKICAgICAgICAgICAgV2l0aCA9IDU0LAogICAgICAgICAg
ICBDbG9zdXJlID0gNTUsCiAgICAgICAgICAgIENhdGNoID0gNTYsCiAgICAgICAgfTsKICAgIH07
IC8vIHN0cnVjdCBUeXBlCgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAg
ICAgIFR5cGVTZXQgPSAxIDw8IDAsCiAgICAgICAgT2JqZWN0U2V0ID0gMSA8PCAxLAogICAgICAg
IEFsbEZpZWxkc1NldCA9IChUeXBlU2V0IHwgT2JqZWN0U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0
ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQ
PiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2NvcGU+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNjb3BlOwogICAgcHVibGljOgoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoVHlwZTo6RW51bSB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwg
cHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJp
bmcoInR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPYmplY3RTZXQ+JiBzZXRPYmplY3QoLypQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIE9iamVjdFNldCksIHByb3BlcnR5X29iamVjdF9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoIm9iamVjdCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxPYmplY3RTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8U2NvcGU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxTY29wZT4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTY29wZT4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8U2NvcGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2NvcGU+IHJl
c3VsdCA9IFNjb3BlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRUeXBlKC4uLikKICAgICAqICAg
ICAuc2V0T2JqZWN0KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9w
dFJlZihuZXcgU2NvcGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0
ZW1UcmFpdHM7Cn07Cgp9IC8vIERlYnVnZ2VyCgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRf
REVCVUdHRVIpCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKbmFtZXNwYWNlIERPTURl
YnVnZ2VyIHsKLyogRE9NIGJyZWFrcG9pbnQgdHlwZS4gKi8Kc3RydWN0IERPTUJyZWFrcG9pbnRU
eXBlIHsKICAgIGVudW0gRW51bSB7CiAgICAgICAgU3VidHJlZV9tb2RpZmllZCA9IDU3LAogICAg
ICAgIEF0dHJpYnV0ZV9tb2RpZmllZCA9IDU4LAogICAgICAgIE5vZGVfcmVtb3ZlZCA9IDU5LAog
ICAgfTsKfTsgLy8gc3RydWN0IERPTUJyZWFrcG9pbnRUeXBlCgp9IC8vIERPTURlYnVnZ2VyCgoj
ZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCgp9IC8vIG5hbWVzcGFjZSBUeXBl
QnVpbGRlcgoKCn0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKCiNlbmRpZiAvLyBFTkFCTEUoSU5TUEVD
VE9SKQoKI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvclR5cGVCdWlsZGVyX2gpCgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>125851</attachid>
            <date>2012-02-07 08:55:45 -0800</date>
            <delta_ts>2012-02-07 14:37:02 -0800</delta_ts>
            <desc>original InspectorTypeBuilder.cpp</desc>
            <filename>InspectorTypeBuilder.base.cpp</filename>
            <type>text/plain</type>
            <size>4908</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgoKCiNpbmNsdWRlICJjb25maWcuaCIKI2lmIEVOQUJMRShJTlNQRUNU
T1IpCgojaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIKCm5hbWVzcGFjZSBXZWJDb3Jl
IHsKCm5hbWVzcGFjZSBUeXBlQnVpbGRlciB7Cgpjb25zdCBjaGFyKiBjb25zdCBlbnVtX2NvbnN0
YW50X3ZhbHVlc1tdID0gewogICAgIkRvY3VtZW50IiwKICAgICJTdHlsZXNoZWV0IiwKICAgICJJ
bWFnZSIsCiAgICAiRm9udCIsCiAgICAiU2NyaXB0IiwKICAgICJYSFIiLAogICAgIldlYlNvY2tl
dCIsCiAgICAiT3RoZXIiLAogICAgIm9iamVjdCIsCiAgICAiZnVuY3Rpb24iLAogICAgInVuZGVm
aW5lZCIsCiAgICAic3RyaW5nIiwKICAgICJudW1iZXIiLAogICAgImJvb2xlYW4iLAogICAgImFy
cmF5IiwKICAgICJudWxsIiwKICAgICJub2RlIiwKICAgICJyZWdleHAiLAogICAgImRhdGUiLAog
ICAgImh0bWwiLAogICAgIndtbCIsCiAgICAieG1sIiwKICAgICJqYXZhc2NyaXB0IiwKICAgICJu
ZXR3b3JrIiwKICAgICJjb25zb2xlLWFwaSIsCiAgICAib3RoZXIiLAogICAgInRpcCIsCiAgICAi
bG9nIiwKICAgICJ3YXJuaW5nIiwKICAgICJlcnJvciIsCiAgICAiZGVidWciLAogICAgImRpciIs
CiAgICAiZGlyeG1sIiwKICAgICJ0cmFjZSIsCiAgICAic3RhcnRHcm91cCIsCiAgICAic3RhcnRH
cm91cENvbGxhcHNlZCIsCiAgICAiZW5kR3JvdXAiLAogICAgImFzc2VydCIsCiAgICAicGFyc2Vy
IiwKICAgICJzY3JpcHQiLAogICAgInVzZXIiLAogICAgInVzZXItYWdlbnQiLAogICAgImluc3Bl
Y3RvciIsCiAgICAicmVndWxhciIsCiAgICAiYWN0aXZlIiwKICAgICJpbmFjdGl2ZSIsCiAgICAi
ZGlzYWJsZWQiLAogICAgInN0eWxlIiwKICAgICJtZWRpYVJ1bGUiLAogICAgImltcG9ydFJ1bGUi
LAogICAgImxpbmtlZFNoZWV0IiwKICAgICJpbmxpbmVTaGVldCIsCiAgICAiZ2xvYmFsIiwKICAg
ICJsb2NhbCIsCiAgICAid2l0aCIsCiAgICAiY2xvc3VyZSIsCiAgICAiY2F0Y2giLAogICAgInN1
YnRyZWUtbW9kaWZpZWQiLAogICAgImF0dHJpYnV0ZS1tb2RpZmllZCIsCiAgICAibm9kZS1yZW1v
dmVkIiwKICAgICJET00iLAogICAgIkV2ZW50TGlzdGVuZXIiLAogICAgImV4Y2VwdGlvbiIKfTsK
ClN0cmluZyBnZXRFbnVtQ29uc3RhbnRWYWx1ZShpbnQgY29kZSkgewogICAgcmV0dXJuIGVudW1f
Y29uc3RhbnRfdmFsdWVzW2NvZGVdOwp9Cgp9IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgoKI2lm
ICFBU1NFUlRfRElTQUJMRUQKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgVHlwZUJ1aWxkZXI6
OkFycmF5PFQ+Ojphc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGFycmF5OwogICAgYm9vbCBjYXN0UmVzID0gdmFsdWUt
PmFzQXJyYXkoJmFycmF5KTsKICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7CiAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXJyYXktPmxlbmd0aCgpOyBpKyspCiAgICAgICAg
QXJyYXlJdGVtSGVscGVyPFQ+OjpUcmFpdHM6OnRlbXBsYXRlIGFzc2VydENvcnJlY3RWYWx1ZTxU
PihhcnJheS0+Z2V0KGkpLmdldCgpKTsKfQoKc3RhdGljIHZvaWQgYXNzZXJ0QW55KEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSkKewogICAgLy8gTm8tb3AuCn0KCgpzdGF0aWMgdm9pZCBhc3NlcnRTdHJp
bmcoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAgICBTdHJpbmcgdjsKICAgIGJvb2wgY2FzdFJl
cyA9IHZhbHVlLT5hc1N0cmluZygmdik7CiAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RS
ZXMpOwp9CgoKc3RhdGljIHZvaWQgYXNzZXJ0SW50KEluc3BlY3RvclZhbHVlKiB2YWx1ZSkKewog
ICAgaW50IHY7CiAgICBib29sIGNhc3RSZXMgPSB2YWx1ZS0+YXNOdW1iZXIoJnYpOwogICAgQVNT
RVJUX1VOVVNFRChjYXN0UmVzLCBjYXN0UmVzKTsKfQoKCnZvaWQgVHlwZUJ1aWxkZXI6OlJ1bnRp
bWU6OlJlbW90ZU9iamVjdDo6VHlwZTo6YXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVl
KiB2YWx1ZSkKewogICAgV1RGOjpTdHJpbmcgczsKICAgIGJvb2wgY2FzdF9yZXMgPSB2YWx1ZS0+
YXNTdHJpbmcoJnMpOwogICAgQVNTRVJUKGNhc3RfcmVzKTsKICAgIEFTU0VSVChzID09ICJvYmpl
Y3QiIHx8IHMgPT0gImZ1bmN0aW9uIiB8fCBzID09ICJ1bmRlZmluZWQiIHx8IHMgPT0gInN0cmlu
ZyIgfHwgcyA9PSAibnVtYmVyIiB8fCBzID09ICJib29sZWFuIik7Cn0KCgp2b2lkIFR5cGVCdWls
ZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q6OlN1YnR5cGU6OmFzc2VydENvcnJlY3RWYWx1ZShJ
bnNwZWN0b3JWYWx1ZSogdmFsdWUpCnsKICAgIFdURjo6U3RyaW5nIHM7CiAgICBib29sIGNhc3Rf
cmVzID0gdmFsdWUtPmFzU3RyaW5nKCZzKTsKICAgIEFTU0VSVChjYXN0X3Jlcyk7CiAgICBBU1NF
UlQocyA9PSAiYXJyYXkiIHx8IHMgPT0gIm51bGwiIHx8IHMgPT0gIm5vZGUiIHx8IHMgPT0gInJl
Z2V4cCIgfHwgcyA9PSAiZGF0ZSIpOwp9CgoKdm9pZCBUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVt
b3RlT2JqZWN0Ojphc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBvYmplY3Q7CiAgICBib29sIGNhc3RSZXMgPSB2YWx1
ZS0+YXNPYmplY3QoJm9iamVjdCk7CiAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMp
OwogICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRvciBpdDsKICAgIGl0ID0gb2JqZWN0LT5maW5k
KCJ0eXBlIik7CiAgICBBU1NFUlQoaXQgIT0gb2JqZWN0LT5lbmQoKSk7CiAgICBUeXBlOjphc3Nl
cnRDb3JyZWN0VmFsdWUoaXQtPnNlY29uZC5nZXQoKSk7CiAgICBpbnQgY291bnQgPSAxOwogICAg
aXQgPSBvYmplY3QtPmZpbmQoInN1YnR5cGUiKTsKICAgIGlmIChpdCAhPSBvYmplY3QtPmVuZCgp
KSB7CiAgICAgICAgU3VidHlwZTo6YXNzZXJ0Q29ycmVjdFZhbHVlKGl0LT5zZWNvbmQuZ2V0KCkp
OwogICAgICAgICsrY291bnQ7CiAgICB9CiAgICBpdCA9IG9iamVjdC0+ZmluZCgiY2xhc3NOYW1l
Iik7CiAgICBpZiAoaXQgIT0gb2JqZWN0LT5lbmQoKSkgewogICAgICAgIGFzc2VydFN0cmluZyhp
dC0+c2Vjb25kLmdldCgpKTsKICAgICAgICArK2NvdW50OwogICAgfQogICAgaXQgPSBvYmplY3Qt
PmZpbmQoInZhbHVlIik7CiAgICBpZiAoaXQgIT0gb2JqZWN0LT5lbmQoKSkgewogICAgICAgIGFz
c2VydEFueShpdC0+c2Vjb25kLmdldCgpKTsKICAgICAgICArK2NvdW50OwogICAgfQogICAgaXQg
PSBvYmplY3QtPmZpbmQoImRlc2NyaXB0aW9uIik7CiAgICBpZiAoaXQgIT0gb2JqZWN0LT5lbmQo
KSkgewogICAgICAgIGFzc2VydFN0cmluZyhpdC0+c2Vjb25kLmdldCgpKTsKICAgICAgICArK2Nv
dW50OwogICAgfQogICAgaXQgPSBvYmplY3QtPmZpbmQoIm9iamVjdElkIik7CiAgICBpZiAoaXQg
IT0gb2JqZWN0LT5lbmQoKSkgewogICAgICAgIGFzc2VydFN0cmluZyhpdC0+c2Vjb25kLmdldCgp
KTsKICAgICAgICArK2NvdW50OwogICAgfQogICAgQVNTRVJUKGNvdW50ID09IG9iamVjdC0+c2l6
ZSgpKTsKfQoKCnZvaWQgVHlwZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5bGVJZDo6YXNzZXJ0Q29ycmVj
dFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gb2JqZWN0OwogICAgYm9vbCBjYXN0UmVzID0gdmFsdWUtPmFzT2JqZWN0KCZvYmplY3QpOwog
ICAgQVNTRVJUX1VOVVNFRChjYXN0UmVzLCBjYXN0UmVzKTsKICAgIEluc3BlY3Rvck9iamVjdDo6
aXRlcmF0b3IgaXQ7CiAgICBpdCA9IG9iamVjdC0+ZmluZCgic3R5bGVTaGVldElkIik7CiAgICBB
U1NFUlQoaXQgIT0gb2JqZWN0LT5lbmQoKSk7CiAgICBhc3NlcnRTdHJpbmcoaXQtPnNlY29uZC5n
ZXQoKSk7CiAgICBpdCA9IG9iamVjdC0+ZmluZCgib3JkaW5hbCIpOwogICAgQVNTRVJUKGl0ICE9
IG9iamVjdC0+ZW5kKCkpOwogICAgYXNzZXJ0SW50KGl0LT5zZWNvbmQuZ2V0KCkpOwogICAgaW50
IGNvdW50ID0gMjsKICAgIEFTU0VSVChjb3VudCA9PSBvYmplY3QtPnNpemUoKSk7Cn0KCgp2b2lk
IFR5cGVCdWlsZGVyOjpDU1M6OkNTU1J1bGVJZDo6YXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gb2JqZWN0OwogICAg
Ym9vbCBjYXN0UmVzID0gdmFsdWUtPmFzT2JqZWN0KCZvYmplY3QpOwogICAgQVNTRVJUX1VOVVNF
RChjYXN0UmVzLCBjYXN0UmVzKTsKICAgIEluc3BlY3Rvck9iamVjdDo6aXRlcmF0b3IgaXQ7CiAg
ICBpdCA9IG9iamVjdC0+ZmluZCgic3R5bGVTaGVldElkIik7CiAgICBBU1NFUlQoaXQgIT0gb2Jq
ZWN0LT5lbmQoKSk7CiAgICBhc3NlcnRTdHJpbmcoaXQtPnNlY29uZC5nZXQoKSk7CiAgICBpdCA9
IG9iamVjdC0+ZmluZCgib3JkaW5hbCIpOwogICAgQVNTRVJUKGl0ICE9IG9iamVjdC0+ZW5kKCkp
OwogICAgYXNzZXJ0SW50KGl0LT5zZWNvbmQuZ2V0KCkpOwogICAgaW50IGNvdW50ID0gMjsKICAg
IEFTU0VSVChjb3VudCA9PSBvYmplY3QtPnNpemUoKSk7Cn0KCgoKCiNlbmRpZiAvLyAhQVNTRVJU
X0RJU0FCTEVECgp9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCgojZW5kaWYgLy8gRU5BQkxFKElOU1BF
Q1RPUikK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>125853</attachid>
            <date>2012-02-07 09:01:30 -0800</date>
            <delta_ts>2012-02-07 14:37:05 -0800</delta_ts>
            <desc>new InspectorTypeBuilder.h</desc>
            <filename>InspectorTypeBuilder.h</filename>
            <type>text/plain</type>
            <size>151657</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgoKI2lmbmRlZiBJbnNwZWN0b3JUeXBlQnVpbGRlcl9oCiNkZWZpbmUg
SW5zcGVjdG9yVHlwZUJ1aWxkZXJfaAoKI2lmIEVOQUJMRShJTlNQRUNUT1IpCgojaW5jbHVkZSAi
SW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNsdWRlIDxQbGF0Zm9ybVN0cmluZy5oPgojaW5jbHVkZSA8
d3RmL1Bhc3NSZWZQdHIuaD4KCm5hbWVzcGFjZSBXZWJDb3JlIHsKCm5hbWVzcGFjZSBUeXBlQnVp
bGRlciB7CgovLyBUaGlzIGNsYXNzIHByb3ZpZGVzICJUcmFpdHMiIHR5cGUgZm9yIHRoZSBpbnB1
dCB0eXBlIFQuIEl0IGlzIHByb2dyYW1tZWQgdXNpbmcgQysrIHRlbXBsYXRlIHNwZWNpYWxpemF0
aW9uCi8vIHRlY2huaXF1ZS4gQnkgZGVmYXVsdCBpdCBzaW1wbHkgdGFrZXMgIkl0ZW1UcmFpdHMi
IHR5cGUgZnJvbSBULCBidXQgaXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGJhc2UgdHlwZXMuCnRl
bXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBBcnJheUl0ZW1IZWxwZXIgewogICAgdHlwZWRlZiB0
eXBlbmFtZSBUOjpJdGVtVHJhaXRzIFRyYWl0czsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNs
YXNzIEFycmF5IDogcHVibGljIEluc3BlY3RvckFycmF5IHsKcHJpdmF0ZToKICAgIEFycmF5KCkg
eyB9CgpwdWJsaWM6CiAgICB2b2lkIGFkZEl0ZW0oUGFzc1JlZlB0cjxUPiB2YWx1ZSkKICAgIHsK
ICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6cHVzaFJlZlB0cih0aGlzLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBhZGRJdGVtKFQgdmFsdWUpCiAgICB7CiAgICAgICAgQXJyYXlJ
dGVtSGVscGVyPFQ+OjpUcmFpdHM6OnB1c2hSYXcodGhpcywgdmFsdWUpOwogICAgfQoKICAgIHN0
YXRpYyBQYXNzUmVmUHRyPEFycmF5PFQ+ID4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IEFycmF5PFQ+KCkpOwogICAgfQoKICAgIHN0YXRpYyBQYXNzUmVmUHRyPEFy
cmF5PFQ+ID4gcnVudGltZUNhc3QoUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAg
ICB7CiAgICAgICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBhcnJheTsKICAgICAgICBib29sIGNh
c3RSZXMgPSB2YWx1ZS0+YXNBcnJheSgmYXJyYXkpOwogICAgICAgIEFTU0VSVF9VTlVTRUQoY2Fz
dFJlcywgY2FzdFJlcyk7CiNpZiAhQVNTRVJUX0RJU0FCTEVECiAgICAgICAgYXNzZXJ0Q29ycmVj
dFZhbHVlKGFycmF5LmdldCgpKTsKI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECiAgICAgICAg
Q09NUElMRV9BU1NFUlQoc2l6ZW9mKEFycmF5PFQ+KSA9PSBzaXplb2YoSW5zcGVjdG9yQXJyYXkp
LCB0eXBlX2Nhc3RfcHJvYmxlbSk7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEFycmF5PFQ+
Kj4oYXJyYXkuZ2V0KCkpOwogICAgfQoKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgIHN0YXRpYyB2
b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpCiAgICB7CiAgICAg
ICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBhcnJheTsKICAgICAgICBib29sIGNhc3RSZXMgPSB2
YWx1ZS0+YXNBcnJheSgmYXJyYXkpOwogICAgICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2Fz
dFJlcyk7CiAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGFycmF5LT5sZW5ndGgoKTsg
aSsrKQogICAgICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6dGVtcGxhdGUgYXNz
ZXJ0Q29ycmVjdFZhbHVlPFQ+KGFycmF5LT5nZXQoaSkuZ2V0KCkpOwogICAgfQoKI2VuZGlmIC8v
ICFBU1NFUlRfRElTQUJMRUQKfTsKCnN0cnVjdCBTdHJ1Y3RJdGVtVHJhaXRzIHsKICAgIHN0YXRp
YyB2b2lkIHB1c2hSZWZQdHIoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgYXJyYXktPnB1c2hPYmplY3QodmFsdWUp
OwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBzdGF0aWMgdm9pZCBhc3NlcnRD
b3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKSB7CiAgICAgICAgVDo6YXNzZXJ0Q29y
cmVjdFZhbHVlKHZhbHVlKTsKICAgIH0KfTsKCnRlbXBsYXRlPD4Kc3RydWN0IEFycmF5SXRlbUhl
bHBlcjxTdHJpbmc+IHsKICAgIHN0cnVjdCBUcmFpdHMgewogICAgICAgIHN0YXRpYyB2b2lkIHB1
c2hSYXcoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgYXJyYXktPnB1c2hTdHJpbmcodmFsdWUpOwogICAgICAgIH0KICAgIH07
Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBBcnJheUl0ZW1IZWxwZXI8SW5zcGVjdG9yT2JqZWN0PiB7
CiAgICBzdHJ1Y3QgVHJhaXRzIHsKICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3Bl
Y3RvckFycmF5KiBhcnJheSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgYXJyYXktPnB1c2hPYmplY3QodmFsdWUpOwogICAgICAgIH0KICAg
IH07Cn07CgovLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KbmFtZXNwYWNlIENvbnNvbGUgewpjbGFz
cyBDYWxsRnJhbWU7Cn0gLy8gQ29uc29sZQoKI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpu
YW1lc3BhY2UgSW5kZXhlZERCIHsKY2xhc3MgT2JqZWN0U3RvcmU7CmNsYXNzIE9iamVjdFN0b3Jl
SW5kZXg7Cn0gLy8gSW5kZXhlZERCCgojZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0Up
Cm5hbWVzcGFjZSBDU1MgewpjbGFzcyBDU1NSdWxlOwpjbGFzcyBTb3VyY2VSYW5nZTsKY2xhc3Mg
Q1NTU3R5bGU7CmNsYXNzIENTU1Byb3BlcnR5OwpjbGFzcyBDU1NNZWRpYTsKfSAvLyBDU1MKCiNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKbmFtZXNwYWNlIERlYnVnZ2VyIHsKY2xhc3Mg
TG9jYXRpb247CmNsYXNzIFNjb3BlOwp9IC8vIERlYnVnZ2VyCgojZW5kaWYgLy8gRU5BQkxFKEpB
VkFTQ1JJUFRfREVCVUdHRVIpCi8vIEVuZCBvZiBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KCi8vIFR5
cGVkZWZzLgpuYW1lc3BhY2UgUGFnZSB7Ci8qIFVuaXF1ZSBzY3JpcHQgaWRlbnRpZmllci4gKi8K
dHlwZWRlZiBTdHJpbmcgU2NyaXB0SWRlbnRpZmllcjsKCn0gLy8gUGFnZQoKbmFtZXNwYWNlIFJ1
bnRpbWUgewovKiBVbmlxdWUgb2JqZWN0IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIFJl
bW90ZU9iamVjdElkOwoKfSAvLyBSdW50aW1lCgpuYW1lc3BhY2UgTmV0d29yayB7Ci8qIFVuaXF1
ZSBsb2FkZXIgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgTG9hZGVySWQ7CgovKiBVbmlx
dWUgZnJhbWUgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgRnJhbWVJZDsKCi8qIFVuaXF1
ZSByZXF1ZXN0IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIFJlcXVlc3RJZDsKCn0gLy8g
TmV0d29yawoKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgRGVidWdn
ZXIgewovKiBCcmVha3BvaW50IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIEJyZWFrcG9p
bnRJZDsKCi8qIFVuaXF1ZSBzY3JpcHQgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgU2Ny
aXB0SWQ7CgovKiBDYWxsIGZyYW1lIGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIENhbGxG
cmFtZUlkOwoKfSAvLyBEZWJ1Z2dlcgoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVH
R0VSKQovLyBFbmQgb2YgdHlwZWRlZnMuCgoKClN0cmluZyBnZXRFbnVtQ29uc3RhbnRWYWx1ZShp
bnQgY29kZSk7CgpuYW1lc3BhY2UgTWVtb3J5IHsKLyogTnVtYmVyIG9mIG5vZGVzIHdpdGggZ2l2
ZW4gbmFtZS4gKi8KY2xhc3MgTm9kZUNvdW50IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1
YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOb2RlTmFt
ZVNldCA9IDEgPDwgMCwKICAgICAgICBDb3VudFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVs
ZHNTZXQgPSAoTm9kZU5hbWVTZXQgfCBDb3VudFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50
IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVp
bGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPE5vZGVDb3VudD4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxk
ZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRy
OwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgTm9kZUNvdW50OwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTm9kZU5hbWVTZXQ+JiBzZXROb2RlTmFtZShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIE5vZGVOYW1lU2V0KSwgcHJvcGVydHlfbm9kZU5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJub2RlTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxOb2RlTmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBDb3VudFNldD4mIHNldENvdW50KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb3VudFNldCksIHByb3BlcnR5X2NvdW50
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY291bnQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q291bnRTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Tm9kZUNvdW50PiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Tm9k
ZUNvdW50Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVm
UHRyPE5vZGVDb3VudD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Tm9k
ZUNvdW50PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPE5vZGVDb3VudD4gcmVzdWx0ID0gTm9kZUNvdW50
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXROb2RlTmFtZSguLi4pCiAgICAgKiAgICAgLnNldENv
dW50KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUo
KQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcg
Tm9kZUNvdW50KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1U
cmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIE51bWJlciBvZiBKUyBldmVudCBsaXN0ZW5lcnMgYnkg
ZXZlbnQgdHlwZS4gKi8KY2xhc3MgTGlzdGVuZXJDb3VudCA6IHB1YmxpYyBJbnNwZWN0b3JPYmpl
Y3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAg
VHlwZVNldCA9IDEgPDwgMCwKICAgICAgICBDb3VudFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoVHlwZVNldCB8IENvdW50U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8TGlzdGVuZXJDb3VudD4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgTGlzdGVuZXJDb3VudDsKICAgIHB1
YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ291bnRT
ZXQ+JiBzZXRDb3VudChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgQ291bnRTZXQpLCBwcm9wZXJ0eV9jb3VudF9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvdW50IiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPENvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUmVmUHRyPExpc3RlbmVyQ291bnQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxMaXN0ZW5lckNvdW50Pio+
KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPExpc3Rl
bmVyQ291bnQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPExpc3RlbmVy
Q291bnQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8TGlzdGVuZXJDb3VudD4gcmVzdWx0ID0gTGlzdGVu
ZXJDb3VudDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlwZSguLi4pCiAgICAgKiAgICAgLnNl
dENvdW50KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVh
dGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihu
ZXcgTGlzdGVuZXJDb3VudCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1
Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBDaGFyYWN0ZXIgZGF0YSBzdGF0aXN0aWNz
IGZvciB0aGUgcGFnZS4gKi8KY2xhc3MgU3RyaW5nU3RhdGlzdGljcyA6IHB1YmxpYyBJbnNwZWN0
b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAg
ICAgICAgRG9tU2V0ID0gMSA8PCAwLAogICAgICAgIEpzU2V0ID0gMSA8PCAxLAogICAgICAgIFNo
YXJlZFNldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoRG9tU2V0IHwgSnNTZXQg
fCBTaGFyZWRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1
aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jl
c3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYg
Y2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2Fz
dDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXIoUGFzc1JlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPiBwdHIpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBTdHJpbmdTdGF0aXN0aWNzOwogICAgcHVibGljOgoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgRG9tU2V0PiYgc2V0RG9tKGludCB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEb21TZXQpLCBwcm9wZXJ0eV9kb21f
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJkb20iLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG9tU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IEpzU2V0PiYgc2V0SnMoaW50IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEpzU2V0KSwgcHJvcGVydHlfanNf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJqcyIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxKc1NldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBTaGFyZWRTZXQ+JiBzZXRTaGFyZWQoaW50IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNoYXJlZFNldCksIHBy
b3BlcnR5X3NoYXJlZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1i
ZXIoInNoYXJlZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaGFyZWRT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U3RyaW5nU3RhdGlzdGlj
cz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxG
aWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPFN0cmluZ1N0YXRpc3RpY3M+Kj4oJm1fcmVzdWx0KTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U3RyaW5nU3RhdGlzdGljcz4gKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8U3RyaW5nU3RhdGlzdGljcz4oKnRoaXMp
OwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoK
ICAgICAqIFJlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPiByZXN1bHQgPSBTdHJpbmdTdGF0aXN0aWNz
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXREb20oLi4uKQogICAgICogICAgIC5zZXRKcyguLi4p
CiAgICAgKiAgICAgLnNldFNoYXJlZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxO
b0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxk
c1NldD4oYWRvcHRSZWYobmV3IFN0cmluZ1N0YXRpc3RpY3MoKSkpOwogICAgfQogICAgdHlwZWRl
ZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKY2xhc3MgRE9N
R3JvdXAgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAg
ICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFNpemVTZXQgPSAxIDw8IDAsCiAgICAgICAgVGl0
bGVTZXQgPSAxIDw8IDEsCiAgICAgICAgTm9kZUNvdW50U2V0ID0gMSA8PCAyLAogICAgICAgIExp
c3RlbmVyQ291bnRTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFNpemVTZXQg
fCBUaXRsZVNldCB8IE5vZGVDb3VudFNldCB8IExpc3RlbmVyQ291bnRTZXQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxET01Hcm91cD4g
cHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVs
ZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRE9NR3JvdXA7CiAg
ICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaXplU2V0PiYgc2V0U2l6ZShpbnQg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2l6
ZVNldCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNp
emVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVGl0bGVTZXQ+JiBz
ZXRUaXRsZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFRpdGxlU2V0KSwgcHJvcGVydHlfdGl0bGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0aXRsZSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUaXRsZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBOb2RlQ291bnRTZXQ+JiBzZXROb2RlQ291bnQoLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6TWVtb3J5OjpOb2RlQ291bnQgPiA+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZUNvdW50U2V0KSwgcHJvcGVydHlfbm9kZUNvdW50X2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJub2RlQ291bnQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Tm9kZUNvdW50U2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExpc3RlbmVyQ291bnRTZXQ+JiBzZXRMaXN0
ZW5lckNvdW50KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6Ok1l
bW9yeTo6TGlzdGVuZXJDb3VudCA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMaXN0ZW5l
ckNvdW50U2V0KSwgcHJvcGVydHlfbGlzdGVuZXJDb3VudF9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRBcnJheSgibGlzdGVuZXJDb3VudCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxMaXN0ZW5lckNvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPERPTUdyb3VwPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RE9NR3JvdXA+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RE9NR3Jv
dXA+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPERPTUdyb3VwPigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPERPTUdyb3VwPiByZXN1bHQgPSBET01Hcm91cDo6Y3JlYXRlKCkKICAg
ICAqICAgICAuc2V0U2l6ZSguLi4pCiAgICAgKiAgICAgLnNldFRpdGxlKC4uLikKICAgICAqICAg
ICAuc2V0Tm9kZUNvdW50KC4uLikKICAgICAqICAgICAuc2V0TGlzdGVuZXJDb3VudCguLi4pOwog
ICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAg
ICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IERPTUdyb3VwKCkp
KTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKCiAgICB2b2lkIHNldERvY3VtZW50VVJJKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVSSSIsIHZhbHVlKTsKICAgIH0KfTsK
Cn0gLy8gTWVtb3J5CgpuYW1lc3BhY2UgUGFnZSB7Ci8qIFJlc291cmNlIHR5cGUgYXMgaXQgd2Fz
IHBlcmNlaXZlZCBieSB0aGUgcmVuZGVyaW5nIGVuZ2luZS4gKi8Kc3RydWN0IFJlc291cmNlVHlw
ZSB7CiAgICBlbnVtIEVudW0gewogICAgICAgIERvY3VtZW50ID0gMCwKICAgICAgICBTdHlsZXNo
ZWV0ID0gMSwKICAgICAgICBJbWFnZSA9IDIsCiAgICAgICAgRm9udCA9IDMsCiAgICAgICAgU2Ny
aXB0ID0gNCwKICAgICAgICBYSFIgPSA1LAogICAgICAgIFdlYlNvY2tldCA9IDYsCiAgICAgICAg
T3RoZXIgPSA3LAogICAgfTsKfTsgLy8gc3RydWN0IFJlc291cmNlVHlwZQoKLyogSW5mb3JtYXRp
b24gYWJvdXQgdGhlIEZyYW1lIG9uIHRoZSBwYWdlLiAqLwpjbGFzcyBGcmFtZSA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9
IDAsCiAgICAgICAgSWRTZXQgPSAxIDw8IDAsCiAgICAgICAgTG9hZGVySWRTZXQgPSAxIDw8IDEs
CiAgICAgICAgVXJsU2V0ID0gMSA8PCAyLAogICAgICAgIE1pbWVUeXBlU2V0ID0gMSA8PCAzLAog
ICAgICAgIEFsbEZpZWxkc1NldCA9IChJZFNldCB8IExvYWRlcklkU2V0IHwgVXJsU2V0IHwgTWlt
ZVR5cGVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgRnJhbWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJZFNldD4m
IHNldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgSWRTZXQpLCBwcm9wZXJ0eV9pZF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPElkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IExvYWRlcklkU2V0PiYgc2V0TG9hZGVySWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6
TG9hZGVySWQmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMb2FkZXJJZFNldCksIHByb3BlcnR5X2xvYWRlcklkX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibG9hZGVySWQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TG9hZGVySWRTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
VXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVy
bFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNaW1lVHlwZVNldD4m
IHNldE1pbWVUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgTWltZVR5cGVTZXQpLCBwcm9wZXJ0eV9taW1lVHlwZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1pbWVUeXBlIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1pbWVUeXBlU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEZyYW1lPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RnJh
bWU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8
RnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZyYW1lPigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPEZyYW1lPiByZXN1bHQgPSBGcmFtZTo6Y3JlYXRlKCkKICAgICAqICAg
ICAuc2V0SWQoLi4uKQogICAgICogICAgIC5zZXRMb2FkZXJJZCguLi4pCiAgICAgKiAgICAgLnNl
dFVybCguLi4pCiAgICAgKiAgICAgLnNldE1pbWVUeXBlKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRnJhbWUoKSkpOwogICAgfQogICAgdHlwZWRl
ZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0
UGFyZW50SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoInBhcmVudElkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldFNlY3VyaXR5T3JpZ2luKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzZWN1cml0eU9yaWdpbiIsIHZhbHVlKTsKICAg
IH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBGcmFtZSBoaWVyYXJjaHkgYWxvbmcgd2l0
aCB0aGVpciBjYWNoZWQgcmVzb3VyY2VzLiAqLwpjbGFzcyBGcmFtZVJlc291cmNlVHJlZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0
eSBuYW1lICdyZXNvdXJjZXMnIHdoaWxlIGdlbmVyYXRpbmcgRnJhbWVSZXNvdXJjZVRyZWUuCiAg
ICBjbGFzcyBSZXNvdXJjZXMgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKICAgIHB1YmxpYzoK
ICAgICAgICBlbnVtIHsKICAgICAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgICAgICBV
cmxTZXQgPSAxIDw8IDAsCiAgICAgICAgICAgIFR5cGVTZXQgPSAxIDw8IDEsCiAgICAgICAgICAg
IE1pbWVUeXBlU2V0ID0gMSA8PCAyLAogICAgICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0
IHwgVHlwZVNldCB8IE1pbWVUeXBlU2V0KQogICAgICAgIH07CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgICAgICBjbGFzcyBCdWlsZGVyIHsKICAgICAgICBwcml2YXRlOgogICAgICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPFJlc291cmNlcz4gcHRyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgICAg
ICB9CiAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBSZXNvdXJjZXM7CiAgICAgICAgcHVibGljOgog
ICAgCiAgICAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFVybFNldCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShUeXBlQnVpbGRlcjo6UGFnZTo6UmVz
b3VyY2VUeXBlOjpFbnVtIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIGdldEVudW1Db25z
dGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVT
ZXQ+KCk7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlw
ZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUi
LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAg
ICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVTZXQ+
JiBzZXRNaW1lVHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTWltZVR5cGVTZXQpLCBwcm9wZXJ0eV9t
aW1lVHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJtaW1lVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWlt
ZVR5cGVTZXQ+KCk7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8UmVzb3VyY2VzPiYgKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVzb3VyY2VzPio+KCZt
X3Jlc3VsdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8
UmVzb3VyY2VzPiAoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gUmVmUHRy
PFJlc291cmNlcz4oKnRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLyoK
ICAgICAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgICAgICogUmVmUHRyPFJlc291
cmNlcz4gcmVzdWx0ID0gUmVzb3VyY2VzOjpjcmVhdGUoKQogICAgICAgICAqICAgICAuc2V0VXJs
KC4uLikKICAgICAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICAgICAqICAgICAuc2V0TWlt
ZVR5cGUoLi4uKTsKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4gY3JlYXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgUmVzb3VyY2VzKCkpKTsKICAgICAgICB9CiAgICAgICAgdHlwZWRl
ZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwogICAgfTsKCiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgRnJhbWVTZXQgPSAxIDw8IDAs
CiAgICAgICAgUmVzb3VyY2VzU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChG
cmFtZVNldCB8IFJlc291cmNlc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiBwdHIpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRl
cl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7
CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBGcmFtZVJlc291cmNlVHJlZTsKICAgIHB1
YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEZyYW1lU2V0PiYgc2V0RnJhbWUoLypQYXNz
UmVmUHRyPFR5cGVCdWlsZGVyOjpQYWdlOjpGcmFtZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgRnJhbWVTZXQpLCBwcm9wZXJ0eV9mcmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRPYmplY3QoImZyYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPEZyYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJl
c291cmNlc1NldD4mIHNldFJlc291cmNlcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5
PFJlc291cmNlcyA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSZXNvdXJjZXNTZXQpLCBw
cm9wZXJ0eV9yZXNvdXJjZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
QXJyYXkoInJlc291cmNlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxS
ZXNvdXJjZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RnJhbWVS
ZXNvdXJjZVRyZWU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4qPigmbV9yZXN1
bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxGcmFtZVJlc291cmNl
VHJlZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8RnJhbWVSZXNvdXJj
ZVRyZWU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+IHJlc3VsdCA9IEZy
YW1lUmVzb3VyY2VUcmVlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRGcmFtZSguLi4pCiAgICAg
KiAgICAgLnNldFJlc291cmNlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0Zp
ZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4oYWRvcHRSZWYobmV3IEZyYW1lUmVzb3VyY2VUcmVlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYg
VHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldENo
aWxkRnJhbWVzKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OlBh
Z2U6OkZyYW1lUmVzb3VyY2VUcmVlID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJjaGlsZEZyYW1lcyIsIHZhbHVlKTsK
ICAgIH0KfTsKCi8qIFNlYXJjaCBtYXRjaCBmb3IgcmVzb3VyY2UuICovCmNsYXNzIFNlYXJjaE1h
dGNoIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAg
IE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBMaW5lTnVtYmVyU2V0ID0gMSA8PCAwLAogICAgICAg
IExpbmVDb250ZW50U2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChMaW5lTnVt
YmVyU2V0IHwgTGluZUNvbnRlbnRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4K
ICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTZWFyY2hNYXRjaD4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VhcmNoTWF0Y2g7CiAgICBwdWJsaWM6CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBMaW5lTnVtYmVyU2V0PiYgc2V0TGluZU51bWJlcihkb3VibGUg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTGlu
ZU51bWJlclNldCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPExpbmVOdW1iZXJTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgTGluZUNvbnRlbnRTZXQ+JiBzZXRMaW5lQ29udGVudChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExp
bmVDb250ZW50U2V0KSwgcHJvcGVydHlfbGluZUNvbnRlbnRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJsaW5lQ29udGVudCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lQ29udGVudFNldD4oKTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFJlZlB0cjxTZWFyY2hNYXRjaD4mICgpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkp
OwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlYXJjaE1hdGNo
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNl
YXJjaE1hdGNoPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTZWFyY2hN
YXRjaD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBj
b25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWFyY2hNYXRjaD4gcmVzdWx0ID0gU2VhcmNoTWF0
Y2g6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldExpbmVOdW1iZXIoLi4uKQogICAgICogICAgIC5z
ZXRMaW5lQ29udGVudCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRv
cHRSZWYobmV3IFNlYXJjaE1hdGNoKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6
OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIFNlYXJjaCByZXN1bHQgZm9yIHJl
c291cmNlLiAqLwpjbGFzcyBTZWFyY2hSZXN1bHQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFVybFNl
dCA9IDEgPDwgMCwKICAgICAgICBGcmFtZUlkU2V0ID0gMSA8PCAxLAogICAgICAgIE1hdGNoZXND
b3VudFNldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0IHwgRnJhbWVJ
ZFNldCB8IE1hdGNoZXNDb3VudFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNlYXJjaFJlc3VsdD4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VhcmNoUmVzdWx0OwogICAgcHVibGljOgoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwg
cHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGcmFtZUlkU2V0PiYgc2V0RnJhbWVJ
ZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiovIGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRnJh
bWVJZFNldCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPEZyYW1lSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TWF0Y2hlc0NvdW50U2V0PiYgc2V0TWF0Y2hlc0NvdW50KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYXRjaGVzQ291bnRTZXQpLCBw
cm9wZXJ0eV9tYXRjaGVzQ291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0TnVtYmVyKCJtYXRjaGVzQ291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8TWF0Y2hlc0NvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPFNlYXJjaFJlc3VsdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlYXJjaFJlc3VsdD4qPigmbV9yZXN1
bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWFyY2hSZXN1bHQ+
ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNlYXJjaFJlc3VsdD4oKnRo
aXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3Rv
cjoKICAgICAqIFJlZlB0cjxTZWFyY2hSZXN1bHQ+IHJlc3VsdCA9IFNlYXJjaFJlc3VsdDo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0RnJhbWVJZCguLi4p
CiAgICAgKiAgICAgLnNldE1hdGNoZXNDb3VudCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
b0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNlYXJjaFJlc3VsdCgpKSk7CiAgICB9CiAgICB0eXBl
ZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBDb29r
aWUgb2JqZWN0ICovCmNsYXNzIENvb2tpZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJs
aWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9
IDEgPDwgMCwKICAgICAgICBWYWx1ZVNldCA9IDEgPDwgMSwKICAgICAgICBEb21haW5TZXQgPSAx
IDw8IDIsCiAgICAgICAgUGF0aFNldCA9IDEgPDwgMywKICAgICAgICBFeHBpcmVzU2V0ID0gMSA8
PCA0LAogICAgICAgIFNpemVTZXQgPSAxIDw8IDUsCiAgICAgICAgSHR0cE9ubHlTZXQgPSAxIDw8
IDYsCiAgICAgICAgU2VjdXJlU2V0ID0gMSA8PCA3LAogICAgICAgIFNlc3Npb25TZXQgPSAxIDw8
IDgsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQgfCBWYWx1ZVNldCB8IERvbWFpblNl
dCB8IFBhdGhTZXQgfCBFeHBpcmVzU2V0IHwgU2l6ZVNldCB8IEh0dHBPbmx5U2V0IHwgU2VjdXJl
U2V0IHwgU2Vzc2lvblNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xh
c3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNU
RVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcihQYXNzUmVmUHRyPENvb2tpZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgQ29va2llOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgTmFtZVNldD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWYWx1ZVNldD4mIHNldFZhbHVlKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVmFs
dWVTZXQpLCBwcm9wZXJ0eV92YWx1ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFZhbHVlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERvbWFpblNl
dD4mIHNldERvbWFpbihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIERvbWFpblNldCksIHByb3BlcnR5X2RvbWFpbl9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImRvbWFpbiIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxEb21haW5TZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUGF0aFNldD4mIHNldFBhdGgoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBQYXRo
U2V0KSwgcHJvcGVydHlfcGF0aF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoInBhdGgiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UGF0
aFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFeHBpcmVzU2V0PiYg
c2V0RXhwaXJlcyhpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgRXhwaXJlc1NldCksIHByb3BlcnR5X2V4cGlyZXNfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJleHBpcmVzIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPEV4cGlyZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgU2l6ZVNldD4mIHNldFNpemUoaW50IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNpemVTZXQpLCBwcm9wZXJ0eV9zaXpl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaXplU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEh0dHBPbmx5U2V0PiYgc2V0SHR0cE9ubHkoYm9vbCB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIdHRw
T25seVNldCksIHByb3BlcnR5X2h0dHBPbmx5X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldEJvb2xlYW4oImh0dHBPbmx5IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEh0dHBPbmx5U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFNlY3VyZVNldD4mIHNldFNlY3VyZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNlY3VyZVNldCksIHByb3BlcnR5X3NlY3VyZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJzZWN1cmUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2VjdXJlU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNlc3Npb25TZXQ+JiBzZXRTZXNzaW9uKGJvb2wg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2Vz
c2lvblNldCksIHByb3BlcnR5X3Nlc3Npb25fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0Qm9vbGVhbigic2Vzc2lvbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxTZXNzaW9uU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRy
PENvb2tpZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENvb2tpZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDb29raWU+ICgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gUmVmUHRyPENvb2tpZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDb29raWU+IHJl
c3VsdCA9IENvb2tpZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAg
ICAgLnNldFZhbHVlKC4uLikKICAgICAqICAgICAuc2V0RG9tYWluKC4uLikKICAgICAqICAgICAu
c2V0UGF0aCguLi4pCiAgICAgKiAgICAgLnNldEV4cGlyZXMoLi4uKQogICAgICogICAgIC5zZXRT
aXplKC4uLikKICAgICAqICAgICAuc2V0SHR0cE9ubHkoLi4uKQogICAgICogICAgIC5zZXRTZWN1
cmUoLi4uKQogICAgICogICAgIC5zZXRTZXNzaW9uKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVy
PE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ29va2llKCkpKTsKICAgIH0KICAgIHR5cGVkZWYg
VHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gUGFnZQoK
bmFtZXNwYWNlIFJ1bnRpbWUgewovKiBNaXJyb3Igb2JqZWN0IHJlZmVyZW5jaW5nIG9yaWdpbmFs
IEphdmFTY3JpcHQgb2JqZWN0LiAqLwpjbGFzcyBSZW1vdGVPYmplY3QgOiBwdWJsaWMgSW5zcGVj
dG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAndHlw
ZScgd2hpbGUgZ2VuZXJhdGluZyBSZW1vdGVPYmplY3QuCiAgICBzdHJ1Y3QgVHlwZSB7CiAgICAg
ICAgZW51bSBFbnVtIHsKICAgICAgICAgICAgT2JqZWN0ID0gOCwKICAgICAgICAgICAgRnVuY3Rp
b24gPSA5LAogICAgICAgICAgICBVbmRlZmluZWQgPSAxMCwKICAgICAgICAgICAgU3RyaW5nID0g
MTEsCiAgICAgICAgICAgIE51bWJlciA9IDEyLAogICAgICAgICAgICBCb29sZWFuID0gMTMsCiAg
ICAgICAgfTsKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICAgICBzdGF0aWMgdm9pZCBhc3NlcnRD
b3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKTsKI2VuZGlmICAvLyAhQVNTRVJUX0RJ
U0FCTEVECiAgICB9OyAvLyBzdHJ1Y3QgVHlwZQoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5
IG5hbWUgJ3N1YnR5cGUnIHdoaWxlIGdlbmVyYXRpbmcgUmVtb3RlT2JqZWN0LgogICAgc3RydWN0
IFN1YnR5cGUgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIEFycmF5ID0gMTQsCiAg
ICAgICAgICAgIE51bGwgPSAxNSwKICAgICAgICAgICAgTm9kZSA9IDE2LAogICAgICAgICAgICBS
ZWdleHAgPSAxNywKICAgICAgICAgICAgRGF0ZSA9IDE4LAogICAgICAgIH07CiNpZiAhQVNTRVJU
X0RJU0FCTEVECiAgICAgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSk7CiNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAogICAgfTsgLy8gc3Ry
dWN0IFN1YnR5cGUKCiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAg
VHlwZVNldCA9IDEgPDwgMCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVHlwZVNldCkKICAgIH07
CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRl
OgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1w
bGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJlbW90
ZU9iamVjdD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmVt
b3RlT2JqZWN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4m
IHNldFR5cGUoVHlwZTo6RW51bSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1
ZSh2YWx1ZSkpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZW1vdGVP
YmplY3Q+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PFJlZlB0cjxSZW1vdGVPYmplY3Q+Kj4oJm1fcmVzdWx0KTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmVtb3RlT2JqZWN0PiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxSZW1vdGVPYmplY3Q+KCp0aGlzKTsKICAgICAg
ICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBS
ZWZQdHI8UmVtb3RlT2JqZWN0PiByZXN1bHQgPSBSZW1vdGVPYmplY3Q6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldFR5cGUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBSZW1vdGVPYmplY3QoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRl
cjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0U3VidHlwZShTdWJ0
eXBlOjpFbnVtIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic3VidHlwZSIs
IGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICB9CgogICAgdm9pZCBzZXRTdWJ0eXBl
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdWJ0
eXBlIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0Q2xhc3NOYW1lKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJjbGFzc05hbWUiLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRWYWx1ZShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRWYWx1ZSgidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAg
ICB1c2luZyBJbnNwZWN0b3JPYmplY3Q6OnNldFZhbHVlOwoKCiAgICB2b2lkIHNldERlc2NyaXB0
aW9uKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJk
ZXNjcmlwdGlvbiIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE9iamVjdElkKC8qY29uc3Qg
VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVjdElkJiovIGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJvYmplY3RJZCIsIHZhbHVlKTsKICAg
IH0KICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbW90ZU9iamVjdD4gcnVudGltZUNhc3QoUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gb2JqZWN0OwogICAgICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc09iamVjdCgm
b2JqZWN0KTsKICAgICAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwojaWYgIUFT
U0VSVF9ESVNBQkxFRAogICAgICAgIGFzc2VydENvcnJlY3RWYWx1ZShvYmplY3QuZ2V0KCkpOwoj
ZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKICAgICAgICBDT01QSUxFX0FTU0VSVChzaXplb2Yo
UmVtb3RlT2JqZWN0KSA9PSBzaXplb2YoSW5zcGVjdG9yT2JqZWN0KSwgdHlwZV9jYXN0X3Byb2Js
ZW0pOwogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW1vdGVPYmplY3QqPihvYmplY3QuZ2V0
KCkpOwogICAgfQoKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgIHN0YXRpYyB2b2lkIGFzc2VydENv
cnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpOwojZW5kaWYgIC8vICFBU1NFUlRfRElT
QUJMRUQKfTsKCi8qIE9iamVjdCBwcm9wZXJ0eSBkZXNjcmlwdG9yLiAqLwpjbGFzcyBQcm9wZXJ0
eURlc2NyaXB0b3IgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7
CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAg
ICAgV3JpdGFibGVTZXQgPSAxIDw8IDEsCiAgICAgICAgQ29uZmlndXJhYmxlU2V0ID0gMSA8PCAy
LAogICAgICAgIEVudW1lcmFibGVTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0g
KE5hbWVTZXQgfCBXcml0YWJsZVNldCB8IENvbmZpZ3VyYWJsZVNldCB8IEVudW1lcmFibGVTZXQp
CiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAg
cHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAg
ICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0
cjxQcm9wZXJ0eURlc2NyaXB0b3I+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIFByb3BlcnR5RGVzY3JpcHRvcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5
X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1l
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgV3JpdGFibGVTZXQ+JiBzZXRXcml0YWJsZShi
b29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFdyaXRhYmxlU2V0KSwgcHJvcGVydHlfd3JpdGFibGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigid3JpdGFibGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8V3JpdGFibGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgQ29uZmlndXJhYmxlU2V0PiYgc2V0Q29uZmlndXJhYmxlKGJvb2wgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ29uZmlndXJhYmxl
U2V0KSwgcHJvcGVydHlfY29uZmlndXJhYmxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldEJvb2xlYW4oImNvbmZpZ3VyYWJsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxDb25maWd1cmFibGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgRW51bWVyYWJsZVNldD4mIHNldEVudW1lcmFibGUoYm9vbCB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBFbnVtZXJhYmxlU2V0
KSwgcHJvcGVydHlfZW51bWVyYWJsZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRCb29sZWFuKCJlbnVtZXJhYmxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPEVudW1lcmFibGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8UHJvcGVydHlEZXNjcmlwdG9yPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9y
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFBy
b3BlcnR5RGVzY3JpcHRvcj4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
UHJvcGVydHlEZXNjcmlwdG9yPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRv
cj4gcmVzdWx0ID0gUHJvcGVydHlEZXNjcmlwdG9yOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRO
YW1lKC4uLikKICAgICAqICAgICAuc2V0V3JpdGFibGUoLi4uKQogICAgICogICAgIC5zZXRDb25m
aWd1cmFibGUoLi4uKQogICAgICogICAgIC5zZXRFbnVtZXJhYmxlKC4uLik7CiAgICAgKi8KICAg
IHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVy
biBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgUHJvcGVydHlEZXNjcmlwdG9yKCkp
KTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKCiAgICB2b2lkIHNldFZhbHVlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGlt
ZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNp
bmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXRHZXQoLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiZ2V0Iiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U2V0KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInNldCIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFdhc1Rocm93bihib29sIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEJv
b2xlYW4oIndhc1Rocm93biIsIHZhbHVlKTsKICAgIH0KICAgIHN0YXRpYyBQYXNzUmVmUHRyPFBy
b3BlcnR5RGVzY3JpcHRvcj4gcnVudGltZUNhc3QoUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4g
dmFsdWUpCiAgICB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gb2JqZWN0OwogICAg
ICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc09iamVjdCgmb2JqZWN0KTsKICAgICAgICBBU1NF
UlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwojaWYgIUFTU0VSVF9ESVNBQkxFRAogICAgICAg
IGFzc2VydENvcnJlY3RWYWx1ZShvYmplY3QuZ2V0KCkpOwojZW5kaWYgIC8vICFBU1NFUlRfRElT
QUJMRUQKICAgICAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoUHJvcGVydHlEZXNjcmlwdG9yKSA9
PSBzaXplb2YoSW5zcGVjdG9yT2JqZWN0KSwgdHlwZV9jYXN0X3Byb2JsZW0pOwogICAgICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxQcm9wZXJ0eURlc2NyaXB0b3IqPihvYmplY3QuZ2V0KCkpOwogICAg
fQoKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1
ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpOwojZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKfTsK
Ci8qIFJlcHJlc2VudHMgZnVuY3Rpb24gY2FsbCBhcmd1bWVudC4gRWl0aGVyIHJlbW90ZSBvYmpl
Y3QgaWQgPGNvZGU+b2JqZWN0SWQ8L2NvZGU+IG9yIHByaW1pdGl2ZSA8Y29kZT52YWx1ZTwvY29k
ZT4gb3IgbmVpdGhlciBvZiAoZm9yIHVuZGVmaW5lZCkgdGhlbSBzaG91bGQgYmUgc3BlY2lmaWVk
LiAqLwpjbGFzcyBDYWxsQXJndW1lbnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGlj
OgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIEFsbEZpZWxkc1Nl
dCA9IDAKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPENhbGxBcmd1bWVudD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9z
dGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmll
bmQgY2xhc3MgQ2FsbEFyZ3VtZW50OwogICAgcHVibGljOgoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8Q2FsbEFyZ3VtZW50PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEFyZ3VtZW50Pio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4g
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEFyZ3VtZW50PigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPENhbGxBcmd1bWVudD4gcmVzdWx0ID0gQ2FsbEFyZ3VtZW50OjpjcmVh
dGUoKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWxs
QXJndW1lbnQoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRy
YWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0VmFsdWUoUGFzc1JlZlB0cjxJbnNwZWN0b3JW
YWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0VmFsdWUoInZhbHVlIiwgdmFsdWUp
OwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBz
ZXRPYmplY3RJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3RJZCYq
LyBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygib2Jq
ZWN0SWQiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIFJ1bnRpbWUKCm5hbWVzcGFjZSBDb25zb2xl
IHsKLyogQ29uc29sZSBtZXNzYWdlLiAqLwpjbGFzcyBDb25zb2xlTWVzc2FnZSA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1l
ICdzb3VyY2UnIHdoaWxlIGdlbmVyYXRpbmcgQ29uc29sZU1lc3NhZ2UuCiAgICBzdHJ1Y3QgU291
cmNlIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBIdG1sID0gMTksCiAgICAgICAg
ICAgIFdtbCA9IDIwLAogICAgICAgICAgICBYbWwgPSAyMSwKICAgICAgICAgICAgSmF2YXNjcmlw
dCA9IDIyLAogICAgICAgICAgICBOZXR3b3JrID0gMjMsCiAgICAgICAgICAgIENvbnNvbGVfYXBp
ID0gMjQsCiAgICAgICAgICAgIE90aGVyID0gMjUsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVj
dCBTb3VyY2UKCiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdsZXZlbCcgd2hpbGUg
Z2VuZXJhdGluZyBDb25zb2xlTWVzc2FnZS4KICAgIHN0cnVjdCBMZXZlbCB7CiAgICAgICAgZW51
bSBFbnVtIHsKICAgICAgICAgICAgVGlwID0gMjYsCiAgICAgICAgICAgIExvZyA9IDI3LAogICAg
ICAgICAgICBXYXJuaW5nID0gMjgsCiAgICAgICAgICAgIEVycm9yID0gMjksCiAgICAgICAgICAg
IERlYnVnID0gMzAsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBMZXZlbAoKICAgIC8vIE5h
bWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUnIHdoaWxlIGdlbmVyYXRpbmcgQ29uc29sZU1l
c3NhZ2UuCiAgICBzdHJ1Y3QgVHlwZSB7CiAgICAgICAgZW51bSBFbnVtIHsKICAgICAgICAgICAg
TG9nID0gMjcsCiAgICAgICAgICAgIERpciA9IDMxLAogICAgICAgICAgICBEaXJ4bWwgPSAzMiwK
ICAgICAgICAgICAgVHJhY2UgPSAzMywKICAgICAgICAgICAgU3RhcnRHcm91cCA9IDM0LAogICAg
ICAgICAgICBTdGFydEdyb3VwQ29sbGFwc2VkID0gMzUsCiAgICAgICAgICAgIEVuZEdyb3VwID0g
MzYsCiAgICAgICAgICAgIEFzc2VydCA9IDM3LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3Qg
VHlwZQoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTb3VyY2VT
ZXQgPSAxIDw8IDAsCiAgICAgICAgTGV2ZWxTZXQgPSAxIDw8IDEsCiAgICAgICAgVGV4dFNldCA9
IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU291cmNlU2V0IHwgTGV2ZWxTZXQgfCBU
ZXh0U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVy
IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RT
dGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVp
bGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8Q29uc29sZU1lc3NhZ2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIENvbnNvbGVNZXNzYWdlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU291cmNlU2V0PiYgc2V0U291cmNlKFNvdXJjZTo6RW51bSB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTb3VyY2VTZXQpLCBwcm9w
ZXJ0eV9zb3VyY2VfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJzb3VyY2UiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFNvdXJjZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBTb3VyY2VTZXQ+JiBzZXRTb3VyY2UoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTb3VyY2VTZXQpLCBwcm9wZXJ0
eV9zb3VyY2VfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJz
b3VyY2UiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U291cmNlU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExldmVsU2V0PiYgc2V0TGV2ZWwo
TGV2ZWw6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgTGV2ZWxTZXQpLCBwcm9wZXJ0eV9sZXZlbF9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImxldmVsIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFs
dWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMZXZlbFNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMZXZlbFNldD4mIHNldExldmVsKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
TGV2ZWxTZXQpLCBwcm9wZXJ0eV9sZXZlbF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoImxldmVsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPExldmVsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRleHRT
ZXQ+JiBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgVGV4dFNldCksIHByb3BlcnR5X3RleHRfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRleHRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBSZWZQdHI8Q29uc29sZU1lc3NhZ2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDb25zb2xlTWVz
c2FnZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0
cjxDb25zb2xlTWVzc2FnZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
Q29uc29sZU1lc3NhZ2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBT
eW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q29uc29sZU1lc3NhZ2U+IHJlc3Vs
dCA9IENvbnNvbGVNZXNzYWdlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTb3VyY2UoLi4uKQog
ICAgICogICAgIC5zZXRMZXZlbCguLi4pCiAgICAgKiAgICAgLnNldFRleHQoLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDb25zb2xlTWVzc2FnZSgp
KSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1U
cmFpdHM7CgogICAgdm9pZCBzZXRUeXBlKFR5cGU6OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJ0eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAg
IH0KCiAgICB2b2lkIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0
aGlzLT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRVcmwoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInVybCIsIHZh
bHVlKTsKICAgIH0KCiAgICB2b2lkIHNldExpbmUoaW50IHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldE51bWJlcigibGluZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJlcGVhdENv
dW50KGludCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoInJlcGVhdENvdW50
IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UGFyYW1ldGVycygvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3QgPiA+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
QXJyYXkoInBhcmFtZXRlcnMiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTdGFja1RyYWNl
KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OkNh
bGxGcmFtZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRBcnJheSgic3RhY2tUcmFjZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lk
IHNldE5ldHdvcmtSZXF1ZXN0SWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVz
dElkJiovIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5n
KCJuZXR3b3JrUmVxdWVzdElkIiwgdmFsdWUpOwogICAgfQp9OwoKLyogU3RhY2sgZW50cnkgZm9y
IGNvbnNvbGUgZXJyb3JzIGFuZCBhc3NlcnRpb25zLiAqLwpjbGFzcyBDYWxsRnJhbWUgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNT
ZXQgPSAwLAogICAgICAgIEZ1bmN0aW9uTmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBVcmxTZXQg
PSAxIDw8IDEsCiAgICAgICAgTGluZU51bWJlclNldCA9IDEgPDwgMiwKICAgICAgICBDb2x1bW5O
dW1iZXJTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKEZ1bmN0aW9uTmFtZVNl
dCB8IFVybFNldCB8IExpbmVOdW1iZXJTZXQgfCBDb2x1bW5OdW1iZXJTZXQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWxsRnJhbWU+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENhbGxGcmFtZTsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEZ1bmN0aW9uTmFtZVNldD4mIHNl
dEZ1bmN0aW9uTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZ1bmN0aW9uTmFtZVNldCksIHByb3BlcnR5X2Z1bmN0
aW9uTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZ1
bmN0aW9uTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxGdW5jdGlv
bk5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYg
c2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBMaW5lTnVtYmVyU2V0PiYgc2V0TGluZU51bWJlcihpbnQgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTGluZU51bWJlclNldCksIHByb3Bl
cnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExp
bmVOdW1iZXJTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ29sdW1u
TnVtYmVyU2V0PiYgc2V0Q29sdW1uTnVtYmVyKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb2x1bW5OdW1iZXJTZXQpLCBwcm9wZXJ0eV9j
b2x1bW5OdW1iZXJfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVy
KCJjb2x1bW5OdW1iZXIiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29s
dW1uTnVtYmVyU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxG
cmFtZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBB
bGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENhbGxGcmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDYWxsRnJhbWU+ICgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gUmVmUHRyPENhbGxGcmFtZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWxs
RnJhbWU+IHJlc3VsdCA9IENhbGxGcmFtZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0RnVuY3Rp
b25OYW1lKC4uLikKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TGluZU51
bWJlciguLi4pCiAgICAgKiAgICAgLnNldENvbHVtbk51bWJlciguLi4pOwogICAgICovCiAgICBz
dGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENhbGxGcmFtZSgpKSk7CiAgICB9CiAg
ICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07Cgp9
IC8vIENvbnNvbGUKCm5hbWVzcGFjZSBOZXR3b3JrIHsKLyogVGltaW5nIGluZm9ybWF0aW9uIGZv
ciB0aGUgcmVxdWVzdC4gKi8KY2xhc3MgUmVzb3VyY2VUaW1pbmcgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAg
ICAgIFJlcXVlc3RUaW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFByb3h5U3RhcnRTZXQgPSAxIDw8
IDEsCiAgICAgICAgUHJveHlFbmRTZXQgPSAxIDw8IDIsCiAgICAgICAgRG5zU3RhcnRTZXQgPSAx
IDw8IDMsCiAgICAgICAgRG5zRW5kU2V0ID0gMSA8PCA0LAogICAgICAgIENvbm5lY3RTdGFydFNl
dCA9IDEgPDwgNSwKICAgICAgICBDb25uZWN0RW5kU2V0ID0gMSA8PCA2LAogICAgICAgIFNzbFN0
YXJ0U2V0ID0gMSA8PCA3LAogICAgICAgIFNzbEVuZFNldCA9IDEgPDwgOCwKICAgICAgICBTZW5k
U3RhcnRTZXQgPSAxIDw8IDksCiAgICAgICAgU2VuZEVuZFNldCA9IDEgPDwgMTAsCiAgICAgICAg
UmVjZWl2ZUhlYWRlcnNFbmRTZXQgPSAxIDw8IDExLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChS
ZXF1ZXN0VGltZVNldCB8IFByb3h5U3RhcnRTZXQgfCBQcm94eUVuZFNldCB8IERuc1N0YXJ0U2V0
IHwgRG5zRW5kU2V0IHwgQ29ubmVjdFN0YXJ0U2V0IHwgQ29ubmVjdEVuZFNldCB8IFNzbFN0YXJ0
U2V0IHwgU3NsRW5kU2V0IHwgU2VuZFN0YXJ0U2V0IHwgU2VuZEVuZFNldCB8IFJlY2VpdmVIZWFk
ZXJzRW5kU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8UmVzb3VyY2VUaW1pbmc+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIFJlc291cmNlVGltaW5nOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgUmVxdWVzdFRpbWVTZXQ+JiBzZXRSZXF1ZXN0VGltZShkb3VibGUgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUmVxdWVzdFRp
bWVTZXQpLCBwcm9wZXJ0eV9yZXF1ZXN0VGltZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoInJlcXVlc3RUaW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFJlcXVlc3RUaW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFByb3h5U3RhcnRTZXQ+JiBzZXRQcm94eVN0YXJ0KGRvdWJsZSB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBQcm94eVN0YXJ0U2V0
KSwgcHJvcGVydHlfcHJveHlTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoInByb3h5U3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8UHJveHlTdGFydFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBQcm94eUVuZFNldD4mIHNldFByb3h5RW5kKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBQcm94eUVuZFNldCksIHByb3BlcnR5X3By
b3h5RW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicHJv
eHlFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UHJveHlFbmRTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG5zU3RhcnRTZXQ+JiBzZXRE
bnNTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgRG5zU3RhcnRTZXQpLCBwcm9wZXJ0eV9kbnNTdGFydF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImRuc1N0YXJ0IiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERuc1N0YXJ0U2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IERuc0VuZFNldD4mIHNldERuc0VuZChkb3VibGUgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRG5zRW5kU2V0KSwg
cHJvcGVydHlfZG5zRW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51
bWJlcigiZG5zRW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERuc0Vu
ZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDb25uZWN0U3RhcnRT
ZXQ+JiBzZXRDb25uZWN0U3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIENvbm5lY3RTdGFydFNldCksIHByb3BlcnR5X2Nvbm5l
Y3RTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNv
bm5lY3RTdGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb25uZWN0
U3RhcnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ29ubmVjdEVu
ZFNldD4mIHNldENvbm5lY3RFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIENvbm5lY3RFbmRTZXQpLCBwcm9wZXJ0eV9jb25uZWN0
RW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY29ubmVj
dEVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb25uZWN0RW5kU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNzbFN0YXJ0U2V0PiYgc2V0
U3NsU3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFNzbFN0YXJ0U2V0KSwgcHJvcGVydHlfc3NsU3RhcnRfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzc2xTdGFydCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTc2xTdGFydFNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBTc2xFbmRTZXQ+JiBzZXRTc2xFbmQoZG91YmxlIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNzbEVuZFNldCks
IHByb3BlcnR5X3NzbEVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoInNzbEVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTc2xF
bmRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VuZFN0YXJ0U2V0
PiYgc2V0U2VuZFN0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBTZW5kU3RhcnRTZXQpLCBwcm9wZXJ0eV9zZW5kU3RhcnRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzZW5kU3RhcnQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2VuZFN0YXJ0U2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNlbmRFbmRTZXQ+JiBzZXRTZW5kRW5kKGRv
dWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTZW5kRW5kU2V0KSwgcHJvcGVydHlfc2VuZEVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXROdW1iZXIoInNlbmRFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8U2VuZEVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBSZWNlaXZlSGVhZGVyc0VuZFNldD4mIHNldFJlY2VpdmVIZWFkZXJzRW5kKGRvdWJsZSB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSZWNl
aXZlSGVhZGVyc0VuZFNldCksIHByb3BlcnR5X3JlY2VpdmVIZWFkZXJzRW5kX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicmVjZWl2ZUhlYWRlcnNFbmQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UmVjZWl2ZUhlYWRlcnNFbmRTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVzb3VyY2VUaW1pbmc+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRz
U2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PFJlZlB0cjxSZXNvdXJjZVRpbWluZz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxSZXNvdXJjZVRpbWluZz4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8UmVzb3VyY2VUaW1pbmc+KCp0aGlzKTsKICAgICAgICB9
CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQ
dHI8UmVzb3VyY2VUaW1pbmc+IHJlc3VsdCA9IFJlc291cmNlVGltaW5nOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXRSZXF1ZXN0VGltZSguLi4pCiAgICAgKiAgICAgLnNldFByb3h5U3RhcnQoLi4u
KQogICAgICogICAgIC5zZXRQcm94eUVuZCguLi4pCiAgICAgKiAgICAgLnNldERuc1N0YXJ0KC4u
LikKICAgICAqICAgICAuc2V0RG5zRW5kKC4uLikKICAgICAqICAgICAuc2V0Q29ubmVjdFN0YXJ0
KC4uLikKICAgICAqICAgICAuc2V0Q29ubmVjdEVuZCguLi4pCiAgICAgKiAgICAgLnNldFNzbFN0
YXJ0KC4uLikKICAgICAqICAgICAuc2V0U3NsRW5kKC4uLikKICAgICAqICAgICAuc2V0U2VuZFN0
YXJ0KC4uLikKICAgICAqICAgICAuc2V0U2VuZEVuZCguLi4pCiAgICAgKiAgICAgLnNldFJlY2Vp
dmVIZWFkZXJzRW5kKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9w
dFJlZihuZXcgUmVzb3VyY2VUaW1pbmcoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRl
cjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogSFRUUCByZXF1ZXN0IGRhdGEu
ICovCmNsYXNzIFJlcXVlc3QgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAg
ZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFVybFNldCA9IDEgPDwgMCwK
ICAgICAgICBNZXRob2RTZXQgPSAxIDw8IDEsCiAgICAgICAgSGVhZGVyc1NldCA9IDEgPDwgMiwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0IHwgTWV0aG9kU2V0IHwgSGVhZGVyc1NldCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PFJlcXVlc3Q+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFJl
cXVlc3Q7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRV
cmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IE1ldGhvZFNldD4mIHNldE1ldGhvZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1ldGhvZFNldCksIHByb3BlcnR5X21l
dGhvZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1ldGhv
ZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNZXRob2RTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSGVhZGVyc1NldD4mIHNldEhlYWRlcnMo
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhlYWRlcnNTZXQpLCBwcm9wZXJ0eV9oZWFkZXJzX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIZWFkZXJzU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFJlcXVlc3Q+JiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZXF1
ZXN0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PFJlcXVlc3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlcXVlc3Q+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8UmVxdWVzdD4gcmVzdWx0ID0gUmVxdWVzdDo6Y3JlYXRlKCkK
ICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TWV0aG9kKC4uLikKICAgICAq
ICAgICAuc2V0SGVhZGVycyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxk
c1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4o
YWRvcHRSZWYobmV3IFJlcXVlc3QoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6
U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0UG9zdERhdGEoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInBvc3REYXRhIiwg
dmFsdWUpOwogICAgfQp9OwoKLyogSFRUUCByZXNwb25zZSBkYXRhLiAqLwpjbGFzcyBSZXNwb25z
ZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBO
b0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVXJsU2V0ID0gMSA8PCAwLAogICAgICAgIFN0YXR1c1Nl
dCA9IDEgPDwgMSwKICAgICAgICBTdGF0dXNUZXh0U2V0ID0gMSA8PCAyLAogICAgICAgIEhlYWRl
cnNTZXQgPSAxIDw8IDMsCiAgICAgICAgTWltZVR5cGVTZXQgPSAxIDw8IDQsCiAgICAgICAgQ29u
bmVjdGlvblJldXNlZFNldCA9IDEgPDwgNSwKICAgICAgICBDb25uZWN0aW9uSWRTZXQgPSAxIDw8
IDYsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8IFN0YXR1c1NldCB8IFN0YXR1c1Rl
eHRTZXQgfCBIZWFkZXJzU2V0IHwgTWltZVR5cGVTZXQgfCBDb25uZWN0aW9uUmV1c2VkU2V0IHwg
Q29ubmVjdGlvbklkU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFz
cyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RF
UD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyKFBhc3NSZWZQdHI8UmVzcG9uc2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIFJlc3BvbnNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBTdGF0dXNTZXQ+JiBzZXRTdGF0dXMoZG91YmxlIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0YXR1c1NldCks
IHByb3BlcnR5X3N0YXR1c19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoInN0YXR1cyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0
dXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhdHVzVGV4dFNl
dD4mIHNldFN0YXR1c1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdGF0dXNUZXh0U2V0KSwgcHJvcGVydHlfc3Rh
dHVzVGV4dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0
YXR1c1RleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3RhdHVzVGV4
dFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIZWFkZXJzU2V0PiYg
c2V0SGVhZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSGVhZGVyc1NldCksIHByb3BlcnR5
X2hlYWRlcnNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJo
ZWFkZXJzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhlYWRlcnNTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVTZXQ+JiBzZXRN
aW1lVHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIE1pbWVUeXBlU2V0KSwgcHJvcGVydHlfbWltZVR5cGVfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJtaW1lVHlwZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNaW1lVHlwZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDb25uZWN0aW9uUmV1c2VkU2V0PiYgc2V0Q29ubmVj
dGlvblJldXNlZChib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIENvbm5lY3Rpb25SZXVzZWRTZXQpLCBwcm9wZXJ0eV9jb25uZWN0aW9uUmV1
c2VkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImNvbm5l
Y3Rpb25SZXVzZWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29ubmVj
dGlvblJldXNlZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDb25u
ZWN0aW9uSWRTZXQ+JiBzZXRDb25uZWN0aW9uSWQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENvbm5lY3Rpb25JZFNldCksIHByb3Bl
cnR5X2Nvbm5lY3Rpb25JZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoImNvbm5lY3Rpb25JZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxDb25uZWN0aW9uSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8
UmVzcG9uc2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZXNwb25zZT4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxSZXNwb25zZT4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8UmVzcG9uc2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9
OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8UmVz
cG9uc2U+IHJlc3VsdCA9IFJlc3BvbnNlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRVcmwoLi4u
KQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXNUZXh0KC4u
LikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4pCiAgICAgKiAgICAgLnNldE1pbWVUeXBlKC4u
LikKICAgICAqICAgICAuc2V0Q29ubmVjdGlvblJldXNlZCguLi4pCiAgICAgKiAgICAgLnNldENv
bm5lY3Rpb25JZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4g
Y3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRS
ZWYobmV3IFJlc3BvbnNlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVj
dEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldEhlYWRlcnNUZXh0KGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJoZWFkZXJzVGV4dCIs
IHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJlcXVlc3RIZWFkZXJzKFBhc3NSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJlcXVl
c3RIZWFkZXJzIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UmVxdWVzdEhlYWRlcnNUZXh0
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJyZXF1
ZXN0SGVhZGVyc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRGcm9tRGlza0NhY2hl
KGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigiZnJvbURpc2tDYWNo
ZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFRpbWluZygvKlBhc3NSZWZQdHI8VHlwZUJ1
aWxkZXI6Ok5ldHdvcms6OlJlc291cmNlVGltaW5nPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInRpbWluZyIsIHZhbHVl
KTsKICAgIH0KfTsKCi8qIFdlYlNvY2tldCByZXF1ZXN0IGRhdGEuICovCmNsYXNzIFdlYlNvY2tl
dFJlcXVlc3QgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAg
ICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFJlcXVlc3RLZXkzU2V0ID0gMSA8PCAwLAog
ICAgICAgIEhlYWRlcnNTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFJlcXVl
c3RLZXkzU2V0IHwgSGVhZGVyc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFdlYlNvY2tldFJlcXVlc3Q+IHB0cikKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsK
ICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFdlYlNvY2tldFJlcXVlc3Q7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSZXF1ZXN0S2V5M1NldD4mIHNldFJlcXVlc3RL
ZXkzKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgUmVxdWVzdEtleTNTZXQpLCBwcm9wZXJ0eV9yZXF1ZXN0S2V5M19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInJlcXVlc3RLZXkzIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJlcXVlc3RLZXkzU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhlYWRlcnNTZXQ+JiBzZXRIZWFkZXJz
KFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIZWFkZXJzU2V0KSwgcHJvcGVydHlfaGVhZGVyc19h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SGVhZGVyc1NldD4oKTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PigqdGhpcyk7CiAgICAgICAgfQog
ICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRy
PFdlYlNvY2tldFJlcXVlc3Q+IHJlc3VsdCA9IFdlYlNvY2tldFJlcXVlc3Q6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldFJlcXVlc3RLZXkzKC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFdlYlNvY2tl
dFJlcXVlc3QoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRy
YWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogV2ViU29ja2V0IHJlc3BvbnNlIGRhdGEuICovCmNsYXNz
IFdlYlNvY2tldFJlc3BvbnNlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdGF0dXNTZXQgPSAxIDw8
IDAsCiAgICAgICAgU3RhdHVzVGV4dFNldCA9IDEgPDwgMSwKICAgICAgICBIZWFkZXJzU2V0ID0g
MSA8PCAyLAogICAgICAgIENoYWxsZW5nZVJlc3BvbnNlU2V0ID0gMSA8PCAzLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChTdGF0dXNTZXQgfCBTdGF0dXNUZXh0U2V0IHwgSGVhZGVyc1NldCB8IENo
YWxsZW5nZVJlc3BvbnNlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBj
bGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwg
U1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyKFBhc3NSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+IHB0cikKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2Ny
ZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAg
ICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFdlYlNvY2tldFJlc3BvbnNlOwogICAgcHVibGlj
OgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhdHVzU2V0PiYgc2V0U3RhdHVzKGRvdWJsZSB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdGF0
dXNTZXQpLCBwcm9wZXJ0eV9zdGF0dXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8U3RhdHVzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0YXR1
c1RleHRTZXQ+JiBzZXRTdGF0dXNUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3RhdHVzVGV4dFNldCksIHByb3Bl
cnR5X3N0YXR1c1RleHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJzdGF0dXNUZXh0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0
YXR1c1RleHRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSGVhZGVy
c1NldD4mIHNldEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhlYWRlcnNTZXQpLCBw
cm9wZXJ0eV9oZWFkZXJzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9i
amVjdCgiaGVhZGVycyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIZWFk
ZXJzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENoYWxsZW5nZVJl
c3BvbnNlU2V0PiYgc2V0Q2hhbGxlbmdlUmVzcG9uc2UoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDaGFsbGVuZ2VSZXNw
b25zZVNldCksIHByb3BlcnR5X2NoYWxsZW5nZVJlc3BvbnNlX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiY2hhbGxlbmdlUmVzcG9uc2UiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q2hhbGxlbmdlUmVzcG9uc2VTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+JiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCBy
ZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PFJlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+KCp0aGlzKTsKICAgICAg
ICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBS
ZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+IHJlc3VsdCA9IFdlYlNvY2tldFJlc3BvbnNlOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXNUZXh0
KC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4pCiAgICAgKiAgICAgLnNldENoYWxsZW5n
ZVJlc3BvbnNlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBj
cmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJl
ZihuZXcgV2ViU29ja2V0UmVzcG9uc2UoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRl
cjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogSW5mb3JtYXRpb24gYWJvdXQg
dGhlIGNhY2hlZCByZXNvdXJjZS4gKi8KY2xhc3MgQ2FjaGVkUmVzb3VyY2UgOiBwdWJsaWMgSW5z
cGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAw
LAogICAgICAgIFVybFNldCA9IDEgPDwgMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAxLAogICAg
ICAgIEJvZHlTaXplU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChVcmxTZXQg
fCBUeXBlU2V0IHwgQm9keVNpemVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4K
ICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWNoZWRSZXNvdXJjZT4gcHRyKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJf
Y3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwog
ICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGVkUmVzb3VyY2U7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxT
ZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBl
KFR5cGVCdWlsZGVyOjpQYWdlOjpSZXNvdXJjZVR5cGU6OkVudW0gdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5
cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwg
Z2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+
JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgQm9keVNpemVTZXQ+JiBzZXRCb2R5U2l6ZShkb3VibGUgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQm9keVNpemVTZXQpLCBw
cm9wZXJ0eV9ib2R5U2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoImJvZHlTaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEJv
ZHlTaXplU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENhY2hlZFJl
c291cmNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+Kj4oJm1fcmVzdWx0KTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+ICgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENhY2hlZFJlc291cmNlPigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPENhY2hlZFJlc291cmNlPiByZXN1bHQgPSBDYWNoZWRSZXNvdXJjZTo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0VHlwZSguLi4pCiAg
ICAgKiAgICAgLnNldEJvZHlTaXplKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5v
RmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgQ2FjaGVkUmVzb3VyY2UoKSkpOwogICAgfQogICAgdHlwZWRlZiBU
eXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0UmVz
cG9uc2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNwb25zZT4qLyBQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2Jq
ZWN0KCJyZXNwb25zZSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRo
ZSByZXF1ZXN0IGluaXRpYXRvci4gKi8KY2xhc3MgSW5pdGlhdG9yIDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUn
IHdoaWxlIGdlbmVyYXRpbmcgSW5pdGlhdG9yLgogICAgc3RydWN0IFR5cGUgewogICAgICAgIGVu
dW0gRW51bSB7CiAgICAgICAgICAgIFBhcnNlciA9IDM4LAogICAgICAgICAgICBTY3JpcHQgPSAz
OSwKICAgICAgICAgICAgT3RoZXIgPSAyNSwKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IFR5
cGUKCiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVHlwZVNldCA9
IDEgPDwgMCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVHlwZVNldCkKICAgIH07CgogICAgdGVt
cGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQg
U1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRo
aXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEluaXRpYXRvcj4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgSW5pdGlhdG9yOwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoVHlwZTo6
RW51bSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoInR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJv
cGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
InR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxJbml0aWF0b3I+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1
bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJl
ZlB0cjxJbml0aWF0b3I+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFBhc3NSZWZQdHI8SW5pdGlhdG9yPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJl
ZlB0cjxJbml0aWF0b3I+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBT
eW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8SW5pdGlhdG9yPiByZXN1bHQgPSBJ
bml0aWF0b3I6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKTsKICAgICAqLwogICAg
c3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJu
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBJbml0aWF0b3IoKSkpOwogICAgfQog
ICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAg
IHZvaWQgc2V0U3RhY2tUcmFjZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVC
dWlsZGVyOjpDb25zb2xlOjpDYWxsRnJhbWUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJh
eT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoInN0YWNrVHJhY2UiLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldExp
bmVOdW1iZXIoZG91YmxlIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigibGlu
ZU51bWJlciIsIHZhbHVlKTsKICAgIH0KfTsKCn0gLy8gTmV0d29yawoKI2lmIEVOQUJMRShTUUxf
REFUQUJBU0UpCm5hbWVzcGFjZSBEYXRhYmFzZSB7Ci8qIERhdGFiYXNlIG9iamVjdC4gKi8KY2xh
c3MgRGF0YWJhc2UgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7
CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIElkU2V0ID0gMSA8PCAwLAogICAgICAg
IERvbWFpblNldCA9IDEgPDwgMSwKICAgICAgICBOYW1lU2V0ID0gMSA8PCAyLAogICAgICAgIFZl
cnNpb25TZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKElkU2V0IHwgRG9tYWlu
U2V0IHwgTmFtZVNldCB8IFZlcnNpb25TZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFU
RT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxEYXRhYmFzZT4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRGF0YWJhc2U7CiAgICBwdWJsaWM6CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBJZFNldD4mIHNldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSWRTZXQpLCBwcm9wZXJ0
eV9pZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImlkIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElkU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERvbWFpblNldD4mIHNldERvbWFpbihjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IERvbWFpblNldCksIHByb3BlcnR5X2RvbWFpbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRTdHJpbmcoImRvbWFpbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxEb21haW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TmFtZVNldD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBWZXJzaW9uU2V0PiYgc2V0VmVyc2lvbihjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZl
cnNpb25TZXQpLCBwcm9wZXJ0eV92ZXJzaW9uX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygidmVyc2lvbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxWZXJzaW9uU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRy
PERhdGFiYXNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RGF0YWJhc2U+Kj4oJm1fcmVzdWx0KTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RGF0YWJhc2U+ICgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gUmVmUHRyPERhdGFiYXNlPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPERh
dGFiYXNlPiByZXN1bHQgPSBEYXRhYmFzZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0SWQoLi4u
KQogICAgICogICAgIC5zZXREb21haW4oLi4uKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAg
ICAqICAgICAuc2V0VmVyc2lvbiguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0Zp
ZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4oYWRvcHRSZWYobmV3IERhdGFiYXNlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxk
ZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gRGF0YWJhc2UKCiNlbmRp
ZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQojaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCm5h
bWVzcGFjZSBJbmRleGVkREIgewovKiBTZWN1cml0eSBvcmlnaW4gd2l0aCBkYXRhYmFzZSBuYW1l
cy4gKi8KY2xhc3MgU2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcyA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAs
CiAgICAgICAgU2VjdXJpdHlPcmlnaW5TZXQgPSAxIDw8IDAsCiAgICAgICAgRGF0YWJhc2VOYW1l
c1NldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU2VjdXJpdHlPcmlnaW5TZXQg
fCBEYXRhYmFzZU5hbWVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBj
bGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwg
U1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VjdXJpdHlPcmlnaW5X
aXRoRGF0YWJhc2VOYW1lczsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNl
Y3VyaXR5T3JpZ2luU2V0PiYgc2V0U2VjdXJpdHlPcmlnaW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTZWN1cml0eU9y
aWdpblNldCksIHByb3BlcnR5X3NlY3VyaXR5T3JpZ2luX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygic2VjdXJpdHlPcmlnaW4iLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8U2VjdXJpdHlPcmlnaW5TZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgRGF0YWJhc2VOYW1lc1NldD4mIHNldERhdGFiYXNlTmFtZXMo
LypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxTdHJpbmcgPiA+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgRGF0YWJhc2VOYW1lc1NldCksIHByb3BlcnR5X2RhdGFiYXNlTmFtZXNfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoImRhdGFiYXNlTmFtZXMi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RGF0YWJhc2VOYW1lc1NldD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxTZWN1cml0eU9yaWdpbldpdGhE
YXRhYmFzZU5hbWVzPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNU
QVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VO
YW1lcz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0
cjxTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzPiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuIFJlZlB0cjxTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzPigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM+IHJlc3VsdCA9IFNl
Y3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNl
Y3VyaXR5T3JpZ2luKC4uLikKICAgICAqICAgICAuc2V0RGF0YWJhc2VOYW1lcyguLi4pOwogICAg
ICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAg
ICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNlY3VyaXR5T3JpZ2lu
V2l0aERhdGFiYXNlTmFtZXMoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3Ry
dWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogRGF0YWJhc2Ugd2l0aCBhbiBhcnJheSBv
ZiBvYmplY3Qgc3RvcmVzLiAqLwpjbGFzcyBEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNT
ZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgVmVyc2lvblNldCA9IDEg
PDwgMSwKICAgICAgICBPYmplY3RTdG9yZXNTZXQgPSAxIDw8IDIsCiAgICAgICAgQWxsRmllbGRz
U2V0ID0gKE5hbWVTZXQgfCBWZXJzaW9uU2V0IHwgT2JqZWN0U3RvcmVzU2V0KQogICAgfTsKCiAg
ICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRl
PGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+
Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RGF0YWJhc2VX
aXRoT2JqZWN0U3RvcmVzPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0
eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFt
ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFZlcnNpb25TZXQ+JiBzZXRWZXJzaW9uKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgVmVyc2lvblNldCksIHByb3BlcnR5X3ZlcnNpb25fYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ2ZXJzaW9uIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFZlcnNpb25TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgT2JqZWN0U3RvcmVzU2V0PiYgc2V0T2JqZWN0U3RvcmVzKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkluZGV4ZWREQjo6T2JqZWN0U3RvcmUg
PiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT2JqZWN0U3RvcmVzU2V0KSwgcHJvcGVydHlf
b2JqZWN0U3RvcmVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5
KCJvYmplY3RTdG9yZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T2Jq
ZWN0U3RvcmVzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPERhdGFi
YXNlV2l0aE9iamVjdFN0b3Jlcz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPERhdGFiYXNlV2l0aE9iamVjdFN0
b3Jlcz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0
cjxEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gUmVmUHRyPERhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxE
YXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+IHJlc3VsdCA9IERhdGFiYXNlV2l0aE9iamVjdFN0b3Jl
czo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFZlcnNp
b24oLi4uKQogICAgICogICAgIC5zZXRPYmplY3RTdG9yZXMoLi4uKTsKICAgICAqLwogICAgc3Rh
dGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMo
KSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVt
VHJhaXRzOwp9OwoKLyogT2JqZWN0IHN0b3JlLiAqLwpjbGFzcyBPYmplY3RTdG9yZSA6IHB1Ymxp
YyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1Nl
dCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBLZXlQYXRoU2V0ID0gMSA8
PCAxLAogICAgICAgIEluZGV4ZXNTZXQgPSAxIDw8IDIsCiAgICAgICAgQWxsRmllbGRzU2V0ID0g
KE5hbWVTZXQgfCBLZXlQYXRoU2V0IHwgSW5kZXhlc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPE9iamVjdFN0b3JlPiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBPYmplY3RTdG9yZTsKICAgIHB1
YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgS2V5UGF0
aFNldD4mIHNldEtleVBhdGgoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBLZXlQYXRoU2V0KSwgcHJvcGVydHlfa2V5UGF0
aF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImtleVBhdGgi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8S2V5UGF0aFNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJbmRleGVzU2V0PiYgc2V0SW5kZXhlcygv
KlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpJbmRleGVkREI6Ok9i
amVjdFN0b3JlSW5kZXggPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSW5kZXhlc1NldCks
IHByb3BlcnR5X2luZGV4ZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
QXJyYXkoImluZGV4ZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SW5k
ZXhlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxPYmplY3RTdG9y
ZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxG
aWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPE9iamVjdFN0b3JlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPE9iamVjdFN0b3JlPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxPYmplY3RTdG9yZT4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxP
YmplY3RTdG9yZT4gcmVzdWx0ID0gT2JqZWN0U3RvcmU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dE5hbWUoLi4uKQogICAgICogICAgIC5zZXRLZXlQYXRoKC4uLikKICAgICAqICAgICAuc2V0SW5k
ZXhlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3
IE9iamVjdFN0b3JlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0
ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIE9iamVjdCBzdG9yZSBpbmRleC4gKi8KY2xhc3Mg
T2JqZWN0U3RvcmVJbmRleCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwK
ICAgICAgICBLZXlQYXRoU2V0ID0gMSA8PCAxLAogICAgICAgIFVuaXF1ZVNldCA9IDEgPDwgMiwK
ICAgICAgICBNdWx0aUVudHJ5U2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChO
YW1lU2V0IHwgS2V5UGF0aFNldCB8IFVuaXF1ZVNldCB8IE11bHRpRW50cnlTZXQpCiAgICB9OwoK
ICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToK
ICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxh
dGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RF
UD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxPYmplY3RT
dG9yZUluZGV4PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBP
YmplY3RTdG9yZUluZGV4OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFt
ZVNldD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBLZXlQYXRoU2V0PiYgc2V0S2V5UGF0aChjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEtleVBh
dGhTZXQpLCBwcm9wZXJ0eV9rZXlQYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygia2V5UGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxLZXlQYXRoU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVu
aXF1ZVNldD4mIHNldFVuaXF1ZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFVuaXF1ZVNldCksIHByb3BlcnR5X3VuaXF1ZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJ1bmlxdWUiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VW5pcXVlU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IE11bHRpRW50cnlTZXQ+JiBzZXRNdWx0aUVudHJ5KGJvb2wg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTXVs
dGlFbnRyeVNldCksIHByb3BlcnR5X211bHRpRW50cnlfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigibXVsdGlFbnRyeSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxNdWx0aUVudHJ5U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUmVmUHRyPE9iamVjdFN0b3JlSW5kZXg+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxPYmplY3RTdG9y
ZUluZGV4Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVm
UHRyPE9iamVjdFN0b3JlSW5kZXg+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPE9iamVjdFN0b3JlSW5kZXg+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8T2JqZWN0U3RvcmVJbmRl
eD4gcmVzdWx0ID0gT2JqZWN0U3RvcmVJbmRleDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFt
ZSguLi4pCiAgICAgKiAgICAgLnNldEtleVBhdGgoLi4uKQogICAgICogICAgIC5zZXRVbmlxdWUo
Li4uKQogICAgICogICAgIC5zZXRNdWx0aUVudHJ5KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVy
PE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVJbmRleCgpKSk7CiAgICB9CiAg
ICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07Cgp9
IC8vIEluZGV4ZWREQgoKI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpuYW1lc3Bh
Y2UgRE9NU3RvcmFnZSB7Ci8qIERPTSBTdG9yYWdlIGVudHJ5LiAqLwpjbGFzcyBFbnRyeSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxk
c1NldCA9IDAsCiAgICAgICAgSG9zdFNldCA9IDEgPDwgMCwKICAgICAgICBJc0xvY2FsU3RvcmFn
ZVNldCA9IDEgPDwgMSwKICAgICAgICBJZFNldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNT
ZXQgPSAoSG9zdFNldCB8IElzTG9jYWxTdG9yYWdlU2V0IHwgSWRTZXQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxFbnRyeT4gcHRyKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQs
IGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0
ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRW50cnk7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIb3N0U2V0PiYgc2V0SG9zdChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhv
c3RTZXQpLCBwcm9wZXJ0eV9ob3N0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygiaG9zdCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxI
b3N0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IElzTG9jYWxTdG9y
YWdlU2V0PiYgc2V0SXNMb2NhbFN0b3JhZ2UoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJc0xvY2FsU3RvcmFnZVNldCksIHByb3BlcnR5
X2lzTG9jYWxTdG9yYWdlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJv
b2xlYW4oImlzTG9jYWxTdG9yYWdlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPElzTG9jYWxTdG9yYWdlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IElkU2V0PiYgc2V0SWQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJpZCIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEVudHJ5Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEVudHJ5PiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxFbnRyeT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxFbnRyeT4gcmVz
dWx0ID0gRW50cnk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEhvc3QoLi4uKQogICAgICogICAg
IC5zZXRJc0xvY2FsU3RvcmFnZSguLi4pCiAgICAgKiAgICAgLnNldElkKC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRW50cnkoKSkpOwogICAgfQog
ICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoK
fSAvLyBET01TdG9yYWdlCgpuYW1lc3BhY2UgQXBwbGljYXRpb25DYWNoZSB7Ci8qIERldGFpbGVk
IGFwcGxpY2F0aW9uIGNhY2hlIHJlc291cmNlIGluZm9ybWF0aW9uLiAqLwpjbGFzcyBBcHBsaWNh
dGlvbkNhY2hlUmVzb3VyY2UgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAg
ZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFVybFNldCA9IDEgPDwgMCwK
ICAgICAgICBTaXplU2V0ID0gMSA8PCAxLAogICAgICAgIFR5cGVTZXQgPSAxIDw8IDIsCiAgICAg
ICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8IFNpemVTZXQgfCBUeXBlU2V0KQogICAgfTsKCiAg
ICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRl
PGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+
Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8QXBwbGljYXRp
b25DYWNoZVJlc291cmNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91
cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNpemVTZXQ+JiBzZXRTaXplKGludCB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTaXplU2V0KSwgcHJv
cGVydHlfc2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InNpemUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2l6ZVNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEFw
cGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVS
ZXNvdXJjZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+ICgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+IHJlc3VsdCA9IEFwcGxpY2F0aW9uQ2FjaGVSZXNv
dXJjZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0U2l6
ZSguLi4pCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UoKSkpOwogICAg
fQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9
OwoKLyogRGV0YWlsZWQgYXBwbGljYXRpb24gY2FjaGUgaW5mb3JtYXRpb24uICovCmNsYXNzIEFw
cGxpY2F0aW9uQ2FjaGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51
bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE1hbmlmZXN0VVJMU2V0ID0gMSA8
PCAwLAogICAgICAgIFNpemVTZXQgPSAxIDw8IDEsCiAgICAgICAgQ3JlYXRpb25UaW1lU2V0ID0g
MSA8PCAyLAogICAgICAgIFVwZGF0ZVRpbWVTZXQgPSAxIDw8IDMsCiAgICAgICAgUmVzb3VyY2Vz
U2V0ID0gMSA8PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChNYW5pZmVzdFVSTFNldCB8IFNp
emVTZXQgfCBDcmVhdGlvblRpbWVTZXQgfCBVcGRhdGVUaW1lU2V0IHwgUmVzb3VyY2VzU2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
QXBwbGljYXRpb25DYWNoZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgQXBwbGljYXRpb25DYWNoZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IE1hbmlmZXN0VVJMU2V0PiYgc2V0TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYW5pZmVzdFVS
TFNldCksIHByb3BlcnR5X21hbmlmZXN0VVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8TWFuaWZlc3RVUkxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU2l6ZVNldD4mIHNldFNpemUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNpemVTZXQpLCBwcm9wZXJ0eV9zaXplX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaXplU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IENyZWF0aW9uVGltZVNldD4mIHNldENyZWF0aW9uVGltZShk
b3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgQ3JlYXRpb25UaW1lU2V0KSwgcHJvcGVydHlfY3JlYXRpb25UaW1lX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY3JlYXRpb25UaW1lIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENyZWF0aW9uVGltZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcGRhdGVUaW1lU2V0PiYgc2V0VXBkYXRlVGltZShk
b3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgVXBkYXRlVGltZVNldCksIHByb3BlcnR5X3VwZGF0ZVRpbWVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ1cGRhdGVUaW1lIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPFVwZGF0ZVRpbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgUmVzb3VyY2VzU2V0PiYgc2V0UmVzb3VyY2VzKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkFwcGxpY2F0aW9uQ2FjaGU6OkFwcGxp
Y2F0aW9uQ2FjaGVSZXNvdXJjZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSZXNvdXJj
ZXNTZXQpLCBwcm9wZXJ0eV9yZXNvdXJjZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0QXJyYXkoInJlc291cmNlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxSZXNvdXJjZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8QXBwbGljYXRpb25DYWNoZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8QXBwbGlj
YXRpb25DYWNoZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8QXBwbGlj
YXRpb25DYWNoZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlPiByZXN1bHQg
PSBBcHBsaWNhdGlvbkNhY2hlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRNYW5pZmVzdFVSTCgu
Li4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRDcmVhdGlvblRpbWUo
Li4uKQogICAgICogICAgIC5zZXRVcGRhdGVUaW1lKC4uLikKICAgICAqICAgICAuc2V0UmVzb3Vy
Y2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUo
KQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcg
QXBwbGljYXRpb25DYWNoZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1
Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBGcmFtZSBpZGVudGlmaWVyIC0gbWFuaWZl
c3QgVVJMIHBhaXIuICovCmNsYXNzIEZyYW1lV2l0aE1hbmlmZXN0IDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAg
ICAgICBGcmFtZUlkU2V0ID0gMSA8PCAwLAogICAgICAgIE1hbmlmZXN0VVJMU2V0ID0gMSA8PCAx
LAogICAgICAgIFN0YXR1c1NldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoRnJh
bWVJZFNldCB8IE1hbmlmZXN0VVJMU2V0IHwgU3RhdHVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0
ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQ
PiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEZyYW1lV2l0aE1h
bmlmZXN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRnJhbWVJZFNldD4m
IHNldEZyYW1lSWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYqLyBjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIEZyYW1lSWRTZXQpLCBwcm9wZXJ0eV9mcmFtZUlkX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiZnJhbWVJZCIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxGcmFtZUlkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IE1hbmlmZXN0VVJMU2V0PiYgc2V0TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYW5p
ZmVzdFVSTFNldCksIHByb3BlcnR5X21hbmlmZXN0VVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8TWFuaWZlc3RVUkxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgU3RhdHVzU2V0PiYgc2V0U3RhdHVzKGludCB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdGF0dXNTZXQpLCBwcm9wZXJ0
eV9zdGF0dXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJz
dGF0dXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3RhdHVzU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiYg
KCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxk
c1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+ICgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiByZXN1bHQgPSBGcmFtZVdpdGhNYW5pZmVz
dDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0RnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldE1h
bmlmZXN0VVJMKC4uLikKICAgICAqICAgICAuc2V0U3RhdHVzKC4uLik7CiAgICAgKi8KICAgIHN0
YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBC
dWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRnJhbWVXaXRoTWFuaWZlc3QoKSkpOwog
ICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRz
Owp9OwoKfSAvLyBBcHBsaWNhdGlvbkNhY2hlCgpuYW1lc3BhY2UgRE9NIHsKLyogRE9NIGludGVy
YWN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIG1pcnJvciBvYmplY3RzIHRoYXQgcmVw
cmVzZW50IHRoZSBhY3R1YWwgRE9NIG5vZGVzLiBET01Ob2RlIGlzIGEgYmFzZSBub2RlIG1pcnJv
ciB0eXBlLiAqLwpjbGFzcyBOb2RlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoK
ICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOb2RlSWRTZXQgPSAx
IDw8IDAsCiAgICAgICAgTm9kZVR5cGVTZXQgPSAxIDw8IDEsCiAgICAgICAgTm9kZU5hbWVTZXQg
PSAxIDw8IDIsCiAgICAgICAgTG9jYWxOYW1lU2V0ID0gMSA8PCAzLAogICAgICAgIE5vZGVWYWx1
ZVNldCA9IDEgPDwgNCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoTm9kZUlkU2V0IHwgTm9kZVR5
cGVTZXQgfCBOb2RlTmFtZVNldCB8IExvY2FsTmFtZVNldCB8IE5vZGVWYWx1ZVNldCkKICAgIH07
CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRl
OgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1w
bGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPE5vZGU+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIE5vZGU7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2RlSWRTZXQ+JiBzZXROb2RlSWQoaW50
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5v
ZGVJZFNldCksIHByb3BlcnR5X25vZGVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXROdW1iZXIoIm5vZGVJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxOb2RlSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTm9k
ZVR5cGVTZXQ+JiBzZXROb2RlVHlwZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZVR5cGVTZXQpLCBwcm9wZXJ0eV9ub2RlVHlwZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm5vZGVUeXBlIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVUeXBlU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVOYW1lU2V0PiYgc2V0Tm9kZU5hbWUo
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBOb2RlTmFtZVNldCksIHByb3BlcnR5X25vZGVOYW1lX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibm9kZU5hbWUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8Tm9kZU5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgTG9jYWxOYW1lU2V0PiYgc2V0TG9jYWxOYW1lKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
TG9jYWxOYW1lU2V0KSwgcHJvcGVydHlfbG9jYWxOYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygibG9jYWxOYW1lIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPExvY2FsTmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBOb2RlVmFsdWVTZXQ+JiBzZXROb2RlVmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOb2RlVmFs
dWVTZXQpLCBwcm9wZXJ0eV9ub2RlVmFsdWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJub2RlVmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8Tm9kZVZhbHVlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPE5vZGU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxOb2RlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPE5vZGU+ICgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gUmVmUHRyPE5vZGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Tm9kZT4gcmVzdWx0ID0g
Tm9kZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0Tm9kZUlkKC4uLikKICAgICAqICAgICAuc2V0
Tm9kZVR5cGUoLi4uKQogICAgICogICAgIC5zZXROb2RlTmFtZSguLi4pCiAgICAgKiAgICAgLnNl
dExvY2FsTmFtZSguLi4pCiAgICAgKiAgICAgLnNldE5vZGVWYWx1ZSguLi4pOwogICAgICovCiAg
ICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1
cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IE5vZGUoKSkpOwogICAgfQogICAg
dHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZv
aWQgc2V0Q2hpbGROb2RlQ291bnQoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51
bWJlcigiY2hpbGROb2RlQ291bnQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRDaGlsZHJl
bigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpET006Ok5vZGUg
PiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0QXJyYXkoImNoaWxkcmVuIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0QXR0cmli
dXRlcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFN0cmluZyA+ID4qLyBQYXNzUmVm
UHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgi
YXR0cmlidXRlcyIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldERvY3VtZW50VVJMKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVS
TCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFB1YmxpY0lkKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwdWJsaWNJZCIsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIHNldFN5c3RlbUlkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0U3RyaW5nKCJzeXN0ZW1JZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dEludGVybmFsU3Vic2V0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJpbnRlcm5hbFN1YnNldCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFht
bFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoInhtbFZlcnNpb24iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5z
cGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXRDb250ZW50RG9jdW1lbnQoLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiY29udGVudERvY3Vt
ZW50IiwgdmFsdWUpOwogICAgfQp9OwoKLyogRE9NIGludGVyYWN0aW9uIGlzIGltcGxlbWVudGVk
IGluIHRlcm1zIG9mIG1pcnJvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBhY3R1YWwgRE9N
IG5vZGVzLiBET01Ob2RlIGlzIGEgYmFzZSBub2RlIG1pcnJvciB0eXBlLiAqLwpjbGFzcyBFdmVu
dExpc3RlbmVyIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewog
ICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAwLAogICAgICAg
IFVzZUNhcHR1cmVTZXQgPSAxIDw8IDEsCiAgICAgICAgSXNBdHRyaWJ1dGVTZXQgPSAxIDw8IDIs
CiAgICAgICAgTm9kZUlkU2V0ID0gMSA8PCAzLAogICAgICAgIEhhbmRsZXJCb2R5U2V0ID0gMSA8
PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0IHwgVXNlQ2FwdHVyZVNldCB8IElz
QXR0cmlidXRlU2V0IHwgTm9kZUlkU2V0IHwgSGFuZGxlckJvZHlTZXQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxFdmVudExpc3RlbmVy
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBFdmVudExpc3Rl
bmVyOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5
cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBVc2VDYXB0dXJlU2V0PiYgc2V0VXNlQ2FwdHVyZShib29sIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVzZUNhcHR1cmVTZXQpLCBwcm9w
ZXJ0eV91c2VDYXB0dXJlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJv
b2xlYW4oInVzZUNhcHR1cmUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
VXNlQ2FwdHVyZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJc0F0
dHJpYnV0ZVNldD4mIHNldElzQXR0cmlidXRlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSXNBdHRyaWJ1dGVTZXQpLCBwcm9wZXJ0eV9p
c0F0dHJpYnV0ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFu
KCJpc0F0dHJpYnV0ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJc0F0
dHJpYnV0ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2RlSWRT
ZXQ+JiBzZXROb2RlSWQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE5vZGVJZFNldCksIHByb3BlcnR5X25vZGVJZF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm5vZGVJZCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgSGFuZGxlckJvZHlTZXQ+JiBzZXRIYW5kbGVyQm9keShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IEhhbmRsZXJCb2R5U2V0KSwgcHJvcGVydHlfaGFuZGxlckJvZHlfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJoYW5kbGVyQm9keSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIYW5kbGVyQm9keVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxFdmVudExpc3RlbmVyPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RXZlbnRM
aXN0ZW5lcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxFdmVudExpc3RlbmVyPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxFdmVudExpc3RlbmVyPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEV2ZW50TGlzdGVuZXI+IHJlc3Vs
dCA9IEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAg
ICogICAgIC5zZXRVc2VDYXB0dXJlKC4uLikKICAgICAqICAgICAuc2V0SXNBdHRyaWJ1dGUoLi4u
KQogICAgICogICAgIC5zZXROb2RlSWQoLi4uKQogICAgICogICAgIC5zZXRIYW5kbGVyQm9keSgu
Li4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAg
IHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEV2ZW50
TGlzdGVuZXIoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRy
YWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0TG9jYXRpb24oLypQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpEZWJ1Z2dlcjo6TG9jYXRpb24+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgibG9jYXRpb24iLCB2YWx1ZSk7
CiAgICB9Cn07CgovKiBBIHN0cnVjdHVyZSBob2xkaW5nIGFuIFJHQkEgY29sb3IuICovCi8vIFR5
cGUgb3JpZ2luYWxseSB3YXMgbmFtZWQgJ1JHQkEnLgpjbGFzcyBSZ2JhIDogcHVibGljIEluc3Bl
Y3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwK
ICAgICAgICBSU2V0ID0gMSA8PCAwLAogICAgICAgIEdTZXQgPSAxIDw8IDEsCiAgICAgICAgQlNl
dCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoUlNldCB8IEdTZXQgfCBCU2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
UmdiYT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
Tm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAg
ICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmdiYTsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJTZXQ+JiBzZXRSKGludCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSU2V0KSwg
cHJvcGVydHlfcl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InIiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UlNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBHU2V0PiYgc2V0RyhpbnQgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgR1NldCksIHByb3BlcnR5
X2dfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJnIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEdTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgQlNldD4mIHNldEIoaW50IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEJTZXQpLCBwcm9wZXJ0eV9iX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiYiIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxCU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUmVmUHRyPFJnYmE+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZ2JhPio+KCZtX3Jlc3VsdCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFJnYmE+ICgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJnYmE+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8UmdiYT4g
cmVzdWx0ID0gUmdiYTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UiguLi4pCiAgICAgKiAgICAg
LnNldEcoLi4uKQogICAgICogICAgIC5zZXRCKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgUmdiYSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVC
dWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRBKGRvdWJs
ZSB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImEiLCB2YWx1ZSk7CiAgICB9
Cn07CgovKiBDb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBoaWdobGlnaHRpbmcgb2YgcGFnZSBl
bGVtZW50cy4gKi8KY2xhc3MgSGlnaGxpZ2h0Q29uZmlnIDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBB
bGxGaWVsZHNTZXQgPSAwCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNz
IEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBt
X3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
PiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXIoUGFzc1JlZlB0cjxIaWdobGlnaHRDb25maWc+IHB0cikKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRf
aW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9
CiAgICAgICAgZnJpZW5kIGNsYXNzIEhpZ2hsaWdodENvbmZpZzsKICAgIHB1YmxpYzoKCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPEhpZ2hsaWdodENvbmZpZz4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEhpZ2hs
aWdodENvbmZpZz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFz
c1JlZlB0cjxIaWdobGlnaHRDb25maWc+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
UmVmUHRyPEhpZ2hsaWdodENvbmZpZz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoK
ICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxIaWdobGlnaHRDb25m
aWc+IHJlc3VsdCA9IEhpZ2hsaWdodENvbmZpZzo6Y3JlYXRlKCk7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgSGlnaGxpZ2h0Q29uZmlnKCkpKTsKICAgIH0K
ICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAg
ICB2b2lkIHNldFNob3dJbmZvKGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9v
bGVhbigic2hvd0luZm8iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRDb250ZW50Q29sb3Io
LypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006OlJnYmE+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiY29udGVudENv
bG9yIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UGFkZGluZ0NvbG9yKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6RE9NOjpSZ2JhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInBhZGRpbmdDb2xvciIsIHZhbHVl
KTsKICAgIH0KCiAgICB2b2lkIHNldEJvcmRlckNvbG9yKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRl
cjo6RE9NOjpSZ2JhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRPYmplY3QoImJvcmRlckNvbG9yIiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0TWFyZ2luQ29sb3IoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006OlJnYmE+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldE9iamVjdCgibWFyZ2luQ29sb3IiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIERPTQoKbmFt
ZXNwYWNlIENTUyB7Ci8qIFRoaXMgb2JqZWN0IGlkZW50aWZpZXMgYSBDU1Mgc3R5bGUgaW4gYSB1
bmlxdWUgd2F5LiAqLwpjbGFzcyBDU1NTdHlsZUlkIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHls
ZVNoZWV0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgT3JkaW5hbFNldCA9IDEgPDwgMSwKICAgICAg
ICBBbGxGaWVsZHNTZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgT3JkaW5hbFNldCkKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0eWxl
SWQ+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5v
RmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAg
ICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxl
SWQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTdHlsZVNoZWV0SWRTZXQ+
JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdHlsZVNoZWV0SWRTZXQpLCBwcm9wZXJ0eV9z
dHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5
bGVTaGVldElkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE9yZGlu
YWxTZXQ+JiBzZXRPcmRpbmFsKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBPcmRpbmFsU2V0KSwgcHJvcGVydHlfb3JkaW5hbF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm9yZGluYWwiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T3JkaW5hbFNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZUlkPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTU3R5
bGVJZD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0
cjxDU1NTdHlsZUlkPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NT
dHlsZUlkPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1N0eWxlSWQ+IHJlc3VsdCA9IENTU1N0eWxl
SWQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAg
LnNldE9yZGluYWwoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0
UmVmKG5ldyBDU1NTdHlsZUlkKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0
cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKICAgIHN0YXRpYyBQYXNzUmVmUHRyPENTU1N0eWxl
SWQ+IHJ1bnRpbWVDYXN0KFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVlKQogICAgewog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdDsKICAgICAgICBib29sIGNhc3RS
ZXMgPSB2YWx1ZS0+YXNPYmplY3QoJm9iamVjdCk7CiAgICAgICAgQVNTRVJUX1VOVVNFRChjYXN0
UmVzLCBjYXN0UmVzKTsKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICAgICBhc3NlcnRDb3JyZWN0
VmFsdWUob2JqZWN0LmdldCgpKTsKI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECiAgICAgICAg
Q09NUElMRV9BU1NFUlQoc2l6ZW9mKENTU1N0eWxlSWQpID09IHNpemVvZihJbnNwZWN0b3JPYmpl
Y3QpLCB0eXBlX2Nhc3RfcHJvYmxlbSk7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENTU1N0
eWxlSWQqPihvYmplY3QuZ2V0KCkpOwogICAgfQoKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgIHN0
YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpOwojZW5k
aWYgIC8vICFBU1NFUlRfRElTQUJMRUQKfTsKCi8qIFRoaXMgb2JqZWN0IGlkZW50aWZpZXMgYSBD
U1MgcnVsZSBpbiBhIHVuaXF1ZSB3YXkuICovCmNsYXNzIENTU1J1bGVJZCA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAs
CiAgICAgICAgU3R5bGVTaGVldElkU2V0ID0gMSA8PCAwLAogICAgICAgIE9yZGluYWxTZXQgPSAx
IDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFN0eWxlU2hlZXRJZFNldCB8IE9yZGluYWxT
ZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewog
ICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAg
ICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRl
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVy
PFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1Jl
ZlB0cjxDU1NSdWxlSWQ+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUp
OwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNs
YXNzIENTU1J1bGVJZDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0eWxl
U2hlZXRJZFNldD4mIHNldFN0eWxlU2hlZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2hlZXRJZFNldCks
IHByb3BlcnR5X3N0eWxlU2hlZXRJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInN0eWxlU2hlZXRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxTdHlsZVNoZWV0SWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgT3JkaW5hbFNldD4mIHNldE9yZGluYWwoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE9yZGluYWxTZXQpLCBwcm9wZXJ0eV9vcmRp
bmFsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigib3JkaW5h
bCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPcmRpbmFsU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1J1bGVJZD4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPENTU1J1bGVJZD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxDU1NSdWxlSWQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPENTU1J1bGVJZD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NSdWxlSWQ+IHJlc3VsdCA9IENT
U1J1bGVJZDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVTaGVldElkKC4uLikKICAgICAq
ICAgICAuc2V0T3JkaW5hbCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxk
c1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4o
YWRvcHRSZWYobmV3IENTU1J1bGVJZCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVy
OjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CiAgICBzdGF0aWMgUGFzc1JlZlB0cjxDU1NS
dWxlSWQ+IHJ1bnRpbWVDYXN0KFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVlKQogICAg
ewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdDsKICAgICAgICBib29sIGNh
c3RSZXMgPSB2YWx1ZS0+YXNPYmplY3QoJm9iamVjdCk7CiAgICAgICAgQVNTRVJUX1VOVVNFRChj
YXN0UmVzLCBjYXN0UmVzKTsKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICAgICBhc3NlcnRDb3Jy
ZWN0VmFsdWUob2JqZWN0LmdldCgpKTsKI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECiAgICAg
ICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKENTU1J1bGVJZCkgPT0gc2l6ZW9mKEluc3BlY3Rvck9i
amVjdCksIHR5cGVfY2FzdF9wcm9ibGVtKTsKICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NT
UnVsZUlkKj4ob2JqZWN0LmdldCgpKTsKICAgIH0KCiNpZiAhQVNTRVJUX0RJU0FCTEVECiAgICBz
dGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKTsKI2Vu
ZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECn07CgovKiBDU1MgcnVsZSBjb2xsZWN0aW9uIGZvciBh
IHNpbmdsZSBwc2V1ZG8gc3R5bGUuICovCmNsYXNzIFBzZXVkb0lkUnVsZXMgOiBwdWJsaWMgSW5z
cGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAw
LAogICAgICAgIFBzZXVkb0lkU2V0ID0gMSA8PCAwLAogICAgICAgIFJ1bGVzU2V0ID0gMSA8PCAx
LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChQc2V1ZG9JZFNldCB8IFJ1bGVzU2V0KQogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UHNldWRv
SWRSdWxlcz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUHNl
dWRvSWRSdWxlczsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFBzZXVkb0lk
U2V0PiYgc2V0UHNldWRvSWQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFBzZXVkb0lkU2V0KSwgcHJvcGVydHlfcHNldWRvSWRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJwc2V1ZG9JZCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxQc2V1ZG9JZFNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSdWxlc1NldD4mIHNldFJ1bGVzKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQYXNz
UmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBSdWxlc1NldCksIHByb3BlcnR5X3J1bGVzX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJydWxlcyIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSdWxlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFJlZlB0cjxQc2V1ZG9JZFJ1bGVzPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UHNldWRvSWRSdWxl
cz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxQ
c2V1ZG9JZFJ1bGVzPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxQc2V1
ZG9JZFJ1bGVzPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhl
dGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFBzZXVkb0lkUnVsZXM+IHJlc3VsdCA9IFBz
ZXVkb0lkUnVsZXM6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFBzZXVkb0lkKC4uLikKICAgICAq
ICAgICAuc2V0UnVsZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBQc2V1ZG9JZFJ1bGVzKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxk
ZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIENTUyBydWxlIGNvbGxlY3Rp
b24gZm9yIGEgc2luZ2xlIHBzZXVkbyBzdHlsZS4gKi8KY2xhc3MgSW5oZXJpdGVkU3R5bGVFbnRy
eSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBO
b0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTWF0Y2hlZENTU1J1bGVzU2V0ID0gMSA8PCAwLAogICAg
ICAgIEFsbEZpZWxkc1NldCA9IChNYXRjaGVkQ1NTUnVsZXNTZXQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxJbmhlcml0ZWRTdHlsZUVu
dHJ5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBO
b0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAg
ICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBJbmhlcml0
ZWRTdHlsZUVudHJ5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWF0Y2hl
ZENTU1J1bGVzU2V0PiYgc2V0TWF0Y2hlZENTU1J1bGVzKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRl
cjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBNYXRjaGVkQ1NTUnVsZXNTZXQpLCBwcm9wZXJ0eV9tYXRjaGVkQ1NTUnVsZXNfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoIm1hdGNoZWRDU1NSdWxl
cyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNYXRjaGVkQ1NTUnVsZXNT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SW5oZXJpdGVkU3R5bGVF
bnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBB
bGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+Kj4oJm1fcmVzdWx0KTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SW5oZXJpdGVkU3R5bGVFbnRy
eT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8SW5oZXJpdGVkU3R5bGVF
bnRyeT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBj
b25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiByZXN1bHQgPSBJ
bmhlcml0ZWRTdHlsZUVudHJ5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRNYXRjaGVkQ1NTUnVs
ZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgp
CiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBJ
bmhlcml0ZWRTdHlsZUVudHJ5KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0
cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldElubGluZVN0eWxlKC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpDU1NTdHlsZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJpbmxpbmVTdHls
ZSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZSBpbmZvcm1hdGlvbiBmb3IgYSBET00g
c3R5bGUgYXR0cmlidXRlLiAqLwpjbGFzcyBDU1NTdHlsZUF0dHJpYnV0ZSA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAs
CiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBTdHlsZVNldCA9IDEgPDwgMSwKICAg
ICAgICBBbGxGaWVsZHNTZXQgPSAoTmFtZVNldCB8IFN0eWxlU2V0KQogICAgfTsKCiAgICB0ZW1w
bGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBT
VEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhp
cyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1
dGU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5v
RmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAg
ICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxl
QXR0cmlidXRlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFtZVNldD4m
IHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBTdHlsZVNldD4mIHNldFN0eWxlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
Q1NTOjpDU1NTdHlsZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3R5bGVTZXQpLCBwcm9w
ZXJ0eV9zdHlsZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3Qo
InN0eWxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0eWxlU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPiYg
KCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxk
c1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+ICgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPiByZXN1bHQgPSBDU1NTdHlsZUF0dHJpYnV0
ZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFN0eWxl
KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQog
ICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ1NT
U3R5bGVBdHRyaWJ1dGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0
SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NTIHN0eWxlc2hlZXQgbWV0YWluZm9ybWF0
aW9uLiAqLwpjbGFzcyBDU1NTdHlsZVNoZWV0SGVhZGVyIDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBT
dHlsZVNoZWV0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgU291cmNlVVJMU2V0ID0gMSA8PCAxLAog
ICAgICAgIFRpdGxlU2V0ID0gMSA8PCAyLAogICAgICAgIERpc2FibGVkU2V0ID0gMSA8PCAzLAog
ICAgICAgIEFsbEZpZWxkc1NldCA9IChTdHlsZVNoZWV0SWRTZXQgfCBTb3VyY2VVUkxTZXQgfCBU
aXRsZVNldCB8IERpc2FibGVkU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAg
ICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRF
IHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxk
ZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRy
OwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVTaGVldEhlYWRlcjsKICAg
IHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0eWxlU2hlZXRJZFNldD4mIHNldFN0
eWxlU2hlZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2hlZXRJZFNldCksIHByb3BlcnR5X3N0eWxlU2hl
ZXRJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0eWxl
U2hlZXRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdHlsZVNoZWV0
SWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNlVVJMU2V0
PiYgc2V0U291cmNlVVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlVVJMU2V0KSwgcHJvcGVydHlfc291cmNl
VVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNl
VVJMIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNvdXJjZVVSTFNldD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUaXRsZVNldD4mIHNldFRpdGxl
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgVGl0bGVTZXQpLCBwcm9wZXJ0eV90aXRsZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInRpdGxlIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFRpdGxlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IERpc2FibGVkU2V0PiYgc2V0RGlzYWJsZWQoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEaXNhYmxlZFNldCksIHByb3BlcnR5
X2Rpc2FibGVkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4o
ImRpc2FibGVkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERpc2FibGVk
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlU2hlZXRI
ZWFkZXI+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
QWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFk
ZXI+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxlU2hlZXRI
ZWFkZXI+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4gcmVzdWx0ID0g
Q1NTU3R5bGVTaGVldEhlYWRlcjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVTaGVldElk
KC4uLikKICAgICAqICAgICAuc2V0U291cmNlVVJMKC4uLikKICAgICAqICAgICAuc2V0VGl0bGUo
Li4uKQogICAgICogICAgIC5zZXREaXNhYmxlZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
b0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENTU1N0eWxlU2hlZXRIZWFkZXIoKSkpOwogICAgfQog
ICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoK
LyogQ1NTIHN0eWxlc2hlZXQgY29udGVudHMuICovCmNsYXNzIENTU1N0eWxlU2hlZXRCb2R5IDog
cHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmll
bGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgUnVs
ZXNTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFN0eWxlU2hlZXRJZFNldCB8
IFJ1bGVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+IHB0cikKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5f
bm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAg
ICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hlZXRCb2R5OwogICAgcHVibGljOgoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTaGVldElkU2V0PiYgc2V0U3R5bGVTaGVldElkKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgU3R5bGVTaGVldElkU2V0KSwgcHJvcGVydHlfc3R5bGVTaGVldElkX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3R5bGVTaGVldElkIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0eWxlU2hlZXRJZFNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSdWxlc1NldD4mIHNldFJ1bGVzKC8qUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQ
YXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSdWxlc1NldCksIHByb3BlcnR5X3J1bGVzX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJydWxlcyIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSdWxlc1NldD4oKTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0
eWxlU2hlZXRCb2R5Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQ
YXNzUmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07Cgog
ICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHls
ZVNoZWV0Qm9keT4gcmVzdWx0ID0gQ1NTU3R5bGVTaGVldEJvZHk6OmNyZWF0ZSgpCiAgICAgKiAg
ICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAgLnNldFJ1bGVzKC4uLik7CiAgICAg
Ki8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAg
IHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTU3R5bGVTaGVldEJv
ZHkoKSkpOwogICAgfQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJ
dGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewog
ICAgICAgIHRoaXMtPnNldFN0cmluZygidGV4dCIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIENTUyBy
dWxlIHJlcHJlc2VudGF0aW9uLiAqLwpjbGFzcyBDU1NSdWxlIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ29yaWdpbicg
d2hpbGUgZ2VuZXJhdGluZyBDU1NSdWxlLgogICAgc3RydWN0IE9yaWdpbiB7CiAgICAgICAgZW51
bSBFbnVtIHsKICAgICAgICAgICAgVXNlciA9IDQwLAogICAgICAgICAgICBVc2VyX2FnZW50ID0g
NDEsCiAgICAgICAgICAgIEluc3BlY3RvciA9IDQyLAogICAgICAgICAgICBSZWd1bGFyID0gNDMs
CiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBPcmlnaW4KCiAgICBlbnVtIHsKICAgICAgICBO
b0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU2VsZWN0b3JUZXh0U2V0ID0gMSA8PCAwLAogICAgICAg
IFNvdXJjZUxpbmVTZXQgPSAxIDw8IDEsCiAgICAgICAgT3JpZ2luU2V0ID0gMSA8PCAyLAogICAg
ICAgIFN0eWxlU2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChTZWxlY3RvclRl
eHRTZXQgfCBTb3VyY2VMaW5lU2V0IHwgT3JpZ2luU2V0IHwgU3R5bGVTZXQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NSdWxlPiBw
dHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxk
c1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9y
ZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDU1NSdWxlOwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VsZWN0b3JUZXh0U2V0PiYgc2V0U2Vs
ZWN0b3JUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgU2VsZWN0b3JUZXh0U2V0KSwgcHJvcGVydHlfc2VsZWN0b3JU
ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic2VsZWN0
b3JUZXh0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNlbGVjdG9yVGV4
dFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTb3VyY2VMaW5lU2V0
PiYgc2V0U291cmNlTGluZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgU291cmNlTGluZVNldCksIHByb3BlcnR5X3NvdXJjZUxpbmVfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzb3VyY2VMaW5lIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNvdXJjZUxpbmVTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgT3JpZ2luU2V0PiYgc2V0T3JpZ2luKE9y
aWdpbjo6RW51bSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBPcmlnaW5TZXQpLCBwcm9wZXJ0eV9vcmlnaW5fYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJvcmlnaW4iLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2
YWx1ZSkpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE9yaWdpblNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPcmlnaW5TZXQ+JiBzZXRPcmlnaW4oY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBPcmlnaW5TZXQpLCBwcm9wZXJ0eV9vcmlnaW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJvcmlnaW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8T3JpZ2luU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFN0eWxlU2V0PiYgc2V0U3R5bGUoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OkNT
U1N0eWxlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdHlsZVNldCksIHByb3BlcnR5X3N0
eWxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgic3R5bGUi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTUnVsZT4mICgpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19u
b3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENT
U1J1bGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8Q1NTUnVsZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTUnVs
ZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NSdWxlPiByZXN1bHQgPSBDU1NSdWxlOjpjcmVhdGUo
KQogICAgICogICAgIC5zZXRTZWxlY3RvclRleHQoLi4uKQogICAgICogICAgIC5zZXRTb3VyY2VM
aW5lKC4uLikKICAgICAqICAgICAuc2V0T3JpZ2luKC4uLikKICAgICAqICAgICAuc2V0U3R5bGUo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NS
dWxlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMg
SXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFJ1bGVJZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
OkNTUzo6Q1NTUnVsZUlkPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJ1bGVJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2
b2lkIHNldFNvdXJjZVVSTChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldFN0cmluZygic291cmNlVVJMIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U2VsZWN0
b3JSYW5nZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6U291cmNlUmFuZ2U+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9i
amVjdCgic2VsZWN0b3JSYW5nZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE1lZGlhKC8q
UGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTTWVkaWEg
PiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0QXJyYXkoIm1lZGlhIiwgdmFsdWUpOwogICAgfQp9OwoKLyogVGV4dCByYW5nZSB3aXRo
aW4gYSByZXNvdXJjZS4gKi8KY2xhc3MgU291cmNlUmFuZ2UgOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IFN0YXJ0U2V0ID0gMSA8PCAwLAogICAgICAgIEVuZFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoU3RhcnRTZXQgfCBFbmRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTb3VyY2VSYW5nZT4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxk
ZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRy
OwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU291cmNlUmFuZ2U7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTdGFydFNldD4mIHNldFN0YXJ0KGludCB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdGFydFNldCks
IHByb3BlcnR5X3N0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51
bWJlcigic3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3RhcnRT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRW5kU2V0PiYgc2V0RW5k
KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBFbmRTZXQpLCBwcm9wZXJ0eV9lbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0TnVtYmVyKCJlbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
RW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNvdXJjZVJhbmdl
PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZp
ZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxSZWZQdHI8U291cmNlUmFuZ2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U291cmNlUmFuZ2U+ICgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gUmVmUHRyPFNvdXJjZVJhbmdlPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNv
dXJjZVJhbmdlPiByZXN1bHQgPSBTb3VyY2VSYW5nZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0
U3RhcnQoLi4uKQogICAgICogICAgIC5zZXRFbmQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBTb3VyY2VSYW5nZSgpKSk7CiAgICB9CiAgICB0eXBl
ZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgpjbGFzcyBD
U1NDb21wdXRlZFN0eWxlUHJvcGVydHkgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGlj
OgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAx
IDw8IDAsCiAgICAgICAgVmFsdWVTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0g
KE5hbWVTZXQgfCBWYWx1ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZVByb3Bl
cnR5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFtZVNldD4mIHNldE5h
bWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBWYWx1ZVNldD4mIHNldFZhbHVlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVmFsdWVTZXQpLCBwcm9wZXJ0eV92
YWx1ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZhbHVl
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFZhbHVlU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4m
ICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVs
ZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4qPigmbV9yZXN1bHQpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJv
cGVydHk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU0NvbXB1dGVk
U3R5bGVQcm9wZXJ0eT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVy
dHk+IHJlc3VsdCA9IENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eTo6Y3JlYXRlKCkKICAgICAqICAg
ICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFZhbHVlKC4uLik7CiAgICAgKi8KICAgIHN0
YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBC
dWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5
KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRl
bVRyYWl0czsKfTsKCi8qIENTUyBzdHlsZSByZXByZXNlbnRhdGlvbi4gKi8KY2xhc3MgQ1NTU3R5
bGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAg
Tm9GaWVsZHNTZXQgPSAwLAogICAgICAgIENzc1Byb3BlcnRpZXNTZXQgPSAxIDw8IDAsCiAgICAg
ICAgU2hvcnRoYW5kRW50cmllc1NldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAo
Q3NzUHJvcGVydGllc1NldCB8IFNob3J0aGFuZEVudHJpZXNTZXQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NTdHlsZT4gcHRyKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQs
IGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0
ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGU7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDc3NQcm9wZXJ0aWVzU2V0PiYgc2V0Q3NzUHJv
cGVydGllcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpDU1M6
OkNTU1Byb3BlcnR5ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENzc1Byb3BlcnRpZXNT
ZXQpLCBwcm9wZXJ0eV9jc3NQcm9wZXJ0aWVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldEFycmF5KCJjc3NQcm9wZXJ0aWVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPENzc1Byb3BlcnRpZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgU2hvcnRoYW5kRW50cmllc1NldD4mIHNldFNob3J0aGFuZEVudHJpZXMoLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxJbnNwZWN0b3JPYmplY3QgPiA+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgU2hvcnRoYW5kRW50cmllc1NldCksIHByb3BlcnR5X3Nob3J0aGFu
ZEVudHJpZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInNo
b3J0aGFuZEVudHJpZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2hv
cnRoYW5kRW50cmllc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxD
U1NTdHlsZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NT
dHlsZT4gcmVzdWx0ID0gQ1NTU3R5bGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldENzc1Byb3Bl
cnRpZXMoLi4uKQogICAgICogICAgIC5zZXRTaG9ydGhhbmRFbnRyaWVzKC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTU3R5bGUoKSkpOwogICAg
fQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoK
ICAgIHZvaWQgc2V0U3R5bGVJZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5
bGVJZD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0T2JqZWN0KCJzdHlsZUlkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0Q3Nz
VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygi
Y3NzVGV4dCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJhbmdlKC8qUGFzc1JlZlB0cjxU
eXBlQnVpbGRlcjo6Q1NTOjpTb3VyY2VSYW5nZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJyYW5nZSIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldFdpZHRoKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0U3RyaW5nKCJ3aWR0aCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEhl
aWdodChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygi
aGVpZ2h0IiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIHN0eWxlIGVmZmVjdGl2ZSB2aXN1YWwg
ZGltZW5zaW9ucyBhbmQgc291cmNlIG9mZnNldHMuICovCmNsYXNzIENTU1Byb3BlcnR5IDogcHVi
bGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5
IG5hbWUgJ3N0YXR1cycgd2hpbGUgZ2VuZXJhdGluZyBDU1NQcm9wZXJ0eS4KICAgIHN0cnVjdCBT
dGF0dXMgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIEFjdGl2ZSA9IDQ0LAogICAg
ICAgICAgICBJbmFjdGl2ZSA9IDQ1LAogICAgICAgICAgICBEaXNhYmxlZCA9IDQ2LAogICAgICAg
ICAgICBTdHlsZSA9IDQ3LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgU3RhdHVzCgogICAg
ZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAs
CiAgICAgICAgVmFsdWVTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVT
ZXQgfCBWYWx1ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPENTU1Byb3BlcnR5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBDU1NQcm9wZXJ0eTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5
X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1l
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVmFsdWVTZXQ+JiBzZXRWYWx1ZShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFZhbHVlU2V0KSwgcHJvcGVydHlfdmFsdWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxWYWx1ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxD
U1NQcm9wZXJ0eT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1Byb3BlcnR5Pio+KCZtX3Jlc3VsdCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1Byb3BlcnR5PiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NQcm9wZXJ0eT4oKnRoaXMpOwogICAg
ICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAq
IFJlZlB0cjxDU1NQcm9wZXJ0eT4gcmVzdWx0ID0gQ1NTUHJvcGVydHk6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldE5hbWUoLi4uKQogICAgICogICAgIC5zZXRWYWx1ZSguLi4pOwogICAgICovCiAg
ICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1
cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENTU1Byb3BlcnR5KCkpKTsKICAg
IH0KICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsK
CiAgICB2b2lkIHNldFByaW9yaXR5KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJwcmlvcml0eSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldElt
cGxpY2l0KGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigiaW1wbGlj
aXQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0UGFyc2VkT2soYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29s
ZWFuKCJwYXJzZWRPayIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YXR1cyhTdGF0dXM6
OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCBnZXRF
bnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhdHVzKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCB2
YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTaG9ydGhhbmROYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzaG9ydGhhbmROYW1lIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0UmFuZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6
OlNvdXJjZVJhbmdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJhbmdlIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NT
IG1lZGlhIHF1ZXJ5IGRlc2NyaXB0b3IuICovCmNsYXNzIENTU01lZGlhIDogcHVibGljIEluc3Bl
Y3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3Nv
dXJjZScgd2hpbGUgZ2VuZXJhdGluZyBDU1NNZWRpYS4KICAgIHN0cnVjdCBTb3VyY2UgewogICAg
ICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIE1lZGlhUnVsZSA9IDQ4LAogICAgICAgICAgICBJ
bXBvcnRSdWxlID0gNDksCiAgICAgICAgICAgIExpbmtlZFNoZWV0ID0gNTAsCiAgICAgICAgICAg
IElubGluZVNoZWV0ID0gNTEsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBTb3VyY2UKCiAg
ICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVGV4dFNldCA9IDEgPDwg
MCwKICAgICAgICBTb3VyY2VTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFRl
eHRTZXQgfCBTb3VyY2VTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNs
YXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NNZWRpYT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9u
b25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAg
ICAgICBmcmllbmQgY2xhc3MgQ1NTTWVkaWE7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBUZXh0U2V0PiYgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRleHRTZXQpLCBwcm9wZXJ0eV90
ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGV4dCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUZXh0U2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVNldD4mIHNldFNvdXJjZShTb3VyY2U6
OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUp
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNlU2V0PiYgc2V0U291cmNlKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
U291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFNvdXJjZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxD
U1NNZWRpYT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU01lZGlhPio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU01lZGlhPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NNZWRpYT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NN
ZWRpYT4gcmVzdWx0ID0gQ1NTTWVkaWE6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRleHQoLi4u
KQogICAgICogICAgIC5zZXRTb3VyY2UoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NNZWRpYSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVC
dWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRTb3VyY2VV
UkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInNv
dXJjZVVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNvdXJjZUxpbmUoaW50IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigic291cmNlTGluZSIsIHZhbHVlKTsKICAg
IH0KfTsKCi8qIENTUyBzZWxlY3RvciBwcm9maWxlIGVudHJ5LiAqLwpjbGFzcyBTZWxlY3RvclBy
b2ZpbGVFbnRyeSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU2VsZWN0b3JTZXQgPSAxIDw8IDAsCiAg
ICAgICAgVXJsU2V0ID0gMSA8PCAxLAogICAgICAgIExpbmVOdW1iZXJTZXQgPSAxIDw8IDIsCiAg
ICAgICAgVGltZVNldCA9IDEgPDwgMywKICAgICAgICBIaXRDb3VudFNldCA9IDEgPDwgNCwKICAg
ICAgICBNYXRjaENvdW50U2V0ID0gMSA8PCA1LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChTZWxl
Y3RvclNldCB8IFVybFNldCB8IExpbmVOdW1iZXJTZXQgfCBUaW1lU2V0IHwgSGl0Q291bnRTZXQg
fCBNYXRjaENvdW50U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFz
cyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RF
UD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyKFBhc3NSZWZQdHI8U2VsZWN0b3JQcm9maWxlRW50cnk+IHB0cikKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2Ny
ZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAg
ICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNlbGVjdG9yUHJvZmlsZUVudHJ5OwogICAgcHVi
bGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VsZWN0b3JTZXQ+JiBzZXRTZWxlY3Rvcihj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFNlbGVjdG9yU2V0KSwgcHJvcGVydHlfc2VsZWN0b3JfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzZWxlY3RvciIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTZWxlY3RvclNldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9w
ZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1
cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExpbmVOdW1iZXJTZXQ+JiBzZXRMaW5lTnVt
YmVyKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBMaW5lTnVtYmVyU2V0KSwgcHJvcGVydHlfbGluZU51bWJlcl9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGluZU51bWJlclNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBUaW1lU2V0PiYgc2V0VGltZShkb3VibGUgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVGltZVNldCksIHByb3Bl
cnR5X3RpbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ0
aW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRpbWVTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSGl0Q291bnRTZXQ+JiBzZXRIaXRDb3Vu
dChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgSGl0Q291bnRTZXQpLCBwcm9wZXJ0eV9oaXRDb3VudF9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImhpdENvdW50IiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPEhpdENvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IE1hdGNoQ291bnRTZXQ+JiBzZXRNYXRjaENvdW50KGludCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYXRjaENvdW50U2V0KSwg
cHJvcGVydHlfbWF0Y2hDb3VudF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXROdW1iZXIoIm1hdGNoQ291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8TWF0Y2hDb3VudFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxT
ZWxlY3RvclByb2ZpbGVFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNl
bGVjdG9yUHJvZmlsZUVudHJ5PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxTZWxlY3RvclByb2ZpbGVFbnRyeT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoK
ICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWxlY3RvclByb2Zp
bGVFbnRyeT4gcmVzdWx0ID0gU2VsZWN0b3JQcm9maWxlRW50cnk6OmNyZWF0ZSgpCiAgICAgKiAg
ICAgLnNldFNlbGVjdG9yKC4uLikKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAu
c2V0TGluZU51bWJlciguLi4pCiAgICAgKiAgICAgLnNldFRpbWUoLi4uKQogICAgICogICAgIC5z
ZXRIaXRDb3VudCguLi4pCiAgICAgKiAgICAgLnNldE1hdGNoQ291bnQoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBTZWxlY3RvclByb2ZpbGVFbnRy
eSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0
ZW1UcmFpdHM7Cn07CgpjbGFzcyBTZWxlY3RvclByb2ZpbGUgOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IFRvdGFsVGltZVNldCA9IDEgPDwgMCwKICAgICAgICBEYXRhU2V0ID0gMSA8PCAxLAogICAgICAg
IEFsbEZpZWxkc1NldCA9IChUb3RhbFRpbWVTZXQgfCBEYXRhU2V0KQogICAgfTsKCiAgICB0ZW1w
bGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBT
VEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhp
cyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VsZWN0b3JQcm9maWxl
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBTZWxlY3RvclBy
b2ZpbGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUb3RhbFRpbWVTZXQ+
JiBzZXRUb3RhbFRpbWUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFRvdGFsVGltZVNldCksIHByb3BlcnR5X3RvdGFsVGltZV9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInRvdGFsVGltZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUb3RhbFRpbWVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRGF0YVNldD4mIHNldERhdGEoLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3RvclByb2ZpbGVF
bnRyeSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEYXRhU2V0KSwgcHJvcGVydHlfZGF0
YV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgiZGF0YSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxEYXRhU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PFNlbGVjdG9yUHJvZmlsZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUGFzc1JlZlB0cjxTZWxlY3RvclByb2ZpbGU+ICgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gUmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07Cgog
ICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWxlY3Rv
clByb2ZpbGU+IHJlc3VsdCA9IFNlbGVjdG9yUHJvZmlsZTo6Y3JlYXRlKCkKICAgICAqICAgICAu
c2V0VG90YWxUaW1lKC4uLikKICAgICAqICAgICAuc2V0RGF0YSguLi4pOwogICAgICovCiAgICBz
dGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNlbGVjdG9yUHJvZmlsZSgpKSk7CiAg
ICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7
Cn07Cgp9IC8vIENTUwoKbmFtZXNwYWNlIFRpbWVsaW5lIHsKLyogVGltZWxpbmUgcmVjb3JkIGNv
bnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNvcmRlZCBhY3Rpdml0eS4gKi8KY2xhc3Mg
VGltZWxpbmVFdmVudCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVHlwZVNldCA9IDEgPDwgMCwKICAg
ICAgICBEYXRhU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0IHwg
RGF0YVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPFRpbWVsaW5lRXZlbnQ+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2lu
aXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAg
ZnJpZW5kIGNsYXNzIFRpbWVsaW5lRXZlbnQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90
eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERhdGFTZXQ+JiBzZXREYXRhKFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBEYXRhU2V0KSwgcHJvcGVydHlfZGF0YV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImRhdGEiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8RGF0YVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxUaW1lbGluZUV2ZW50PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8VGltZWxpbmVFdmVudD4qPigmbV9y
ZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxUaW1lbGluZUV2
ZW50PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxUaW1lbGluZUV2ZW50
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPFRpbWVsaW5lRXZlbnQ+IHJlc3VsdCA9IFRpbWVsaW5lRXZl
bnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXREYXRh
KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQog
ICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgVGlt
ZWxpbmVFdmVudCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVt
VHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRDaGlsZHJlbigvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpUaW1lbGluZTo6VGltZWxpbmVFdmVudCA+ID4q
LyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRBcnJheSgiY2hpbGRyZW4iLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIFRpbWVsaW5lCgojaWYg
RU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCm5hbWVzcGFjZSBEZWJ1Z2dlciB7Ci8qIExvY2F0
aW9uIGluIHRoZSBzb3VyY2UgY29kZS4gKi8KY2xhc3MgTG9jYXRpb24gOiBwdWJsaWMgSW5zcGVj
dG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAog
ICAgICAgIFNjcmlwdElkU2V0ID0gMSA8PCAwLAogICAgICAgIExpbmVOdW1iZXJTZXQgPSAxIDw8
IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFNjcmlwdElkU2V0IHwgTGluZU51bWJlclNldCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PExvY2F0aW9uPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBM
b2NhdGlvbjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNjcmlwdElkU2V0
PiYgc2V0U2NyaXB0SWQoLypjb25zdCBUeXBlQnVpbGRlcjo6RGVidWdnZXI6OlNjcmlwdElkJiov
IGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgU2NyaXB0SWRTZXQpLCBwcm9wZXJ0eV9zY3JpcHRJZF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNjcmlwdElkIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNjcmlwdElkU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IExpbmVOdW1iZXJTZXQ+JiBzZXRMaW5lTnVtYmVyKGludCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMaW5lTnVt
YmVyU2V0KSwgcHJvcGVydHlfbGluZU51bWJlcl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8TGluZU51bWJlclNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFJlZlB0cjxMb2NhdGlvbj4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPExvY2F0aW9uPio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPExvY2F0aW9uPiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxMb2NhdGlvbj4oKnRoaXMpOwogICAgICAg
IH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJl
ZlB0cjxMb2NhdGlvbj4gcmVzdWx0ID0gTG9jYXRpb246OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dFNjcmlwdElkKC4uLikKICAgICAqICAgICAuc2V0TGluZU51bWJlciguLi4pOwogICAgICovCiAg
ICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1
cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IExvY2F0aW9uKCkpKTsKICAgIH0K
ICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAg
ICB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
TnVtYmVyKCJjb2x1bW5OdW1iZXIiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBJbmZvcm1hdGlvbiBh
Ym91dCB0aGUgZnVuY3Rpb24uICovCmNsYXNzIEZ1bmN0aW9uRGV0YWlscyA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAs
CiAgICAgICAgTG9jYXRpb25TZXQgPSAxIDw8IDAsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKExv
Y2F0aW9uU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8RnVuY3Rpb25EZXRhaWxzPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBGdW5jdGlvbkRldGFpbHM7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBMb2NhdGlvblNldD4mIHNldExvY2F0aW9uKC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6RGVidWdnZXI6OkxvY2F0aW9uPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBM
b2NhdGlvblNldCksIHByb3BlcnR5X2xvY2F0aW9uX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE9iamVjdCgibG9jYXRpb24iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8TG9jYXRpb25TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8RnVuY3Rpb25EZXRhaWxzPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RnVuY3Rpb25EZXRhaWxzPio+
KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEZ1bmN0
aW9uRGV0YWlscz4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8RnVuY3Rp
b25EZXRhaWxzPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhl
dGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEZ1bmN0aW9uRGV0YWlscz4gcmVzdWx0ID0g
RnVuY3Rpb25EZXRhaWxzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRMb2NhdGlvbiguLi4pOwog
ICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAg
ICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEZ1bmN0aW9uRGV0
YWlscygpKSk7CiAgICB9CiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRz
IEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQg
c2V0RGlzcGxheU5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRTdHJpbmcoImRpc3BsYXlOYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0SW5mZXJy
ZWROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5n
KCJpbmZlcnJlZE5hbWUiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBKYXZhU2NyaXB0IGNhbGwgZnJh
bWUuIEFycmF5IG9mIGNhbGwgZnJhbWVzIGZvcm0gdGhlIGNhbGwgc3RhY2suICovCmNsYXNzIENh
bGxGcmFtZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgQ2FsbEZyYW1lSWRTZXQgPSAxIDw8IDAsCiAg
ICAgICAgRnVuY3Rpb25OYW1lU2V0ID0gMSA8PCAxLAogICAgICAgIExvY2F0aW9uU2V0ID0gMSA8
PCAyLAogICAgICAgIFNjb3BlQ2hhaW5TZXQgPSAxIDw8IDMsCiAgICAgICAgVGhpc1NldCA9IDEg
PDwgNCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoQ2FsbEZyYW1lSWRTZXQgfCBGdW5jdGlvbk5h
bWVTZXQgfCBMb2NhdGlvblNldCB8IFNjb3BlQ2hhaW5TZXQgfCBUaGlzU2V0KQogICAgfTsKCiAg
ICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRl
PGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+
Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q2FsbEZyYW1l
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDYWxsRnJhbWU7
CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDYWxsRnJhbWVJZFNldD4mIHNl
dENhbGxGcmFtZUlkKC8qY29uc3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpDYWxsRnJhbWVJZCYq
LyBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIENhbGxGcmFtZUlkU2V0KSwgcHJvcGVydHlfY2FsbEZyYW1lSWRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJjYWxsRnJhbWVJZCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDYWxsRnJhbWVJZFNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGdW5jdGlvbk5hbWVTZXQ+JiBzZXRGdW5j
dGlvbk5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBGdW5jdGlvbk5hbWVTZXQpLCBwcm9wZXJ0eV9mdW5jdGlvbk5h
bWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmdW5jdGlv
bk5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnVuY3Rpb25OYW1l
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExvY2F0aW9uU2V0PiYg
c2V0TG9jYXRpb24oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6TG9jYXRpb24+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExvY2F0aW9uU2V0KSwgcHJvcGVydHlfbG9jYXRp
b25fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJsb2NhdGlv
biIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMb2NhdGlvblNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTY29wZUNoYWluU2V0PiYgc2V0U2Nv
cGVDaGFpbigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpEZWJ1
Z2dlcjo6U2NvcGUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2NvcGVDaGFpblNldCks
IHByb3BlcnR5X3Njb3BlQ2hhaW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0QXJyYXkoInNjb3BlQ2hhaW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8U2NvcGVDaGFpblNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBU
aGlzU2V0PiYgc2V0VGhpcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90
ZU9iamVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVGhpc1NldCksIHByb3BlcnR5X3Ro
aXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJ0aGlzIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRoaXNTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q2FsbEZyYW1lPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2Fs
bEZyYW1lPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVm
UHRyPENhbGxGcmFtZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2Fs
bEZyYW1lPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENhbGxGcmFtZT4gcmVzdWx0ID0gQ2FsbEZyYW1l
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRDYWxsRnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNl
dEZ1bmN0aW9uTmFtZSguLi4pCiAgICAgKiAgICAgLnNldExvY2F0aW9uKC4uLikKICAgICAqICAg
ICAuc2V0U2NvcGVDaGFpbiguLi4pCiAgICAgKiAgICAgLnNldFRoaXMoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWxsRnJhbWUoKSkpOwogICAg
fQogICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9
OwoKLyogU2NvcGUgZGVzY3JpcHRpb24uICovCmNsYXNzIFNjb3BlIDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUn
IHdoaWxlIGdlbmVyYXRpbmcgU2NvcGUuCiAgICBzdHJ1Y3QgVHlwZSB7CiAgICAgICAgZW51bSBF
bnVtIHsKICAgICAgICAgICAgR2xvYmFsID0gNTIsCiAgICAgICAgICAgIExvY2FsID0gNTMsCiAg
ICAgICAgICAgIFdpdGggPSA1NCwKICAgICAgICAgICAgQ2xvc3VyZSA9IDU1LAogICAgICAgICAg
ICBDYXRjaCA9IDU2LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgVHlwZQoKICAgIGVudW0g
ewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAwLAogICAg
ICAgIE9iamVjdFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVHlwZVNldCB8
IE9iamVjdFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPFNjb3BlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0
YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVu
ZCBjbGFzcyBTY29wZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVT
ZXQ+JiBzZXRUeXBlKFR5cGU6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgZ2V0RW51bUNvbnN0YW50
VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgT2Jq
ZWN0U2V0PiYgc2V0T2JqZWN0KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVt
b3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPYmplY3RTZXQpLCBwcm9wZXJ0
eV9vYmplY3RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJv
YmplY3QiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T2JqZWN0U2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNjb3BlPiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8U2NvcGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8U2NvcGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNjb3Bl
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPFNjb3BlPiByZXN1bHQgPSBTY29wZTo6Y3JlYXRlKCkKICAg
ICAqICAgICAuc2V0VHlwZSguLi4pCiAgICAgKiAgICAgLnNldE9iamVjdCguLi4pOwogICAgICov
CiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICBy
ZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNjb3BlKCkpKTsKICAgIH0K
ICAgIHR5cGVkZWYgVHlwZUJ1aWxkZXI6OlN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsK
Cn0gLy8gRGVidWdnZXIKCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lm
IEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgRE9NRGVidWdnZXIgewovKiBE
T00gYnJlYWtwb2ludCB0eXBlLiAqLwpzdHJ1Y3QgRE9NQnJlYWtwb2ludFR5cGUgewogICAgZW51
bSBFbnVtIHsKICAgICAgICBTdWJ0cmVlX21vZGlmaWVkID0gNTcsCiAgICAgICAgQXR0cmlidXRl
X21vZGlmaWVkID0gNTgsCiAgICAgICAgTm9kZV9yZW1vdmVkID0gNTksCiAgICB9Owp9OyAvLyBz
dHJ1Y3QgRE9NQnJlYWtwb2ludFR5cGUKCn0gLy8gRE9NRGVidWdnZXIKCiNlbmRpZiAvLyBFTkFC
TEUoSkFWQVNDUklQVF9ERUJVR0dFUikKCn0gLy8gbmFtZXNwYWNlIFR5cGVCdWlsZGVyCgoKfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQoKI2VuZGlmIC8vIEVOQUJMRShJTlNQRUNUT1IpCgojZW5kaWYg
Ly8gIWRlZmluZWQoSW5zcGVjdG9yVHlwZUJ1aWxkZXJfaCkKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>125854</attachid>
            <date>2012-02-07 09:01:57 -0800</date>
            <delta_ts>2012-02-07 14:37:09 -0800</delta_ts>
            <desc>new InspectorTypeBuilder.cpp</desc>
            <filename>InspectorTypeBuilder.cpp</filename>
            <type>text/plain</type>
            <size>7945</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgoKCiNpbmNsdWRlICJjb25maWcuaCIKI2lmIEVOQUJMRShJTlNQRUNU
T1IpCgojaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIKCm5hbWVzcGFjZSBXZWJDb3Jl
IHsKCm5hbWVzcGFjZSBUeXBlQnVpbGRlciB7Cgpjb25zdCBjaGFyKiBjb25zdCBlbnVtX2NvbnN0
YW50X3ZhbHVlc1tdID0gewogICAgIkRvY3VtZW50IiwKICAgICJTdHlsZXNoZWV0IiwKICAgICJJ
bWFnZSIsCiAgICAiRm9udCIsCiAgICAiU2NyaXB0IiwKICAgICJYSFIiLAogICAgIldlYlNvY2tl
dCIsCiAgICAiT3RoZXIiLAogICAgIm9iamVjdCIsCiAgICAiZnVuY3Rpb24iLAogICAgInVuZGVm
aW5lZCIsCiAgICAic3RyaW5nIiwKICAgICJudW1iZXIiLAogICAgImJvb2xlYW4iLAogICAgImFy
cmF5IiwKICAgICJudWxsIiwKICAgICJub2RlIiwKICAgICJyZWdleHAiLAogICAgImRhdGUiLAog
ICAgImh0bWwiLAogICAgIndtbCIsCiAgICAieG1sIiwKICAgICJqYXZhc2NyaXB0IiwKICAgICJu
ZXR3b3JrIiwKICAgICJjb25zb2xlLWFwaSIsCiAgICAib3RoZXIiLAogICAgInRpcCIsCiAgICAi
bG9nIiwKICAgICJ3YXJuaW5nIiwKICAgICJlcnJvciIsCiAgICAiZGVidWciLAogICAgImRpciIs
CiAgICAiZGlyeG1sIiwKICAgICJ0cmFjZSIsCiAgICAic3RhcnRHcm91cCIsCiAgICAic3RhcnRH
cm91cENvbGxhcHNlZCIsCiAgICAiZW5kR3JvdXAiLAogICAgImFzc2VydCIsCiAgICAicGFyc2Vy
IiwKICAgICJzY3JpcHQiLAogICAgInVzZXIiLAogICAgInVzZXItYWdlbnQiLAogICAgImluc3Bl
Y3RvciIsCiAgICAicmVndWxhciIsCiAgICAiYWN0aXZlIiwKICAgICJpbmFjdGl2ZSIsCiAgICAi
ZGlzYWJsZWQiLAogICAgInN0eWxlIiwKICAgICJtZWRpYVJ1bGUiLAogICAgImltcG9ydFJ1bGUi
LAogICAgImxpbmtlZFNoZWV0IiwKICAgICJpbmxpbmVTaGVldCIsCiAgICAiZ2xvYmFsIiwKICAg
ICJsb2NhbCIsCiAgICAid2l0aCIsCiAgICAiY2xvc3VyZSIsCiAgICAiY2F0Y2giLAogICAgInN1
YnRyZWUtbW9kaWZpZWQiLAogICAgImF0dHJpYnV0ZS1tb2RpZmllZCIsCiAgICAibm9kZS1yZW1v
dmVkIiwKICAgICJET00iLAogICAgIkV2ZW50TGlzdGVuZXIiLAogICAgImV4Y2VwdGlvbiIKfTsK
ClN0cmluZyBnZXRFbnVtQ29uc3RhbnRWYWx1ZShpbnQgY29kZSkgewogICAgcmV0dXJuIGVudW1f
Y29uc3RhbnRfdmFsdWVzW2NvZGVdOwp9Cgp9IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgoKI2lm
ICFBU1NFUlRfRElTQUJMRUQKCnN0YXRpYyB2b2lkIGFzc2VydEFueShJbnNwZWN0b3JWYWx1ZSog
dmFsdWUpCnsKICAgIC8vIE5vLW9wLgp9CgoKc3RhdGljIHZvaWQgYXNzZXJ0U3RyaW5nKEluc3Bl
Y3RvclZhbHVlKiB2YWx1ZSkKewogICAgU3RyaW5nIHY7CiAgICBib29sIGNhc3RSZXMgPSB2YWx1
ZS0+YXNTdHJpbmcoJnYpOwogICAgQVNTRVJUX1VOVVNFRChjYXN0UmVzLCBjYXN0UmVzKTsKfQoK
CnN0YXRpYyB2b2lkIGFzc2VydEJvb2xlYW4oSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAgICBi
b29sIHY7CiAgICBib29sIGNhc3RSZXMgPSB2YWx1ZS0+YXNCb29sZWFuKCZ2KTsKICAgIEFTU0VS
VF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7Cn0KCgpzdGF0aWMgdm9pZCBhc3NlcnRJbnQoSW5z
cGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAgICBpbnQgdjsKICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVl
LT5hc051bWJlcigmdik7CiAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwp9CgoK
dm9pZCBUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0OjpUeXBlOjphc3NlcnRDb3Jy
ZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAgICBXVEY6OlN0cmluZyBzOwogICAg
Ym9vbCBjYXN0X3JlcyA9IHZhbHVlLT5hc1N0cmluZygmcyk7CiAgICBBU1NFUlQoY2FzdF9yZXMp
OwogICAgQVNTRVJUKHMgPT0gIm9iamVjdCIgfHwgcyA9PSAiZnVuY3Rpb24iIHx8IHMgPT0gInVu
ZGVmaW5lZCIgfHwgcyA9PSAic3RyaW5nIiB8fCBzID09ICJudW1iZXIiIHx8IHMgPT0gImJvb2xl
YW4iKTsKfQoKCnZvaWQgVHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVjdDo6U3VidHlw
ZTo6YXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkKewogICAgV1RGOjpT
dHJpbmcgczsKICAgIGJvb2wgY2FzdF9yZXMgPSB2YWx1ZS0+YXNTdHJpbmcoJnMpOwogICAgQVNT
RVJUKGNhc3RfcmVzKTsKICAgIEFTU0VSVChzID09ICJhcnJheSIgfHwgcyA9PSAibnVsbCIgfHwg
cyA9PSAibm9kZSIgfHwgcyA9PSAicmVnZXhwIiB8fCBzID09ICJkYXRlIik7Cn0KCgp2b2lkIFR5
cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q6OmFzc2VydENvcnJlY3RWYWx1ZShJbnNw
ZWN0b3JWYWx1ZSogdmFsdWUpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdDsK
ICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc09iamVjdCgmb2JqZWN0KTsKICAgIEFTU0VSVF9V
TlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0Ojpp
dGVyYXRvciB0eXBlUG9zOwogICAgICAgIHR5cGVQb3MgPSBvYmplY3QtPmZpbmQoInR5cGUiKTsK
ICAgICAgICBBU1NFUlQodHlwZVBvcyAhPSBvYmplY3QtPmVuZCgpKTsKICAgICAgICBUeXBlOjph
c3NlcnRDb3JyZWN0VmFsdWUodHlwZVBvcy0+c2Vjb25kLmdldCgpKTsKICAgIH0KICAgIGludCBm
b3VuZFByb3BlcnRpZXNDb3VudCA9IDE7CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0Ojpp
dGVyYXRvciBzdWJ0eXBlUG9zOwogICAgICAgIHN1YnR5cGVQb3MgPSBvYmplY3QtPmZpbmQoInN1
YnR5cGUiKTsKICAgICAgICBpZiAoc3VidHlwZVBvcyAhPSBvYmplY3QtPmVuZCgpKSB7CiAgICAg
ICAgICAgIFN1YnR5cGU6OmFzc2VydENvcnJlY3RWYWx1ZShzdWJ0eXBlUG9zLT5zZWNvbmQuZ2V0
KCkpOwogICAgICAgICAgICArK2ZvdW5kUHJvcGVydGllc0NvdW50OwogICAgfQogICAgfQogICAg
ewogICAgICAgIEluc3BlY3Rvck9iamVjdDo6aXRlcmF0b3IgY2xhc3NOYW1lUG9zOwogICAgICAg
IGNsYXNzTmFtZVBvcyA9IG9iamVjdC0+ZmluZCgiY2xhc3NOYW1lIik7CiAgICAgICAgaWYgKGNs
YXNzTmFtZVBvcyAhPSBvYmplY3QtPmVuZCgpKSB7CiAgICAgICAgICAgIGFzc2VydFN0cmluZyhj
bGFzc05hbWVQb3MtPnNlY29uZC5nZXQoKSk7CiAgICAgICAgICAgICsrZm91bmRQcm9wZXJ0aWVz
Q291bnQ7CiAgICB9CiAgICB9CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRv
ciB2YWx1ZVBvczsKICAgICAgICB2YWx1ZVBvcyA9IG9iamVjdC0+ZmluZCgidmFsdWUiKTsKICAg
ICAgICBpZiAodmFsdWVQb3MgIT0gb2JqZWN0LT5lbmQoKSkgewogICAgICAgICAgICBhc3NlcnRB
bnkodmFsdWVQb3MtPnNlY29uZC5nZXQoKSk7CiAgICAgICAgICAgICsrZm91bmRQcm9wZXJ0aWVz
Q291bnQ7CiAgICB9CiAgICB9CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRv
ciBkZXNjcmlwdGlvblBvczsKICAgICAgICBkZXNjcmlwdGlvblBvcyA9IG9iamVjdC0+ZmluZCgi
ZGVzY3JpcHRpb24iKTsKICAgICAgICBpZiAoZGVzY3JpcHRpb25Qb3MgIT0gb2JqZWN0LT5lbmQo
KSkgewogICAgICAgICAgICBhc3NlcnRTdHJpbmcoZGVzY3JpcHRpb25Qb3MtPnNlY29uZC5nZXQo
KSk7CiAgICAgICAgICAgICsrZm91bmRQcm9wZXJ0aWVzQ291bnQ7CiAgICB9CiAgICB9CiAgICB7
CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRvciBvYmplY3RJZFBvczsKICAgICAgICBv
YmplY3RJZFBvcyA9IG9iamVjdC0+ZmluZCgib2JqZWN0SWQiKTsKICAgICAgICBpZiAob2JqZWN0
SWRQb3MgIT0gb2JqZWN0LT5lbmQoKSkgewogICAgICAgICAgICBhc3NlcnRTdHJpbmcob2JqZWN0
SWRQb3MtPnNlY29uZC5nZXQoKSk7CiAgICAgICAgICAgICsrZm91bmRQcm9wZXJ0aWVzQ291bnQ7
CiAgICB9CiAgICB9CiAgICBBU1NFUlQoZm91bmRQcm9wZXJ0aWVzQ291bnQgPT0gb2JqZWN0LT5z
aXplKCkpOwp9CgoKdm9pZCBUeXBlQnVpbGRlcjo6UnVudGltZTo6UHJvcGVydHlEZXNjcmlwdG9y
Ojphc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBvYmplY3Q7CiAgICBib29sIGNhc3RSZXMgPSB2YWx1ZS0+YXNPYmpl
Y3QoJm9iamVjdCk7CiAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwogICAgewog
ICAgICAgIEluc3BlY3Rvck9iamVjdDo6aXRlcmF0b3IgbmFtZVBvczsKICAgICAgICBuYW1lUG9z
ID0gb2JqZWN0LT5maW5kKCJuYW1lIik7CiAgICAgICAgQVNTRVJUKG5hbWVQb3MgIT0gb2JqZWN0
LT5lbmQoKSk7CiAgICAgICAgYXNzZXJ0U3RyaW5nKG5hbWVQb3MtPnNlY29uZC5nZXQoKSk7CiAg
ICB9CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRvciB3cml0YWJsZVBvczsK
ICAgICAgICB3cml0YWJsZVBvcyA9IG9iamVjdC0+ZmluZCgid3JpdGFibGUiKTsKICAgICAgICBB
U1NFUlQod3JpdGFibGVQb3MgIT0gb2JqZWN0LT5lbmQoKSk7CiAgICAgICAgYXNzZXJ0Qm9vbGVh
bih3cml0YWJsZVBvcy0+c2Vjb25kLmdldCgpKTsKICAgIH0KICAgIHsKICAgICAgICBJbnNwZWN0
b3JPYmplY3Q6Oml0ZXJhdG9yIGNvbmZpZ3VyYWJsZVBvczsKICAgICAgICBjb25maWd1cmFibGVQ
b3MgPSBvYmplY3QtPmZpbmQoImNvbmZpZ3VyYWJsZSIpOwogICAgICAgIEFTU0VSVChjb25maWd1
cmFibGVQb3MgIT0gb2JqZWN0LT5lbmQoKSk7CiAgICAgICAgYXNzZXJ0Qm9vbGVhbihjb25maWd1
cmFibGVQb3MtPnNlY29uZC5nZXQoKSk7CiAgICB9CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2Jq
ZWN0OjppdGVyYXRvciBlbnVtZXJhYmxlUG9zOwogICAgICAgIGVudW1lcmFibGVQb3MgPSBvYmpl
Y3QtPmZpbmQoImVudW1lcmFibGUiKTsKICAgICAgICBBU1NFUlQoZW51bWVyYWJsZVBvcyAhPSBv
YmplY3QtPmVuZCgpKTsKICAgICAgICBhc3NlcnRCb29sZWFuKGVudW1lcmFibGVQb3MtPnNlY29u
ZC5nZXQoKSk7CiAgICB9CiAgICBpbnQgZm91bmRQcm9wZXJ0aWVzQ291bnQgPSA0OwogICAgewog
ICAgICAgIEluc3BlY3Rvck9iamVjdDo6aXRlcmF0b3IgdmFsdWVQb3M7CiAgICAgICAgdmFsdWVQ
b3MgPSBvYmplY3QtPmZpbmQoInZhbHVlIik7CiAgICAgICAgaWYgKHZhbHVlUG9zICE9IG9iamVj
dC0+ZW5kKCkpIHsKICAgICAgICAgICAgVHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVj
dDo6YXNzZXJ0Q29ycmVjdFZhbHVlKHZhbHVlUG9zLT5zZWNvbmQuZ2V0KCkpOwogICAgICAgICAg
ICArK2ZvdW5kUHJvcGVydGllc0NvdW50OwogICAgfQogICAgfQogICAgewogICAgICAgIEluc3Bl
Y3Rvck9iamVjdDo6aXRlcmF0b3IgZ2V0UG9zOwogICAgICAgIGdldFBvcyA9IG9iamVjdC0+Zmlu
ZCgiZ2V0Iik7CiAgICAgICAgaWYgKGdldFBvcyAhPSBvYmplY3QtPmVuZCgpKSB7CiAgICAgICAg
ICAgIFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q6OmFzc2VydENvcnJlY3RWYWx1
ZShnZXRQb3MtPnNlY29uZC5nZXQoKSk7CiAgICAgICAgICAgICsrZm91bmRQcm9wZXJ0aWVzQ291
bnQ7CiAgICB9CiAgICB9CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRvciBz
ZXRQb3M7CiAgICAgICAgc2V0UG9zID0gb2JqZWN0LT5maW5kKCJzZXQiKTsKICAgICAgICBpZiAo
c2V0UG9zICE9IG9iamVjdC0+ZW5kKCkpIHsKICAgICAgICAgICAgVHlwZUJ1aWxkZXI6OlJ1bnRp
bWU6OlJlbW90ZU9iamVjdDo6YXNzZXJ0Q29ycmVjdFZhbHVlKHNldFBvcy0+c2Vjb25kLmdldCgp
KTsKICAgICAgICAgICAgKytmb3VuZFByb3BlcnRpZXNDb3VudDsKICAgIH0KICAgIH0KICAgIHsK
ICAgICAgICBJbnNwZWN0b3JPYmplY3Q6Oml0ZXJhdG9yIHdhc1Rocm93blBvczsKICAgICAgICB3
YXNUaHJvd25Qb3MgPSBvYmplY3QtPmZpbmQoIndhc1Rocm93biIpOwogICAgICAgIGlmICh3YXNU
aHJvd25Qb3MgIT0gb2JqZWN0LT5lbmQoKSkgewogICAgICAgICAgICBhc3NlcnRCb29sZWFuKHdh
c1Rocm93blBvcy0+c2Vjb25kLmdldCgpKTsKICAgICAgICAgICAgKytmb3VuZFByb3BlcnRpZXND
b3VudDsKICAgIH0KICAgIH0KICAgIEFTU0VSVChmb3VuZFByb3BlcnRpZXNDb3VudCA9PSBvYmpl
Y3QtPnNpemUoKSk7Cn0KCgp2b2lkIFR5cGVCdWlsZGVyOjpDU1M6OkNTU1N0eWxlSWQ6OmFzc2Vy
dENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpCnsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG9iamVjdDsKICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc09iamVjdCgmb2Jq
ZWN0KTsKICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7CiAgICB7CiAgICAgICAg
SW5zcGVjdG9yT2JqZWN0OjppdGVyYXRvciBzdHlsZVNoZWV0SWRQb3M7CiAgICAgICAgc3R5bGVT
aGVldElkUG9zID0gb2JqZWN0LT5maW5kKCJzdHlsZVNoZWV0SWQiKTsKICAgICAgICBBU1NFUlQo
c3R5bGVTaGVldElkUG9zICE9IG9iamVjdC0+ZW5kKCkpOwogICAgICAgIGFzc2VydFN0cmluZyhz
dHlsZVNoZWV0SWRQb3MtPnNlY29uZC5nZXQoKSk7CiAgICB9CiAgICB7CiAgICAgICAgSW5zcGVj
dG9yT2JqZWN0OjppdGVyYXRvciBvcmRpbmFsUG9zOwogICAgICAgIG9yZGluYWxQb3MgPSBvYmpl
Y3QtPmZpbmQoIm9yZGluYWwiKTsKICAgICAgICBBU1NFUlQob3JkaW5hbFBvcyAhPSBvYmplY3Qt
PmVuZCgpKTsKICAgICAgICBhc3NlcnRJbnQob3JkaW5hbFBvcy0+c2Vjb25kLmdldCgpKTsKICAg
IH0KICAgIGludCBmb3VuZFByb3BlcnRpZXNDb3VudCA9IDI7CiAgICBBU1NFUlQoZm91bmRQcm9w
ZXJ0aWVzQ291bnQgPT0gb2JqZWN0LT5zaXplKCkpOwp9CgoKdm9pZCBUeXBlQnVpbGRlcjo6Q1NT
OjpDU1NSdWxlSWQ6OmFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpCnsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdDsKICAgIGJvb2wgY2FzdFJlcyA9IHZh
bHVlLT5hc09iamVjdCgmb2JqZWN0KTsKICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJl
cyk7CiAgICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRvciBzdHlsZVNoZWV0SWRQ
b3M7CiAgICAgICAgc3R5bGVTaGVldElkUG9zID0gb2JqZWN0LT5maW5kKCJzdHlsZVNoZWV0SWQi
KTsKICAgICAgICBBU1NFUlQoc3R5bGVTaGVldElkUG9zICE9IG9iamVjdC0+ZW5kKCkpOwogICAg
ICAgIGFzc2VydFN0cmluZyhzdHlsZVNoZWV0SWRQb3MtPnNlY29uZC5nZXQoKSk7CiAgICB9CiAg
ICB7CiAgICAgICAgSW5zcGVjdG9yT2JqZWN0OjppdGVyYXRvciBvcmRpbmFsUG9zOwogICAgICAg
IG9yZGluYWxQb3MgPSBvYmplY3QtPmZpbmQoIm9yZGluYWwiKTsKICAgICAgICBBU1NFUlQob3Jk
aW5hbFBvcyAhPSBvYmplY3QtPmVuZCgpKTsKICAgICAgICBhc3NlcnRJbnQob3JkaW5hbFBvcy0+
c2Vjb25kLmdldCgpKTsKICAgIH0KICAgIGludCBmb3VuZFByb3BlcnRpZXNDb3VudCA9IDI7CiAg
ICBBU1NFUlQoZm91bmRQcm9wZXJ0aWVzQ291bnQgPT0gb2JqZWN0LT5zaXplKCkpOwp9CgoKCgoj
ZW5kaWYgLy8gIUFTU0VSVF9ESVNBQkxFRAoKfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQoKI2VuZGlm
IC8vIEVOQUJMRShJTlNQRUNUT1IpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125965</attachid>
            <date>2012-02-07 17:38:02 -0800</date>
            <delta_ts>2012-02-08 15:55:55 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77917-20120208053801.patch</filename>
            <type>text/plain</type>
            <size>7234</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2ODI3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOGI3YTI1YWZiMmJkOTEw
MTNkNDc1OWVkZWE0NjNiOTAzMGVmNzY2Zi4uZGYwZTdiOTRkZjI5YTliMTY4MmQ2OGZiZDYyMGNl
NWRkNzdhZDBmZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDEyLTAyLTA2ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBJbiBJbnNwZWN0b3IuanNvbiBQcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGUgc2hvdWxkIGJl
IGRlY2xhcmVkIG9wdGlvbmFsCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03NzkxNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFByb3BlcnR5IGRlc2NyaXB0b3IgaXMgZml4ZWQgaW4gSW5zcGVjdG9yLmpzb24u
IEFsc28gcmV0cm9hY3RpdmVseSBpbgorICAgICAgICAwLjEgYW5kIDEuMC4KKyAgICAgICAgSW5q
ZWN0ZWQgc2NyaXB0IGluIGluc3RydWN0ZWQgdG8gbmV2ZXIgcmV0dXJuIG51bGwgcHJvcGVydHkg
dmFsdWVzLgorCisgICAgICAgICogaW5zcGVjdG9yL0luamVjdGVkU2NyaXB0U291cmNlLmpzOgor
ICAgICAgICAoLik6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3Rvci0wLjEuanNvbjoKKyAg
ICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yLTEuMC5qc29uOgorICAgICAgICAqIGluc3BlY3Rv
ci9JbnNwZWN0b3IuanNvbjoKKwogMjAxMi0wMi0wNiAgRXVnZW5lIEdpcmFyZCAgPGdpcmFyZEBj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW5kZXhlZERCIGNyZWF0ZU9iamVjdFN0b3JlIHNob3Vs
ZCB0aHJvdyBpZiBvcHRpb25zIGFyZyBpcyBpbnZhbGlkCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5qZWN0ZWRTY3JpcHRTb3VyY2UuanMgYi9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5qZWN0ZWRTY3JpcHRTb3VyY2UuanMKaW5kZXggMjcwODlhODg3YjcxNWYxNjc1
MGQ2NTFhY2UxZDA5MDg3M2IyNjI2YS4uZjY5ZWRhZWRlNjFmZDIwYTA0ZDI1Y2Y2Yzg5NGIxMjZl
YWIwOTMwYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luamVjdGVkU2Ny
aXB0U291cmNlLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFNjcmlw
dFNvdXJjZS5qcwpAQCAtMjMwLDcgKzIzMCwxNiBAQCBJbmplY3RlZFNjcmlwdC5wcm90b3R5cGUg
PSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbmFtZVByb2Nl
c3NlZFtuYW1lXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0g
T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIG5hbWUpOwotICAgICAgICAg
ICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRl
c2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBwYXNzIG51bGwg
dmFsdWVzIC0tIG91ciBwcm90b2NvbCBmb3JtYWwgdHlwZSBzeXN0ZW0gaGFzIGEgcHJvYmxlbSB3
aXRoIG51bGwuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxldGUgcHJvcGVydHkgY29t
cGxldGVseSBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXNj
cmlwdG9yLmdldCAhPSAiZnVuY3Rpb24iKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGVsZXRlIGRlc2NyaXB0b3IuZ2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPSAiZnVuY3Rpb24i
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRlc2NyaXB0b3Iuc2V0Owor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewog
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFsbCBiaW5kaW5ncyBwcm92aWRlIHByb3Bl
ciBkZXNjcmlwdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSB3cml0YWJsZSwgY29uZmlndXJhYmxlIHBy
b3BlcnR5LgogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IG9iamVjdFtu
YW1lXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBm
YWxzZX0pOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci0w
LjEuanNvbiBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3ItMC4xLmpzb24KaW5k
ZXggMDA4NmQ5YTU4ZWYxNWVjOTA5ZjQ2NjgyNWRjY2Q4ZjQ0NGEwMzI3MC4uYTVjMDMwMzVjYTRl
YjkxMDQwZTE5Mzg2ZjBhMDAzMWJiZTAxOTZmNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
aW5zcGVjdG9yL0luc3BlY3Rvci0wLjEuanNvbgorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvSW5zcGVjdG9yLTAuMS5qc29uCkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICAgICAgICAgICAg
ICAicHJvcGVydGllcyI6IFsKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJuYW1lIiwg
InR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIlByb3BlcnR5IG5hbWUuIiB9LAogICAg
ICAgICAgICAgICAgICAgICB7ICJuYW1lIjogInZhbHVlIiwgIiRyZWYiOiAiUmVtb3RlT2JqZWN0
IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIlRoZSB2YWx1ZSBhc3NvY2lhdGVk
IHdpdGggdGhlIHByb3BlcnR5LiIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJ3
cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUg
dmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCAoZGF0YSBk
ZXNjcmlwdG9ycyBvbmx5KS4iIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAid3Jp
dGFibGUiLCAidHlwZSI6ICJib29sZWFuIiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9u
IjogIlRydWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbWF5IGJl
IGNoYW5nZWQgKGRhdGEgZGVzY3JpcHRvcnMgb25seSkuIiB9LAogICAgICAgICAgICAgICAgICAg
ICB7ICJuYW1lIjogImdldCIsICIkcmVmIjogIlJlbW90ZU9iamVjdCIsICJvcHRpb25hbCI6IHRy
dWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0aW9uIHdoaWNoIHNlcnZlcyBhcyBhIGdldHRlciBm
b3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGlmIHRoZXJlIGlzIG5v
IGdldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRvcnMgb25seSkuIiB9LAogICAgICAgICAgICAgICAg
ICAgICB7ICJuYW1lIjogInNldCIsICIkcmVmIjogIlJlbW90ZU9iamVjdCIsICJvcHRpb25hbCI6
IHRydWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0aW9uIHdoaWNoIHNlcnZlcyBhcyBhIHNldHRl
ciBmb3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGlmIHRoZXJlIGlz
IG5vIHNldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRvcnMgb25seSkuIiB9LAogICAgICAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogImNvbmZpZ3VyYWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAiZGVz
Y3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5IGRlc2NyaXB0b3Ig
bWF5IGJlIGNoYW5nZWQgYW5kIGlmIHRoZSBwcm9wZXJ0eSBtYXkgYmUgZGVsZXRlZCBmcm9tIHRo
ZSBjb3JyZXNwb25kaW5nIG9iamVjdC4iIH0sCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9yLTEuMC5qc29uIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3Rvci0xLjAuanNvbgppbmRleCAxZDNjYmRjMDIwYjA0ZWIzZTFlNDg0YWIyMWQ2ZWYwMmE3
NmI5NjJmLi5lMTllN2UwNjA5MWJjYzU1MTNiMmQ3MWI0MzMxOWRjYjBlYWJmZjE2IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yLTEuMC5qc29uCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3ItMS4wLmpzb24KQEAgLTM3Niw3ICszNzYs
NyBAQAogICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogWwogICAgICAgICAgICAgICAgICAg
ICB7ICJuYW1lIjogIm5hbWUiLCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAiUHJv
cGVydHkgbmFtZS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAidmFsdWUiLCAi
JHJlZiI6ICJSZW1vdGVPYmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAi
VGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkuIiB9LAotICAgICAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogIndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlw
dGlvbiI6ICJUcnVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG1h
eSBiZSBjaGFuZ2VkIChkYXRhIGRlc2NyaXB0b3JzIG9ubHkpLiIgfSwKKyAgICAgICAgICAgICAg
ICAgICAgeyAibmFtZSI6ICJ3cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAib3B0aW9uYWwi
OiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRo
IHRoZSBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5KS4iIH0s
CiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiZ2V0IiwgIiRyZWYiOiAiUmVtb3RlT2Jq
ZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gd2hpY2gg
c2VydmVzIGFzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVmaW5lZDwv
Y29kZT4gaWYgdGhlcmUgaXMgbm8gZ2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbmx5KS4i
IH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAic2V0IiwgIiRyZWYiOiAiUmVtb3Rl
T2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gd2hp
Y2ggc2VydmVzIGFzIGEgc2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVmaW5l
ZDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbmx5
KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiY29uZmlndXJhYmxlIiwgInR5
cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB0eXBlIG9mIHRoaXMg
cHJvcGVydHkgZGVzY3JpcHRvciBtYXkgYmUgY2hhbmdlZCBhbmQgaWYgdGhlIHByb3BlcnR5IG1h
eSBiZSBkZWxldGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LiIgfSwKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3IuanNvbiBiL1NvdXJjZS9XZWJD
b3JlL2luc3BlY3Rvci9JbnNwZWN0b3IuanNvbgppbmRleCAzMWU4ZDhhMTEwMmRiZWE4MmViMjkz
NjAwZjNkNTNkN2NhMjU3NTcyLi44NDIxOTYyNTA0MTAwMjM0YTcxM2MzZGMwNGYxODAxZTMyZDMz
ZWJlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yLmpzb24K
KysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci5qc29uCkBAIC0zNzcsNyAr
Mzc3LDcgQEAKICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IFsKICAgICAgICAgICAgICAg
ICAgICAgeyAibmFtZSI6ICJuYW1lIiwgInR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjog
IlByb3BlcnR5IG5hbWUuIiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogInZhbHVl
IiwgIiRyZWYiOiAiUmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9u
IjogIlRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5LiIgfSwKLSAgICAgICAg
ICAgICAgICAgICAgeyAibmFtZSI6ICJ3cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAiZGVz
Y3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0
eSBtYXkgYmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCisgICAgICAgICAg
ICAgICAgICAgIHsgIm5hbWUiOiAid3JpdGFibGUiLCAidHlwZSI6ICJib29sZWFuIiwgIm9wdGlv
bmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIlRydWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQg
d2l0aCB0aGUgcHJvcGVydHkgbWF5IGJlIGNoYW5nZWQgKGRhdGEgZGVzY3JpcHRvcnMgb25seSku
IiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogImdldCIsICIkcmVmIjogIlJlbW90
ZU9iamVjdCIsICJvcHRpb25hbCI6IHRydWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0aW9uIHdo
aWNoIHNlcnZlcyBhcyBhIGdldHRlciBmb3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51bmRlZmlu
ZWQ8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGdldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRvcnMgb25s
eSkuIiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogInNldCIsICIkcmVmIjogIlJl
bW90ZU9iamVjdCIsICJvcHRpb25hbCI6IHRydWUsICJkZXNjcmlwdGlvbiI6ICJBIGZ1bmN0aW9u
IHdoaWNoIHNlcnZlcyBhcyBhIHNldHRlciBmb3IgdGhlIHByb3BlcnR5LCBvciA8Y29kZT51bmRl
ZmluZWQ8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHNldHRlciAoYWNjZXNzb3IgZGVzY3JpcHRvcnMg
b25seSkuIiB9LAogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogImNvbmZpZ3VyYWJsZSIs
ICJ0eXBlIjogImJvb2xlYW4iLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdHlwZSBvZiB0
aGlzIHByb3BlcnR5IGRlc2NyaXB0b3IgbWF5IGJlIGNoYW5nZWQgYW5kIGlmIHRoZSBwcm9wZXJ0
eSBtYXkgYmUgZGVsZXRlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdC4iIH0sCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126171</attachid>
            <date>2012-02-08 15:56:07 -0800</date>
            <delta_ts>2012-02-09 14:24:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77917-20120209035605.patch</filename>
            <type>text/plain</type>
            <size>7008</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2ODI3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOGI3YTI1YWZiMmJkOTEw
MTNkNDc1OWVkZWE0NjNiOTAzMGVmNzY2Zi4uZGYwZTdiOTRkZjI5YTliMTY4MmQ2OGZiZDYyMGNl
NWRkNzdhZDBmZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDEyLTAyLTA2ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBJbiBJbnNwZWN0b3IuanNvbiBQcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGUgc2hvdWxkIGJl
IGRlY2xhcmVkIG9wdGlvbmFsCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03NzkxNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFByb3BlcnR5IGRlc2NyaXB0b3IgaXMgZml4ZWQgaW4gSW5zcGVjdG9yLmpzb24u
IEFsc28gcmV0cm9hY3RpdmVseSBpbgorICAgICAgICAwLjEgYW5kIDEuMC4KKyAgICAgICAgSW5q
ZWN0ZWQgc2NyaXB0IGluIGluc3RydWN0ZWQgdG8gbmV2ZXIgcmV0dXJuIG51bGwgcHJvcGVydHkg
dmFsdWVzLgorCisgICAgICAgICogaW5zcGVjdG9yL0luamVjdGVkU2NyaXB0U291cmNlLmpzOgor
ICAgICAgICAoLik6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3Rvci0wLjEuanNvbjoKKyAg
ICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yLTEuMC5qc29uOgorICAgICAgICAqIGluc3BlY3Rv
ci9JbnNwZWN0b3IuanNvbjoKKwogMjAxMi0wMi0wNiAgRXVnZW5lIEdpcmFyZCAgPGdpcmFyZEBj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW5kZXhlZERCIGNyZWF0ZU9iamVjdFN0b3JlIHNob3Vs
ZCB0aHJvdyBpZiBvcHRpb25zIGFyZyBpcyBpbnZhbGlkCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5qZWN0ZWRTY3JpcHRTb3VyY2UuanMgYi9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5qZWN0ZWRTY3JpcHRTb3VyY2UuanMKaW5kZXggMjcwODlhODg3YjcxNWYxNjc1
MGQ2NTFhY2UxZDA5MDg3M2IyNjI2YS4uYmU1Yjk5Zjk0NmNmOWVjZTZlY2NhY2Q4Yzg5NzkwYzk2
ZDJlNzZiNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luamVjdGVkU2Ny
aXB0U291cmNlLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFNjcmlw
dFNvdXJjZS5qcwpAQCAtMTg0LDEyICsxODQsMTcgQEAgSW5qZWN0ZWRTY3JpcHQucHJvdG90eXBl
ID0gewogCiAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyAr
K2kpIHsKICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNbaV07Ci0gICAg
ICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXQpCisgICAgICAgICAgICBpZiAoImdldCIgaW4gZGVz
Y3JpcHRvcikKICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldCA9IHRoaXMuX3dyYXBPYmpl
Y3QoZGVzY3JpcHRvci5nZXQsIG9iamVjdEdyb3VwTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZGVz
Y3JpcHRvci5zZXQpCisgICAgICAgICAgICBpZiAoInNldCIgaW4gZGVzY3JpcHRvcikKICAgICAg
ICAgICAgICAgICBkZXNjcmlwdG9yLnNldCA9IHRoaXMuX3dyYXBPYmplY3QoZGVzY3JpcHRvci5z
ZXQsIG9iamVjdEdyb3VwTmFtZSk7CiAgICAgICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlw
dG9yKQogICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSB0aGlzLl93cmFwT2JqZWN0
KGRlc2NyaXB0b3IudmFsdWUsIG9iamVjdEdyb3VwTmFtZSk7CisgICAgICAgICAgICBpZiAoISgi
Y29uZmlndXJhYmxlIiBpbiBkZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9y
LmNvbmZpZ3VyYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCEoImVudW1lcmFibGUiIGlu
IGRlc2NyaXB0b3IpKQorICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZh
bHNlOworICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3Jz
OwogICAgIH0sCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9y
LTAuMS5qc29uIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci0wLjEuanNvbgpp
bmRleCAwMDg2ZDlhNThlZjE1ZWM5MDlmNDY2ODI1ZGNjZDhmNDQ0YTAzMjcwLi5hNWMwMzAzNWNh
NGViOTEwNDBlMTkzODZmMGEwMDMxYmJlMDE5NmY1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yLTAuMS5qc29uCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3ItMC4xLmpzb24KQEAgLTI2NSw3ICsyNjUsNyBAQAogICAgICAgICAgICAg
ICAgICJwcm9wZXJ0aWVzIjogWwogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogIm5hbWUi
LCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgbmFtZS4iIH0sCiAg
ICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAidmFsdWUiLCAiJHJlZiI6ICJSZW1vdGVPYmpl
Y3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiVGhlIHZhbHVlIGFzc29jaWF0
ZWQgd2l0aCB0aGUgcHJvcGVydHkuIiB9LAotICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjog
IndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRo
ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG1heSBiZSBjaGFuZ2VkIChkYXRh
IGRlc2NyaXB0b3JzIG9ubHkpLiIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJ3
cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRp
b24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBtYXkg
YmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCiAgICAgICAgICAgICAgICAg
ICAgIHsgIm5hbWUiOiAiZ2V0IiwgIiRyZWYiOiAiUmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFsIjog
dHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gd2hpY2ggc2VydmVzIGFzIGEgZ2V0dGVy
IGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaWYgdGhlcmUgaXMg
bm8gZ2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCiAgICAgICAgICAgICAg
ICAgICAgIHsgIm5hbWUiOiAic2V0IiwgIiRyZWYiOiAiUmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFs
IjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gd2hpY2ggc2VydmVzIGFzIGEgc2V0
dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaWYgdGhlcmUg
aXMgbm8gc2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCiAgICAgICAgICAg
ICAgICAgICAgIHsgIm5hbWUiOiAiY29uZmlndXJhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJk
ZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkgZGVzY3JpcHRv
ciBtYXkgYmUgY2hhbmdlZCBhbmQgaWYgdGhlIHByb3BlcnR5IG1heSBiZSBkZWxldGVkIGZyb20g
dGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LiIgfSwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2luc3BlY3Rvci9JbnNwZWN0b3ItMS4wLmpzb24gYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
SW5zcGVjdG9yLTEuMC5qc29uCmluZGV4IDFkM2NiZGMwMjBiMDRlYjNlMWU0ODRhYjIxZDZlZjAy
YTc2Yjk2MmYuLmUxOWU3ZTA2MDkxYmNjNTUxM2IyZDcxYjQzMzE5ZGNiMGVhYmZmMTYgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3ItMS4wLmpzb24KKysrIGIv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci0xLjAuanNvbgpAQCAtMzc2LDcgKzM3
Niw3IEBACiAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiBbCiAgICAgICAgICAgICAgICAg
ICAgIHsgIm5hbWUiOiAibmFtZSIsICJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJQ
cm9wZXJ0eSBuYW1lLiIgfSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJ2YWx1ZSIs
ICIkcmVmIjogIlJlbW90ZU9iamVjdCIsICJvcHRpb25hbCI6IHRydWUsICJkZXNjcmlwdGlvbiI6
ICJUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eS4iIH0sCi0gICAgICAgICAg
ICAgICAgICAgIHsgIm5hbWUiOiAid3JpdGFibGUiLCAidHlwZSI6ICJib29sZWFuIiwgImRlc2Ny
aXB0aW9uIjogIlRydWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkg
bWF5IGJlIGNoYW5nZWQgKGRhdGEgZGVzY3JpcHRvcnMgb25seSkuIiB9LAorICAgICAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogIndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJvcHRpb25h
bCI6IHRydWUsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdp
dGggdGhlIHByb3BlcnR5IG1heSBiZSBjaGFuZ2VkIChkYXRhIGRlc2NyaXB0b3JzIG9ubHkpLiIg
fSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJnZXQiLCAiJHJlZiI6ICJSZW1vdGVP
YmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiQSBmdW5jdGlvbiB3aGlj
aCBzZXJ2ZXMgYXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+dW5kZWZpbmVk
PC9jb2RlPiBpZiB0aGVyZSBpcyBubyBnZXR0ZXIgKGFjY2Vzc29yIGRlc2NyaXB0b3JzIG9ubHkp
LiIgfSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJzZXQiLCAiJHJlZiI6ICJSZW1v
dGVPYmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiQSBmdW5jdGlvbiB3
aGljaCBzZXJ2ZXMgYXMgYSBzZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+dW5kZWZp
bmVkPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzZXR0ZXIgKGFjY2Vzc29yIGRlc2NyaXB0b3JzIG9u
bHkpLiIgfSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJjb25maWd1cmFibGUiLCAi
dHlwZSI6ICJib29sZWFuIiwgImRlc2NyaXB0aW9uIjogIlRydWUgaWYgdGhlIHR5cGUgb2YgdGhp
cyBwcm9wZXJ0eSBkZXNjcmlwdG9yIG1heSBiZSBjaGFuZ2VkIGFuZCBpZiB0aGUgcHJvcGVydHkg
bWF5IGJlIGRlbGV0ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QuIiB9LApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci5qc29uIGIvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci5qc29uCmluZGV4IDMxZThkOGExMTAyZGJlYTgyZWIy
OTM2MDBmM2Q1M2Q3Y2EyNTc1NzIuLjg0MjE5NjI1MDQxMDAyMzRhNzEzYzNkYzA0ZjE4MDFlMzJk
MzNlYmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3IuanNv
bgorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yLmpzb24KQEAgLTM3Nyw3
ICszNzcsNyBAQAogICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogWwogICAgICAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogIm5hbWUiLCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24i
OiAiUHJvcGVydHkgbmFtZS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAidmFs
dWUiLCAiJHJlZiI6ICJSZW1vdGVPYmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRp
b24iOiAiVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkuIiB9LAotICAgICAg
ICAgICAgICAgICAgICB7ICJuYW1lIjogIndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJk
ZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bl
cnR5IG1heSBiZSBjaGFuZ2VkIChkYXRhIGRlc2NyaXB0b3JzIG9ubHkpLiIgfSwKKyAgICAgICAg
ICAgICAgICAgICAgeyAibmFtZSI6ICJ3cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAib3B0
aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRl
ZCB3aXRoIHRoZSBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5
KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiZ2V0IiwgIiRyZWYiOiAiUmVt
b3RlT2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24g
d2hpY2ggc2VydmVzIGFzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVm
aW5lZDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZ2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBv
bmx5KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAic2V0IiwgIiRyZWYiOiAi
UmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rp
b24gd2hpY2ggc2VydmVzIGFzIGEgc2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVu
ZGVmaW5lZDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9y
cyBvbmx5KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiY29uZmlndXJhYmxl
IiwgInR5cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB0eXBlIG9m
IHRoaXMgcHJvcGVydHkgZGVzY3JpcHRvciBtYXkgYmUgY2hhbmdlZCBhbmQgaWYgdGhlIHByb3Bl
cnR5IG1heSBiZSBkZWxldGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LiIgfSwK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126373</attachid>
            <date>2012-02-09 14:24:51 -0800</date>
            <delta_ts>2012-02-14 06:27:28 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77917-20120210022449.patch</filename>
            <type>text/plain</type>
            <size>8417</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2ODI3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOGI3YTI1YWZiMmJkOTEw
MTNkNDc1OWVkZWE0NjNiOTAzMGVmNzY2Zi4uZGYwZTdiOTRkZjI5YTliMTY4MmQ2OGZiZDYyMGNl
NWRkNzdhZDBmZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDEyLTAyLTA2ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBJbiBJbnNwZWN0b3IuanNvbiBQcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGUgc2hvdWxkIGJl
IGRlY2xhcmVkIG9wdGlvbmFsCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03NzkxNworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFByb3BlcnR5IGRlc2NyaXB0b3IgaXMgZml4ZWQgaW4gSW5zcGVjdG9yLmpzb24u
IEFsc28gcmV0cm9hY3RpdmVseSBpbgorICAgICAgICAwLjEgYW5kIDEuMC4KKyAgICAgICAgSW5q
ZWN0ZWQgc2NyaXB0IGluIGluc3RydWN0ZWQgdG8gbmV2ZXIgcmV0dXJuIG51bGwgcHJvcGVydHkg
dmFsdWVzLgorCisgICAgICAgICogaW5zcGVjdG9yL0luamVjdGVkU2NyaXB0U291cmNlLmpzOgor
ICAgICAgICAoLik6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3Rvci0wLjEuanNvbjoKKyAg
ICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yLTEuMC5qc29uOgorICAgICAgICAqIGluc3BlY3Rv
ci9JbnNwZWN0b3IuanNvbjoKKwogMjAxMi0wMi0wNiAgRXVnZW5lIEdpcmFyZCAgPGdpcmFyZEBj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW5kZXhlZERCIGNyZWF0ZU9iamVjdFN0b3JlIHNob3Vs
ZCB0aHJvdyBpZiBvcHRpb25zIGFyZyBpcyBpbnZhbGlkCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5qZWN0ZWRTY3JpcHRTb3VyY2UuanMgYi9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5qZWN0ZWRTY3JpcHRTb3VyY2UuanMKaW5kZXggMjcwODlhODg3YjcxNWYxNjc1
MGQ2NTFhY2UxZDA5MDg3M2IyNjI2YS4uYmU1Yjk5Zjk0NmNmOWVjZTZlY2NhY2Q4Yzg5NzkwYzk2
ZDJlNzZiNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luamVjdGVkU2Ny
aXB0U291cmNlLmpzCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbmplY3RlZFNjcmlw
dFNvdXJjZS5qcwpAQCAtMTg0LDEyICsxODQsMTcgQEAgSW5qZWN0ZWRTY3JpcHQucHJvdG90eXBl
ID0gewogCiAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyAr
K2kpIHsKICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNbaV07Ci0gICAg
ICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXQpCisgICAgICAgICAgICBpZiAoImdldCIgaW4gZGVz
Y3JpcHRvcikKICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldCA9IHRoaXMuX3dyYXBPYmpl
Y3QoZGVzY3JpcHRvci5nZXQsIG9iamVjdEdyb3VwTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZGVz
Y3JpcHRvci5zZXQpCisgICAgICAgICAgICBpZiAoInNldCIgaW4gZGVzY3JpcHRvcikKICAgICAg
ICAgICAgICAgICBkZXNjcmlwdG9yLnNldCA9IHRoaXMuX3dyYXBPYmplY3QoZGVzY3JpcHRvci5z
ZXQsIG9iamVjdEdyb3VwTmFtZSk7CiAgICAgICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlw
dG9yKQogICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSB0aGlzLl93cmFwT2JqZWN0
KGRlc2NyaXB0b3IudmFsdWUsIG9iamVjdEdyb3VwTmFtZSk7CisgICAgICAgICAgICBpZiAoISgi
Y29uZmlndXJhYmxlIiBpbiBkZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9y
LmNvbmZpZ3VyYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCEoImVudW1lcmFibGUiIGlu
IGRlc2NyaXB0b3IpKQorICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZh
bHNlOworICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3Jz
OwogICAgIH0sCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9y
LTAuMS5qc29uIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci0wLjEuanNvbgpp
bmRleCAwMDg2ZDlhNThlZjE1ZWM5MDlmNDY2ODI1ZGNjZDhmNDQ0YTAzMjcwLi5hNWMwMzAzNWNh
NGViOTEwNDBlMTkzODZmMGEwMDMxYmJlMDE5NmY1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yLTAuMS5qc29uCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3ItMC4xLmpzb24KQEAgLTI2NSw3ICsyNjUsNyBAQAogICAgICAgICAgICAg
ICAgICJwcm9wZXJ0aWVzIjogWwogICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjogIm5hbWUi
LCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAiUHJvcGVydHkgbmFtZS4iIH0sCiAg
ICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAidmFsdWUiLCAiJHJlZiI6ICJSZW1vdGVPYmpl
Y3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiVGhlIHZhbHVlIGFzc29jaWF0
ZWQgd2l0aCB0aGUgcHJvcGVydHkuIiB9LAotICAgICAgICAgICAgICAgICAgICB7ICJuYW1lIjog
IndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRo
ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG1heSBiZSBjaGFuZ2VkIChkYXRh
IGRlc2NyaXB0b3JzIG9ubHkpLiIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJ3
cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRp
b24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBtYXkg
YmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCiAgICAgICAgICAgICAgICAg
ICAgIHsgIm5hbWUiOiAiZ2V0IiwgIiRyZWYiOiAiUmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFsIjog
dHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gd2hpY2ggc2VydmVzIGFzIGEgZ2V0dGVy
IGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaWYgdGhlcmUgaXMg
bm8gZ2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCiAgICAgICAgICAgICAg
ICAgICAgIHsgIm5hbWUiOiAic2V0IiwgIiRyZWYiOiAiUmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFs
IjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24gd2hpY2ggc2VydmVzIGFzIGEgc2V0
dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaWYgdGhlcmUg
aXMgbm8gc2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBvbmx5KS4iIH0sCiAgICAgICAgICAg
ICAgICAgICAgIHsgIm5hbWUiOiAiY29uZmlndXJhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJk
ZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkgZGVzY3JpcHRv
ciBtYXkgYmUgY2hhbmdlZCBhbmQgaWYgdGhlIHByb3BlcnR5IG1heSBiZSBkZWxldGVkIGZyb20g
dGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LiIgfSwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2luc3BlY3Rvci9JbnNwZWN0b3ItMS4wLmpzb24gYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
SW5zcGVjdG9yLTEuMC5qc29uCmluZGV4IDFkM2NiZGMwMjBiMDRlYjNlMWU0ODRhYjIxZDZlZjAy
YTc2Yjk2MmYuLmUxOWU3ZTA2MDkxYmNjNTUxM2IyZDcxYjQzMzE5ZGNiMGVhYmZmMTYgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3ItMS4wLmpzb24KKysrIGIv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci0xLjAuanNvbgpAQCAtMzc2LDcgKzM3
Niw3IEBACiAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiBbCiAgICAgICAgICAgICAgICAg
ICAgIHsgIm5hbWUiOiAibmFtZSIsICJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJQ
cm9wZXJ0eSBuYW1lLiIgfSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJ2YWx1ZSIs
ICIkcmVmIjogIlJlbW90ZU9iamVjdCIsICJvcHRpb25hbCI6IHRydWUsICJkZXNjcmlwdGlvbiI6
ICJUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eS4iIH0sCi0gICAgICAgICAg
ICAgICAgICAgIHsgIm5hbWUiOiAid3JpdGFibGUiLCAidHlwZSI6ICJib29sZWFuIiwgImRlc2Ny
aXB0aW9uIjogIlRydWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkg
bWF5IGJlIGNoYW5nZWQgKGRhdGEgZGVzY3JpcHRvcnMgb25seSkuIiB9LAorICAgICAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogIndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJvcHRpb25h
bCI6IHRydWUsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdp
dGggdGhlIHByb3BlcnR5IG1heSBiZSBjaGFuZ2VkIChkYXRhIGRlc2NyaXB0b3JzIG9ubHkpLiIg
fSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJnZXQiLCAiJHJlZiI6ICJSZW1vdGVP
YmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiQSBmdW5jdGlvbiB3aGlj
aCBzZXJ2ZXMgYXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+dW5kZWZpbmVk
PC9jb2RlPiBpZiB0aGVyZSBpcyBubyBnZXR0ZXIgKGFjY2Vzc29yIGRlc2NyaXB0b3JzIG9ubHkp
LiIgfSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJzZXQiLCAiJHJlZiI6ICJSZW1v
dGVPYmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiQSBmdW5jdGlvbiB3
aGljaCBzZXJ2ZXMgYXMgYSBzZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+dW5kZWZp
bmVkPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzZXR0ZXIgKGFjY2Vzc29yIGRlc2NyaXB0b3JzIG9u
bHkpLiIgfSwKICAgICAgICAgICAgICAgICAgICAgeyAibmFtZSI6ICJjb25maWd1cmFibGUiLCAi
dHlwZSI6ICJib29sZWFuIiwgImRlc2NyaXB0aW9uIjogIlRydWUgaWYgdGhlIHR5cGUgb2YgdGhp
cyBwcm9wZXJ0eSBkZXNjcmlwdG9yIG1heSBiZSBjaGFuZ2VkIGFuZCBpZiB0aGUgcHJvcGVydHkg
bWF5IGJlIGRlbGV0ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QuIiB9LApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci5qc29uIGIvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvci5qc29uCmluZGV4IDMxZThkOGExMTAyZGJlYTgyZWIy
OTM2MDBmM2Q1M2Q3Y2EyNTc1NzIuLjg0MjE5NjI1MDQxMDAyMzRhNzEzYzNkYzA0ZjE4MDFlMzJk
MzNlYmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3IuanNv
bgorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yLmpzb24KQEAgLTM3Nyw3
ICszNzcsNyBAQAogICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogWwogICAgICAgICAgICAg
ICAgICAgICB7ICJuYW1lIjogIm5hbWUiLCAidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24i
OiAiUHJvcGVydHkgbmFtZS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAidmFs
dWUiLCAiJHJlZiI6ICJSZW1vdGVPYmplY3QiLCAib3B0aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRp
b24iOiAiVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkuIiB9LAotICAgICAg
ICAgICAgICAgICAgICB7ICJuYW1lIjogIndyaXRhYmxlIiwgInR5cGUiOiAiYm9vbGVhbiIsICJk
ZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bl
cnR5IG1heSBiZSBjaGFuZ2VkIChkYXRhIGRlc2NyaXB0b3JzIG9ubHkpLiIgfSwKKyAgICAgICAg
ICAgICAgICAgICAgeyAibmFtZSI6ICJ3cml0YWJsZSIsICJ0eXBlIjogImJvb2xlYW4iLCAib3B0
aW9uYWwiOiB0cnVlLCAiZGVzY3JpcHRpb24iOiAiVHJ1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRl
ZCB3aXRoIHRoZSBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCAoZGF0YSBkZXNjcmlwdG9ycyBvbmx5
KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiZ2V0IiwgIiRyZWYiOiAiUmVt
b3RlT2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rpb24g
d2hpY2ggc2VydmVzIGFzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVuZGVm
aW5lZDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZ2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9ycyBv
bmx5KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAic2V0IiwgIiRyZWYiOiAi
UmVtb3RlT2JqZWN0IiwgIm9wdGlvbmFsIjogdHJ1ZSwgImRlc2NyaXB0aW9uIjogIkEgZnVuY3Rp
b24gd2hpY2ggc2VydmVzIGFzIGEgc2V0dGVyIGZvciB0aGUgcHJvcGVydHksIG9yIDxjb2RlPnVu
ZGVmaW5lZDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc2V0dGVyIChhY2Nlc3NvciBkZXNjcmlwdG9y
cyBvbmx5KS4iIH0sCiAgICAgICAgICAgICAgICAgICAgIHsgIm5hbWUiOiAiY29uZmlndXJhYmxl
IiwgInR5cGUiOiAiYm9vbGVhbiIsICJkZXNjcmlwdGlvbiI6ICJUcnVlIGlmIHRoZSB0eXBlIG9m
IHRoaXMgcHJvcGVydHkgZGVzY3JpcHRvciBtYXkgYmUgY2hhbmdlZCBhbmQgaWYgdGhlIHByb3Bl
cnR5IG1heSBiZSBkZWxldGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LiIgfSwKZGlm
ZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwpp
bmRleCAzMzg1MmE3M2FmMDA0OGJhMjY0YzU1OWU4YThjYjY3NDUzY2VmMmM5Li4zODllYmNhNGVk
Zjg1NGJhNWZhOGM2NTBiMjdmODBhMTdhY2RiM2UxIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9D
aGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIw
MTItMDItMDkgIFBldGVyIFJ5YmluICA8cGV0ZXIucnliaW5AZ21haWwuY29tPgorCisgICAgICAg
IFdlYiBJbnNwZWN0b3I6IEluIEluc3BlY3Rvci5qc29uIFByb3BlcnR5RGVzY3JpcHRvci53cml0
YWJsZSBzaG91bGQgYmUgZGVjbGFyZWQgb3B0aW9uYWwKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTE3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgIlVuZGVmaW5lZCIgZ2V0dGVyIGFuZCBzZXR0ZXIgaXMg
bm93IHZpc2libGUuCisKKyAgICAgICAgKiBpbnNwZWN0b3IvcnVudGltZS9ydW50aW1lLWdldFBy
b3BlcnRpZXMtZXhwZWN0ZWQudHh0OgorCiAyMDEyLTAyLTA2ICBFdWdlbmUgR2lyYXJkICA8Z2ly
YXJkQGNocm9taXVtLm9yZz4KIAogICAgICAgICBJbmRleGVkREIgY3JlYXRlT2JqZWN0U3RvcmUg
c2hvdWxkIHRocm93IGlmIG9wdGlvbnMgYXJnIGlzIGludmFsaWQgKG5vdCBhbiBvYmplY3QpLgpk
aWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3J1bnRpbWUvcnVudGltZS1nZXRQcm9w
ZXJ0aWVzLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2luc3BlY3Rvci9ydW50aW1lL3J1bnRp
bWUtZ2V0UHJvcGVydGllcy1leHBlY3RlZC50eHQKaW5kZXggNGRmNTI1NTYwOGMwNTE0ODQyZGJl
NzMwMjJkMDRlNWRlZDg3MjZjNS4uN2Q1OWFjN2I1ODFlYWI1ODMzMzQ5ZmVjNmI2ZjA1NmI2Nzg2
YzNjNiAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3J1bnRpbWUvcnVudGltZS1n
ZXRQcm9wZXJ0aWVzLWV4cGVjdGVkLnR4dAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvcnVu
dGltZS9ydW50aW1lLWdldFByb3BlcnRpZXMtZXhwZWN0ZWQudHh0CkBAIC0zNiw0ICszNiwxNCBA
QCBSdW5uaW5nOiB0ZXN0R2V0dGVyT25seQogICAgIGVudW1lcmFibGUgOiB0cnVlCiAgICAgd3Jp
dGFibGUgOiBmYWxzZQogfQoreworICAgIG5hbWUgOiAic2V0IGZvbyIKKyAgICB2YWx1ZSA6IHsK
KyAgICAgICAgdHlwZSA6ICJ1bmRlZmluZWQiCisgICAgICAgIGRlc2NyaXB0aW9uIDogInVuZGVm
aW5lZCIKKyAgICAgICAgb2JqZWN0SWQgOiA8dW5kZWZpbmVkPgorICAgIH0KKyAgICBlbnVtZXJh
YmxlIDogdHJ1ZQorICAgIHdyaXRhYmxlIDogZmFsc2UKK30KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>