<?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>49729</bug_id>
          
          <creation_ts>2010-11-18 06:46:12 -0800</creation_ts>
          <short_desc>Web Inspector: reduce the footprint of InspectorBackendDispatcher.</short_desc>
          <delta_ts>2010-11-19 07:35:49 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>49732</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ilya Tikhonovsky">loislo</reporter>
          <assigned_to name="Ilya Tikhonovsky">loislo</assigned_to>
          <cc>abarth</cc>
    
    <cc>apavlov</cc>
    
    <cc>buildbot</cc>
    
    <cc>bweinstein</cc>
    
    <cc>eric</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>310836</commentid>
    <comment_count>0</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-11-18 06:46:12 -0800</bug_when>
    <thetext>%subj%</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310838</commentid>
    <comment_count>1</comment_count>
      <attachid>74234</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-11-18 06:53:58 -0800</bug_when>
    <thetext>Created attachment 74234
[patch] initial version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310840</commentid>
    <comment_count>2</comment_count>
      <attachid>74235</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-11-18 06:56:35 -0800</bug_when>
    <thetext>Created attachment 74235
sample InspectorBackendDispatcher.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310842</commentid>
    <comment_count>3</comment_count>
      <attachid>74234</attachid>
    <who name="Yury Semikhatsky">yurys</who>
    <bug_when>2010-11-18 06:59:47 -0800</bug_when>
    <thetext>Comment on attachment 74234
[patch] initial version.

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

&gt; WebCore/ChangeLog:6
&gt; +        InspectorBackendDispatcher is a generated file.

Please provide a meaningful change log entry describing the change details.

&gt; WebCore/inspector/CodeGeneratorInspector.pm:354
&gt; +            $typeString =~ s/\b(\w)/\U$1/g;

Please comment these two lines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310844</commentid>
    <comment_count>4</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2010-11-18 07:07:24 -0800</bug_when>
    <thetext>Attachment 74234 did not build on win:
Build output: http://queues.webkit.org/results/6250016</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311338</commentid>
    <comment_count>5</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2010-11-19 03:21:40 -0800</bug_when>
    <thetext>Rolled out for breaking core builders. Please remember to close bugs upon landing patches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311345</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-11-19 03:33:23 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/72373 might have broken SnowLeopard Intel Release (Tests)
The following tests are not passing:
inspector/report-protocol-errors.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311448</commentid>
    <comment_count>7</comment_count>
      <attachid>74234</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-11-19 07:35:27 -0800</bug_when>
    <thetext>Comment on attachment 74234
[patch] initial version.

Committed r72398
	M	WebCore/ChangeLog
	M	WebCore/inspector/CodeGeneratorInspector.pm
r72398 = 2585c11bab6a48b308ad24608a88d24dd88c210e (refs/remotes/trunk)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>311449</commentid>
    <comment_count>8</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2010-11-19 07:35:49 -0800</bug_when>
    <thetext>landed. Closing the bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>74234</attachid>
            <date>2010-11-18 06:53:58 -0800</date>
            <delta_ts>2010-11-19 07:35:27 -0800</delta_ts>
            <desc>[patch] initial version.</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>6743</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZjVhYjNhZi4uMWJlOGY2ZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNSBAQAorMjAxMC0xMS0xOCAgSWx5YSBUaWtob25v
dnNreSAgPGxvaXNsb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgV2ViIEluc3BlY3RvcjogcmVkdWNlIHRoZSBmb290cHJpbnQg
b2YgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXIuCisgICAgICAgIEluc3BlY3RvckJhY2tlbmRE
aXNwYXRjaGVyIGlzIGEgZ2VuZXJhdGVkIGZpbGUuCisgICAgICAgIEl0cyBjb250ZW50IGlzIG5v
dCBvcHRpbWFsIGFuZCBtYXkgYmUgcmVkdWNlZCBieSBhIHF1YXJ0ZXIuCisKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5NzI5CisKKyAgICAgICAgKiBp
bnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5wbToKKwogMjAxMC0xMS0xOCAgTmlrb2xh
cyBaaW1tZXJtYW5uICA8bnppbW1lcm1hbm5AcmltLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBi
eSBEaXJrIFNjaHVsemUuCmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJh
dG9ySW5zcGVjdG9yLnBtIGIvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rv
ci5wbQppbmRleCBmNWYyNDUzLi5hYzZmNmM3IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rv
ci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnBtCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVH
ZW5lcmF0b3JJbnNwZWN0b3IucG0KQEAgLTkyLDYgKzkyLDcgQEAgJHR5cGVUcmFuc2Zvcm17IlZh
bHVlIn0gPSB7CiAkdHlwZVRyYW5zZm9ybXsiU3RyaW5nIn0gPSB7CiAgICAgInBhcmFtIiA9PiAi
Y29uc3QgU3RyaW5nJiIsCiAgICAgInZhcmlhYmxlIiA9PiAiU3RyaW5nIiwKKyAgICAicmV0dXJu
IiA9PiAiU3RyaW5nIiwKICAgICAiZGVmYXVsdFZhbHVlIiA9PiAiXCJcIiIsCiAgICAgImZvcndh
cmRIZWFkZXIiID0+ICJ3dGYvRm9yd2FyZC5oIiwKICAgICAiaGVhZGVyIiA9PiAiUGxhdGZvcm1T
dHJpbmcuaCIsCkBAIC0yNjYsNiArMjY3LDEyIEBAIHN1YiBnZW5lcmF0ZUZ1bmN0aW9ucwogICAg
IHB1c2goQGJhY2tlbmRNZXRob2RzSW1wbCwgZ2VuZXJhdGVCYWNrZW5kRGlzcGF0Y2hlcigpKTsK
ICAgICBwdXNoKEBiYWNrZW5kTWV0aG9kc0ltcGwsIGdlbmVyYXRlQmFja2VuZFJlcG9ydFByb3Rv
Y29sRXJyb3IoKSk7CiAKKyAgICBmb3JlYWNoIG15ICR0eXBlIChrZXlzICViYWNrZW5kVHlwZXMp
IHsKKyAgICAgICAgaWYgKCR0eXBlVHJhbnNmb3JteyR0eXBlfXsiSlNPTlR5cGUifSkgeworICAg
ICAgICAgICAgcHVzaChAYmFja2VuZE1ldGhvZHNJbXBsLCBnZW5lcmF0ZUFyZ3VtZW50R2V0dGVy
cygkdHlwZSkpOworICAgICAgICB9CisgICAgfQorCiAgICAgQGJhY2tlbmRTdHViSlMgPSBnZW5l
cmF0ZUJhY2tlbmRTdHViSlMoJGludGVyZmFjZSk7CiB9CiAKQEAgLTMzMiw0MyArMzM5LDMwIEBA
IHN1YiBnZW5lcmF0ZUJhY2tlbmRGdW5jdGlvbgogICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAg
ICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhcIlByb3RvY29sIEVycm9yOiAkZG9tYWluIGhh
bmRsZXIgaXMgbm90IGF2YWlsYWJsZS5cIik7Iik7CiAgICAgcHVzaChAZnVuY3Rpb24sICIiKTsK
IAorICAgICMgZGVjbGFyZSBsb2NhbCB2YXJpYWJsZXMgZm9yIG91dCBhcmd1bWVudHMuCisgICAg
cHVzaChAZnVuY3Rpb24sIG1hcCgiICAgICIgLiAkdHlwZVRyYW5zZm9ybXskXy0+dHlwZX0tPnsi
dmFyaWFibGUifSAuICIgIiAuICRfLT5uYW1lIC4gIiA9ICIgLiAkdHlwZVRyYW5zZm9ybXskXy0+
dHlwZX0tPnsiZGVmYXVsdFZhbHVlIn0gLiAiOyIsIEBvdXRBcmdzKSk7CisKKyAgICBteSAkaW5k
ZW50ID0gIiI7CiAgICAgaWYgKHNjYWxhcihAaW5BcmdzKSkgewogICAgICAgICAjIGRlY2xhcmUg
dmFyaWFibGVzIGZvciBhbGwgJ2luJyBhcmdzOwotICAgICAgICBwdXNoKEBmdW5jdGlvbiwgbWFw
KCIgICAgIiAuICR0eXBlVHJhbnNmb3JteyRfLT50eXBlfS0+eyJ2YXJpYWJsZSJ9IC4gIiAiIC4g
JF8tPm5hbWUgLiAiID0gIiAuICR0eXBlVHJhbnNmb3JteyRfLT50eXBlfS0+eyJkZWZhdWx0VmFs
dWUifSAuICI7IiwgQGluQXJncykpOwotCi0gICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiIik7Ci0g
ICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3Vt
ZW50c0NvbnRhaW5lcjsiKTsKLSAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgaWYgKCEoYXJn
dW1lbnRzQ29udGFpbmVyID0gcmVxdWVzdE1lc3NhZ2VPYmplY3QtPmdldE9iamVjdChcImFyZ3Vt
ZW50c1wiKSkpIHsiKTsKLSAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAgIHByb3RvY29s
RXJyb3JzLT5wdXNoU3RyaW5nKFwiUHJvdG9jb2wgRXJyb3I6ICdhcmd1bWVudHMnIHByb3BlcnR5
IHdpdGggdHlwZSAnb2JqZWN0JyB3YXMgbm90IGZvdW5kLlwiKTsiKTsKLSAgICAgICAgcHVzaChA
ZnVuY3Rpb24sICIgICAgfSBlbHNlIHsiKTsKLSAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAg
ICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgYXJndW1lbnRzRW5kSXRlcmF0b3Ig
PSBhcmd1bWVudHNDb250YWluZXItPmVuZCgpOyIpOworICAgICAgICBwdXNoKEBmdW5jdGlvbiwg
IiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0
T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCBcImFyZ3VtZW50c1wiLCBwcm90b2NvbEVycm9y
cy5nZXQoKSkpIHsiKTsKIAogICAgICAgICBmb3JlYWNoIG15ICRwYXJhbWV0ZXIgKEBpbkFyZ3Mp
IHsKICAgICAgICAgICAgIG15ICRuYW1lID0gJHBhcmFtZXRlci0+bmFtZTsKICAgICAgICAgICAg
IG15ICR0eXBlID0gJHBhcmFtZXRlci0+dHlwZTsKLSAgICAgICAgICAgIG15ICR2YXJpYWJsZVR5
cGUgPSAkdHlwZVRyYW5zZm9ybXskdHlwZX0tPnsidmFyaWFibGUifTsKLSAgICAgICAgICAgIG15
ICRKU09OVHlwZSA9ICR0eXBlVHJhbnNmb3JteyR0eXBlfS0+eyJKU09OVHlwZSJ9OwotCi0gICAg
ICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiIpOwotICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24s
ICIgICAgICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgJHtuYW1lfVZhbHVlSXRl
cmF0b3IgPSBhcmd1bWVudHNDb250YWluZXItPmZpbmQoXCIkbmFtZVwiKTsiKTsKLSAgICAgICAg
ICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICBpZiAoJHtuYW1lfVZhbHVlSXRlcmF0b3IgPT0g
YXJndW1lbnRzRW5kSXRlcmF0b3IpIHsiKTsKLSAgICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAi
ICAgICAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoXCJQcm90b2NvbCBFcnJvcjog
QXJndW1lbnQgJyRuYW1lJyB3aXRoIHR5cGUgJyRKU09OVHlwZScgd2FzIG5vdCBmb3VuZC5cIik7
Iik7Ci0gICAgICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAgfSBlbHNlIHsiKTsKLSAg
ICAgICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgICAgICAgICAgaWYgKCEke25hbWV9VmFsdWVJ
dGVyYXRvci0+c2Vjb25kLT5hcyRKU09OVHlwZSgmJG5hbWUpKSB7Iik7Ci0gICAgICAgICAgICBw
dXNoKEBmdW5jdGlvbiwgIiAgICAgICAgICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmlu
ZyhcIlByb3RvY29sIEVycm9yOiBBcmd1bWVudCAnJG5hbWUnIGhhcyB3cm9uZyB0eXBlLiBJdCBz
aG91bGQgYmUgJyRKU09OVHlwZScuXCIpOyIpOwotICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24s
ICIgICAgICAgICAgICB9Iik7Ci0gICAgICAgICAgICBwdXNoKEBmdW5jdGlvbiwgIiAgICAgICAg
fSIpOworICAgICAgICAgICAgbXkgJHR5cGVTdHJpbmcgPSAkcGFyYW1ldGVyLT50eXBlOworICAg
ICAgICAgICAgJHR5cGVTdHJpbmcgPX4gcy9cYihcdykvXFUkMS9nOworICAgICAgICAgICAgJHR5
cGVTdHJpbmcgPX4gcy8gLy9nOworICAgICAgICAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgICAg
ICIgLiAkdHlwZVRyYW5zZm9ybXskdHlwZX0tPnsidmFyaWFibGUifSAuICIgJG5hbWUgPSBnZXQk
dHlwZVN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksIFwiJG5hbWVcIiwgcHJvdG9jb2xF
cnJvcnMuZ2V0KCkpOyIpOwogICAgICAgICB9Ci0gICAgICAgIHB1c2goQGZ1bmN0aW9uLCAiICAg
IH0iKTsKKyAgICAgICAgcHVzaChAZnVuY3Rpb24sICIiKTsKKyAgICAgICAgJGluZGVudCA9ICIg
ICAgIjsKICAgICB9CiAKLSAgICAjIGRlY2xhcmUgbG9jYWwgdmFyaWFibGVzIGZvciBvdXQgYXJn
dW1lbnRzLgotICAgIHB1c2goQGZ1bmN0aW9uLCBtYXAoIiAgICAiIC4gJHR5cGVUcmFuc2Zvcm17
JF8tPnR5cGV9LT57InZhcmlhYmxlIn0gLiAiICIgLiAkXy0+bmFtZSAuICIgPSAiIC4gJHR5cGVU
cmFuc2Zvcm17JF8tPnR5cGV9LT57ImRlZmF1bHRWYWx1ZSJ9IC4gIjsiLCBAb3V0QXJncykpOwot
CiAgICAgbXkgJGFyZ3MgPSBqb2luKCIsICIsIChtYXAoJF8tPm5hbWUsIEBpbkFyZ3MpLCBtYXAo
IiYiIC4gJF8tPm5hbWUsIEBvdXRBcmdzKSkpOwotICAgIHB1c2goQGZ1bmN0aW9uLCAiICAgIGlm
ICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSIpOwotICAgIHB1c2goQGZ1bmN0aW9uLCAiICAg
ICAgICAkZG9tYWluQWNjZXNzb3ItPiRmdW5jdGlvbk5hbWUoJGFyZ3MpOyIpOwotICAgIHB1c2go
QGZ1bmN0aW9uLCAiIik7CisgICAgcHVzaChAZnVuY3Rpb24sICIkaW5kZW50ICAgIGlmICghcHJv
dG9jb2xFcnJvcnMtPmxlbmd0aCgpKSIpOworICAgIHB1c2goQGZ1bmN0aW9uLCAiJGluZGVudCAg
ICAgICAgJGRvbWFpbkFjY2Vzc29yLT4kZnVuY3Rpb25OYW1lKCRhcmdzKTsiKTsKKyAgICBwdXNo
KEBmdW5jdGlvbiwgc2NhbGFyKEBpbkFyZ3MpID8gIiAgICB9IiA6ICIiKTsKIAogICAgIHB1c2go
QGZ1bmN0aW9uLCAiICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBX
ZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5Iik7CiAgICAgcHVzaChAZnVuY3Rpb24sICIgICAgaWYg
KChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRy
b2xsZXItPmhhc0Zyb250ZW5kKCkpIHsiKTsKQEAgLTQxMiw2ICs0MDYsNDEgQEAgRU9GCiAgICAg
cmV0dXJuIHNwbGl0KCJcbiIsICRyZXBvcnRQcm90b2NvbEVycm9yKTsKIH0KIAorc3ViIGdlbmVy
YXRlQXJndW1lbnRHZXR0ZXJzCit7CisgICAgbXkgJHR5cGUgPSBzaGlmdDsKKyAgICBteSAkanNv
biA9ICR0eXBlVHJhbnNmb3JteyR0eXBlfXsiSlNPTlR5cGUifTsKKyAgICBteSAkdmFyaWFibGUg
PSAkdHlwZVRyYW5zZm9ybXskdHlwZX17InZhcmlhYmxlIn07CisgICAgbXkgJHJldHVybiAgPSAk
dHlwZVRyYW5zZm9ybXskdHlwZX17InJldHVybiJ9ID8gJHR5cGVUcmFuc2Zvcm17JHR5cGV9eyJy
ZXR1cm4ifSA6ICR0eXBlVHJhbnNmb3JteyR0eXBlfXsicGFyYW0ifTsKKworICAgIG15ICR0eXBl
U3RyaW5nID0gJHR5cGU7CisgICAgJHR5cGVTdHJpbmcgPX4gcy9cYihcdykvXFUkMS9nOworICAg
ICR0eXBlU3RyaW5nID1+IHMvIC8vZzsKKworICAgIHB1c2goQGJhY2tlbmRDb25zdGFudERlY2xh
cmF0aW9ucywgIiRyZXR1cm4gZ2V0JHR5cGVTdHJpbmcoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IFN0cmluZyYgbmFtZSwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKTsiKTsK
KyAgICBteSAkZ2V0dGVyQm9keSA9IDw8ICJFT0YiOworCiskcmV0dXJuIEluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjpnZXQkdHlwZVN0cmluZyhJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpCit7CisgICAg
QVNTRVJUKG9iamVjdCk7CisgICAgQVNTRVJUKHByb3RvY29sRXJyb3JzKTsKKworICAgICR2YXJp
YWJsZSB2YWx1ZTsKKyAgICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG9i
amVjdC0+ZW5kKCk7CisgICAgSW5zcGVjdG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciB2YWx1ZUl0
ZXJhdG9yID0gb2JqZWN0LT5maW5kKG5hbWUpOworCisgICAgaWYgKHZhbHVlSXRlcmF0b3IgPT0g
ZW5kKQorICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1hdCgi
UHJvdG9jb2wgRXJyb3I6IEFyZ3VtZW50ICdcJXMnIHdpdGggdHlwZSAnJGpzb24nIHdhcyBub3Qg
Zm91bmQuIiwgbmFtZS51dGY4KCkuZGF0YSgpKSk7CisgICAgZWxzZSB7CisgICAgICAgIGlmICgh
dmFsdWVJdGVyYXRvci0+c2Vjb25kLT5hcyRqc29uKCZ2YWx1ZSkpCisgICAgICAgICAgICBwcm90
b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1hdCgiUHJvdG9jb2wgRXJyb3I6IEFy
Z3VtZW50ICdcJXMnIGhhcyB3cm9uZyB0eXBlLiBJdCBzaG91bGQgYmUgJyRqc29uJy4iLCBuYW1l
LnV0ZjgoKS5kYXRhKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorRU9GCisKKyAg
ICByZXR1cm4gc3BsaXQoIlxuIiwgJGdldHRlckJvZHkpOworfQogCiBzdWIgZ2VuZXJhdGVCYWNr
ZW5kRGlzcGF0Y2hlcgogewo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>74235</attachid>
            <date>2010-11-18 06:56:35 -0800</date>
            <delta_ts>2010-11-18 06:56:35 -0800</delta_ts>
            <desc>sample InspectorBackendDispatcher.cpp</desc>
            <filename>InspectorBackendDispatcher.cpp</filename>
            <type>text/x-c++src</type>
            <size>156608</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">Ly8gQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1z
dHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgoK
I2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAiSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXIu
aCIKI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0NvbmNhdGVuYXRlLmg+CgojaWYgRU5BQkxFKElO
U1BFQ1RPUikKCiNpbmNsdWRlICJJbnNwZWN0b3JBcHBsaWNhdGlvbkNhY2hlQWdlbnQuaCIKI2lu
Y2x1ZGUgIkluc3BlY3RvckJhY2tlbmQuaCIKI2luY2x1ZGUgIkluc3BlY3RvckNTU0FnZW50Lmgi
CiNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnQuaCIKI2luY2x1ZGUgIkluc3BlY3RvckRPTUFnZW50
LmgiCiNpbmNsdWRlICJJbnNwZWN0b3JEZWJ1Z2dlckFnZW50LmgiCiNpbmNsdWRlICJJbnNwZWN0
b3JGaWxlU3lzdGVtQWdlbnQuaCIKI2luY2x1ZGUgIkluc3BlY3RvclByb2ZpbGVyQWdlbnQuaCIK
I2luY2x1ZGUgIkluc3BlY3RvclJlc291cmNlQWdlbnQuaCIKI2luY2x1ZGUgIkluc3BlY3RvclZh
bHVlcy5oIgojaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKCm5hbWVzcGFjZSBXZWJDb3JlIHsK
CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpwb3B1bGF0ZVNjcmlwdE9i
amVjdHNDbWQgPSAicG9wdWxhdGVTY3JpcHRPYmplY3RzIjsKY29uc3QgY2hhciogSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OmdldEluc3BlY3RvclN0YXRlQ21kID0gImdldEluc3BlY3RvclN0
YXRlIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnNldFNlYXJjaGlu
Z0Zvck5vZGVDbWQgPSAic2V0U2VhcmNoaW5nRm9yTm9kZSI7CmNvbnN0IGNoYXIqIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyOjpzZXRNb25pdG9yaW5nWEhSRW5hYmxlZENtZCA9ICJzZXRNb25p
dG9yaW5nWEhSRW5hYmxlZCI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpyZWxvYWRQYWdlQ21kID0gInJlbG9hZFBhZ2UiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6c3RhcnRUaW1lbGluZVByb2ZpbGVyQ21kID0gInN0YXJ0VGltZWxpbmVQ
cm9maWxlciI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzdG9wVGlt
ZWxpbmVQcm9maWxlckNtZCA9ICJzdG9wVGltZWxpbmVQcm9maWxlciI7CmNvbnN0IGNoYXIqIElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpjYWNoZWRSZXNvdXJjZXNDbWQgPSAiY2FjaGVkUmVz
b3VyY2VzIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJlc291cmNl
Q29udGVudENtZCA9ICJyZXNvdXJjZUNvbnRlbnQiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6ZW5hYmxlRGVidWdnZXJDbWQgPSAiZW5hYmxlRGVidWdnZXIiOwpjb25z
dCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6ZGlzYWJsZURlYnVnZ2VyQ21kID0g
ImRpc2FibGVEZWJ1Z2dlciI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpzZXRCcmVha3BvaW50Q21kID0gInNldEJyZWFrcG9pbnQiOwpjb25zdCBjaGFyKiBJbnNwZWN0
b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cmVtb3ZlQnJlYWtwb2ludENtZCA9ICJyZW1vdmVCcmVha3Bv
aW50IjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmFjdGl2YXRlQnJl
YWtwb2ludHNDbWQgPSAiYWN0aXZhdGVCcmVha3BvaW50cyI7CmNvbnN0IGNoYXIqIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyOjpkZWFjdGl2YXRlQnJlYWtwb2ludHNDbWQgPSAiZGVhY3RpdmF0
ZUJyZWFrcG9pbnRzIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnBh
dXNlQ21kID0gInBhdXNlIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6
OnJlc3VtZUNtZCA9ICJyZXN1bWUiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcjo6c3RlcE92ZXJTdGF0ZW1lbnRDbWQgPSAic3RlcE92ZXJTdGF0ZW1lbnQiOwpjb25zdCBj
aGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c3RlcEludG9TdGF0ZW1lbnRDbWQgPSAi
c3RlcEludG9TdGF0ZW1lbnQiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
cjo6c3RlcE91dE9mRnVuY3Rpb25DbWQgPSAic3RlcE91dE9mRnVuY3Rpb24iOwpjb25zdCBjaGFy
KiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0UGF1c2VPbkV4Y2VwdGlvbnNTdGF0ZUNt
ZCA9ICJzZXRQYXVzZU9uRXhjZXB0aW9uc1N0YXRlIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OmVkaXRTY3JpcHRTb3VyY2VDbWQgPSAiZWRpdFNjcmlwdFNvdXJjZSI7
CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRTY3JpcHRTb3VyY2VD
bWQgPSAiZ2V0U2NyaXB0U291cmNlIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OnNldE5hdGl2ZUJyZWFrcG9pbnRDbWQgPSAic2V0TmF0aXZlQnJlYWtwb2ludCI7CmNv
bnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZW1vdmVOYXRpdmVCcmVha3Bv
aW50Q21kID0gInJlbW92ZU5hdGl2ZUJyZWFrcG9pbnQiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JC
YWNrZW5kRGlzcGF0Y2hlcjo6ZW5hYmxlUHJvZmlsZXJDbWQgPSAiZW5hYmxlUHJvZmlsZXIiOwpj
b25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6ZGlzYWJsZVByb2ZpbGVyQ21k
ID0gImRpc2FibGVQcm9maWxlciI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVyOjpzdGFydFByb2ZpbGluZ0NtZCA9ICJzdGFydFByb2ZpbGluZyI7CmNvbnN0IGNoYXIqIElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzdG9wUHJvZmlsaW5nQ21kID0gInN0b3BQcm9maWxp
bmciOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0UHJvZmlsZUhl
YWRlcnNDbWQgPSAiZ2V0UHJvZmlsZUhlYWRlcnMiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6Z2V0UHJvZmlsZUNtZCA9ICJnZXRQcm9maWxlIjsKY29uc3QgY2hhciog
SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJlbW92ZVByb2ZpbGVDbWQgPSAicmVtb3ZlUHJv
ZmlsZSI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpjbGVhclByb2Zp
bGVzQ21kID0gImNsZWFyUHJvZmlsZXMiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcjo6dGFrZUhlYXBTbmFwc2hvdENtZCA9ICJ0YWtlSGVhcFNuYXBzaG90IjsKY29uc3Qg
Y2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnNldEluamVjdGVkU2NyaXB0U291cmNl
Q21kID0gInNldEluamVjdGVkU2NyaXB0U291cmNlIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OmRpc3BhdGNoT25JbmplY3RlZFNjcmlwdENtZCA9ICJkaXNwYXRjaE9u
SW5qZWN0ZWRTY3JpcHQiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
YWRkU2NyaXB0VG9FdmFsdWF0ZU9uTG9hZENtZCA9ICJhZGRTY3JpcHRUb0V2YWx1YXRlT25Mb2Fk
IjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJlbW92ZUFsbFNjcmlw
dHNUb0V2YWx1YXRlT25Mb2FkQ21kID0gInJlbW92ZUFsbFNjcmlwdHNUb0V2YWx1YXRlT25Mb2Fk
IjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldENoaWxkTm9kZXND
bWQgPSAiZ2V0Q2hpbGROb2RlcyI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVyOjpzZXRBdHRyaWJ1dGVDbWQgPSAic2V0QXR0cmlidXRlIjsKY29uc3QgY2hhciogSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OnJlbW92ZUF0dHJpYnV0ZUNtZCA9ICJyZW1vdmVBdHRyaWJ1
dGUiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0VGV4dE5vZGVW
YWx1ZUNtZCA9ICJzZXRUZXh0Tm9kZVZhbHVlIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OmdldEV2ZW50TGlzdGVuZXJzRm9yTm9kZUNtZCA9ICJnZXRFdmVudExpc3Rl
bmVyc0Zvck5vZGUiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Y29w
eU5vZGVDbWQgPSAiY29weU5vZGUiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcjo6cmVtb3ZlTm9kZUNtZCA9ICJyZW1vdmVOb2RlIjsKY29uc3QgY2hhciogSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OmNoYW5nZVRhZ05hbWVDbWQgPSAiY2hhbmdlVGFnTmFtZSI7CmNv
bnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRPdXRlckhUTUxDbWQgPSAi
Z2V0T3V0ZXJIVE1MIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnNl
dE91dGVySFRNTENtZCA9ICJzZXRPdXRlckhUTUwiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6YWRkSW5zcGVjdGVkTm9kZUNtZCA9ICJhZGRJbnNwZWN0ZWROb2RlIjsK
Y29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnBlcmZvcm1TZWFyY2hDbWQg
PSAicGVyZm9ybVNlYXJjaCI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpzZWFyY2hDYW5jZWxlZENtZCA9ICJzZWFyY2hDYW5jZWxlZCI7CmNvbnN0IGNoYXIqIEluc3Bl
Y3RvckJhY2tlbmREaXNwYXRjaGVyOjpwdXNoTm9kZUJ5UGF0aFRvRnJvbnRlbmRDbWQgPSAicHVz
aE5vZGVCeVBhdGhUb0Zyb250ZW5kIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OnNldENvbnNvbGVNZXNzYWdlc0VuYWJsZWRDbWQgPSAic2V0Q29uc29sZU1lc3NhZ2Vz
RW5hYmxlZCI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpjbGVhckNv
bnNvbGVNZXNzYWdlc0NtZCA9ICJjbGVhckNvbnNvbGVNZXNzYWdlcyI7CmNvbnN0IGNoYXIqIElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpoaWdobGlnaHRET01Ob2RlQ21kID0gImhpZ2hsaWdo
dERPTU5vZGUiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6aGlkZURP
TU5vZGVIaWdobGlnaHRDbWQgPSAiaGlkZURPTU5vZGVIaWdobGlnaHQiOwpjb25zdCBjaGFyKiBJ
bnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6b3BlbkluSW5zcGVjdGVkV2luZG93Q21kID0gIm9w
ZW5Jbkluc3BlY3RlZFdpbmRvdyI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVyOjpoaWdobGlnaHRGcmFtZUNtZCA9ICJoaWdobGlnaHRGcmFtZSI7CmNvbnN0IGNoYXIqIElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpoaWRlRnJhbWVIaWdobGlnaHRDbWQgPSAiaGlkZUZy
YW1lSGlnaGxpZ2h0IjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6Omdl
dFN0eWxlc0NtZCA9ICJnZXRTdHlsZXMiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcjo6Z2V0QWxsU3R5bGVzQ21kID0gImdldEFsbFN0eWxlcyI7CmNvbnN0IGNoYXIqIElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRJbmxpbmVTdHlsZUNtZCA9ICJnZXRJbmxpbmVT
dHlsZSI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRDb21wdXRl
ZFN0eWxlQ21kID0gImdldENvbXB1dGVkU3R5bGUiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6Z2V0U3R5bGVTaGVldENtZCA9ICJnZXRTdHlsZVNoZWV0IjsKY29uc3Qg
Y2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldFN0eWxlU291cmNlRGF0YUNtZCA9
ICJnZXRTdHlsZVNvdXJjZURhdGEiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcjo6YXBwbHlTdHlsZVRleHRDbWQgPSAiYXBwbHlTdHlsZVRleHQiOwpjb25zdCBjaGFyKiBJ
bnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0U3R5bGVUZXh0Q21kID0gInNldFN0eWxlVGV4
dCI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRTdHlsZVByb3Bl
cnR5Q21kID0gInNldFN0eWxlUHJvcGVydHkiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlcjo6dG9nZ2xlU3R5bGVFbmFibGVkQ21kID0gInRvZ2dsZVN0eWxlRW5hYmxlZCI7
CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRSdWxlU2VsZWN0b3JD
bWQgPSAic2V0UnVsZVNlbGVjdG9yIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OmFkZFJ1bGVDbWQgPSAiYWRkUnVsZSI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjpnZXRTdHlsZXNGb3JOb2RlMkNtZCA9ICJnZXRTdHlsZXNGb3JOb2RlMiI7
CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRDb21wdXRlZFN0eWxl
Rm9yTm9kZTJDbWQgPSAiZ2V0Q29tcHV0ZWRTdHlsZUZvck5vZGUyIjsKY29uc3QgY2hhciogSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldElubGluZVN0eWxlRm9yTm9kZTJDbWQgPSAiZ2V0
SW5saW5lU3R5bGVGb3JOb2RlMiI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVyOjpnZXRBbGxTdHlsZXMyQ21kID0gImdldEFsbFN0eWxlczIiOwpjb25zdCBjaGFyKiBJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0U3R5bGVTaGVldDJDbWQgPSAiZ2V0U3R5bGVTaGVl
dDIiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0U3R5bGVTaGVl
dFRleHQyQ21kID0gInNldFN0eWxlU2hlZXRUZXh0MiI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVyOjpzZXRQcm9wZXJ0eVRleHQyQ21kID0gInNldFByb3BlcnR5VGV4dDIi
Owpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6dG9nZ2xlUHJvcGVydHky
Q21kID0gInRvZ2dsZVByb3BlcnR5MiI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVyOjpzZXRSdWxlU2VsZWN0b3IyQ21kID0gInNldFJ1bGVTZWxlY3RvcjIiOwpjb25zdCBj
aGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6YWRkUnVsZTJDbWQgPSAiYWRkUnVsZTIi
Owpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0U3VwcG9ydGVkQ1NT
UHJvcGVydGllc0NtZCA9ICJnZXRTdXBwb3J0ZWRDU1NQcm9wZXJ0aWVzIjsKY29uc3QgY2hhciog
SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnF1ZXJ5U2VsZWN0b3JBbGxDbWQgPSAicXVlcnlT
ZWxlY3RvckFsbCI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRD
b29raWVzQ21kID0gImdldENvb2tpZXMiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcjo6ZGVsZXRlQ29va2llQ21kID0gImRlbGV0ZUNvb2tpZSI7CmNvbnN0IGNoYXIqIElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRBcHBsaWNhdGlvbkNhY2hlc0NtZCA9ICJnZXRB
cHBsaWNhdGlvbkNhY2hlcyI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpnZXRGaWxlU3lzdGVtUGF0aEFzeW5jQ21kID0gImdldEZpbGVTeXN0ZW1QYXRoQXN5bmMiOwpj
b25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cmV2ZWFsRm9sZGVySW5PU0Nt
ZCA9ICJyZXZlYWxGb2xkZXJJbk9TIjsKY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OnJlbGVhc2VXcmFwcGVyT2JqZWN0R3JvdXBDbWQgPSAicmVsZWFzZVdyYXBwZXJPYmpl
Y3RHcm91cCI7CmNvbnN0IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpkaWRFdmFs
dWF0ZUZvclRlc3RJbkZyb250ZW5kQ21kID0gImRpZEV2YWx1YXRlRm9yVGVzdEluRnJvbnRlbmQi
Owpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0RGF0YWJhc2VUYWJs
ZU5hbWVzQ21kID0gImdldERhdGFiYXNlVGFibGVOYW1lcyI7CmNvbnN0IGNoYXIqIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyOjpleGVjdXRlU1FMQ21kID0gImV4ZWN1dGVTUUwiOwpjb25zdCBj
aGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0RE9NU3RvcmFnZUVudHJpZXNDbWQg
PSAiZ2V0RE9NU3RvcmFnZUVudHJpZXMiOwpjb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcjo6c2V0RE9NU3RvcmFnZUl0ZW1DbWQgPSAic2V0RE9NU3RvcmFnZUl0ZW0iOwpjb25z
dCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cmVtb3ZlRE9NU3RvcmFnZUl0ZW1D
bWQgPSAicmVtb3ZlRE9NU3RvcmFnZUl0ZW0iOwoKYm9vbCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcjo6Z2V0Q29tbWFuZE5hbWUoY29uc3QgU3RyaW5nJiBtZXNzYWdlLCBTdHJpbmcqIHJlc3Vs
dCkKewogICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSA9IEluc3BlY3RvclZhbHVlOjpw
YXJzZUpTT04obWVzc2FnZSk7CiAgICBpZiAoIXZhbHVlKQogICAgICAgIHJldHVybiBmYWxzZTsK
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBvYmplY3QgPSB2YWx1ZS0+YXNPYmplY3QoKTsK
ICAgIGlmICghb2JqZWN0KQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICBSZWZQdHI8SW5zcGVj
dG9yVmFsdWU+IGNvbW1hbmRWYWx1ZSA9IG9iamVjdC0+Z2V0KCJjb21tYW5kIik7CiAgICBpZiAo
IWNvbW1hbmRWYWx1ZSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIGNvbW1hbmRW
YWx1ZS0+YXNTdHJpbmcocmVzdWx0KTsKfQp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
Ojpwb3B1bGF0ZVNjcmlwdE9iamVjdHMobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJh
eTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAgcHJv
dG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhhbmRs
ZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgo
KSkKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPnBvcHVsYXRlU2NyaXB0T2JqZWN0cygp
OwoKICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0
b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJ
ZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3Rv
Y29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3Rv
Y29sRXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVu
dCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmco
KSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldEluc3BlY3Rv
clN0YXRlKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqKQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAg
IGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNo
U3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5kbGVyIGlzIG5vdCBhdmFpbGFi
bGUuIik7CgogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc3RhdGUgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAg
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5nZXRJbnNwZWN0b3JTdGF0ZSgmc3RhdGUpOwoKICAgIC8v
IHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxh
YmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1f
aW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7
CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAg
ICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3Jz
LT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAg
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3Jz
KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVz
cG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9u
c2VEYXRhLT5zZXRPYmplY3QoInN0YXRlIiwgc3RhdGUpOwogICAgICAgICAgICByZXNwb25zZU1l
c3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNlRGF0YSk7CiAgICAgICAgfQogICAgICAg
IG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9G
cm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJ
bnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0U2VhcmNoaW5nRm9yTm9kZShsb25nIGNhbGxJ
ZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPElu
c3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsK
CiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlcikKICAgICAgICBwcm90b2NvbEVycm9ycy0+
cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IENvbnRyb2xsZXIgaGFuZGxlciBpcyBub3QgYXZh
aWxhYmxlLiIpOwoKICAgIGJvb2wgbmV3U3RhdGUgPSBmYWxzZTsKICAgIGlmIChSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3Nh
Z2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBi
b29sIGVuYWJsZWQgPSBnZXRCb29sZWFuKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgImVuYWJs
ZWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMt
Pmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPnNldFNlYXJjaGlu
Z0Zvck5vZGUoZW5hYmxlZCwgJm5ld1N0YXRlKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JG
cm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAo
KGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJv
bGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJl
c3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9u
c2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNz
YWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7Cgog
ICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNl
TWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNl
IHsKICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRCb29s
ZWFuKCJuZXdTdGF0ZSIsIG5ld1N0YXRlKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5z
ZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3Bl
Y3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQo
cmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OnNldE1vbml0b3JpbmdYSFJFbmFibGVkKGxvbmcgY2FsbElkLCBJ
bnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAg
IGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNo
U3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5kbGVyIGlzIG5vdCBhdmFpbGFi
bGUuIik7CgogICAgYm9vbCBuZXdTdGF0ZSA9IGZhbHNlOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9i
amVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGJvb2wg
ZW5hYmxlID0gZ2V0Qm9vbGVhbihhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJlbmFibGUiLCBw
cm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0
aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPnNldE1vbml0b3JpbmdYSFJF
bmFibGVkKGVuYWJsZSwgJm5ld1N0YXRlKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9u
dGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNh
bGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxl
ci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3Bv
bnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VN
ZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdl
LT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAg
ICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVz
c2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsK
ICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRCb29sZWFu
KCJuZXdTdGF0ZSIsIG5ld1N0YXRlKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRP
YmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVz
cG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OnJlbG9hZFBhZ2UobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCop
CnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JB
cnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAg
cHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhh
bmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5n
dGgoKSkKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPnJlbG9hZFBhZ2UoKTsKCiAgICAv
LyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWls
YWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAg
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9y
cyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAg
fQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzdGFydFRpbWVsaW5lUHJvZmls
ZXIobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JB
cnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYg
KCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJp
bmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4i
KTsKCiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPnN0YXJ0VGltZWxpbmVQcm9maWxlcigpOwoKICAgIC8vIHVzZSBJbnNwZWN0
b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBp
ZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29u
dHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVz
cG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VN
ZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7
CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3Bv
bnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJv
bnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnN0b3BUaW1lbGluZVByb2ZpbGVyKGxvbmcgY2FsbElk
LCBJbnNwZWN0b3JPYmplY3QqKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29s
RXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JD
b250cm9sbGVyKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBF
cnJvcjogQ29udHJvbGxlciBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5z
dG9wVGltZWxpbmVQcm9maWxlcigpOwoKICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBh
IG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJv
bnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2Fn
ZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5z
ZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29s
ZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0
QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRy
b2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VN
ZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXI6OmNhY2hlZFJlc291cmNlcyhsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KikK
ewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFy
cmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+bV9yZXNvdXJj
ZUFnZW50KQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJv
cjogUmVzb3VyY2UgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHJlc291cmNlcyA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBp
ZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xs
ZXItPm1fcmVzb3VyY2VBZ2VudC0+Y2FjaGVkUmVzb3VyY2VzKCZyZXNvdXJjZXMpOwoKICAgIC8v
IHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxh
YmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1f
aW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7
CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAg
ICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3Jz
LT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAg
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3Jz
KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVz
cG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9u
c2VEYXRhLT5zZXRPYmplY3QoInJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICAgICAgICAgIHJl
c3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9
CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1l
c3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9
Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZXNvdXJjZUNvbnRlbnQobG9uZyBj
YWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRl
KCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPm1fcmVzb3VyY2VBZ2VudCkKICAg
ICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IFJlc291cmNl
IGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBTdHJpbmcgY29udGVudCA9ICIiOwog
ICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9i
amVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdl
dCgpKSkgewogICAgICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVJZCA9IGdldFVuc2lnbmVkTG9uZyhh
cmd1bWVudHNDb250YWluZXIuZ2V0KCksICJmcmFtZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkp
OwogICAgICAgIFN0cmluZyB1cmwgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgp
LCAidXJsIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIGJvb2wgYmFzZTY0RW5jb2Rl
ID0gZ2V0Qm9vbGVhbihhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJiYXNlNjRFbmNvZGUiLCBw
cm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0
aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPm1fcmVzb3VyY2VBZ2VudC0+
cmVzb3VyY2VDb250ZW50KGZyYW1lSWQsIHVybCwgYmFzZTY0RW5jb2RlLCAmY29udGVudCk7CiAg
ICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVj
dG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0
aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6
OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxs
SWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90
b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0
aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90
b2NvbEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAg
ICAgIHJlc3BvbnNlRGF0YS0+c2V0U3RyaW5nKCJjb250ZW50IiwgY29udGVudCk7CiAgICAgICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAg
ICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+
c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwog
ICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjplbmFibGVEZWJ1Z2dlcihs
b25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAg
UmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5Ojpj
cmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQmFja2Vu
ZCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjog
QmFja2VuZCBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2Fn
ZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGJv
b2wgYWx3YXlzID0gZ2V0Qm9vbGVhbihhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJhbHdheXMi
LCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckJhY2tl
bmQoKS0+ZW5hYmxlRGVidWdnZXIoYWx3YXlzKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JG
cm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAo
KGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJv
bGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJl
c3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9u
c2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNz
YWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7Cgog
ICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNl
TWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRl
bmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OmRpc2FibGVEZWJ1Z2dlcihsb25nIGNhbGxJZCwgSW5zcGVj
dG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFy
cmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAo
IW1faW5zcGVjdG9yQ29udHJvbGxlcikKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmlu
ZygiUHJvdG9jb2wgRXJyb3I6IENvbnRyb2xsZXIgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIp
OwoKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBn
ZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9y
cy5nZXQoKSkpIHsKICAgICAgICBib29sIGFsd2F5cyA9IGdldEJvb2xlYW4oYXJndW1lbnRzQ29u
dGFpbmVyLmdldCgpLCAiYWx3YXlzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBp
ZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5kaXNhYmxlRGVidWdnZXIoYWx3YXlzKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0
b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBp
ZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29u
dHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVz
cG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VN
ZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7
CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3Bv
bnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJv
bnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnNldEJyZWFrcG9pbnQobG9uZyBjYWxsSWQsIEluc3Bl
Y3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JB
cnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYg
KCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRlYnVnZ2VyQWdlbnQoKSkKICAgICAgICBwcm90b2Nv
bEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IERlYnVnIGhhbmRsZXIgaXMgbm90
IGF2YWlsYWJsZS4iKTsKCiAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKICAgIHVuc2lnbmVkIGlu
dCBhY3R1YWxMaW5lTnVtYmVyID0gMHU7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
YXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJn
dW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgU3RyaW5nIHNvdXJjZUlE
ID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInNvdXJjZUlEIiwgcHJvdG9j
b2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIHVuc2lnbmVkIGludCBsaW5lTnVtYmVyID0gZ2V0VW5z
aWduZWRJbnQoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAibGluZU51bWJlciIsIHByb3RvY29s
RXJyb3JzLmdldCgpKTsKICAgICAgICBib29sIGVuYWJsZWQgPSBnZXRCb29sZWFuKGFyZ3VtZW50
c0NvbnRhaW5lci5nZXQoKSwgImVuYWJsZWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CiAgICAg
ICAgU3RyaW5nIGNvbmRpdGlvbiA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCks
ICJjb25kaXRpb24iLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9j
b2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRl
YnVnZ2VyQWdlbnQoKS0+c2V0QnJlYWtwb2ludChzb3VyY2VJRCwgbGluZU51bWJlciwgZW5hYmxl
ZCwgY29uZGl0aW9uLCAmc3VjY2VzcywgJmFjdHVhbExpbmVOdW1iZXIpOwogICAgfQogICAgLy8g
dXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFi
aWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9p
bnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAg
ICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMt
Pmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAg
ICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMp
OwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNw
b25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25z
ZURhdGEtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgICAgICAgcmVzcG9u
c2VEYXRhLT5zZXROdW1iZXIoImFjdHVhbExpbmVOdW1iZXIiLCBhY3R1YWxMaW5lTnVtYmVyKTsK
ICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURh
dGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNs
aWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJp
bmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJlbW92ZUJy
ZWFrcG9pbnQobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmpl
Y3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0
b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRlYnVn
Z2VyQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wg
RXJyb3I6IERlYnVnIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RN
ZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAg
ICAgU3RyaW5nIHNvdXJjZUlEID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwg
InNvdXJjZUlEIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIHVuc2lnbmVkIGxvbmcg
bGluZU51bWJlciA9IGdldFVuc2lnbmVkTG9uZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJs
aW5lTnVtYmVyIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1
Z2dlckFnZW50KCktPnJlbW92ZUJyZWFrcG9pbnQoc291cmNlSUQsIGxpbmVOdW1iZXIpOwogICAg
fQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3Rv
ciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgo
KSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0Ojpj
cmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElk
KTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9j
b2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgo
KSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9j
b2xFcnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50
KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygp
KTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6YWN0aXZhdGVCcmVh
a3BvaW50cyhsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KikKewogICAgUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAg
ICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+ZGVidWdnZXJBZ2VudCgpKQogICAgICAgIHBy
b3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRGVidWcgaGFuZGxlciBp
cyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQog
ICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZGVidWdnZXJBZ2VudCgpLT5hY3RpdmF0ZUJy
ZWFrcG9pbnRzKCk7CgogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9m
IFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJy
b3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigi
c2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nl
c3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJy
b3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJy
b3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5z
cGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRv
SlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
ZGVhY3RpdmF0ZUJyZWFrcG9pbnRzKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6
OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50
KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBE
ZWJ1ZyBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpCiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50
KCktPmRlYWN0aXZhdGVCcmVha3BvaW50cygpOwoKICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVu
ZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJ
ZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+
aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNl
TWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNz
YWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5z
ZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAg
IGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2Fn
ZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVz
cG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OnBhdXNlKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6
OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50
KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBE
ZWJ1ZyBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpCiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50
KCktPnBhdXNlKCk7CgogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9m
IFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJy
b3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigi
c2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nl
c3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJy
b3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJy
b3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5z
cGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRv
SlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
cmVzdW1lKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqKQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAg
IGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50KCkpCiAgICAgICAgcHJv
dG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBEZWJ1ZyBoYW5kbGVyIGlz
IG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAg
ICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50KCktPnJlc3VtZSgpOwoK
ICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3Ig
YXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkp
ICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7
CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkp
CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29s
RXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgp
LT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7
CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnN0ZXBPdmVyU3RhdGVt
ZW50KGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlm
ICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50KCkpCiAgICAgICAgcHJvdG9j
b2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBEZWJ1ZyBoYW5kbGVyIGlzIG5v
dCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAg
ICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50KCktPnN0ZXBPdmVyU3RhdGVt
ZW50KCk7CgogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYklu
c3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5s
ZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwg
Y2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAh
cHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5s
ZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwg
cHJvdG9jb2xFcnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9y
Q2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0
cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c3RlcElu
dG9TdGF0ZW1lbnQobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7
CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRlYnVnZ2VyQWdlbnQoKSkKICAgICAg
ICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IERlYnVnIGhhbmRs
ZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgo
KSkKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRlYnVnZ2VyQWdlbnQoKS0+c3RlcElu
dG9TdGF0ZW1lbnQoKTsKCiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIg
b2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xF
cnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkp
IHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVy
KCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3Vj
Y2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xF
cnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJl
cnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5p
bnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+
dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpzdGVwT3V0T2ZGdW5jdGlvbihsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KikKewogICAg
UmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5Ojpj
cmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+ZGVidWdnZXJBZ2VudCgp
KQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRGVi
dWcgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIGlmICghcHJvdG9jb2xFcnJvcnMt
Pmxlbmd0aCgpKQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZGVidWdnZXJBZ2VudCgp
LT5zdGVwT3V0T2ZGdW5jdGlvbigpOwoKICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBh
IG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJv
bnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2Fn
ZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5z
ZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29s
ZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0
QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRy
b2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VN
ZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXI6OnNldFBhdXNlT25FeGNlcHRpb25zU3RhdGUobG9uZyBjYWxsSWQsIEluc3BlY3Rv
ck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJh
eT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFt
X2luc3BlY3RvckNvbnRyb2xsZXItPmRlYnVnZ2VyQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVy
cm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IERlYnVnIGhhbmRsZXIgaXMgbm90IGF2
YWlsYWJsZS4iKTsKCiAgICBsb25nIG5ld1N0YXRlID0gMDsKICAgIGlmIChSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VP
YmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBsb25n
IHBhdXNlT25FeGNlcHRpb25zU3RhdGUgPSBnZXRMb25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQo
KSwgInBhdXNlT25FeGNlcHRpb25zU3RhdGUiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAg
ICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmRlYnVnZ2VyQWdlbnQoKS0+c2V0UGF1c2VPbkV4Y2VwdGlvbnNTdGF0ZShw
YXVzZU9uRXhjZXB0aW9uc1N0YXRlLCAmbmV3U3RhdGUpOwogICAgfQogICAgLy8gdXNlIEluc3Bl
Y3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAg
IGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICBy
ZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25z
ZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVz
cG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAg
IGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEg
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNl
dE51bWJlcigibmV3U3RhdGUiLCBuZXdTdGF0ZSk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2Fn
ZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9p
bnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250
ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3Bl
Y3RvckJhY2tlbmREaXNwYXRjaGVyOjplZGl0U2NyaXB0U291cmNlKGxvbmcgY2FsbElkLCBJbnNw
ZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlm
ICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50KCkpCiAgICAgICAgcHJvdG9j
b2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBEZWJ1ZyBoYW5kbGVyIGlzIG5v
dCBhdmFpbGFibGUuIik7CgogICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAgICBTdHJpbmcgcmVz
dWx0ID0gIiI7CiAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IG5ld0NhbGxGcmFtZXMgPSBJbnNw
ZWN0b3JWYWx1ZTo6bnVsbCgpOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3Vt
ZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50
cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIFN0cmluZyBzb3VyY2VJRCA9IGdl
dFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJzb3VyY2VJRCIsIHByb3RvY29sRXJy
b3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcgbmV3Q29udGVudCA9IGdldFN0cmluZyhhcmd1bWVu
dHNDb250YWluZXIuZ2V0KCksICJuZXdDb250ZW50IiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoK
ICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNw
ZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dlckFnZW50KCktPmVkaXRTY3JpcHRTb3VyY2Uoc291cmNl
SUQsIG5ld0NvbnRlbnQsICZzdWNjZXNzLCAmcmVzdWx0LCAmbmV3Q2FsbEZyYW1lcyk7CiAgICB9
CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9y
IGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2Nv
bEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2Nv
bEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAg
IHJlc3BvbnNlRGF0YS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsIHN1Y2Nlc3MpOwogICAgICAgICAg
ICByZXNwb25zZURhdGEtPnNldFN0cmluZygicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICAgICAg
cmVzcG9uc2VEYXRhLT5zZXRWYWx1ZSgibmV3Q2FsbEZyYW1lcyIsIG5ld0NhbGxGcmFtZXMpOwog
ICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNlRGF0
YSk7CiAgICAgICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xp
ZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0U2NyaXB0
U291cmNlKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9y
QXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kZWJ1Z2dl
ckFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVy
cm9yOiBEZWJ1ZyBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgU3RyaW5nIHNjcmlw
dFNvdXJjZSA9ICIiOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0Nv
bnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHBy
b3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIFN0cmluZyBzb3VyY2VJRCA9IGdldFN0cmlu
Zyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJzb3VyY2VJRCIsIHByb3RvY29sRXJyb3JzLmdl
dCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAg
IG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZGVidWdnZXJBZ2VudCgpLT5nZXRTY3JpcHRTb3VyY2Uo
c291cmNlSUQsICZzY3JpcHRTb3VyY2UpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250
ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2Fs
bElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVy
LT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9u
c2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1l
c3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2Ut
PnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAg
ICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNz
YWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2Ugewog
ICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0
b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldFN0cmluZygi
c2NyaXB0U291cmNlIiwgc2NyaXB0U291cmNlKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdl
LT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRl
bmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OnNldE5hdGl2ZUJyZWFrcG9pbnQobG9uZyBjYWxsSWQsIElu
c3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0
b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAg
aWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hT
dHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJs
ZS4iKTsKCiAgICBTdHJpbmcgYnJlYWtwb2ludElkID0gIiI7CiAgICBpZiAoUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdl
T2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gYnJlYWtwb2ludCA9IGdldE9iamVjdChhcmd1bWVudHNDb250
YWluZXIuZ2V0KCksICJicmVha3BvaW50IiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAg
ICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5zZXROYXRpdmVCcmVha3BvaW50KGJyZWFrcG9pbnQsICZicmVha3BvaW50SWQp
OwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYklu
c3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5s
ZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwg
Y2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAh
cHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5s
ZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwg
cHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
ICAgICAgICByZXNwb25zZURhdGEtPnNldFN0cmluZygiYnJlYWtwb2ludElkIiwgYnJlYWtwb2lu
dElkKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNw
b25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3Bl
Y3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pT
T05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJl
bW92ZU5hdGl2ZUJyZWFrcG9pbnQobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVz
dE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJv
cnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRy
b2xsZXIpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9y
OiBDb250cm9sbGVyIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RN
ZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAg
ICAgU3RyaW5nIGJyZWFrcG9pbnRJZCA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0
KCksICJicmVha3BvaW50SWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICgh
cHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xs
ZXItPnJlbW92ZU5hdGl2ZUJyZWFrcG9pbnQoYnJlYWtwb2ludElkKTsKICAgIH0KICAgIC8vIHVz
ZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmls
aXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5z
cGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAg
ICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAg
cmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5s
ZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsK
ICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVz
c2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0K
CnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmVuYWJsZVByb2ZpbGVyKGxvbmcgY2Fs
bElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8
SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgp
OwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHByb3RvY29sRXJyb3Jz
LT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5kbGVyIGlzIG5vdCBh
dmFpbGFibGUuIik7CgogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0Nv
bnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHBy
b3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGJvb2wgYWx3YXlzID0gZ2V0Qm9vbGVhbihh
cmd1bWVudHNDb250YWluZXIuZ2V0KCksICJhbHdheXMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7
CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmVuYWJsZVByb2ZpbGVyKGFsd2F5cyk7CiAgICB9CiAgICAvLyB1
c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJp
bGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAg
IHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+
bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAg
ICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7
CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1l
c3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9
Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpkaXNhYmxlUHJvZmlsZXIobG9uZyBj
YWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRl
KCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAgcHJvdG9jb2xFcnJv
cnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhhbmRsZXIgaXMgbm90
IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRz
Q29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwg
cHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgYm9vbCBhbHdheXMgPSBnZXRCb29sZWFu
KGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgImFsd2F5cyIsIHByb3RvY29sRXJyb3JzLmdldCgp
KTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIG1f
aW5zcGVjdG9yQ29udHJvbGxlci0+ZGlzYWJsZVByb2ZpbGVyKGFsd2F5cyk7CiAgICB9CiAgICAv
LyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWls
YWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAg
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9y
cyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAg
fQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzdGFydFByb2ZpbGluZyhsb25n
IGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KikKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBw
cm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5z
cGVjdG9yQ29udHJvbGxlcikKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJv
dG9jb2wgRXJyb3I6IENvbnRyb2xsZXIgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAg
IGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgIG1faW5zcGVjdG9yQ29udHJv
bGxlci0+c3RhcnRQcm9maWxpbmcoKTsKCiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMg
YSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwg
cHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zy
b250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3Nh
Z2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9v
bGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAo
cHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNl
dEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNl
TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmRE
aXNwYXRjaGVyOjpzdG9wUHJvZmlsaW5nKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqKQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJy
YXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHBy
b3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5k
bGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpCiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5zdG9wUHJvZmlsaW5nKCk7CgogICAg
Ly8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFp
bGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYg
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUo
KTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAg
ICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJv
cnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAg
ICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJv
cnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNl
bmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAg
IH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0UHJvZmlsZUhlYWRlcnMo
bG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJh
eT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFt
X2luc3BlY3RvckNvbnRyb2xsZXItPnByb2ZpbGVyQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVy
cm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IFByb2ZpbGVyIGhhbmRsZXIgaXMgbm90
IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGhlYWRlcnMgPSBJbnNw
ZWN0b3JBcnJheTo6Y3JlYXRlKCk7CiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkK
ICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPnByb2ZpbGVyQWdlbnQoKS0+Z2V0UHJvZmls
ZUhlYWRlcnMoJmhlYWRlcnMpOwoKICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1h
cmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90
b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRl
bmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRO
dW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFu
KCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90
b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJy
YXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0Ojpj
cmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRBcnJheSgiaGVhZGVycyIsIGhl
YWRlcnMpOwogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJl
c3BvbnNlRGF0YSk7CiAgICAgICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5z
cGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRv
SlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
Z2V0UHJvZmlsZShsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9i
amVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3Bl
Y3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+cHJv
ZmlsZXJBZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2Nv
bCBFcnJvcjogUHJvZmlsZXIgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHByb2ZpbGUgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9i
amVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdl
dCgpKSkgewogICAgICAgIFN0cmluZyB0eXBlID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5l
ci5nZXQoKSwgInR5cGUiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CiAgICAgICAgdW5zaWduZWQg
bG9uZyB1aWQgPSBnZXRVbnNpZ25lZExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAidWlk
IiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5s
ZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5wcm9maWxlckFnZW50
KCktPmdldFByb2ZpbGUodHlwZSwgdWlkLCAmcHJvZmlsZSk7CiAgICB9CiAgICAvLyB1c2UgSW5z
cGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQog
ICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAg
IHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3Bv
bnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBy
ZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAg
ICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlRGF0
YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+
c2V0T2JqZWN0KCJwcm9maWxlIiwgcHJvZmlsZSk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2Fn
ZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9p
bnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250
ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3Bl
Y3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZW1vdmVQcm9maWxlKGxvbmcgY2FsbElkLCBJbnNwZWN0
b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJy
YXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICgh
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5wcm9maWxlckFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xF
cnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBQcm9maWxlciBoYW5kbGVyIGlzIG5v
dCBhdmFpbGFibGUuIik7CgogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50
c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIs
IHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIFN0cmluZyB0eXBlID0gZ2V0U3RyaW5n
KGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInR5cGUiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7
CiAgICAgICAgdW5zaWduZWQgbG9uZyB1aWQgPSBnZXRVbnNpZ25lZExvbmcoYXJndW1lbnRzQ29u
dGFpbmVyLmdldCgpLCAidWlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAo
IXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9s
bGVyLT5wcm9maWxlckFnZW50KCktPnJlbW92ZVByb2ZpbGUodHlwZSwgdWlkKTsKICAgIH0KICAg
IC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZh
aWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYm
IG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAg
ICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJy
b3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAg
ICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJy
b3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAg
ICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmNsZWFyUHJvZmlsZXMobG9u
ZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4g
cHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2lu
c3BlY3RvckNvbnRyb2xsZXItPnByb2ZpbGVyQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVycm9y
cy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IFByb2ZpbGVyIGhhbmRsZXIgaXMgbm90IGF2
YWlsYWJsZS4iKTsKCiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICBt
X2luc3BlY3RvckNvbnRyb2xsZXItPnByb2ZpbGVyQWdlbnQoKS0+Y2xlYXJQcm9maWxlcygpOwoK
ICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3Ig
YXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkp
ICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7
CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkp
CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29s
RXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgp
LT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7
CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnRha2VIZWFwU25hcHNo
b3QobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JB
cnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYg
KCFtX2luc3BlY3RvckNvbnRyb2xsZXItPnByb2ZpbGVyQWdlbnQoKSkKICAgICAgICBwcm90b2Nv
bEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IFByb2ZpbGVyIGhhbmRsZXIgaXMg
bm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAg
ICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPnByb2ZpbGVyQWdlbnQoKS0+dGFrZUhlYXBTbmFw
c2hvdCgpOwoKICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJ
bnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+
bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAg
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9i
amVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIs
IGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwg
IXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+
bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIs
IHByb3RvY29sRXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3Rv
ckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05T
dHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnNldElu
amVjdGVkU2NyaXB0U291cmNlKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RN
ZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3Jz
ID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9s
bGVyLT5pbnNwZWN0b3JCYWNrZW5kKCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJp
bmcoIlByb3RvY29sIEVycm9yOiBCYWNrZW5kIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsK
CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0
T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMu
Z2V0KCkpKSB7CiAgICAgICAgU3RyaW5nIHNjcmlwdFNvdXJjZSA9IGdldFN0cmluZyhhcmd1bWVu
dHNDb250YWluZXIuZ2V0KCksICJzY3JpcHRTb3VyY2UiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7
CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckJhY2tlbmQoKS0+c2V0SW5qZWN0ZWRTY3JpcHRT
b3VyY2Uoc2NyaXB0U291cmNlKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBh
cyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8
fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFz
RnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVz
c2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdl
LT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRC
b29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlm
IChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNv
bnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9u
c2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OmRpc3BhdGNoT25JbmplY3RlZFNjcmlwdChsb25nIGNhbGxJZCwgSW5zcGVj
dG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFy
cmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAo
IW1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQmFja2VuZCgpKQogICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQmFja2VuZCBoYW5kbGVyIGlz
IG5vdCBhdmFpbGFibGUuIik7CgogICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiByZXN1bHQgPSBJ
bnNwZWN0b3JWYWx1ZTo6bnVsbCgpOwogICAgYm9vbCBpc0V4Y2VwdGlvbiA9IGZhbHNlOwogICAg
aWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVj
dChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgp
KSkgewogICAgICAgIGxvbmcgaW5qZWN0ZWRTY3JpcHRJZCA9IGdldExvbmcoYXJndW1lbnRzQ29u
dGFpbmVyLmdldCgpLCAiaW5qZWN0ZWRTY3JpcHRJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsK
ICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIu
Z2V0KCksICJtZXRob2ROYW1lIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIFN0cmlu
ZyBhcmd1bWVudHMgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAiYXJndW1l
bnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3Jz
LT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JC
YWNrZW5kKCktPmRpc3BhdGNoT25JbmplY3RlZFNjcmlwdChpbmplY3RlZFNjcmlwdElkLCBtZXRo
b2ROYW1lLCBhcmd1bWVudHMsICZyZXN1bHQsICZpc0V4Y2VwdGlvbik7CiAgICB9CiAgICAvLyB1
c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJp
bGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAg
IHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+
bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAg
ICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7
CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3Bv
bnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNl
RGF0YS0+c2V0VmFsdWUoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0
YS0+c2V0Qm9vbGVhbigiaXNFeGNlcHRpb24iLCBpc0V4Y2VwdGlvbik7CiAgICAgICAgICAgIHJl
c3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9
CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1l
c3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9
Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjphZGRTY3JpcHRUb0V2YWx1YXRlT25M
b2FkKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJy
YXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHBy
b3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5k
bGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFy
Z3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIFN0cmluZyBzY3JpcHRT
b3VyY2UgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAic2NyaXB0U291cmNl
IiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5s
ZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5hZGRTY3JpcHRUb0V2
YWx1YXRlT25Mb2FkKHNjcmlwdFNvdXJjZSk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJv
bnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChj
YWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xs
ZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNw
b25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNl
TWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2Fn
ZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAg
ICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1l
c3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgbV9pbnNw
ZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5k
KHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyOjpyZW1vdmVBbGxTY3JpcHRzVG9FdmFsdWF0ZU9uTG9hZChsb25n
IGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KikKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBw
cm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5z
cGVjdG9yQ29udHJvbGxlcikKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJv
dG9jb2wgRXJyb3I6IENvbnRyb2xsZXIgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAg
IGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgIG1faW5zcGVjdG9yQ29udHJv
bGxlci0+cmVtb3ZlQWxsU2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQoKTsKCiAgICAvLyB1c2UgSW5z
cGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQog
ICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAg
IHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3Bv
bnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBy
ZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAg
ICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lk
IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRDaGlsZE5vZGVzKGxvbmcgY2FsbElkLCBJ
bnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAg
IGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpKQogICAgICAgIHByb3RvY29s
RXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRE9NIGhhbmRsZXIgaXMgbm90IGF2
YWlsYWJsZS4iKTsKCiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29u
dGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJv
dG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9uZyBub2RlSWQgPSBnZXRMb25nKGFyZ3Vt
ZW50c0NvbnRhaW5lci5nZXQoKSwgIm5vZGVJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKCiAg
ICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIG1faW5zcGVj
dG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKS0+Z2V0Q2hpbGROb2Rlcyhub2RlSWQpOwogICAgfQog
ICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBh
dmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkg
JiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsK
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xF
cnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkK
ICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xF
cnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCkt
PnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsK
ICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0QXR0cmlidXRlKGxv
bmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNy
ZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpKQogICAg
ICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRE9NIGhhbmRs
ZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKICAgIGlm
IChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3Qo
cmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkp
IHsKICAgICAgICBsb25nIGVsZW1lbnRJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdl
dCgpLCAiZWxlbWVudElkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIFN0cmluZyBu
YW1lID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgIm5hbWUiLCBwcm90b2Nv
bEVycm9ycy5nZXQoKSk7CiAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGFyZ3VtZW50
c0NvbnRhaW5lci5nZXQoKSwgInZhbHVlIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAg
ICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5kb21BZ2VudCgpLT5zZXRBdHRyaWJ1dGUoZWxlbWVudElkLCBuYW1lLCB2YWx1
ZSwgJnN1Y2Nlc3MpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFy
a2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3Rv
Y29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVu
ZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51
bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4o
InN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3Rv
Y29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJh
eSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCBz
dWNjZXNzKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCBy
ZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmlu
c3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50
b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6
OnJlbW92ZUF0dHJpYnV0ZShsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVz
c2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9
IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxl
ci0+ZG9tQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9j
b2wgRXJyb3I6IERPTSBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgYm9vbCBzdWNj
ZXNzID0gZmFsc2U7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29u
dGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJv
dG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9uZyBlbGVtZW50SWQgPSBnZXRMb25nKGFy
Z3VtZW50c0NvbnRhaW5lci5nZXQoKSwgImVsZW1lbnRJZCIsIHByb3RvY29sRXJyb3JzLmdldCgp
KTsKICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0
KCksICJuYW1lIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21B
Z2VudCgpLT5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudElkLCBuYW1lLCAmc3VjY2Vzcyk7CiAgICB9
CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9y
IGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2Nv
bEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2Nv
bEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAg
IHJlc3BvbnNlRGF0YS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsIHN1Y2Nlc3MpOwogICAgICAgICAg
ICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNlRGF0YSk7CiAgICAg
ICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNl
bmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAg
IH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0VGV4dE5vZGVWYWx1ZShs
b25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAg
UmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5Ojpj
cmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKSkKICAg
ICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IERPTSBoYW5k
bGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAgICBp
ZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0
KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkp
KSB7CiAgICAgICAgbG9uZyBub2RlSWQgPSBnZXRMb25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQo
KSwgIm5vZGVJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcgdmFsdWUg
PSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAidmFsdWUiLCBwcm90b2NvbEVy
cm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAg
ICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCktPnNldFRleHROb2RlVmFs
dWUobm9kZUlkLCB2YWx1ZSwgJnN1Y2Nlc3MpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZy
b250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgo
Y2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9s
bGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVz
cG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25z
ZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3Nh
Z2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAg
ICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VN
ZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2Ug
ewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldEJvb2xl
YW4oInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRP
YmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVz
cG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OmdldEV2ZW50TGlzdGVuZXJzRm9yTm9kZShsb25nIGNhbGxJZCwgSW5z
cGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBp
ZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVy
cm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IERPTSBoYW5kbGVyIGlzIG5vdCBhdmFp
bGFibGUuIik7CgogICAgbG9uZyBvdXROb2RlSWQgPSAwOwogICAgUmVmUHRyPEluc3BlY3RvckFy
cmF5PiBsaXN0ZW5lcnNBcnJheSA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKICAgIGlmIChS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVx
dWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsK
ICAgICAgICBsb25nIG5vZGVJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAi
bm9kZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJy
b3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2Vu
dCgpLT5nZXRFdmVudExpc3RlbmVyc0Zvck5vZGUobm9kZUlkLCAmb3V0Tm9kZUlkLCAmbGlzdGVu
ZXJzQXJyYXkpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2Vy
IG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgp
KSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJl
cigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1
Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgi
ZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldE51bWJlcigib3V0Tm9kZUlkIiwgb3V0
Tm9kZUlkKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRBcnJheSgibGlzdGVuZXJzQXJy
YXkiLCBsaXN0ZW5lcnNBcnJheSk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2Jq
ZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3Bv
bnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjpjb3B5Tm9kZShsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1
ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVy
cm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29u
dHJvbGxlci0+ZG9tQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygi
UHJvdG9jb2wgRXJyb3I6IERPTSBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYg
KFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChy
ZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkg
ewogICAgICAgIGxvbmcgbm9kZUlkID0gZ2V0TG9uZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCks
ICJub2RlSWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xF
cnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFn
ZW50KCktPmNvcHlOb2RlKG5vZGVJZCk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRl
bmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxs
SWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXIt
Pmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25z
ZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVz
c2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAg
ICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3Nh
Z2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgbV9pbnNwZWN0
b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJl
c3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVyOjpyZW1vdmVOb2RlKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3Qq
IHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3Rv
Y29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0
b3JDb250cm9sbGVyLT5kb21BZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3Ry
aW5nKCJQcm90b2NvbCBFcnJvcjogRE9NIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAg
ICBsb25nIG91dE5vZGVJZCA9IDA7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJn
dW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1l
bnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9uZyBub2RlSWQgPSBnZXRM
b25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgIm5vZGVJZCIsIHByb3RvY29sRXJyb3JzLmdl
dCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAg
IG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKS0+cmVtb3ZlTm9kZShub2RlSWQsICZv
dXROb2RlSWQpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2Vy
IG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgp
KSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJl
cigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1
Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgi
ZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldE51bWJlcigib3V0Tm9kZUlkIiwgb3V0
Tm9kZUlkKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCBy
ZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmlu
c3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50
b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6
OmNoYW5nZVRhZ05hbWUobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3Nh
Z2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJ
bnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIt
PmRvbUFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29s
IEVycm9yOiBET00gaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIGxvbmcgb3V0Tm9k
ZUlkID0gMDsKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWlu
ZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2Nv
bEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBsb25nIG5vZGVJZCA9IGdldExvbmcoYXJndW1lbnRz
Q29udGFpbmVyLmdldCgpLCAibm9kZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAg
IFN0cmluZyBuZXdUYWdOYW1lID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwg
Im5ld1RhZ05hbWUiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9j
b2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRv
bUFnZW50KCktPmNoYW5nZVRhZ05hbWUobm9kZUlkLCBuZXdUYWdOYW1lLCAmb3V0Tm9kZUlkKTsK
ICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNw
ZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVu
Z3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNh
bGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXBy
b3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVu
Z3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHBy
b3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAg
ICAgICAgcmVzcG9uc2VEYXRhLT5zZXROdW1iZXIoIm91dE5vZGVJZCIsIG91dE5vZGVJZCk7CiAg
ICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRh
KTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGll
bnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5n
KCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRPdXRlckhU
TUwobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJh
eTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkp
CiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBET00g
aGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIFN0cmluZyBvdXRlckhUTUwgPSAiIjsK
ICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRP
YmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5n
ZXQoKSkpIHsKICAgICAgICBsb25nIG5vZGVJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVy
LmdldCgpLCAibm9kZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXBy
b3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVy
LT5kb21BZ2VudCgpLT5nZXRPdXRlckhUTUwobm9kZUlkLCAmb3V0ZXJIVE1MKTsKICAgIH0KICAg
IC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZh
aWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYm
IG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAg
ICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJy
b3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAg
ICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJy
b3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVz
cG9uc2VEYXRhLT5zZXRTdHJpbmcoIm91dGVySFRNTCIsIG91dGVySFRNTCk7CiAgICAgICAgICAg
IHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAg
ICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAg
fQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRPdXRlckhUTUwobG9uZyBj
YWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRl
KCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkpCiAgICAgICAg
cHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBET00gaGFuZGxlciBp
cyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIGxvbmcgb3V0Tm9kZUlkID0gMDsKICAgIGlmIChSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVz
dE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAg
ICAgICBsb25nIG5vZGVJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAibm9k
ZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIFN0cmluZyBvdXRlckhUTUwgPSBn
ZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAib3V0ZXJIVE1MIiwgcHJvdG9jb2xF
cnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAg
ICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpLT5zZXRPdXRlckhUTUwo
bm9kZUlkLCBvdXRlckhUTUwsICZvdXROb2RlSWQpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3Rv
ckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlm
ICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNw
b25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1l
c3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsK
CiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9u
c2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVs
c2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldE51
bWJlcigib3V0Tm9kZUlkIiwgb3V0Tm9kZUlkKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdl
LT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRl
bmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OmFkZEluc3BlY3RlZE5vZGUobG9uZyBjYWxsSWQsIEluc3Bl
Y3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JB
cnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYg
KCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJv
cnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBET00gaGFuZGxlciBpcyBub3QgYXZhaWxh
YmxlLiIpOwoKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWlu
ZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2Nv
bEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBsb25nIG5vZGVJZCA9IGdldExvbmcoYXJndW1lbnRz
Q29udGFpbmVyLmdldCgpLCAibm9kZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAg
ICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5kb21BZ2VudCgpLT5hZGRJbnNwZWN0ZWROb2RlKG5vZGVJZCk7CiAgICB9CiAg
ICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2
YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAm
JiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwog
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVy
cm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQog
ICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVy
cm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+
c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwog
ICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpwZXJmb3JtU2VhcmNoKGxv
bmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNy
ZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpKQogICAg
ICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRE9NIGhhbmRs
ZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
YXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJn
dW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgU3RyaW5nIHF1ZXJ5ID0g
Z2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInF1ZXJ5IiwgcHJvdG9jb2xFcnJv
cnMuZ2V0KCkpOwogICAgICAgIGJvb2wgcnVuU3luY2hyb25vdXNseSA9IGdldEJvb2xlYW4oYXJn
dW1lbnRzQ29udGFpbmVyLmdldCgpLCAicnVuU3luY2hyb25vdXNseSIsIHByb3RvY29sRXJyb3Jz
LmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAg
ICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKS0+cGVyZm9ybVNlYXJjaChxdWVy
eSwgcnVuU3luY2hyb25vdXNseSk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQg
YXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQg
fHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhh
c0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1l
c3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2Fn
ZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0
Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBp
ZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2Ut
PnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3Bv
bnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjpzZWFyY2hDYW5jZWxlZChsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0
KikKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3Rv
ckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdl
bnQoKSkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6
IERPTSBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpCiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpLT5z
ZWFyY2hDYW5jZWxlZCgpOwoKICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtl
ciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2Nv
bEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQo
KSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IElu
c3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1i
ZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJz
dWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2Nv
bEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXko
ImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXIt
Pmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdl
LT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXI6OnB1c2hOb2RlQnlQYXRoVG9Gcm9udGVuZChsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0
KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90
b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVj
dG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0
cmluZygiUHJvdG9jb2wgRXJyb3I6IERPTSBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7Cgog
ICAgbG9uZyBub2RlSWQgPSAwOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3Vt
ZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50
cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIFN0cmluZyBwYXRoID0gZ2V0U3Ry
aW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInBhdGgiLCBwcm90b2NvbEVycm9ycy5nZXQo
KSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCktPnB1c2hOb2RlQnlQYXRoVG9Gcm9udGVu
ZChwYXRoLCAmbm9kZUlkKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBh
IG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJv
bnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2Fn
ZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5z
ZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29s
ZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0
QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXROdW1iZXIoIm5vZGVJZCIs
IG5vZGVJZCk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwg
cmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5p
bnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+
dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpzZXRDb25zb2xlTWVzc2FnZXNFbmFibGVkKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3Qq
IHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3Rv
Y29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0
b3JDb250cm9sbGVyKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2Nv
bCBFcnJvcjogQ29udHJvbGxlciBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgYm9v
bCBuZXdTdGF0ZSA9IGZhbHNlOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3Vt
ZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50
cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGJvb2wgZW5hYmxlZCA9IGdldEJv
b2xlYW4oYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAiZW5hYmxlZCIsIHByb3RvY29sRXJyb3Jz
LmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAg
ICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+c2V0Q29uc29sZU1lc3NhZ2VzRW5hYmxlZChlbmFi
bGVkLCAmbmV3U3RhdGUpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEg
bWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHBy
b3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9u
dGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdl
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNl
dE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xl
YW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHBy
b3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRB
cnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6
OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldEJvb2xlYW4oIm5ld1N0YXRl
IiwgbmV3U3RhdGUpOwogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0
YSIsIHJlc3BvbnNlRGF0YSk7CiAgICAgICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxl
ci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3Nh
Z2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcjo6Y2xlYXJDb25zb2xlTWVzc2FnZXMobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCop
CnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JB
cnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAg
cHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhh
bmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5n
dGgoKSkKICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmNsZWFyQ29uc29sZU1lc3NhZ2Vz
KCk7CgogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3Bl
Y3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5n
dGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2Fs
bElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJv
dG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5n
dGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJv
dG9jb2xFcnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xp
ZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6aGlnaGxpZ2h0
RE9NTm9kZShsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVj
dCkKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3Rv
ckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlcikKICAgICAg
ICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IENvbnRyb2xsZXIg
aGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3Qs
ICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBsb25nIG5vZGVJ
ZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAibm9kZUlkIiwgcHJvdG9jb2xF
cnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAg
ICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oaWdobGlnaHRET01Ob2RlKG5vZGVJZCk7
CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5z
cGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBj
YWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBw
cm90b2NvbEVycm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JD
bGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3Ry
aW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpoaWRlRE9N
Tm9kZUhpZ2hsaWdodChsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KikKewogICAgUmVmUHRy
PEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUo
KTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlcikKICAgICAgICBwcm90b2NvbEVycm9y
cy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IENvbnRyb2xsZXIgaGFuZGxlciBpcyBub3Qg
YXZhaWxhYmxlLiIpOwoKICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAg
IG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGlkZURPTU5vZGVIaWdobGlnaHQoKTsKCiAgICAvLyB1
c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJp
bGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAg
IHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+
bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAg
ICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7
CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1l
c3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9
Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpvcGVuSW5JbnNwZWN0ZWRXaW5kb3co
bG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAg
IFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6
Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAgcHJvdG9j
b2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhhbmRsZXIg
aXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJn
dW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1l
bnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgU3RyaW5nIHVybCA9IGdldFN0
cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJ1cmwiLCBwcm90b2NvbEVycm9ycy5nZXQo
KSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBt
X2luc3BlY3RvckNvbnRyb2xsZXItPm9wZW5Jbkluc3BlY3RlZFdpbmRvdyh1cmwpOwogICAgfQog
ICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBh
dmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkg
JiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsK
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xF
cnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkK
ICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xF
cnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCkt
PnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsK
ICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6aGlnaGxpZ2h0RnJhbWUo
bG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAg
IFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6
Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAgICAgcHJvdG9j
b2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVyIGhhbmRsZXIg
aXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJn
dW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1l
bnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgdW5zaWduZWQgbG9uZyBmcmFt
ZUlkID0gZ2V0VW5zaWduZWRMb25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgImZyYW1lSWQi
LCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhpZ2hsaWdodEZyYW1l
KGZyYW1lSWQpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2Vy
IG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgp
KSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJl
cigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1
Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgi
ZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+
aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2Ut
PnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
cjo6aGlkZUZyYW1lSGlnaGxpZ2h0KGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6
OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5kbGVy
IGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkp
CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oaWRlRnJhbWVIaWdobGlnaHQoKTsKCiAg
ICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2
YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAm
JiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwog
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVy
cm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQog
ICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVy
cm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+
c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwog
ICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRTdHlsZXMobG9uZyBj
YWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRl
KCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkpCiAgICAgICAg
cHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBET00gaGFuZGxlciBp
cyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gc3R5bGVzID0g
SW5zcGVjdG9yVmFsdWU6Om51bGwoKTsKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBh
cmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1
bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBsb25nIG5vZGVJZCA9IGdl
dExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAibm9kZUlkIiwgcHJvdG9jb2xFcnJvcnMu
Z2V0KCkpOwogICAgICAgIGJvb2wgYXV0aE9ubHkgPSBnZXRCb29sZWFuKGFyZ3VtZW50c0NvbnRh
aW5lci5nZXQoKSwgImF1dGhPbmx5IiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBp
ZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5kb21BZ2VudCgpLT5nZXRTdHlsZXMobm9kZUlkLCBhdXRoT25seSwgJnN0eWxlcyk7
CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5z
cGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBj
YWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBw
cm90b2NvbEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAg
ICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0VmFsdWUoInN0eWxlcyIsIHN0eWxlcyk7CiAgICAgICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAg
ICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+
c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwog
ICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRBbGxTdHlsZXMobG9u
ZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4g
cHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1
c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBET00gaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIp
OwoKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gc3R5bGVzID0gSW5zcGVjdG9yQXJyYXk6OmNy
ZWF0ZSgpOwogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgbV9pbnNw
ZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpLT5nZXRBbGxTdHlsZXMoJnN0eWxlcyk7CgogICAg
Ly8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFp
bGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYg
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUo
KTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAg
ICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJv
cnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAg
ICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJv
cnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBy
ZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNw
b25zZURhdGEtPnNldEFycmF5KCJzdHlsZXMiLCBzdHlsZXMpOwogICAgICAgICAgICByZXNwb25z
ZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNlRGF0YSk7CiAgICAgICAgfQogICAg
ICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdl
VG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9p
ZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0SW5saW5lU3R5bGUobG9uZyBjYWxsSWQs
IEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7Cgog
ICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkpCiAgICAgICAgcHJvdG9j
b2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBET00gaGFuZGxlciBpcyBub3Qg
YXZhaWxhYmxlLiIpOwoKICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gc3R5bGUgPSBJbnNwZWN0
b3JWYWx1ZTo6bnVsbCgpOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50
c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIs
IHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGxvbmcgbm9kZUlkID0gZ2V0TG9uZyhh
cmd1bWVudHNDb250YWluZXIuZ2V0KCksICJub2RlSWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7
CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCktPmdldElubGluZVN0eWxlKG5vZGVJZCwgJnN0
eWxlKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBX
ZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNl
cSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNz
IiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9y
cyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRWYWx1ZSgic3R5bGUiLCBzdHlsZSk7CiAgICAg
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsK
ICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQo
KS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkp
OwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRDb21wdXRlZFN0
eWxlKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJy
YXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgp
KQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRE9N
IGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+
IHN0eWxlID0gSW5zcGVjdG9yVmFsdWU6Om51bGwoKTsKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmpl
Y3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBsb25nIG5v
ZGVJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAibm9kZUlkIiwgcHJvdG9j
b2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkK
ICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpLT5nZXRDb21wdXRl
ZFN0eWxlKG5vZGVJZCwgJnN0eWxlKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVu
ZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJ
ZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+
aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNl
TWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNz
YWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5z
ZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAg
IGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2Fn
ZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAg
ICAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9y
T2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRWYWx1ZSgic3R5
bGUiLCBzdHlsZSk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRh
IiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVy
LT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2Fn
ZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVyOjpnZXRTdHlsZVNoZWV0KGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RN
ZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3Jz
ID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9s
bGVyLT5kb21BZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90
b2NvbCBFcnJvcjogRE9NIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBzdHlsZVNoZWV0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRP
YmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5n
ZXQoKSkpIHsKICAgICAgICBsb25nIHN0eWxlU2hlZXRJZCA9IGdldExvbmcoYXJndW1lbnRzQ29u
dGFpbmVyLmdldCgpLCAic3R5bGVTaGVldElkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAg
ICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0
b3JDb250cm9sbGVyLT5kb21BZ2VudCgpLT5nZXRTdHlsZVNoZWV0KHN0eWxlU2hlZXRJZCwgJnN0
eWxlU2hlZXQpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2Vy
IG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgp
KSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJl
cigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1
Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgi
ZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldE9iamVjdCgic3R5bGVTaGVldCIsIHN0
eWxlU2hlZXQpOwogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIs
IHJlc3BvbnNlRGF0YSk7CiAgICAgICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+
aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2Ut
PnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
cjo6Z2V0U3R5bGVTb3VyY2VEYXRhKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVl
c3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJy
b3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5kb21BZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQ
cm90b2NvbCBFcnJvcjogRE9NIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBzdHlsZVNvdXJjZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5l
ciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29s
RXJyb3JzLmdldCgpKSkgewogICAgICAgIGxvbmcgc3R5bGVTaGVldElkID0gZ2V0TG9uZyhhcmd1
bWVudHNDb250YWluZXIuZ2V0KCksICJzdHlsZVNoZWV0SWQiLCBwcm90b2NvbEVycm9ycy5nZXQo
KSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCktPmdldFN0eWxlU291cmNlRGF0YShzdHls
ZVNoZWV0SWQsICZzdHlsZVNvdXJjZURhdGEpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZy
b250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgo
Y2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9s
bGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVz
cG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25z
ZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3Nh
Z2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAg
ICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VN
ZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2Ug
ewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldE9iamVj
dCgic3R5bGVTb3VyY2VEYXRhIiwgc3R5bGVTb3VyY2VEYXRhKTsKICAgICAgICAgICAgcmVzcG9u
c2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAg
ICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2Fn
ZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZv
aWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmFwcGx5U3R5bGVUZXh0KGxvbmcgY2FsbElk
LCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoK
ICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpKQogICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRE9NIGhhbmRsZXIgaXMgbm90
IGF2YWlsYWJsZS4iKTsKCiAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JWYWx1ZT4gc3R5bGUgPSBJbnNwZWN0b3JWYWx1ZTo6bnVsbCgpOwogICAgaWYgKFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0
TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAg
ICAgIGxvbmcgc3R5bGVJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAic3R5
bGVJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcgc3R5bGVUZXh0ID0g
Z2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInN0eWxlVGV4dCIsIHByb3RvY29s
RXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZ2V0U3RyaW5nKGFy
Z3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInByb3BlcnR5TmFtZSIsIHByb3RvY29sRXJyb3JzLmdl
dCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAg
IG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKS0+YXBwbHlTdHlsZVRleHQoc3R5bGVJ
ZCwgc3R5bGVUZXh0LCBwcm9wZXJ0eU5hbWUsICZzdWNjZXNzLCAmc3R5bGUpOwogICAgfQogICAg
Ly8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFp
bGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYg
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUo
KTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAg
ICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJv
cnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAg
ICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJv
cnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBy
ZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNw
b25zZURhdGEtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgICAgICAgcmVz
cG9uc2VEYXRhLT5zZXRWYWx1ZSgic3R5bGUiLCBzdHlsZSk7CiAgICAgICAgICAgIHJlc3BvbnNl
TWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAg
ICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lk
IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRTdHlsZVRleHQobG9uZyBjYWxsSWQsIElu
c3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0
b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAg
aWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xF
cnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBET00gaGFuZGxlciBpcyBub3QgYXZh
aWxhYmxlLiIpOwoKICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwogICAgaWYgKFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2Fn
ZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGxv
bmcgc3R5bGVJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAic3R5bGVJZCIs
IHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcgc3R5bGVUZXh0ID0gZ2V0U3Ry
aW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInN0eWxlVGV4dCIsIHByb3RvY29sRXJyb3Jz
LmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAg
ICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKS0+c2V0U3R5bGVUZXh0KHN0eWxl
SWQsIHN0eWxlVGV4dCwgJnN1Y2Nlc3MpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250
ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2Fs
bElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVy
LT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9u
c2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1l
c3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2Ut
PnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAg
ICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNz
YWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2Ugewog
ICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0
b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldEJvb2xlYW4o
InN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmpl
Y3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNv
bnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9u
c2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OnNldFN0eWxlUHJvcGVydHkobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVj
dCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJv
dG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3Bl
Y3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hT
dHJpbmcoIlByb3RvY29sIEVycm9yOiBET00gaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoK
ICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFy
Z3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGxvbmcgc3R5bGVJZCA9
IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAic3R5bGVJZCIsIHByb3RvY29sRXJy
b3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFN0cmluZyhhcmd1bWVudHNDb250
YWluZXIuZ2V0KCksICJuYW1lIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIFN0cmlu
ZyB2YWx1ZSA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJ2YWx1ZSIsIHBy
b3RvY29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpCiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKS0+c2V0U3R5
bGVQcm9wZXJ0eShzdHlsZUlkLCBuYW1lLCB2YWx1ZSwgJnN1Y2Nlc3MpOwogICAgfQogICAgLy8g
dXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFi
aWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9p
bnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAg
ICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMt
Pmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAg
ICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMp
OwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNw
b25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25z
ZURhdGEtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgICAgICAgcmVzcG9u
c2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAg
ICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2Fn
ZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZv
aWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnRvZ2dsZVN0eWxlRW5hYmxlZChsb25nIGNh
bGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRy
PEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUo
KTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKSkKICAgICAgICBw
cm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IERPTSBoYW5kbGVyIGlz
IG5vdCBhdmFpbGFibGUuIik7CgogICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiBzdHlsZSA9IElu
c3BlY3RvclZhbHVlOjpudWxsKCk7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJn
dW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1l
bnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9uZyBzdHlsZUlkID0gZ2V0
TG9uZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJzdHlsZUlkIiwgcHJvdG9jb2xFcnJvcnMu
Z2V0KCkpOwogICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBnZXRTdHJpbmcoYXJndW1lbnRz
Q29udGFpbmVyLmdldCgpLCAicHJvcGVydHlOYW1lIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwog
ICAgICAgIGJvb2wgZGlzYWJsZWQgPSBnZXRCb29sZWFuKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQo
KSwgImRpc2FibGVkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3Rv
Y29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5k
b21BZ2VudCgpLT50b2dnbGVTdHlsZUVuYWJsZWQoc3R5bGVJZCwgcHJvcGVydHlOYW1lLCBkaXNh
YmxlZCwgJnN0eWxlKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1h
cmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90
b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRl
bmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRO
dW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFu
KCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90
b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJy
YXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0Ojpj
cmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRWYWx1ZSgic3R5bGUiLCBzdHls
ZSk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9u
c2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0
b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09O
U3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRS
dWxlU2VsZWN0b3IobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VP
YmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNw
ZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmRv
bUFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVy
cm9yOiBET00gaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIFJlZlB0cjxJbnNwZWN0
b3JWYWx1ZT4gcnVsZSA9IEluc3BlY3RvclZhbHVlOjpudWxsKCk7CiAgICBib29sIHNlbGVjdG9y
QWZmZWN0c05vZGUgPSBmYWxzZTsKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1
bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVu
dHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBsb25nIHJ1bGVJZCA9IGdldExv
bmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAicnVsZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0
KCkpOwogICAgICAgIFN0cmluZyBzZWxlY3RvciA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWlu
ZXIuZ2V0KCksICJzZWxlY3RvciIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBsb25n
IHNlbGVjdGVkTm9kZUlkID0gZ2V0TG9uZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJzZWxl
Y3RlZE5vZGVJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2Nv
bEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9t
QWdlbnQoKS0+c2V0UnVsZVNlbGVjdG9yKHJ1bGVJZCwgc2VsZWN0b3IsIHNlbGVjdGVkTm9kZUlk
LCAmcnVsZSwgJnNlbGVjdG9yQWZmZWN0c05vZGUpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3Rv
ckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlm
ICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNw
b25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1l
c3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsK
CiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9u
c2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVs
c2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldFZh
bHVlKCJydWxlIiwgcnVsZSk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0Qm9vbGVhbigi
c2VsZWN0b3JBZmZlY3RzTm9kZSIsIHNlbGVjdG9yQWZmZWN0c05vZGUpOwogICAgICAgICAgICBy
ZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNlRGF0YSk7CiAgICAgICAg
fQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRN
ZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0K
fQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6YWRkUnVsZShsb25nIGNhbGxJZCwg
SW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAg
ICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9tQWdlbnQoKSkKICAgICAgICBwcm90b2Nv
bEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IERPTSBoYW5kbGVyIGlzIG5vdCBh
dmFpbGFibGUuIik7CgogICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiBydWxlID0gSW5zcGVjdG9y
VmFsdWU6Om51bGwoKTsKICAgIGJvb2wgc2VsZWN0b3JBZmZlY3RzTm9kZSA9IGZhbHNlOwogICAg
aWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVj
dChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgp
KSkgewogICAgICAgIFN0cmluZyBzZWxlY3RvciA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWlu
ZXIuZ2V0KCksICJzZWxlY3RvciIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBsb25n
IHNlbGVjdGVkTm9kZUlkID0gZ2V0TG9uZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJzZWxl
Y3RlZE5vZGVJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2Nv
bEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZG9t
QWdlbnQoKS0+YWRkUnVsZShzZWxlY3Rvciwgc2VsZWN0ZWROb2RlSWQsICZydWxlLCAmc2VsZWN0
b3JBZmZlY3RzTm9kZSk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBt
YXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJv
dG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250
ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2Ug
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0
TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVh
bigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJv
dG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFy
cmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0VmFsdWUoInJ1bGUiLCBydWxl
KTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRCb29sZWFuKCJzZWxlY3RvckFmZmVjdHNO
b2RlIiwgc2VsZWN0b3JBZmZlY3RzTm9kZSk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNw
ZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5k
KHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyOjpnZXRTdHlsZXNGb3JOb2RlMihsb25nIGNhbGxJZCwgSW5zcGVj
dG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFy
cmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAo
IW1faW5zcGVjdG9yQ29udHJvbGxlci0+Y3NzQWdlbnQoKSkKICAgICAgICBwcm90b2NvbEVycm9y
cy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IENTUyBoYW5kbGVyIGlzIG5vdCBhdmFpbGFi
bGUuIik7CgogICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiBzdHlsZXMgPSBJbnNwZWN0b3JWYWx1
ZTo6bnVsbCgpOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRh
aW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3Rv
Y29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGxvbmcgbm9kZUlkID0gZ2V0TG9uZyhhcmd1bWVu
dHNDb250YWluZXIuZ2V0KCksICJub2RlSWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAg
ICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmNzc0FnZW50KCktPmdldFN0eWxlc0Zvck5vZGUyKG5vZGVJZCwgJnN0eWxl
cyk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2Vi
SW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMt
Pmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEi
LCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIs
ICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMt
Pmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMi
LCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAg
ICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0VmFsdWUoInN0eWxlcyIsIHN0eWxlcyk7CiAgICAg
ICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsK
ICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQo
KS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkp
OwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRDb21wdXRlZFN0
eWxlRm9yTm9kZTIobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VP
YmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNw
ZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmNz
c0FnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVy
cm9yOiBDU1MgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIFJlZlB0cjxJbnNwZWN0
b3JWYWx1ZT4gc3R5bGUgPSBJbnNwZWN0b3JWYWx1ZTo6bnVsbCgpOwogICAgaWYgKFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVz
c2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAg
IGxvbmcgbm9kZUlkID0gZ2V0TG9uZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJub2RlSWQi
LCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmNzc0FnZW50KCktPmdl
dENvbXB1dGVkU3R5bGVGb3JOb2RlMihub2RlSWQsICZzdHlsZSk7CiAgICB9CiAgICAvLyB1c2Ug
SW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0
eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3Bl
Y3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJl
c3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVu
Z3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAg
ICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAg
ICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNl
RGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0
YS0+c2V0VmFsdWUoInN0eWxlIiwgc3R5bGUpOwogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2Ut
PnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNlRGF0YSk7CiAgICAgICAgfQogICAgICAgIG1faW5z
cGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVu
ZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0
b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0SW5saW5lU3R5bGVGb3JOb2RlMihsb25nIGNhbGxJZCwg
SW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAg
ICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+Y3NzQWdlbnQoKSkKICAgICAgICBwcm90b2Nv
bEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IENTUyBoYW5kbGVyIGlzIG5vdCBh
dmFpbGFibGUuIik7CgogICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiBzdHlsZSA9IEluc3BlY3Rv
clZhbHVlOjpudWxsKCk7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRz
Q29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwg
cHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9uZyBub2RlSWQgPSBnZXRMb25nKGFy
Z3VtZW50c0NvbnRhaW5lci5nZXQoKSwgIm5vZGVJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsK
CiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIG1faW5z
cGVjdG9yQ29udHJvbGxlci0+Y3NzQWdlbnQoKS0+Z2V0SW5saW5lU3R5bGVGb3JOb2RlMihub2Rl
SWQsICZzdHlsZSk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJr
ZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9j
b2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5k
KCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVt
YmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigi
c3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9j
b2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5
KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0VmFsdWUoInN0eWxlIiwgc3R5bGUp
OwogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNl
RGF0YSk7CiAgICAgICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9y
Q2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0
cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0QWxs
U3R5bGVzMihsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KikKewogICAgUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAg
ICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+Y3NzQWdlbnQoKSkKICAgICAgICBwcm90b2Nv
bEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IENTUyBoYW5kbGVyIGlzIG5vdCBh
dmFpbGFibGUuIik7CgogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBzdHlsZVNoZWV0SWRzID0g
SW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpCiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5jc3NBZ2VudCgpLT5nZXRBbGxTdHls
ZXMyKCZzdHlsZVNoZWV0SWRzKTsKCiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBt
YXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJv
dG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250
ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2Ug
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0
TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVh
bigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJv
dG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFy
cmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0QXJyYXkoInN0eWxlU2hlZXRJ
ZHMiLCBzdHlsZVNoZWV0SWRzKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmpl
Y3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNv
bnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9u
c2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OmdldFN0eWxlU2hlZXQyKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3Qq
IHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3Rv
Y29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0
b3JDb250cm9sbGVyLT5jc3NBZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3Ry
aW5nKCJQcm90b2NvbCBFcnJvcjogQ1NTIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAg
ICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHN0eWxlU2hlZXQgPSBJbnNwZWN0b3JWYWx1ZTo6bnVs
bCgpOwogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9
IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJy
b3JzLmdldCgpKSkgewogICAgICAgIFN0cmluZyBzdHlsZVNoZWV0SWQgPSBnZXRTdHJpbmcoYXJn
dW1lbnRzQ29udGFpbmVyLmdldCgpLCAic3R5bGVTaGVldElkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0
KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAg
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5jc3NBZ2VudCgpLT5nZXRTdHlsZVNoZWV0MihzdHlsZVNo
ZWV0SWQsICZzdHlsZVNoZWV0KTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBh
cyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8
fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFz
RnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVz
c2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdl
LT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRC
b29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlm
IChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRWYWx1ZSgic3R5bGVT
aGVldCIsIHN0eWxlU2hlZXQpOwogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVj
dCgiZGF0YSIsIHJlc3BvbnNlRGF0YSk7CiAgICAgICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29u
dHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25z
ZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlcjo6c2V0U3R5bGVTaGVldFRleHQyKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmpl
Y3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHBy
b3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNw
ZWN0b3JDb250cm9sbGVyLT5jc3NBZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNo
U3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ1NTIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsK
CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0
T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMu
Z2V0KCkpKSB7CiAgICAgICAgU3RyaW5nIHN0eWxlU2hlZXRJZCA9IGdldFN0cmluZyhhcmd1bWVu
dHNDb250YWluZXIuZ2V0KCksICJzdHlsZVNoZWV0SWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7
CiAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgp
LCAidGV4dCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVy
cm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+Y3NzQWdl
bnQoKS0+c2V0U3R5bGVTaGVldFRleHQyKHN0eWxlU2hlZXRJZCwgdGV4dCk7CiAgICB9CiAgICAv
LyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWls
YWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAg
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9y
cyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAg
fQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRQcm9wZXJ0eVRleHQyKGxv
bmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNy
ZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5jc3NBZ2VudCgpKQogICAg
ICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ1NTIGhhbmRs
ZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHN0eWxl
ID0gSW5zcGVjdG9yVmFsdWU6Om51bGwoKTsKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJh
cmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBTdHJpbmcgc3R5bGVJ
ZCA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJzdHlsZUlkIiwgcHJvdG9j
b2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIGxvbmcgcHJvcGVydHlJbmRleCA9IGdldExvbmcoYXJn
dW1lbnRzQ29udGFpbmVyLmdldCgpLCAicHJvcGVydHlJbmRleCIsIHByb3RvY29sRXJyb3JzLmdl
dCgpKTsKICAgICAgICBTdHJpbmcgdGV4dCA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIu
Z2V0KCksICJ0ZXh0IiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIGJvb2wgb3Zlcndy
aXRlID0gZ2V0Qm9vbGVhbihhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJvdmVyd3JpdGUiLCBw
cm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0
aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmNzc0FnZW50KCktPnNldFBy
b3BlcnR5VGV4dDIoc3R5bGVJZCwgcHJvcGVydHlJbmRleCwgdGV4dCwgb3ZlcndyaXRlLCAmc3R5
bGUpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdl
Ykluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3Jz
LT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9y
T2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2Vx
IiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3Mi
LCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3Jz
LT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3Jz
IiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgICAgICAgICByZXNwb25zZURhdGEtPnNldFZhbHVlKCJzdHlsZSIsIHN0eWxlKTsKICAgICAg
ICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwog
ICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgp
LT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7
CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnRvZ2dsZVByb3BlcnR5
Mihsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewog
ICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5
OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+Y3NzQWdlbnQoKSkK
ICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJyb3I6IENTUyBo
YW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiBz
dHlsZSA9IEluc3BlY3RvclZhbHVlOjpudWxsKCk7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0
LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgU3RyaW5nIHN0
eWxlSWQgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAic3R5bGVJZCIsIHBy
b3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBsb25nIHByb3BlcnR5SW5kZXggPSBnZXRMb25n
KGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInByb3BlcnR5SW5kZXgiLCBwcm90b2NvbEVycm9y
cy5nZXQoKSk7CiAgICAgICAgYm9vbCBkaXNhYmxlID0gZ2V0Qm9vbGVhbihhcmd1bWVudHNDb250
YWluZXIuZ2V0KCksICJkaXNhYmxlIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBp
ZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5jc3NBZ2VudCgpLT50b2dnbGVQcm9wZXJ0eTIoc3R5bGVJZCwgcHJvcGVydHlJbmRl
eCwgZGlzYWJsZSwgJnN0eWxlKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBh
cyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8
fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFz
RnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVz
c2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdl
LT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRC
b29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlm
IChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRWYWx1ZSgic3R5bGUi
LCBzdHlsZSk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwg
cmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5p
bnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+
dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpzZXRSdWxlU2VsZWN0b3IyKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RN
ZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3Jz
ID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9s
bGVyLT5jc3NBZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90
b2NvbCBFcnJvcjogQ1NTIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQdHI8
SW5zcGVjdG9yVmFsdWU+IHJ1bGUgPSBJbnNwZWN0b3JWYWx1ZTo6bnVsbCgpOwogICAgaWYgKFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1
ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewog
ICAgICAgIFN0cmluZyBydWxlSWQgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgp
LCAicnVsZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwogICAgICAgIFN0cmluZyBzZWxlY3Rv
ciA9IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJzZWxlY3RvciIsIHByb3Rv
Y29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkp
CiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+Y3NzQWdlbnQoKS0+c2V0UnVsZVNl
bGVjdG9yMihydWxlSWQsIHNlbGVjdG9yLCAmcnVsZSk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVj
dG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAg
aWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNv
bnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJl
c3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNl
TWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkp
OwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNw
b25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAg
ZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0
VmFsdWUoInJ1bGUiLCBydWxlKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmpl
Y3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNv
bnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9u
c2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OmFkZFJ1bGUyKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVl
c3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJy
b3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5jc3NBZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQ
cm90b2NvbCBFcnJvcjogQ1NTIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQ
dHI8SW5zcGVjdG9yVmFsdWU+IHJ1bGUgPSBJbnNwZWN0b3JWYWx1ZTo6bnVsbCgpOwogICAgaWYg
KFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChy
ZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkg
ewogICAgICAgIGxvbmcgY29udGV4dE5vZGVJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVy
LmdldCgpLCAiY29udGV4dE5vZGVJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBT
dHJpbmcgc2VsZWN0b3IgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAic2Vs
ZWN0b3IiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJv
cnMtPmxlbmd0aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmNzc0FnZW50
KCktPmFkZFJ1bGUyKGNvbnRleHROb2RlSWQsIHNlbGVjdG9yLCAmcnVsZSk7CiAgICB9CiAgICAv
LyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWls
YWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAg
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9y
cyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJl
c3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3Bv
bnNlRGF0YS0+c2V0VmFsdWUoInJ1bGUiLCBydWxlKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNz
YWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJv
bnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldFN1cHBvcnRlZENTU1Byb3BlcnRpZXMobG9uZyBj
YWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJv
dG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3Bl
Y3RvckNvbnRyb2xsZXItPmNzc0FnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hT
dHJpbmcoIlByb3RvY29sIEVycm9yOiBDU1MgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoK
ICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gY3NzUHJvcGVydGllcyA9IEluc3BlY3RvckFycmF5
OjpjcmVhdGUoKTsKICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgIG1f
aW5zcGVjdG9yQ29udHJvbGxlci0+Y3NzQWdlbnQoKS0+Z2V0U3VwcG9ydGVkQ1NTUHJvcGVydGll
cygmY3NzUHJvcGVydGllcyk7CgogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEgbWFy
a2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHByb3Rv
Y29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9udGVu
ZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdlID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51
bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xlYW4o
InN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHByb3Rv
Y29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRBcnJh
eSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldEFycmF5KCJjc3NQcm9wZXJ0aWVz
IiwgY3NzUHJvcGVydGllcyk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0
KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNl
TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmRE
aXNwYXRjaGVyOjpxdWVyeVNlbGVjdG9yQWxsKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3Qq
IHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3Rv
Y29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0
b3JDb250cm9sbGVyLT5jc3NBZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3Ry
aW5nKCJQcm90b2NvbCBFcnJvcjogQ1NTIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAg
ICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHJlc3VsdCA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUo
KTsKICAgIGlmIChSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBn
ZXRPYmplY3QocmVxdWVzdE1lc3NhZ2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9y
cy5nZXQoKSkpIHsKICAgICAgICBsb25nIGRvY3VtZW50SWQgPSBnZXRMb25nKGFyZ3VtZW50c0Nv
bnRhaW5lci5nZXQoKSwgImRvY3VtZW50SWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CiAgICAg
ICAgU3RyaW5nIHNlbGVjdG9yID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwg
InNlbGVjdG9yIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29s
RXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5jc3NB
Z2VudCgpLT5xdWVyeVNlbGVjdG9yQWxsKGRvY3VtZW50SWQsIHNlbGVjdG9yLCAmcmVzdWx0KTsK
ICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNw
ZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVu
Z3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNh
bGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXBy
b3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVu
Z3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHBy
b3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAg
ICAgICAgcmVzcG9uc2VEYXRhLT5zZXRBcnJheSgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICAg
ICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAg
ICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAg
ICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldENvb2tpZXMobG9uZyBj
YWxsSWQsIEluc3BlY3Rvck9iamVjdCopCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJv
dG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3Bl
Y3RvckNvbnRyb2xsZXIpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3Rv
Y29sIEVycm9yOiBDb250cm9sbGVyIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGNvb2tpZXMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7
CiAgICBTdHJpbmcgY29va2llc1N0cmluZyA9ICIiOwogICAgaWYgKCFwcm90b2NvbEVycm9ycy0+
bGVuZ3RoKCkpCiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5nZXRDb29raWVzKCZjb29r
aWVzLCAmY29va2llc1N0cmluZyk7CgogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFzIGEg
bWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8IHBy
b3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNGcm9u
dGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdl
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNl
dE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJvb2xl
YW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYgKHBy
b3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRB
cnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIGVsc2UgewogICAgICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEgPSBJbnNwZWN0b3JPYmplY3Q6
OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNldEFycmF5KCJjb29raWVzIiwg
Y29va2llcyk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0U3RyaW5nKCJjb29raWVzU3Ry
aW5nIiwgY29va2llc1N0cmluZyk7CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2Jq
ZWN0KCJkYXRhIiwgcmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3Bv
bnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjpkZWxldGVDb29raWUobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCog
cmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9j
b2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3Rv
ckNvbnRyb2xsZXIpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29s
IEVycm9yOiBDb250cm9sbGVyIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBpZiAo
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJl
cXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7
CiAgICAgICAgU3RyaW5nIGNvb2tpZU5hbWUgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVy
LmdldCgpLCAiY29va2llTmFtZSIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJp
bmcgZG9tYWluID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgImRvbWFpbiIs
IHByb3RvY29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVu
Z3RoKCkpCiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZGVsZXRlQ29va2llKGNv
b2tpZU5hbWUsIGRvbWFpbik7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMg
YSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwg
cHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zy
b250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3Nh
Z2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9v
bGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAo
cHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNl
dEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNl
TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmRE
aXNwYXRjaGVyOjpnZXRBcHBsaWNhdGlvbkNhY2hlcyhsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2Jq
ZWN0KikKewogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3Bl
Y3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAoIW1faW5zcGVjdG9yQ29udHJvbGxlci0+YXBw
bGljYXRpb25DYWNoZUFnZW50KCkpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmco
IlByb3RvY29sIEVycm9yOiBBcHBsaWNhdGlvbkNhY2hlIGhhbmRsZXIgaXMgbm90IGF2YWlsYWJs
ZS4iKTsKCiAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IGFwcGxpY2F0aW9uQ2FjaGVzID0gSW5z
cGVjdG9yVmFsdWU6Om51bGwoKTsKICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQog
ICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+YXBwbGljYXRpb25DYWNoZUFnZW50KCktPmdl
dEFwcGxpY2F0aW9uQ2FjaGVzKCZhcHBsaWNhdGlvbkNhY2hlcyk7CgogICAgLy8gdXNlIEluc3Bl
Y3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAg
IGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICBy
ZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25z
ZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVz
cG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAg
IGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEg
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNl
dFZhbHVlKCJhcHBsaWNhdGlvbkNhY2hlcyIsIGFwcGxpY2F0aW9uQ2FjaGVzKTsKICAgICAgICAg
ICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAg
ICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAg
ICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldEZpbGVTeXN0ZW1QYXRo
QXN5bmMobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3Qp
CnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JB
cnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmZpbGVTeXN0
ZW1BZ2VudCgpKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBF
cnJvcjogRmlsZVN5c3RlbSBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1
ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewog
ICAgICAgIHVuc2lnbmVkIGludCB0eXBlID0gZ2V0VW5zaWduZWRJbnQoYXJndW1lbnRzQ29udGFp
bmVyLmdldCgpLCAidHlwZSIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcg
b3JpZ2luID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgIm9yaWdpbiIsIHBy
b3RvY29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3Ro
KCkpCiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+ZmlsZVN5c3RlbUFnZW50KCkt
PmdldEZpbGVTeXN0ZW1QYXRoQXN5bmModHlwZSwgb3JpZ2luKTsKICAgIH0KICAgIC8vIHVzZSBJ
bnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBXZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5
CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpICYmIG1faW5zcGVj
dG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAg
ICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNlcSIsIGNhbGxJZCk7CiAgICAgICAgcmVz
cG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgIXByb3RvY29sRXJyb3JzLT5sZW5n
dGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAg
IHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9ycyIsIHByb3RvY29sRXJyb3JzKTsKICAg
ICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2Fn
ZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZv
aWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJldmVhbEZvbGRlckluT1MobG9uZyBjYWxs
SWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsKICAgIFJlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7
CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmZpbGVTeXN0ZW1BZ2VudCgpKQogICAg
ICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogRmlsZVN5c3Rl
bSBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVj
dCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIFN0cmluZyBw
YXRoID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInBhdGgiLCBwcm90b2Nv
bEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQog
ICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmZpbGVTeXN0ZW1BZ2VudCgpLT5yZXZl
YWxGb2xkZXJJbk9TKHBhdGgpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3RvckZyb250ZW5kIGFz
IGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlmICgoY2FsbElkIHx8
IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5oYXNG
cm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNz
YWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2Ut
PnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEJv
b2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsKCiAgICAgICAgaWYg
KHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5z
ZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIG1faW5zcGVjdG9yQ29u
dHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25z
ZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlcjo6cmVsZWFzZVdyYXBwZXJPYmplY3RHcm91cChsb25nIGNhbGxJZCwgSW5zcGVj
dG9yT2JqZWN0KiByZXF1ZXN0TWVzc2FnZU9iamVjdCkKewogICAgUmVmUHRyPEluc3BlY3RvckFy
cmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKCiAgICBpZiAo
IW1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQmFja2VuZCgpKQogICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQmFja2VuZCBoYW5kbGVyIGlz
IG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFyZ3Vt
ZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2FnZU9iamVjdCwgImFyZ3VtZW50
cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGxvbmcgaW5qZWN0ZWRTY3JpcHRJ
ZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAiaW5qZWN0ZWRTY3JpcHRJZCIs
IHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcgb2JqZWN0R3JvdXAgPSBnZXRT
dHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAib2JqZWN0R3JvdXAiLCBwcm90b2NvbEVy
cm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAg
ICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckJhY2tlbmQoKS0+cmVsZWFz
ZVdyYXBwZXJPYmplY3RHcm91cChpbmplY3RlZFNjcmlwdElkLCBvYmplY3RHcm91cCk7CiAgICB9
CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9y
IGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2Nv
bEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2Nv
bEVycm9ycyk7CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JDbGllbnQo
KS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkp
OwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpkaWRFdmFsdWF0ZUZv
clRlc3RJbkZyb250ZW5kKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNz
YWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0g
SW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVy
KQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29u
dHJvbGxlciBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7CgogICAgaWYgKFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGFyZ3VtZW50c0NvbnRhaW5lciA9IGdldE9iamVjdChyZXF1ZXN0TWVzc2Fn
ZU9iamVjdCwgImFyZ3VtZW50cyIsIHByb3RvY29sRXJyb3JzLmdldCgpKSkgewogICAgICAgIGxv
bmcgdGVzdENhbGxJZCA9IGdldExvbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAidGVzdENh
bGxJZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcganNvblJlc3VsdCA9
IGdldFN0cmluZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJqc29uUmVzdWx0IiwgcHJvdG9j
b2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkK
ICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kaWRFdmFsdWF0ZUZvclRlc3RJbkZy
b250ZW5kKHRlc3RDYWxsSWQsIGpzb25SZXN1bHQpOwogICAgfQogICAgLy8gdXNlIEluc3BlY3Rv
ckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAgIGlm
ICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JDb250
cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICByZXNw
b25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25zZU1l
c3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKTsK
CiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVzcG9u
c2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAgIG1f
aW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50KCktPnNlbmRNZXNzYWdlVG9Gcm9u
dGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKICAgIH0KfQoKdm9pZCBJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0RGF0YWJhc2VUYWJsZU5hbWVzKGxvbmcgY2FsbElk
LCBJbnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoK
ICAgIGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JCYWNrZW5kKCkpCiAgICAg
ICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBCYWNrZW5kIGhh
bmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHRh
YmxlTmFtZXMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CiAgICBpZiAoUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdl
T2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9u
ZyBkYXRhYmFzZUlkID0gZ2V0TG9uZyhhcmd1bWVudHNDb250YWluZXIuZ2V0KCksICJkYXRhYmFz
ZUlkIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3Jz
LT5sZW5ndGgoKSkKICAgICAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JC
YWNrZW5kKCktPmdldERhdGFiYXNlVGFibGVOYW1lcyhkYXRhYmFzZUlkLCAmdGFibGVOYW1lcyk7
CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5z
cGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBj
YWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFw
cm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKQogICAgICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBw
cm90b2NvbEVycm9ycyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAg
ICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0QXJyYXkoInRhYmxlTmFtZXMiLCB0YWJsZU5hbWVzKTsK
ICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURh
dGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNs
aWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJp
bmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmV4ZWN1dGVT
UUwobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmplY3QpCnsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0b3JBcnJh
eTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckJh
Y2tlbmQoKSkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZygiUHJvdG9jb2wgRXJy
b3I6IEJhY2tlbmQgaGFuZGxlciBpcyBub3QgYXZhaWxhYmxlLiIpOwoKICAgIGJvb2wgc3VjY2Vz
cyA9IGZhbHNlOwogICAgbG9uZyB0cmFuc2FjdGlvbklkID0gMDsKICAgIGlmIChSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBhcmd1bWVudHNDb250YWluZXIgPSBnZXRPYmplY3QocmVxdWVzdE1lc3Nh
Z2VPYmplY3QsICJhcmd1bWVudHMiLCBwcm90b2NvbEVycm9ycy5nZXQoKSkpIHsKICAgICAgICBs
b25nIGRhdGFiYXNlSWQgPSBnZXRMb25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgImRhdGFi
YXNlSWQiLCBwcm90b2NvbEVycm9ycy5nZXQoKSk7CiAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0
U3RyaW5nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInF1ZXJ5IiwgcHJvdG9jb2xFcnJvcnMu
Z2V0KCkpOwoKICAgICAgICBpZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAg
ICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JCYWNrZW5kKCktPmV4ZWN1dGVTUUwo
ZGF0YWJhc2VJZCwgcXVlcnksICZzdWNjZXNzLCAmdHJhbnNhY3Rpb25JZCk7CiAgICB9CiAgICAv
LyB1c2UgSW5zcGVjdG9yRnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWls
YWJpbGl0eQogICAgaWYgKChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBt
X2luc3BlY3RvckNvbnRyb2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAg
ICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpOwoKICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAg
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9y
cyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJl
c3BvbnNlRGF0YSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3Bv
bnNlRGF0YS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsIHN1Y2Nlc3MpOwogICAgICAgICAgICByZXNw
b25zZURhdGEtPnNldE51bWJlcigidHJhbnNhY3Rpb25JZCIsIHRyYW5zYWN0aW9uSWQpOwogICAg
ICAgICAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9iamVjdCgiZGF0YSIsIHJlc3BvbnNlRGF0YSk7
CiAgICAgICAgfQogICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aW5zcGVjdG9yQ2xpZW50
KCktPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNwb25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygp
KTsKICAgIH0KfQoKdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0RE9NU3RvcmFn
ZUVudHJpZXMobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCogcmVxdWVzdE1lc3NhZ2VPYmpl
Y3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMgPSBJbnNwZWN0
b3JBcnJheTo6Y3JlYXRlKCk7CgogICAgaWYgKCFtX2luc3BlY3RvckNvbnRyb2xsZXIpCiAgICAg
ICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIlByb3RvY29sIEVycm9yOiBDb250cm9sbGVy
IGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKCiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+
IGVudHJpZXMgPSBJbnNwZWN0b3JBcnJheTo6Y3JlYXRlKCk7CiAgICBpZiAoUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdl
T2JqZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9u
ZyBzdG9yYWdlSWQgPSBnZXRMb25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInN0b3JhZ2VJ
ZCIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKCiAgICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+
bGVuZ3RoKCkpCiAgICAgICAgICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+Z2V0RE9NU3RvcmFn
ZUVudHJpZXMoc3RvcmFnZUlkLCAmZW50cmllcyk7CiAgICB9CiAgICAvLyB1c2UgSW5zcGVjdG9y
RnJvbnRlbmQgYXMgYSBtYXJrZXIgb2YgV2ViSW5zcGVjdG9yIGF2YWlsYWJpbGl0eQogICAgaWYg
KChjYWxsSWQgfHwgcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSAmJiBtX2luc3BlY3RvckNvbnRy
b2xsZXItPmhhc0Zyb250ZW5kKCkpIHsKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBy
ZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgIHJlc3Bv
bnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJzZXEiLCBjYWxsSWQpOwogICAgICAgIHJlc3BvbnNlTWVz
c2FnZS0+c2V0Qm9vbGVhbigic3VjY2VzcyIsICFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpOwoK
ICAgICAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKQogICAgICAgICAgICByZXNwb25z
ZU1lc3NhZ2UtPnNldEFycmF5KCJlcnJvcnMiLCBwcm90b2NvbEVycm9ycyk7CiAgICAgICAgZWxz
ZSB7CiAgICAgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlRGF0YSA9IElu
c3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIHJlc3BvbnNlRGF0YS0+c2V0QXJy
YXkoImVudHJpZXMiLCBlbnRyaWVzKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRP
YmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2luc3BlY3Rv
ckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVz
cG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OnNldERPTVN0b3JhZ2VJdGVtKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JP
YmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+
IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAgIGlmICghbV9p
bnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCJQ
cm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5kbGVyIGlzIG5vdCBhdmFpbGFibGUuIik7Cgog
ICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
YXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2JqZWN0LCAiYXJn
dW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9uZyBzdG9yYWdlSWQg
PSBnZXRMb25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInN0b3JhZ2VJZCIsIHByb3RvY29s
RXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcga2V5ID0gZ2V0U3RyaW5nKGFyZ3VtZW50c0Nv
bnRhaW5lci5nZXQoKSwgImtleSIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJp
bmcgdmFsdWUgPSBnZXRTdHJpbmcoYXJndW1lbnRzQ29udGFpbmVyLmdldCgpLCAidmFsdWUiLCBw
cm90b2NvbEVycm9ycy5nZXQoKSk7CgogICAgICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0
aCgpKQogICAgICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPnNldERPTVN0b3JhZ2VJdGVt
KHN0b3JhZ2VJZCwga2V5LCB2YWx1ZSwgJnN1Y2Nlc3MpOwogICAgfQogICAgLy8gdXNlIEluc3Bl
Y3RvckZyb250ZW5kIGFzIGEgbWFya2VyIG9mIFdlYkluc3BlY3RvciBhdmFpbGFiaWxpdHkKICAg
IGlmICgoY2FsbElkIHx8IHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgJiYgbV9pbnNwZWN0b3JD
b250cm9sbGVyLT5oYXNGcm9udGVuZCgpKSB7CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gcmVzcG9uc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgICAgICBy
ZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigic2VxIiwgY2FsbElkKTsKICAgICAgICByZXNwb25z
ZU1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCAhcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgp
KTsKCiAgICAgICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkKICAgICAgICAgICAgcmVz
cG9uc2VNZXNzYWdlLT5zZXRBcnJheSgiZXJyb3JzIiwgcHJvdG9jb2xFcnJvcnMpOwogICAgICAg
IGVsc2UgewogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZURhdGEg
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgICAgICAgICByZXNwb25zZURhdGEtPnNl
dEJvb2xlYW4oInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdl
LT5zZXRPYmplY3QoImRhdGEiLCByZXNwb25zZURhdGEpOwogICAgICAgIH0KICAgICAgICBtX2lu
c3BlY3RvckNvbnRyb2xsZXItPmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRl
bmQocmVzcG9uc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7CiAgICB9Cn0KCnZvaWQgSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OnJlbW92ZURPTVN0b3JhZ2VJdGVtKGxvbmcgY2FsbElkLCBJ
bnNwZWN0b3JPYmplY3QqIHJlcXVlc3RNZXNzYWdlT2JqZWN0KQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOwoKICAg
IGlmICghbV9pbnNwZWN0b3JDb250cm9sbGVyKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNo
U3RyaW5nKCJQcm90b2NvbCBFcnJvcjogQ29udHJvbGxlciBoYW5kbGVyIGlzIG5vdCBhdmFpbGFi
bGUuIik7CgogICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAgICBpZiAoUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gYXJndW1lbnRzQ29udGFpbmVyID0gZ2V0T2JqZWN0KHJlcXVlc3RNZXNzYWdlT2Jq
ZWN0LCAiYXJndW1lbnRzIiwgcHJvdG9jb2xFcnJvcnMuZ2V0KCkpKSB7CiAgICAgICAgbG9uZyBz
dG9yYWdlSWQgPSBnZXRMb25nKGFyZ3VtZW50c0NvbnRhaW5lci5nZXQoKSwgInN0b3JhZ2VJZCIs
IHByb3RvY29sRXJyb3JzLmdldCgpKTsKICAgICAgICBTdHJpbmcga2V5ID0gZ2V0U3RyaW5nKGFy
Z3VtZW50c0NvbnRhaW5lci5nZXQoKSwgImtleSIsIHByb3RvY29sRXJyb3JzLmdldCgpKTsKCiAg
ICAgICAgaWYgKCFwcm90b2NvbEVycm9ycy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIG1faW5zcGVj
dG9yQ29udHJvbGxlci0+cmVtb3ZlRE9NU3RvcmFnZUl0ZW0oc3RvcmFnZUlkLCBrZXksICZzdWNj
ZXNzKTsKICAgIH0KICAgIC8vIHVzZSBJbnNwZWN0b3JGcm9udGVuZCBhcyBhIG1hcmtlciBvZiBX
ZWJJbnNwZWN0b3IgYXZhaWxhYmlsaXR5CiAgICBpZiAoKGNhbGxJZCB8fCBwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpICYmIG1faW5zcGVjdG9yQ29udHJvbGxlci0+aGFzRnJvbnRlbmQoKSkgewog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoInNl
cSIsIGNhbGxJZCk7CiAgICAgICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRCb29sZWFuKCJzdWNjZXNz
IiwgIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSk7CgogICAgICAgIGlmIChwcm90b2NvbEVycm9y
cy0+bGVuZ3RoKCkpCiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0QXJyYXkoImVycm9y
cyIsIHByb3RvY29sRXJyb3JzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gcmVzcG9uc2VEYXRhID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgICAgICAgICAgcmVzcG9uc2VEYXRhLT5zZXRCb29sZWFuKCJzdWNjZXNzIiwgc3VjY2Vzcyk7
CiAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJkYXRhIiwgcmVzcG9uc2VE
YXRhKTsKICAgICAgICB9CiAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5pbnNwZWN0b3JD
bGllbnQoKS0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3Ry
aW5nKCkpOwogICAgfQp9Cgp2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpkaXNwYXRj
aChjb25zdCBTdHJpbmcmIG1lc3NhZ2UpCnsKICAgIHR5cGVkZWYgdm9pZCAoSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OipDYWxsSGFuZGxlcikobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVj
dCogbWVzc2FnZU9iamVjdCk7CiAgICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBDYWxsSGFuZGxl
cj4gRGlzcGF0Y2hNYXA7CiAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERpc3BhdGNoTWFwLCBkaXNw
YXRjaE1hcCwgKTsKICAgIGxvbmcgY2FsbElkID0gMDsKCiAgICBpZiAoZGlzcGF0Y2hNYXAuaXNF
bXB0eSgpKSB7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldEJyZWFrcG9pbnRDbWQsICZJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0QnJlYWtwb2ludCk7CiAgICAgICAgZGlzcGF0Y2hN
YXAuYWRkKGVuYWJsZVByb2ZpbGVyQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmVu
YWJsZVByb2ZpbGVyKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoc2V0U2VhcmNoaW5nRm9yTm9k
ZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRTZWFyY2hpbmdGb3JOb2RlKTsK
ICAgICAgICBkaXNwYXRjaE1hcC5hZGQoZ2V0U3R5bGVzQ21kLCAmSW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXI6OmdldFN0eWxlcyk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHRha2VIZWFwU25h
cHNob3RDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6dGFrZUhlYXBTbmFwc2hvdCk7
CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHN0b3BQcm9maWxpbmdDbWQsICZJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6c3RvcFByb2ZpbGluZyk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGV4
ZWN1dGVTUUxDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6ZXhlY3V0ZVNRTCk7CiAg
ICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdldFN0eWxlU2hlZXRDbWQsICZJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlcjo6Z2V0U3R5bGVTaGVldCk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldFN0
eWxlUHJvcGVydHlDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0U3R5bGVQcm9w
ZXJ0eSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdldENvb2tpZXNDbWQsICZJbnNwZWN0b3JC
YWNrZW5kRGlzcGF0Y2hlcjo6Z2V0Q29va2llcyk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHF1
ZXJ5U2VsZWN0b3JBbGxDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cXVlcnlTZWxl
Y3RvckFsbCk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHJlbGVhc2VXcmFwcGVyT2JqZWN0R3Jv
dXBDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cmVsZWFzZVdyYXBwZXJPYmplY3RH
cm91cCk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNlYXJjaENhbmNlbGVkQ21kLCAmSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OnNlYXJjaENhbmNlbGVkKTsKICAgICAgICBkaXNwYXRjaE1h
cC5hZGQocmVtb3ZlQWxsU2NyaXB0c1RvRXZhbHVhdGVPbkxvYWRDbWQsICZJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6cmVtb3ZlQWxsU2NyaXB0c1RvRXZhbHVhdGVPbkxvYWQpOwogICAgICAg
IGRpc3BhdGNoTWFwLmFkZChnZXRBbGxTdHlsZXMyQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OmdldEFsbFN0eWxlczIpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChnZXRJbnNwZWN0
b3JTdGF0ZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRJbnNwZWN0b3JTdGF0
ZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHRvZ2dsZVN0eWxlRW5hYmxlZENtZCwgJkluc3Bl
Y3RvckJhY2tlbmREaXNwYXRjaGVyOjp0b2dnbGVTdHlsZUVuYWJsZWQpOwogICAgICAgIGRpc3Bh
dGNoTWFwLmFkZChzZXRTdHlsZVRleHRDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
c2V0U3R5bGVUZXh0KTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoYWRkSW5zcGVjdGVkTm9kZUNt
ZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjphZGRJbnNwZWN0ZWROb2RlKTsKICAgICAg
ICBkaXNwYXRjaE1hcC5hZGQoc2V0T3V0ZXJIVE1MQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OnNldE91dGVySFRNTCk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGNvcHlOb2RlQ21k
LCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmNvcHlOb2RlKTsKICAgICAgICBkaXNwYXRj
aE1hcC5hZGQoY2xlYXJQcm9maWxlc0NtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpj
bGVhclByb2ZpbGVzKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoc2V0TW9uaXRvcmluZ1hIUkVu
YWJsZWRDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0TW9uaXRvcmluZ1hIUkVu
YWJsZWQpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChyZW1vdmVQcm9maWxlQ21kLCAmSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OnJlbW92ZVByb2ZpbGUpOwogICAgICAgIGRpc3BhdGNoTWFw
LmFkZChwdXNoTm9kZUJ5UGF0aFRvRnJvbnRlbmRDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcjo6cHVzaE5vZGVCeVBhdGhUb0Zyb250ZW5kKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQo
cG9wdWxhdGVTY3JpcHRPYmplY3RzQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnBv
cHVsYXRlU2NyaXB0T2JqZWN0cyk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldFRleHROb2Rl
VmFsdWVDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0VGV4dE5vZGVWYWx1ZSk7
CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHN0ZXBJbnRvU3RhdGVtZW50Q21kLCAmSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OnN0ZXBJbnRvU3RhdGVtZW50KTsKICAgICAgICBkaXNwYXRjaE1h
cC5hZGQoZGlzYWJsZVByb2ZpbGVyQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmRp
c2FibGVQcm9maWxlcik7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdldEFwcGxpY2F0aW9uQ2Fj
aGVzQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldEFwcGxpY2F0aW9uQ2FjaGVz
KTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQocmVzb3VyY2VDb250ZW50Q21kLCAmSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OnJlc291cmNlQ29udGVudCk7CiAgICAgICAgZGlzcGF0Y2hNYXAu
YWRkKGFjdGl2YXRlQnJlYWtwb2ludHNDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
YWN0aXZhdGVCcmVha3BvaW50cyk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdldEFsbFN0eWxl
c0NtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRBbGxTdHlsZXMpOwogICAgICAg
IGRpc3BhdGNoTWFwLmFkZChyZXN1bWVDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
cmVzdW1lKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoZ2V0U3R5bGVzRm9yTm9kZTJDbWQsICZJ
bnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0U3R5bGVzRm9yTm9kZTIpOwogICAgICAgIGRp
c3BhdGNoTWFwLmFkZChnZXRDb21wdXRlZFN0eWxlQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OmdldENvbXB1dGVkU3R5bGUpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZCh0b2dnbGVQ
cm9wZXJ0eTJDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6dG9nZ2xlUHJvcGVydHky
KTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoc2V0UHJvcGVydHlUZXh0MkNtZCwgJkluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyOjpzZXRQcm9wZXJ0eVRleHQyKTsKICAgICAgICBkaXNwYXRjaE1h
cC5hZGQoZ2V0U2NyaXB0U291cmNlQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6Omdl
dFNjcmlwdFNvdXJjZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGNhY2hlZFJlc291cmNlc0Nt
ZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpjYWNoZWRSZXNvdXJjZXMpOwogICAgICAg
IGRpc3BhdGNoTWFwLmFkZChvcGVuSW5JbnNwZWN0ZWRXaW5kb3dDbWQsICZJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6b3BlbkluSW5zcGVjdGVkV2luZG93KTsKICAgICAgICBkaXNwYXRjaE1h
cC5hZGQoZ2V0Q29tcHV0ZWRTdHlsZUZvck5vZGUyQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OmdldENvbXB1dGVkU3R5bGVGb3JOb2RlMik7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRk
KGhpZGVGcmFtZUhpZ2hsaWdodENtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpoaWRl
RnJhbWVIaWdobGlnaHQpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChyZW1vdmVET01TdG9yYWdl
SXRlbUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZW1vdmVET01TdG9yYWdlSXRl
bSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldFJ1bGVTZWxlY3RvcjJDbWQsICZJbnNwZWN0
b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0UnVsZVNlbGVjdG9yMik7CiAgICAgICAgZGlzcGF0Y2hN
YXAuYWRkKGVkaXRTY3JpcHRTb3VyY2VDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
ZWRpdFNjcmlwdFNvdXJjZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHJlbG9hZFBhZ2VDbWQs
ICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cmVsb2FkUGFnZSk7CiAgICAgICAgZGlzcGF0
Y2hNYXAuYWRkKGdldE91dGVySFRNTENtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpn
ZXRPdXRlckhUTUwpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChzdG9wVGltZWxpbmVQcm9maWxl
ckNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzdG9wVGltZWxpbmVQcm9maWxlcik7
CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldERPTVN0b3JhZ2VJdGVtQ21kLCAmSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OnNldERPTVN0b3JhZ2VJdGVtKTsKICAgICAgICBkaXNwYXRjaE1h
cC5hZGQoZ2V0U3R5bGVTaGVldDJDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0
U3R5bGVTaGVldDIpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChzZXROYXRpdmVCcmVha3BvaW50
Q21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnNldE5hdGl2ZUJyZWFrcG9pbnQpOwog
ICAgICAgIGRpc3BhdGNoTWFwLmFkZChnZXRTdXBwb3J0ZWRDU1NQcm9wZXJ0aWVzQ21kLCAmSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldFN1cHBvcnRlZENTU1Byb3BlcnRpZXMpOwogICAg
ICAgIGRpc3BhdGNoTWFwLmFkZChzdGVwT3V0T2ZGdW5jdGlvbkNtZCwgJkluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjpzdGVwT3V0T2ZGdW5jdGlvbik7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRk
KHBlcmZvcm1TZWFyY2hDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cGVyZm9ybVNl
YXJjaCk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldFBhdXNlT25FeGNlcHRpb25zU3RhdGVD
bWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c2V0UGF1c2VPbkV4Y2VwdGlvbnNTdGF0
ZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldFN0eWxlU2hlZXRUZXh0MkNtZCwgJkluc3Bl
Y3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRTdHlsZVNoZWV0VGV4dDIpOwogICAgICAgIGRpc3Bh
dGNoTWFwLmFkZChhZGRSdWxlMkNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjphZGRS
dWxlMik7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGNoYW5nZVRhZ05hbWVDbWQsICZJbnNwZWN0
b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Y2hhbmdlVGFnTmFtZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAu
YWRkKHJlbW92ZUF0dHJpYnV0ZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZW1v
dmVBdHRyaWJ1dGUpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChnZXRQcm9maWxlQ21kLCAmSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldFByb2ZpbGUpOwogICAgICAgIGRpc3BhdGNoTWFw
LmFkZChnZXRDaGlsZE5vZGVzQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldENo
aWxkTm9kZXMpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChnZXRET01TdG9yYWdlRW50cmllc0Nt
ZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRET01TdG9yYWdlRW50cmllcyk7CiAg
ICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdldElubGluZVN0eWxlQ21kLCAmSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OmdldElubGluZVN0eWxlKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQocmVt
b3ZlQnJlYWtwb2ludENtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZW1vdmVCcmVh
a3BvaW50KTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoZGlzYWJsZURlYnVnZ2VyQ21kLCAmSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmRpc2FibGVEZWJ1Z2dlcik7CiAgICAgICAgZGlzcGF0
Y2hNYXAuYWRkKHN0ZXBPdmVyU3RhdGVtZW50Q21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXI6OnN0ZXBPdmVyU3RhdGVtZW50KTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQocGF1c2VDbWQs
ICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cGF1c2UpOwogICAgICAgIGRpc3BhdGNoTWFw
LmFkZChzZXRJbmplY3RlZFNjcmlwdFNvdXJjZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVyOjpzZXRJbmplY3RlZFNjcmlwdFNvdXJjZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdl
dEV2ZW50TGlzdGVuZXJzRm9yTm9kZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpn
ZXRFdmVudExpc3RlbmVyc0Zvck5vZGUpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChzZXRDb25z
b2xlTWVzc2FnZXNFbmFibGVkQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnNldENv
bnNvbGVNZXNzYWdlc0VuYWJsZWQpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChzdGFydFRpbWVs
aW5lUHJvZmlsZXJDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c3RhcnRUaW1lbGlu
ZVByb2ZpbGVyKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoZW5hYmxlRGVidWdnZXJDbWQsICZJ
bnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6ZW5hYmxlRGVidWdnZXIpOwogICAgICAgIGRpc3Bh
dGNoTWFwLmFkZChhZGRTY3JpcHRUb0V2YWx1YXRlT25Mb2FkQ21kLCAmSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OmFkZFNjcmlwdFRvRXZhbHVhdGVPbkxvYWQpOwogICAgICAgIGRpc3BhdGNo
TWFwLmFkZChoaWdobGlnaHRGcmFtZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpo
aWdobGlnaHRGcmFtZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHNldFJ1bGVTZWxlY3RvckNt
ZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpzZXRSdWxlU2VsZWN0b3IpOwogICAgICAg
IGRpc3BhdGNoTWFwLmFkZChzZXRBdHRyaWJ1dGVDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcjo6c2V0QXR0cmlidXRlKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoZ2V0RmlsZVN5c3Rl
bVBhdGhBc3luY0NtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRGaWxlU3lzdGVt
UGF0aEFzeW5jKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoZ2V0U3R5bGVTb3VyY2VEYXRhQ21k
LCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldFN0eWxlU291cmNlRGF0YSk7CiAgICAg
ICAgZGlzcGF0Y2hNYXAuYWRkKGRpZEV2YWx1YXRlRm9yVGVzdEluRnJvbnRlbmRDbWQsICZJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6ZGlkRXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZCk7CiAg
ICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdldERhdGFiYXNlVGFibGVOYW1lc0NtZCwgJkluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyOjpnZXREYXRhYmFzZVRhYmxlTmFtZXMpOwogICAgICAgIGRpc3Bh
dGNoTWFwLmFkZChjbGVhckNvbnNvbGVNZXNzYWdlc0NtZCwgJkluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVyOjpjbGVhckNvbnNvbGVNZXNzYWdlcyk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGhp
Z2hsaWdodERPTU5vZGVDbWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6aGlnaGxpZ2h0
RE9NTm9kZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKHJlbW92ZU5hdGl2ZUJyZWFrcG9pbnRD
bWQsICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cmVtb3ZlTmF0aXZlQnJlYWtwb2ludCk7
CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGdldFByb2ZpbGVIZWFkZXJzQ21kLCAmSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OmdldFByb2ZpbGVIZWFkZXJzKTsKICAgICAgICBkaXNwYXRjaE1h
cC5hZGQocmVtb3ZlTm9kZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZW1vdmVO
b2RlKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoc3RhcnRQcm9maWxpbmdDbWQsICZJbnNwZWN0
b3JCYWNrZW5kRGlzcGF0Y2hlcjo6c3RhcnRQcm9maWxpbmcpOwogICAgICAgIGRpc3BhdGNoTWFw
LmFkZChyZXZlYWxGb2xkZXJJbk9TQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJl
dmVhbEZvbGRlckluT1MpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChhcHBseVN0eWxlVGV4dENt
ZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjphcHBseVN0eWxlVGV4dCk7CiAgICAgICAg
ZGlzcGF0Y2hNYXAuYWRkKGhpZGVET01Ob2RlSGlnaGxpZ2h0Q21kLCAmSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXI6OmhpZGVET01Ob2RlSGlnaGxpZ2h0KTsKICAgICAgICBkaXNwYXRjaE1hcC5h
ZGQoZ2V0SW5saW5lU3R5bGVGb3JOb2RlMkNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpnZXRJbmxpbmVTdHlsZUZvck5vZGUyKTsKICAgICAgICBkaXNwYXRjaE1hcC5hZGQoZGVhY3Rp
dmF0ZUJyZWFrcG9pbnRzQ21kLCAmSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmRlYWN0aXZh
dGVCcmVha3BvaW50cyk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGFkZFJ1bGVDbWQsICZJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6YWRkUnVsZSk7CiAgICAgICAgZGlzcGF0Y2hNYXAuYWRk
KGRlbGV0ZUNvb2tpZUNtZCwgJkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpkZWxldGVDb29r
aWUpOwogICAgICAgIGRpc3BhdGNoTWFwLmFkZChkaXNwYXRjaE9uSW5qZWN0ZWRTY3JpcHRDbWQs
ICZJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6ZGlzcGF0Y2hPbkluamVjdGVkU2NyaXB0KTsK
ICAgIH0KCiAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHBhcnNlZE1lc3NhZ2UgPSBJbnNwZWN0
b3JWYWx1ZTo6cGFyc2VKU09OKG1lc3NhZ2UpOwogICAgaWYgKCFwYXJzZWRNZXNzYWdlKSB7CiAg
ICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsICJQcm90b2NvbCBFcnJvcjogSW52YWxp
ZCBtZXNzYWdlIGZvcm1hdC4gTWVzc2FnZSBzaG91bGQgYmUgaW4gSlNPTiBmb3JtYXQuIik7CiAg
ICAgICAgcmV0dXJuOwogICAgfQoKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2VP
YmplY3QgPSBwYXJzZWRNZXNzYWdlLT5hc09iamVjdCgpOwogICAgaWYgKCFtZXNzYWdlT2JqZWN0
KSB7CiAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsICJQcm90b2NvbCBFcnJvcjog
SW52YWxpZCBtZXNzYWdlIGZvcm1hdC4gVGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGEgSlNPTmlmaWVk
IG9iamVjdC4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgUmVmUHRyPEluc3BlY3RvclZh
bHVlPiBjb21tYW5kVmFsdWUgPSBtZXNzYWdlT2JqZWN0LT5nZXQoImNvbW1hbmQiKTsKICAgIGlm
ICghY29tbWFuZFZhbHVlKSB7CiAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsICJQ
cm90b2NvbCBFcnJvcjogSW52YWxpZCBtZXNzYWdlIGZvcm1hdC4gJ2NvbW1hbmQnIHByb3BlcnR5
IHdhc24ndCBmb3VuZC4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgU3RyaW5nIGNvbW1h
bmQ7CiAgICBpZiAoIWNvbW1hbmRWYWx1ZS0+YXNTdHJpbmcoJmNvbW1hbmQpKSB7CiAgICAgICAg
cmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsICJQcm90b2NvbCBFcnJvcjogSW52YWxpZCBtZXNz
YWdlIGZvcm1hdC4gVGhlIHR5cGUgb2YgJ2NvbW1hbmQnIHByb3BlcnR5IHNob3VsZCBiZSBzdHJp
bmcuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4g
Y2FsbElkVmFsdWUgPSBtZXNzYWdlT2JqZWN0LT5nZXQoInNlcSIpOwogICAgaWYgKCFjYWxsSWRW
YWx1ZSkgewogICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoY2FsbElkLCAiUHJvdG9jb2wgRXJy
b3I6IEludmFsaWQgbWVzc2FnZSBmb3JtYXQuICdzZXEnIHByb3BlcnR5IHdhcyBub3QgZm91bmQg
aW4gdGhlIHJlcXVlc3QuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghY2FsbElk
VmFsdWUtPmFzTnVtYmVyKCZjYWxsSWQpKSB7CiAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihj
YWxsSWQsICJQcm90b2NvbCBFcnJvcjogSW52YWxpZCBtZXNzYWdlIGZvcm1hdC4gVGhlIHR5cGUg
b2YgJ3NlcScgcHJvcGVydHkgc2hvdWxkIGJlIG51bWJlci4iKTsKICAgICAgICByZXR1cm47CiAg
ICB9CgogICAgSGFzaE1hcDxTdHJpbmcsIENhbGxIYW5kbGVyPjo6aXRlcmF0b3IgaXQgPSBkaXNw
YXRjaE1hcC5maW5kKGNvbW1hbmQpOwogICAgaWYgKGl0ID09IGRpc3BhdGNoTWFwLmVuZCgpKSB7
CiAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcihjYWxsSWQsIG1ha2VTdHJpbmcoIlByb3RvY29s
IEVycm9yOiBJbnZhbGlkIGNvbW1hbmQgd2FzIHJlY2VpdmVkLiAnIiwgY29tbWFuZCwgIicgd2Fz
bid0IGZvdW5kLiIpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgKCgqdGhpcykuKml0LT5z
ZWNvbmQpKGNhbGxJZCwgbWVzc2FnZU9iamVjdC5nZXQoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OnJlcG9ydFByb3RvY29sRXJyb3IoY29uc3QgbG9uZyBjYWxsSWQsIGNv
bnN0IFN0cmluZyYgZXJyb3JUZXh0KSBjb25zdAp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIG1lc3NhZ2UtPnNldE51
bWJlcigic2VxIiwgY2FsbElkKTsKICAgIG1lc3NhZ2UtPnNldEJvb2xlYW4oInN1Y2Nlc3MiLCBm
YWxzZSk7CiAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGVycm9ycyA9IEluc3BlY3RvckFycmF5
OjpjcmVhdGUoKTsKICAgIGVycm9ycy0+cHVzaFN0cmluZyhlcnJvclRleHQpOwogICAgbWVzc2Fn
ZS0+c2V0QXJyYXkoImVycm9ycyIsIGVycm9ycyk7CiAgICBtX2luc3BlY3RvckNvbnRyb2xsZXIt
Pmluc3BlY3RvckNsaWVudCgpLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2FnZS0+dG9KU09O
U3RyaW5nKCkpOwp9CgpTdHJpbmcgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldFN0cmlu
ZyhJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBJbnNwZWN0b3JB
cnJheSogcHJvdG9jb2xFcnJvcnMpCnsKICAgIEFTU0VSVChvYmplY3QpOwogICAgQVNTRVJUKHBy
b3RvY29sRXJyb3JzKTsKICAgIAogICAgU3RyaW5nIHZhbHVlOwogICAgSW5zcGVjdG9yT2JqZWN0
Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBvYmplY3QtPmVuZCgpOwogICAgSW5zcGVjdG9yT2JqZWN0
Ojpjb25zdF9pdGVyYXRvciB2YWx1ZUl0ZXJhdG9yID0gb2JqZWN0LT5maW5kKG5hbWUpOwoKICAg
IGlmICh2YWx1ZUl0ZXJhdG9yID09IGVuZCkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0
cmluZyhTdHJpbmc6OmZvcm1hdCgiUHJvdG9jb2wgRXJyb3I6IEFyZ3VtZW50ICclcycgd2l0aCB0
eXBlICdTdHJpbmcnIHdhcyBub3QgZm91bmQuIiwgbmFtZS51dGY4KCkuZGF0YSgpKSk7CiAgICBl
bHNlIHsKICAgICAgICBpZiAoIXZhbHVlSXRlcmF0b3ItPnNlY29uZC0+YXNTdHJpbmcoJnZhbHVl
KSkKICAgICAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQo
IlByb3RvY29sIEVycm9yOiBBcmd1bWVudCAnJXMnIGhhcyB3cm9uZyB0eXBlLiBJdCBzaG91bGQg
YmUgJ1N0cmluZycuIiwgbmFtZS51dGY4KCkuZGF0YSgpKSk7CiAgICB9CiAgICByZXR1cm4gdmFs
dWU7Cn0KCmJvb2wgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldEJvb2xlYW4oSW5zcGVj
dG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgSW5zcGVjdG9yQXJyYXkqIHBy
b3RvY29sRXJyb3JzKQp7CiAgICBBU1NFUlQob2JqZWN0KTsKICAgIEFTU0VSVChwcm90b2NvbEVy
cm9ycyk7CiAgICAKICAgIGJvb2wgdmFsdWU7CiAgICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IG9iamVjdC0+ZW5kKCk7CiAgICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0
ZXJhdG9yIHZhbHVlSXRlcmF0b3IgPSBvYmplY3QtPmZpbmQobmFtZSk7CgogICAgaWYgKHZhbHVl
SXRlcmF0b3IgPT0gZW5kKQogICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmlu
Zzo6Zm9ybWF0KCJQcm90b2NvbCBFcnJvcjogQXJndW1lbnQgJyVzJyB3aXRoIHR5cGUgJ0Jvb2xl
YW4nIHdhcyBub3QgZm91bmQuIiwgbmFtZS51dGY4KCkuZGF0YSgpKSk7CiAgICBlbHNlIHsKICAg
ICAgICBpZiAoIXZhbHVlSXRlcmF0b3ItPnNlY29uZC0+YXNCb29sZWFuKCZ2YWx1ZSkpCiAgICAg
ICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCJQcm90b2Nv
bCBFcnJvcjogQXJndW1lbnQgJyVzJyBoYXMgd3JvbmcgdHlwZS4gSXQgc2hvdWxkIGJlICdCb29s
ZWFuJy4iLCBuYW1lLnV0ZjgoKS5kYXRhKCkpKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKfQoK
bG9uZyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Z2V0TG9uZyhJbnNwZWN0b3JPYmplY3Qq
IG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJv
cnMpCnsKICAgIEFTU0VSVChvYmplY3QpOwogICAgQVNTRVJUKHByb3RvY29sRXJyb3JzKTsKICAg
IAogICAgbG9uZyB2YWx1ZTsKICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5k
ID0gb2JqZWN0LT5lbmQoKTsKICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgdmFs
dWVJdGVyYXRvciA9IG9iamVjdC0+ZmluZChuYW1lKTsKCiAgICBpZiAodmFsdWVJdGVyYXRvciA9
PSBlbmQpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQo
IlByb3RvY29sIEVycm9yOiBBcmd1bWVudCAnJXMnIHdpdGggdHlwZSAnTnVtYmVyJyB3YXMgbm90
IGZvdW5kLiIsIG5hbWUudXRmOCgpLmRhdGEoKSkpOwogICAgZWxzZSB7CiAgICAgICAgaWYgKCF2
YWx1ZUl0ZXJhdG9yLT5zZWNvbmQtPmFzTnVtYmVyKCZ2YWx1ZSkpCiAgICAgICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCJQcm90b2NvbCBFcnJvcjogQXJn
dW1lbnQgJyVzJyBoYXMgd3JvbmcgdHlwZS4gSXQgc2hvdWxkIGJlICdOdW1iZXInLiIsIG5hbWUu
dXRmOCgpLmRhdGEoKSkpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9CgpQYXNzUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldE9iamVjdChJbnNw
ZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBJbnNwZWN0b3JBcnJheSog
cHJvdG9jb2xFcnJvcnMpCnsKICAgIEFTU0VSVChvYmplY3QpOwogICAgQVNTRVJUKHByb3RvY29s
RXJyb3JzKTsKICAgIAogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWU7CiAgICBJbnNw
ZWN0b3JPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG9iamVjdC0+ZW5kKCk7CiAgICBJbnNw
ZWN0b3JPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIHZhbHVlSXRlcmF0b3IgPSBvYmplY3QtPmZpbmQo
bmFtZSk7CgogICAgaWYgKHZhbHVlSXRlcmF0b3IgPT0gZW5kKQogICAgICAgIHByb3RvY29sRXJy
b3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCJQcm90b2NvbCBFcnJvcjogQXJndW1lbnQg
JyVzJyB3aXRoIHR5cGUgJ09iamVjdCcgd2FzIG5vdCBmb3VuZC4iLCBuYW1lLnV0ZjgoKS5kYXRh
KCkpKTsKICAgIGVsc2UgewogICAgICAgIGlmICghdmFsdWVJdGVyYXRvci0+c2Vjb25kLT5hc09i
amVjdCgmdmFsdWUpKQogICAgICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJp
bmc6OmZvcm1hdCgiUHJvdG9jb2wgRXJyb3I6IEFyZ3VtZW50ICclcycgaGFzIHdyb25nIHR5cGUu
IEl0IHNob3VsZCBiZSAnT2JqZWN0Jy4iLCBuYW1lLnV0ZjgoKS5kYXRhKCkpKTsKICAgIH0KICAg
IHJldHVybiB2YWx1ZTsKfQoKUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gSW5zcGVjdG9yQmFj
a2VuZERpc3BhdGNoZXI6OmdldFZhbHVlKEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBT
dHJpbmcmIG5hbWUsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycykKewogICAgQVNTRVJU
KG9iamVjdCk7CiAgICBBU1NFUlQocHJvdG9jb2xFcnJvcnMpOwogICAgCiAgICBSZWZQdHI8SW5z
cGVjdG9yVmFsdWU+IHZhbHVlOwogICAgSW5zcGVjdG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBl
bmQgPSBvYmplY3QtPmVuZCgpOwogICAgSW5zcGVjdG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciB2
YWx1ZUl0ZXJhdG9yID0gb2JqZWN0LT5maW5kKG5hbWUpOwoKICAgIGlmICh2YWx1ZUl0ZXJhdG9y
ID09IGVuZCkKICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1h
dCgiUHJvdG9jb2wgRXJyb3I6IEFyZ3VtZW50ICclcycgd2l0aCB0eXBlICdWYWx1ZScgd2FzIG5v
dCBmb3VuZC4iLCBuYW1lLnV0ZjgoKS5kYXRhKCkpKTsKICAgIGVsc2UgewogICAgICAgIGlmICgh
dmFsdWVJdGVyYXRvci0+c2Vjb25kLT5hc1ZhbHVlKCZ2YWx1ZSkpCiAgICAgICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCJQcm90b2NvbCBFcnJvcjogQXJn
dW1lbnQgJyVzJyBoYXMgd3JvbmcgdHlwZS4gSXQgc2hvdWxkIGJlICdWYWx1ZScuIiwgbmFtZS51
dGY4KCkuZGF0YSgpKSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KClBhc3NSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRBcnJheShJbnNwZWN0
b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBJbnNwZWN0b3JBcnJheSogcHJv
dG9jb2xFcnJvcnMpCnsKICAgIEFTU0VSVChvYmplY3QpOwogICAgQVNTRVJUKHByb3RvY29sRXJy
b3JzKTsKICAgIAogICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZTsKICAgIEluc3BlY3Rv
ck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gb2JqZWN0LT5lbmQoKTsKICAgIEluc3BlY3Rv
ck9iamVjdDo6Y29uc3RfaXRlcmF0b3IgdmFsdWVJdGVyYXRvciA9IG9iamVjdC0+ZmluZChuYW1l
KTsKCiAgICBpZiAodmFsdWVJdGVyYXRvciA9PSBlbmQpCiAgICAgICAgcHJvdG9jb2xFcnJvcnMt
PnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoIlByb3RvY29sIEVycm9yOiBBcmd1bWVudCAnJXMn
IHdpdGggdHlwZSAnQXJyYXknIHdhcyBub3QgZm91bmQuIiwgbmFtZS51dGY4KCkuZGF0YSgpKSk7
CiAgICBlbHNlIHsKICAgICAgICBpZiAoIXZhbHVlSXRlcmF0b3ItPnNlY29uZC0+YXNBcnJheSgm
dmFsdWUpKQogICAgICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZv
cm1hdCgiUHJvdG9jb2wgRXJyb3I6IEFyZ3VtZW50ICclcycgaGFzIHdyb25nIHR5cGUuIEl0IHNo
b3VsZCBiZSAnQXJyYXknLiIsIG5hbWUudXRmOCgpLmRhdGEoKSkpOwogICAgfQogICAgcmV0dXJu
IHZhbHVlOwp9Cgp1bnNpZ25lZCBsb25nIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRV
bnNpZ25lZExvbmcoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwg
SW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKQp7CiAgICBBU1NFUlQob2JqZWN0KTsKICAg
IEFTU0VSVChwcm90b2NvbEVycm9ycyk7CiAgICAKICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CiAg
ICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG9iamVjdC0+ZW5kKCk7CiAg
ICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIHZhbHVlSXRlcmF0b3IgPSBvYmplY3Qt
PmZpbmQobmFtZSk7CgogICAgaWYgKHZhbHVlSXRlcmF0b3IgPT0gZW5kKQogICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCJQcm90b2NvbCBFcnJvcjogQXJn
dW1lbnQgJyVzJyB3aXRoIHR5cGUgJ051bWJlcicgd2FzIG5vdCBmb3VuZC4iLCBuYW1lLnV0Zjgo
KS5kYXRhKCkpKTsKICAgIGVsc2UgewogICAgICAgIGlmICghdmFsdWVJdGVyYXRvci0+c2Vjb25k
LT5hc051bWJlcigmdmFsdWUpKQogICAgICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmlu
ZyhTdHJpbmc6OmZvcm1hdCgiUHJvdG9jb2wgRXJyb3I6IEFyZ3VtZW50ICclcycgaGFzIHdyb25n
IHR5cGUuIEl0IHNob3VsZCBiZSAnTnVtYmVyJy4iLCBuYW1lLnV0ZjgoKS5kYXRhKCkpKTsKICAg
IH0KICAgIHJldHVybiB2YWx1ZTsKfQoKdW5zaWduZWQgaW50IEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVyOjpnZXRVbnNpZ25lZEludChJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3Ry
aW5nJiBuYW1lLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpCnsKICAgIEFTU0VSVChv
YmplY3QpOwogICAgQVNTRVJUKHByb3RvY29sRXJyb3JzKTsKICAgIAogICAgdW5zaWduZWQgaW50
IHZhbHVlOwogICAgSW5zcGVjdG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBvYmplY3Qt
PmVuZCgpOwogICAgSW5zcGVjdG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciB2YWx1ZUl0ZXJhdG9y
ID0gb2JqZWN0LT5maW5kKG5hbWUpOwoKICAgIGlmICh2YWx1ZUl0ZXJhdG9yID09IGVuZCkKICAg
ICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1hdCgiUHJvdG9jb2wg
RXJyb3I6IEFyZ3VtZW50ICclcycgd2l0aCB0eXBlICdOdW1iZXInIHdhcyBub3QgZm91bmQuIiwg
bmFtZS51dGY4KCkuZGF0YSgpKSk7CiAgICBlbHNlIHsKICAgICAgICBpZiAoIXZhbHVlSXRlcmF0
b3ItPnNlY29uZC0+YXNOdW1iZXIoJnZhbHVlKSkKICAgICAgICAgICAgcHJvdG9jb2xFcnJvcnMt
PnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoIlByb3RvY29sIEVycm9yOiBBcmd1bWVudCAnJXMn
IGhhcyB3cm9uZyB0eXBlLiBJdCBzaG91bGQgYmUgJ051bWJlcicuIiwgbmFtZS51dGY4KCkuZGF0
YSgpKSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KCn0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
CiNlbmRpZiAvLyBFTkFCTEUoSU5TUEVDVE9SKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>