<?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>69322</bug_id>
          
          <creation_ts>2011-10-04 00:04:02 -0700</creation_ts>
          <short_desc>DFG should be capable of a broader range of speculations on branch and not</short_desc>
          <delta_ts>2011-10-05 14:35:57 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</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>69321</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>477465</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-04 00:04:02 -0700</bug_when>
    <thetext>The Branch and LogicalNot nodes may take any JS value.  Currently they are only capable of speculating that the value is a boolean.  But there are cases where these nodes are used for null checks, among other things.  DFG should be able to make the appropriate speculation based on the prediction of the child node.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477477</commentid>
    <comment_count>1</comment_count>
      <attachid>109589</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-04 01:05:06 -0700</bug_when>
    <thetext>Created attachment 109589
work in progress

This boosts V8 performance by a decent amount.


Benchmark report for SunSpider, V8, and Kraken.

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc
&quot;BetterBranch&quot; at /Volumes/Data/pizlo/septenary/OpenSource/WebKitBuild/Release/jsc

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Used 1 benchmark iteration per VM
invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level timing. Reporting
benchmark execution times with 95% confidence intervals in milliseconds.

                                            TipOfTree              BetterBranch                                  
SunSpider:
   3d-cube                                7.4862+-0.2303          7.4407+-0.1867       
   3d-morph                               7.4372+-0.2109          7.3692+-0.1329       
   3d-raytrace                            7.5381+-0.2667          7.5366+-0.1559       
   access-binary-trees                    1.7708+-0.0529          1.7450+-0.0765         might be 1.0148x faster
   access-fannkuch                        6.4389+-0.1258          6.3115+-0.0905         might be 1.0202x faster
   access-nbody                           3.4741+-0.0653    ?     3.5484+-0.0954       ? might be 1.0214x slower
   access-nsieve                          2.6006+-0.0750    ?     2.6779+-0.0623       ? might be 1.0297x slower
   bitops-3bit-bits-in-byte               1.7211+-0.0251          1.7178+-0.0313       
   bitops-bits-in-byte                    2.7789+-0.0697          2.6863+-0.0669         might be 1.0345x faster
   bitops-bitwise-and                     3.5273+-0.1354          3.3771+-0.1045         might be 1.0445x faster
   bitops-nsieve-bits                     5.4515+-0.1457          5.4010+-0.1522       
   controlflow-recursive                  2.0884+-0.0502          2.0741+-0.0493       
   crypto-aes                             6.6547+-0.2610          6.5233+-0.2116         might be 1.0201x faster
   crypto-md5                             2.7261+-0.0626    ?     2.7558+-0.0760       ? might be 1.0109x slower
   crypto-sha1                            2.4994+-0.0769          2.4907+-0.0650       
   date-format-tofte                      9.9591+-0.2039    ?    10.2103+-0.2621       ? might be 1.0252x slower
   date-format-xparb                      9.4223+-0.3017          9.3798+-0.2827       
   math-cordic                            6.3661+-0.0935    ?     6.5290+-0.1993       ? might be 1.0256x slower
   math-partial-sums                      7.6179+-0.1193    ?     7.6684+-0.1775       ?
   math-spectral-norm                     2.7889+-0.0816    ?     2.8738+-0.0771       ? might be 1.0304x slower
   regexp-dna                            10.8016+-0.2973    ?    10.8941+-0.2345       ?
   string-base64                          5.4812+-0.1156    ?     5.5595+-0.2529       ? might be 1.0143x slower
   string-fasta                           6.8691+-0.2140          6.6995+-0.1728         might be 1.0253x faster
   string-tagcloud                       11.7154+-0.3687    ?    11.8161+-0.3781       ?
   string-unpack-code                    21.2979+-0.4546         21.0217+-0.4061         might be 1.0131x faster
   string-validate-input                  6.6042+-0.2719          6.3652+-0.2468         might be 1.0376x faster

   &lt;arithmetic&gt; *                         6.2737+-0.0372          6.2567+-0.0333       
   &lt;geometric&gt;                            5.1451+-0.0318          5.1313+-0.0249       
   &lt;harmonic&gt;                             4.2180+-0.0337          4.2059+-0.0305       

                                            TipOfTree              BetterBranch                                  
V8:
   crypto                                72.0374+-0.3624    ?    72.1185+-0.3399       ?
   deltablue                            214.6783+-1.0184    ?   216.0820+-1.2420       ?
   earley-boyer                          87.7386+-0.8656    ?    88.2202+-1.4012       ?
   raytrace                              61.5332+-0.3629    ^    57.8440+-0.4749       ^ definitely 1.0638x faster
   regexp                               103.0834+-0.4982    ?   103.4798+-0.5179       ?
   richards                             185.3879+-0.5735    ?   186.2984+-0.8325       ?
   splay                                 91.3363+-0.6340         90.5186+-0.5669       

   &lt;arithmetic&gt;                         116.5422+-0.2563        116.3659+-0.1903       
   &lt;geometric&gt; *                        105.5238+-0.2539    ^   104.7846+-0.1695       ^ definitely 1.0071x faster
   &lt;harmonic&gt;                            96.9026+-0.2719    ^    95.6197+-0.2223       ^ definitely 1.0134x faster

                                            TipOfTree              BetterBranch                                  
Kraken:
   ai-astar                             491.9563+-4.0277    ?   492.9658+-2.1950       ?
   audio-beat-detection                 190.2766+-0.9526        189.2783+-1.2611       
   audio-dft                            270.8751+-2.6753        270.4489+-2.6225       
   audio-fft                            125.8853+-0.8666        125.3651+-0.4597       
   audio-oscillator                     246.5480+-1.7126        246.3990+-1.6485       
   imaging-darkroom                     418.2428+-1.2805    ?   420.7685+-1.8173       ?
   imaging-desaturate                   224.6155+-0.5200    !   230.8769+-0.6319       ! definitely 1.0279x slower
   imaging-gaussian-blur                581.5427+-1.2182        581.2523+-2.1482       
   json-parse-financial                  48.7181+-0.3893         48.4358+-0.3936       
   json-stringify-tinderbox              68.1482+-0.2456    ^    67.6601+-0.2085       ^ definitely 1.0072x faster
   stanford-crypto-aes                  130.5927+-1.3596        129.1095+-1.3129         might be 1.0115x faster
   stanford-crypto-ccm                  101.0150+-0.6277    ?   101.9456+-1.5832       ?
   stanford-crypto-pbkdf2               192.8562+-1.5205        192.3827+-1.4093       
   stanford-crypto-sha256-iterative      74.6896+-0.2253    ?    77.4587+-2.8886       ? might be 1.0371x slower

   &lt;arithmetic&gt; *                       226.1401+-0.6133    ?   226.7391+-0.6994       ?
   &lt;geometric&gt;                          175.8822+-0.4818    ?   176.3939+-0.7048       ?
   &lt;harmonic&gt;                           136.0794+-0.4157    ?   136.4451+-0.7318       ?

                                            TipOfTree              BetterBranch                                  
All benchmarks:
   &lt;arithmetic&gt;                          88.1888+-0.1780    ?    88.3315+-0.2029       ?
   &lt;geometric&gt;                           23.1031+-0.0880         23.0647+-0.0682       
   &lt;harmonic&gt;                             7.4143+-0.0578          7.3928+-0.0523       

                                            TipOfTree              BetterBranch                                  
Geomean of preferred means:
   &lt;scaled-result&gt;                       53.0982+-0.1242         52.9724+-0.0768</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>478075</commentid>
    <comment_count>2</comment_count>
      <attachid>109721</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-04 17:15:39 -0700</bug_when>
    <thetext>Created attachment 109721
the patch

Updated performance after merging.


Benchmark report for SunSpider, V8, and Kraken.

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc
&quot;BetterBranch&quot; at /Volumes/Data/pizlo/septenary/OpenSource/WebKitBuild/Release/jsc

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Used 1 benchmark iteration per VM
invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level timing. Reporting
benchmark execution times with 95% confidence intervals in milliseconds.

                                            TipOfTree              BetterBranch                                  
SunSpider:
   3d-cube                                7.4812+-0.1460    ?     7.5067+-0.1737       ?
   3d-morph                               7.3919+-0.1335          7.3708+-0.1453       
   3d-raytrace                            7.5996+-0.1626    ?     7.7081+-0.1909       ? might be 1.0143x slower
   access-binary-trees                    1.7566+-0.0562          1.7154+-0.0455         might be 1.0240x faster
   access-fannkuch                        6.3631+-0.0820    ?     6.3847+-0.1062       ?
   access-nbody                           3.6076+-0.0756          3.5630+-0.0802         might be 1.0125x faster
   access-nsieve                          2.7525+-0.1543          2.5887+-0.0714         might be 1.0633x faster
   bitops-3bit-bits-in-byte               1.7318+-0.0244          1.7168+-0.0479       
   bitops-bits-in-byte                    2.7818+-0.0539          2.7355+-0.0740         might be 1.0169x faster
   bitops-bitwise-and                     3.4696+-0.0807    ?     3.9148+-0.5005       ? might be 1.1283x slower
   bitops-nsieve-bits                     5.4481+-0.0925          5.4103+-0.1025       
   controlflow-recursive                  2.0624+-0.0400          2.0529+-0.0372       
   crypto-aes                             6.4679+-0.1676    ?     6.5114+-0.1765       ?
   crypto-md5                             2.7490+-0.0700    ?     2.8099+-0.0835       ? might be 1.0222x slower
   crypto-sha1                            2.4743+-0.0590          2.4562+-0.0486       
   date-format-tofte                     10.1093+-0.2269          9.8557+-0.1560         might be 1.0257x faster
   date-format-xparb                      9.5077+-0.2055          9.2729+-0.1515         might be 1.0253x faster
   math-cordic                            6.3826+-0.1270          6.3111+-0.1125         might be 1.0113x faster
   math-partial-sums                      7.6905+-0.1866          7.4815+-0.1294         might be 1.0279x faster
   math-spectral-norm                     2.7907+-0.0630    ?     2.8314+-0.0866       ? might be 1.0146x slower
   regexp-dna                            10.7219+-0.2144         10.7126+-0.1027       
   string-base64                          5.5707+-0.1089          5.4329+-0.0964         might be 1.0254x faster
   string-fasta                           6.5750+-0.1426    ?     6.6665+-0.1379       ? might be 1.0139x slower
   string-tagcloud                       11.6204+-0.1419    ?    11.8170+-0.1822       ? might be 1.0169x slower
   string-unpack-code                    21.1400+-0.3545         20.9919+-0.2841       
   string-validate-input                  6.2364+-0.1875    ?     6.2398+-0.1595       ?

   &lt;arithmetic&gt; *                         6.2493+-0.0159          6.2330+-0.0383       
   &lt;geometric&gt;                            5.1367+-0.0177          5.1242+-0.0332       
   &lt;harmonic&gt;                             4.2210+-0.0260          4.2030+-0.0362       

                                            TipOfTree              BetterBranch                                  
V8:
   crypto                                72.8145+-0.5199         72.6473+-0.4037       
   deltablue                            214.1124+-1.0016    !   217.9888+-1.8622       ! definitely 1.0181x slower
   earley-boyer                          88.2514+-0.5703    ^    87.2301+-0.2962       ^ definitely 1.0117x faster
   raytrace                              62.1892+-0.5513    ^    58.1012+-0.4594       ^ definitely 1.0704x faster
   regexp                               102.9545+-0.5633    ?   104.1702+-0.7198       ? might be 1.0118x slower
   richards                             187.3573+-0.4727    ?   188.5787+-0.8794       ?
   splay                                 90.9779+-0.8013         90.6149+-1.0160       

   &lt;arithmetic&gt;                         116.9510+-0.1704    ?   117.0473+-0.2610       ?
   &lt;geometric&gt; *                        105.9743+-0.1602    ^   105.2228+-0.1759       ^ definitely 1.0071x faster
   &lt;harmonic&gt;                            97.4046+-0.1800    ^    95.9244+-0.2019       ^ definitely 1.0154x faster

                                            TipOfTree              BetterBranch                                  
Kraken:
   ai-astar                             495.4805+-2.3816    !   502.2475+-3.9661       ! definitely 1.0137x slower
   audio-beat-detection                 190.5182+-0.9920    ?   191.6489+-1.1051       ?
   audio-dft                            270.7026+-2.4880        269.3619+-3.1474       
   audio-fft                            125.9513+-0.6101    ?   126.4527+-0.9342       ?
   audio-oscillator                     247.7809+-1.8248        247.3469+-1.9099       
   imaging-darkroom                     427.8471+-7.5061        426.0058+-2.2012       
   imaging-desaturate                   225.0271+-1.6814    !   232.7494+-1.0558       ! definitely 1.0343x slower
   imaging-gaussian-blur                585.0237+-2.6857        583.4547+-3.3415       
   json-parse-financial                  49.2309+-0.2701    ^    48.5261+-0.4178       ^ definitely 1.0145x faster
   json-stringify-tinderbox              68.9585+-0.7374    ?    70.1904+-1.0000       ? might be 1.0179x slower
   stanford-crypto-aes                  130.2263+-1.5949    ?   132.4506+-1.9081       ? might be 1.0171x slower
   stanford-crypto-ccm                  100.7143+-0.7437    !   103.0105+-1.1431       ! definitely 1.0228x slower
   stanford-crypto-pbkdf2               190.2549+-1.9168    ?   190.8994+-2.4199       ?
   stanford-crypto-sha256-iterative      76.2882+-1.1701         75.8700+-1.1122       

   &lt;arithmetic&gt; *                       227.4289+-0.7199    ?   228.5868+-0.4489       ?
   &lt;geometric&gt;                          176.7279+-0.5544    !   177.7903+-0.3950       ! definitely 1.0060x slower
   &lt;harmonic&gt;                           136.9439+-0.4958    ?   137.5425+-0.4616       ?

                                            TipOfTree              BetterBranch                                  
All benchmarks:
   &lt;arithmetic&gt;                          88.6201+-0.2244    !    88.9703+-0.1221       ! definitely 1.0040x slower
   &lt;geometric&gt;                           23.1301+-0.0572         23.1154+-0.0733       
   &lt;harmonic&gt;                             7.4206+-0.0446          7.3890+-0.0619       

                                            TipOfTree              BetterBranch                                  
Geomean of preferred means:
   &lt;scaled-result&gt;                       53.2057+-0.0926         53.1228+-0.0961</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>478688</commentid>
    <comment_count>3</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-05 14:35:57 -0700</bug_when>
    <thetext>Landed in r96750.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109589</attachid>
            <date>2011-10-04 01:05:06 -0700</date>
            <delta_ts>2011-10-04 17:15:39 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>objectbranch_patch_1.diff</filename>
            <type>text/plain</type>
            <size>27788</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTY1NzQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjUgQEAK
KzIwMTEtMTAtMDQgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBE
Rkcgc2hvdWxkIGJlIGNhcGFibGUgb2YgYSBicm9hZGVyIHJhbmdlIG9mIHNwZWN1bGF0aW9ucyBv
biBicmFuY2ggYW5kIG5vdAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NjkzMjIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAg
ICAgICAgCisgICAgICAgIFRISVMgSVMgQSBET1VCTEUgUEFUQ0guIEl0IGRlcGVuZHMgb24gc29t
ZXRoaW5nIGVsc2Ugbm90IHlldCBsYW5kZWQuIFB1dHRpbmcKKyAgICAgICAgaXQgdXAgaGVyZSBm
b3IgRVdTLgorCisgICAgICAgICogYnl0ZWNvZGUvUHJlZGljdGVkVHlwZS5oOgorICAgICAgICAo
SlNDOjppc0ZpbmFsT2JqZWN0T3JPdGhlclByZWRpY3Rpb24pOgorICAgICAgICAoSlNDOjppc0Fy
cmF5T3JPdGhlclByZWRpY3Rpb24pOgorICAgICAgICAqIGRmZy9ERkdKSVRDb2RlR2VuZXJhdG9y
LmNwcDoKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvci5oOgorICAgICAgICAoSlND
OjpERkc6OkpJVENvZGVHZW5lcmF0b3I6OkpJVENvZGVHZW5lcmF0b3IpOgorICAgICAgICAqIGRm
Zy9ERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkpJVENv
ZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUpOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5l
cmF0b3I6OmZpbGxKU1ZhbHVlKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvcjY0
LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsRG91YmxlKToK
KyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSlNWYWx1ZSk6CisgICAg
ICAgICogZGZnL0RGR09wZXJhdGlvbnMuY3BwOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2
ZUpJVC5oOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpzaG91bGRTcGVjdWxh
dGVGaW5hbE9iamVjdE9yT3RoZXIpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklU
OjpzaG91bGRTcGVjdWxhdGVBcnJheU9yT3RoZXIpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1
bGF0aXZlSklUOjpTcGVjdWxhdGl2ZUpJVCk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZl
SklUMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjplbWl0QnJh
bmNoKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHA6CisgICAgICAgIChK
U0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVPYmplY3RPck90aGVyTG9naWNhbE5vdCk6
CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVMb2dpY2FsTm90KToK
KyAgICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6ZW1pdE9iamVjdE9yT3RoZXJCcmFu
Y2gpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjplbWl0QnJhbmNoKToKKwor
MjAxMS0xMC0wMyAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAgIEpJ
VENvZGVHZW5lcmF0b3Igc2hvdWxkIG5vIGxvbmdlciBoYXZlIGNvZGUgdGhhdCB0cmllcyB0b28g
aGFyZAorICAgICAgICB0byBiZSBib3RoIHNwZWN1bGF0aXZlIGFuZCBub24tc3BlY3VsYXRpdmUK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzIxCisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBT
aW1wbGUgcmVmYWN0b3JpbmcgYW5kIHNpbXBsaWZpY2F0aW9uLCBubyBtZWFzdXJhYmxlIHBlcmZv
cm1hbmNlCisgICAgICAgIGVmZmVjdC4KKworICAgICAgICAqIGRmZy9ERkdKSVRDb2RlR2VuZXJh
dG9yLmNwcDoKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvci5oOgorICAgICAgICAo
SlNDOjpERkc6OkpJVENvZGVHZW5lcmF0b3I6OkpJVENvZGVHZW5lcmF0b3IpOgorICAgICAgICAq
IGRmZy9ERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkpJ
VENvZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUpOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVH
ZW5lcmF0b3I6OmZpbGxKU1ZhbHVlKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRv
cjY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsRG91Ymxl
KToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSlNWYWx1ZSk6Cisg
ICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmg6CisgICAgICAgIChKU0M6OkRGRzo6U3Bl
Y3VsYXRpdmVKSVQ6OlNwZWN1bGF0aXZlSklUKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRp
dmVKSVQzMl82NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmVtaXRC
cmFuY2gpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcDoKKyAgICAgICAg
KEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6ZW1pdEJyYW5jaCk6CisKIDIwMTEtMTAtMDMgIEZp
bGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KIAogICAgICAgICBERkcgc2hvdWxkIGlubGlu
ZSBBcnJheS5wdXNoIGFuZCBBcnJheS5wb3AKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29kZS9QcmVkaWN0ZWRUeXBlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb2RlL1ByZWRpY3RlZFR5cGUuaAkocmV2aXNpb24gOTY1NzEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvUHJlZGljdGVkVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC02Nyw2ICs2NywxMSBAQCBpbmxpbmUgYm9vbCBpc0ZpbmFsT2JqZWN0UHJlZGljdGlvbihQcmVk
CiAgICAgcmV0dXJuIHZhbHVlID09IFByZWRpY3RGaW5hbE9iamVjdDsKIH0KIAoraW5saW5lIGJv
b2wgaXNGaW5hbE9iamVjdE9yT3RoZXJQcmVkaWN0aW9uKFByZWRpY3RlZFR5cGUgdmFsdWUpCit7
CisgICAgcmV0dXJuICEhKHZhbHVlICYgKFByZWRpY3RGaW5hbE9iamVjdCB8IFByZWRpY3RPdGhl
cikpICYmICEodmFsdWUgJiB+KFByZWRpY3RGaW5hbE9iamVjdCB8IFByZWRpY3RPdGhlcikpOwor
fQorCiBpbmxpbmUgYm9vbCBpc1N0cmluZ1ByZWRpY3Rpb24oUHJlZGljdGVkVHlwZSB2YWx1ZSkK
IHsKICAgICByZXR1cm4gdmFsdWUgPT0gUHJlZGljdFN0cmluZzsKQEAgLTc3LDYgKzgyLDExIEBA
IGlubGluZSBib29sIGlzQXJyYXlQcmVkaWN0aW9uKFByZWRpY3RlZFQKICAgICByZXR1cm4gdmFs
dWUgPT0gUHJlZGljdEFycmF5OwogfQogCitpbmxpbmUgYm9vbCBpc0FycmF5T3JPdGhlclByZWRp
Y3Rpb24oUHJlZGljdGVkVHlwZSB2YWx1ZSkKK3sKKyAgICByZXR1cm4gISEodmFsdWUgJiAoUHJl
ZGljdEFycmF5IHwgUHJlZGljdE90aGVyKSkgJiYgISh2YWx1ZSAmIH4oUHJlZGljdEFycmF5IHwg
UHJlZGljdE90aGVyKSk7Cit9CisKIGlubGluZSBib29sIGlzSW50MzJQcmVkaWN0aW9uKFByZWRp
Y3RlZFR5cGUgdmFsdWUpCiB7CiAgICAgcmV0dXJuIHZhbHVlID09IFByZWRpY3RJbnQzMjsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvcjMyXzY0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5l
cmF0b3IzMl82NC5jcHAJKHJldmlzaW9uIDk2NTcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzYs
NyArMTM2LDcgQEAgRlBSUmVnIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUoTm9kZQogICAg
ICAgICAgICAgbV9qaXQuZW1pdExvYWQobm9kZUluZGV4LCB0YWcsIHBheWxvYWQpOwogICAgICAg
ICAgICAgbV9ncHJzLnJldGFpbih0YWcsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlclNwaWxs
ZWQpOwogICAgICAgICAgICAgbV9ncHJzLnJldGFpbihwYXlsb2FkLCB2aXJ0dWFsUmVnaXN0ZXIs
IFNwaWxsT3JkZXJTcGlsbGVkKTsKLSAgICAgICAgICAgIGluZm8uZmlsbEpTVmFsdWUodGFnLCBw
YXlsb2FkLCBtX2lzU3BlY3VsYXRpdmUgPyBzcGlsbEZvcm1hdCA6IERhdGFGb3JtYXRKUyk7Cisg
ICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKHRhZywgcGF5bG9hZCwgc3BpbGxGb3JtYXQpOwog
ICAgICAgICAgICAgdW5sb2NrKHRhZyk7CiAgICAgICAgICAgICB1bmxvY2socGF5bG9hZCk7CiAg
ICAgICAgIH0KQEAgLTI0Miw3ICsyNDIsNyBAQCBib29sIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxK
U1ZhbHVlKE5vZGVJCiAgICAgICAgICAgICBtX2ppdC5lbWl0TG9hZChub2RlSW5kZXgsIHRhZ0dQ
UiwgcGF5bG9hZEdQUik7CiAgICAgICAgICAgICBtX2dwcnMucmV0YWluKHRhZ0dQUiwgdmlydHVh
bFJlZ2lzdGVyLCBTcGlsbE9yZGVyU3BpbGxlZCk7CiAgICAgICAgICAgICBtX2dwcnMucmV0YWlu
KHBheWxvYWRHUFIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlclNwaWxsZWQpOwotICAgICAg
ICAgICAgaW5mby5maWxsSlNWYWx1ZSh0YWdHUFIsIHBheWxvYWRHUFIsIG1faXNTcGVjdWxhdGl2
ZSA/IHNwaWxsRm9ybWF0IDogRGF0YUZvcm1hdEpTKTsKKyAgICAgICAgICAgIGluZm8uZmlsbEpT
VmFsdWUodGFnR1BSLCBwYXlsb2FkR1BSLCBzcGlsbEZvcm1hdCk7CiAgICAgICAgIH0KIAogICAg
ICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE1MTcsNDUgKzE1MTcsNiBAQCB2b2lkIEpJVENvZGVHZW5l
cmF0b3I6Om5vblNwZWN1bGF0aXZlTm9uCiAgICAganNWYWx1ZVJlc3VsdChyZXN1bHRUYWdHUFIs
IHJlc3VsdFBheWxvYWRHUFIsIG1fY29tcGlsZUluZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuLCBV
c2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwogfQogCi12b2lkIEpJVENvZGVHZW5lcmF0b3I6
OmVtaXRCcmFuY2goTm9kZSYgbm9kZSkKLXsKLSAgICAvLyBGSVhNRTogQWRkIGZhc3QgY2FzZXMg
Zm9yIGtub3duIEJvb2xlYW4hCi0gICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5j
aGlsZDEoKSk7Ci0gICAgdmFsdWUuZmlsbCgpOwotICAgIEdQUlJlZyB2YWx1ZVRhZ0dQUiA9IHZh
bHVlLnRhZ0dQUigpOwotICAgIEdQUlJlZyB2YWx1ZVBheWxvYWRHUFIgPSB2YWx1ZS5wYXlsb2Fk
R1BSKCk7Ci0KLSAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMpOwotICAgIEdQUlJlZyByZXN1
bHRHUFIgPSByZXN1bHQuZ3ByKCk7Ci0gICAgCi0gICAgdXNlKG5vZGUuY2hpbGQxKCkpOwotICAg
IAotICAgIEJsb2NrSW5kZXggdGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRl
Y29kZU9mZnNldChub2RlLnRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7Ci0gICAgQmxvY2tJbmRleCBu
b3RUYWtlbiA9IG1faml0LmdyYXBoKCkuYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KG5vZGUu
bm90VGFrZW5CeXRlY29kZU9mZnNldCgpKTsKLQotICAgIEpJVENvbXBpbGVyOjpKdW1wIGZhc3RQ
YXRoID0gbV9qaXQuYnJhbmNoMzIoSklUQ29tcGlsZXI6OkVxdWFsLCB2YWx1ZVRhZ0dQUiwgSklU
Q29tcGlsZXI6OlRydXN0ZWRJbW0zMihKU1ZhbHVlOjpJbnQzMlRhZykpOwotICAgIEpJVENvbXBp
bGVyOjpKdW1wIHNsb3dQYXRoID0gbV9qaXQuYnJhbmNoMzIoSklUQ29tcGlsZXI6Ok5vdEVxdWFs
LCB2YWx1ZVRhZ0dQUiwgSklUQ29tcGlsZXI6OlRydXN0ZWRJbW0zMihKU1ZhbHVlOjpCb29sZWFu
VGFnKSk7Ci0KLSAgICBmYXN0UGF0aC5saW5rKCZtX2ppdCk7Ci0gICAgYWRkQnJhbmNoKG1faml0
LmJyYW5jaFRlc3QzMihKSVRDb21waWxlcjo6WmVybywgdmFsdWVQYXlsb2FkR1BSKSwgbm90VGFr
ZW4pOwotICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIHRha2VuKTsKLQotICAgIHNsb3dQYXRo
LmxpbmsoJm1faml0KTsKLSAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOwot
ICAgIG1faml0LnB1c2godmFsdWVUYWdHUFIpOwotICAgIG1faml0LnB1c2godmFsdWVQYXlsb2Fk
R1BSKTsKLSAgICBtX2ppdC5wdXNoKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyKTsKLSAgICBh
cHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKGRmZ0NvbnZlcnRKU1ZhbHVlVG9Cb29sZWFuKTsK
LSAgICBtX2ppdC5tb3ZlKEdQUkluZm86OnJldHVyblZhbHVlR1BSLCByZXN1bHRHUFIpOwotICAg
IHNpbGVudEZpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKLSAgICAKLSAgICBhZGRCcmFuY2go
bV9qaXQuYnJhbmNoVGVzdDgoSklUQ29tcGlsZXI6Ok5vblplcm8sIHJlc3VsdEdQUiksIHRha2Vu
KTsKLSAgICBpZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkKLSAgICAgICAgYWRkQnJhbmNo
KG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOwotICAgIAotICAgIG5vUmVzdWx0KG1fY29tcGlsZUlu
ZGV4LCBVc2VDaGlsZHJlbkNhbGxlZEV4cGxpY2l0bHkpOwotfQotCiB2b2lkIEpJVENvZGVHZW5l
cmF0b3I6OmVtaXRDYWxsKE5vZGUmIG5vZGUpCiB7CiAgICAgUF9ERkdPcGVyYXRpb25fRSBzbG93
Q2FsbEZ1bmN0aW9uOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2Rl
R2VuZXJhdG9yNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHSklUQ29kZUdlbmVyYXRvcjY0LmNwcAkocmV2aXNpb24gOTY1NzEpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3I2NC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTE0OCw3ICsxNDgsNyBAQCBGUFJSZWcgSklUQ29kZUdlbmVyYXRvcjo6ZmlsbERvdWJsZShO
b2RlCiAgICAgICAgICAgICBBU1NFUlQoc3BpbGxGb3JtYXQgJiBEYXRhRm9ybWF0SlMpOwogICAg
ICAgICAgICAgbV9ncHJzLnJldGFpbihncHIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlclNw
aWxsZWQpOwogICAgICAgICAgICAgbV9qaXQubG9hZFB0cihKSVRDb21waWxlcjo6YWRkcmVzc0Zv
cih2aXJ0dWFsUmVnaXN0ZXIpLCBncHIpOwotICAgICAgICAgICAgaW5mby5maWxsSlNWYWx1ZShn
cHIsIG1faXNTcGVjdWxhdGl2ZSA/IHNwaWxsRm9ybWF0IDogRGF0YUZvcm1hdEpTKTsKKyAgICAg
ICAgICAgIGluZm8uZmlsbEpTVmFsdWUoZ3ByLCBzcGlsbEZvcm1hdCk7CiAgICAgICAgICAgICB1
bmxvY2soZ3ByKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI2Niw3ICsyNjYsNyBAQCBHUFJSZWcg
SklUQ29kZUdlbmVyYXRvcjo6ZmlsbEpTVmFsdWUoTm9kCiAgICAgICAgICAgICBBU1NFUlQoc3Bp
bGxGb3JtYXQgJiBEYXRhRm9ybWF0SlMpOwogICAgICAgICAgICAgbV9ncHJzLnJldGFpbihncHIs
IHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlclNwaWxsZWQpOwogICAgICAgICAgICAgbV9qaXQu
bG9hZFB0cihKSVRDb21waWxlcjo6YWRkcmVzc0Zvcih2aXJ0dWFsUmVnaXN0ZXIpLCBncHIpOwot
ICAgICAgICAgICAgaW5mby5maWxsSlNWYWx1ZShncHIsIG1faXNTcGVjdWxhdGl2ZSA/IHNwaWxs
Rm9ybWF0IDogRGF0YUZvcm1hdEpTKTsKKyAgICAgICAgICAgIGluZm8uZmlsbEpTVmFsdWUoZ3By
LCBzcGlsbEZvcm1hdCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGdwcjsKICAgICB9CkBA
IC0xNDYxLDcwICsxNDYxLDYgQEAgdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2
ZU5vbgogICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0R1BSLCBtX2NvbXBpbGVJbmRleCwgRGF0YUZv
cm1hdEpTQm9vbGVhbiwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKIH0KIAotdm9pZCBK
SVRDb2RlR2VuZXJhdG9yOjplbWl0QnJhbmNoKE5vZGUmIG5vZGUpCi17Ci0gICAgSlNWYWx1ZU9w
ZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7Ci0gICAgR1BSUmVnIHZhbHVlR1BSID0g
dmFsdWUuZ3ByKCk7Ci0gICAgCi0gICAgQmxvY2tJbmRleCB0YWtlbiA9IG1faml0LmdyYXBoKCku
YmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KG5vZGUudGFrZW5CeXRlY29kZU9mZnNldCgpKTsK
LSAgICBCbG9ja0luZGV4IG5vdFRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0
ZWNvZGVPZmZzZXQobm9kZS5ub3RUYWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOwotICAgIAotICAgIGlm
IChpc0tub3duQm9vbGVhbihub2RlLmNoaWxkMSgpKSkgewotICAgICAgICBNYWNyb0Fzc2VtYmxl
cjo6UmVzdWx0Q29uZGl0aW9uIGNvbmRpdGlvbiA9IE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvOwot
ICAgICAgICAKLSAgICAgICAgaWYgKHRha2VuID09IChtX2Jsb2NrICsgMSkpIHsKLSAgICAgICAg
ICAgIGNvbmRpdGlvbiA9IE1hY3JvQXNzZW1ibGVyOjpaZXJvOwotICAgICAgICAgICAgQmxvY2tJ
bmRleCB0bXAgPSB0YWtlbjsKLSAgICAgICAgICAgIHRha2VuID0gbm90VGFrZW47Ci0gICAgICAg
ICAgICBub3RUYWtlbiA9IHRtcDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWRkQnJh
bmNoKG1faml0LmJyYW5jaFRlc3QzMihjb25kaXRpb24sIHZhbHVlR1BSLCBUcnVzdGVkSW1tMzIo
dHJ1ZSkpLCB0YWtlbik7Ci0gICAgICAgIGlmIChub3RUYWtlbiAhPSAobV9ibG9jayArIDEpKQot
ICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOwotICAgICAgICAK
LSAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IEdQUlRlbXBvcmFyeSByZXN1bHQodGhpcyk7Ci0gICAgICAgIEdQUlJlZyByZXN1bHRHUFIgPSBy
ZXN1bHQuZ3ByKCk7Ci0gICAgICAgIAotICAgICAgICBib29sIHByZWRpY3RCb29sZWFuID0gaXNC
b29sZWFuUHJlZGljdGlvbihtX2ppdC5nZXRQcmVkaWN0aW9uKG5vZGUuY2hpbGQxKCkpKTsKLSAg
ICAKLSAgICAgICAgaWYgKHByZWRpY3RCb29sZWFuKSB7Ci0gICAgICAgICAgICBhZGRCcmFuY2go
bV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNz
ZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbihmYWxzZSkpKSksIG5vdFRh
a2VuKTsKLSAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJs
ZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNv
ZGUoanNCb29sZWFuKHRydWUpKSkpLCB0YWtlbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIGlmIChtX2lzU3BlY3VsYXRpdmUgJiYgcHJlZGljdEJvb2xlYW4pIHsKLSAgICAgICAgICAg
IHNwZWN1bGF0aW9uQ2hlY2sobV9qaXQuanVtcCgpKTsKLSAgICAgICAgICAgIHZhbHVlLnVzZSgp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0
cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRy
KEpTVmFsdWU6OmVuY29kZShqc051bWJlcigwKSkpKSwgbm90VGFrZW4pOwotICAgICAgICAgICAg
YWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QWJvdmVPckVxdWFsLCB2
YWx1ZUdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKSwgdGFrZW4pOwotICAgIAot
ICAgICAgICAgICAgaWYgKCFwcmVkaWN0Qm9vbGVhbikgewotICAgICAgICAgICAgICAgIGFkZEJy
YW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFj
cm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKGZhbHNlKSkpKSwg
bm90VGFrZW4pOwotICAgICAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFj
cm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1Zh
bHVlOjplbmNvZGUoanNCb29sZWFuKHRydWUpKSkpLCB0YWtlbik7Ci0gICAgICAgICAgICB9Ci0g
ICAgCi0gICAgICAgICAgICB2YWx1ZS51c2UoKTsKLSAgICAKLSAgICAgICAgICAgIHNpbGVudFNw
aWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgICAgICAgICBtX2ppdC5tb3ZlKHZhbHVl
R1BSLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpOwotICAgICAgICAgICAgbV9qaXQubW92ZShHUFJJ
bmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRHUFIwKTsKLSAgICAgICAg
ICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2soZGZnQ29udmVydEpTVmFsdWVUb0Jvb2xl
YW4pOwotICAgICAgICAgICAgbV9qaXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVz
dWx0R1BSKTsKLSAgICAgICAgICAgIHNpbGVudEZpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsK
LSAgICAKLSAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0OChNYWNyb0Fzc2Vt
Ymxlcjo6Tm9uWmVybywgcmVzdWx0R1BSKSwgdGFrZW4pOwotICAgICAgICAgICAgaWYgKG5vdFRh
a2VuICE9IChtX2Jsb2NrICsgMSkpCi0gICAgICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0Lmp1
bXAoKSwgbm90VGFrZW4pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBub1Jlc3VsdCht
X2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKLSAgICB9Ci19Ci0K
IHZvaWQgSklUQ29kZUdlbmVyYXRvcjo6ZW1pdENhbGwoTm9kZSYgbm9kZSkKIHsKICAgICBQX0RG
R09wZXJhdGlvbl9FIHNsb3dDYWxsRnVuY3Rpb247CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvci5jcHAJKHJldmlzaW9uIDk2NTcxKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzc3LDEyICszNzcsNiBAQCBib29sIEpJVENvZGVHZW5lcmF0b3I6Om5v
blNwZWN1bGF0aXZlU3RyCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEpJVENvZGVHZW5l
cmF0b3I6OnNwZWN1bGF0aW9uQ2hlY2soTWFjcm9Bc3NlbWJsZXI6Okp1bXAganVtcFRvRmFpbCkK
LXsKLSAgICBBU1NFUlQobV9pc1NwZWN1bGF0aXZlKTsKLSAgICBzdGF0aWNfY2FzdDxTcGVjdWxh
dGl2ZUpJVCo+KHRoaXMpLT5zcGVjdWxhdGlvbkNoZWNrKGp1bXBUb0ZhaWwpOwotfQotCiAjaWZu
ZGVmIE5ERUJVRwogc3RhdGljIGNvbnN0IGNoYXIqIGRhdGFGb3JtYXRTdHJpbmcoRGF0YUZvcm1h
dCBmb3JtYXQpCiB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVH
ZW5lcmF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJ
VENvZGVHZW5lcmF0b3IuaAkocmV2aXNpb24gOTY1NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMjMyLDkgKzIz
Miw4IEBAIHB1YmxpYzoKICAgICB9CiAKIHByb3RlY3RlZDoKLSAgICBKSVRDb2RlR2VuZXJhdG9y
KEpJVENvbXBpbGVyJiBqaXQsIGJvb2wgaXNTcGVjdWxhdGl2ZSkKKyAgICBKSVRDb2RlR2VuZXJh
dG9yKEpJVENvbXBpbGVyJiBqaXQpCiAgICAgICAgIDogbV9qaXQoaml0KQotICAgICAgICAsIG1f
aXNTcGVjdWxhdGl2ZShpc1NwZWN1bGF0aXZlKQogICAgICAgICAsIG1fY29tcGlsZUluZGV4KDAp
CiAgICAgICAgICwgbV9nZW5lcmF0aW9uSW5mbyhtX2ppdC5jb2RlQmxvY2soKS0+bV9udW1DYWxs
ZWVSZWdpc3RlcnMpCiAgICAgICAgICwgbV9ibG9ja0hlYWRzKGppdC5ncmFwaCgpLm1fYmxvY2tz
LnNpemUoKSkKQEAgLTc3OCw4ICs3NzcsNiBAQCBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBub25TcGVj
dWxhdGl2ZU5vblBlZXBob2xlU3RyaWN0RXEoTm9kZSYsIGJvb2wgaW52ZXJ0ID0gZmFsc2UpOwog
ICAgIGJvb2wgbm9uU3BlY3VsYXRpdmVTdHJpY3RFcShOb2RlJiwgYm9vbCBpbnZlcnQgPSBmYWxz
ZSk7CiAgICAgCi0gICAgdm9pZCBlbWl0QnJhbmNoKE5vZGUmKTsKLSAgICAKICAgICBNYWNyb0Fz
c2VtYmxlcjo6QWRkcmVzcyBhZGRyZXNzT2ZDYWxsRGF0YShpbnQgaWR4KQogICAgIHsKICAgICAg
ICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lz
dGVyLCAobV9qaXQuY29kZUJsb2NrKCktPm1fbnVtQ2FsbGVlUmVnaXN0ZXJzICsgaWR4KSAqIHN0
YXRpY19jYXN0PGludD4oc2l6ZW9mKFJlZ2lzdGVyKSkpOwpAQCAtNzk5LDggKzc5Niw2IEBAIHBy
b3RlY3RlZDoKIAogICAgIHZvaWQgZW1pdENhbGwoTm9kZSYpOwogICAgIAotICAgIHZvaWQgc3Bl
Y3VsYXRpb25DaGVjayhNYWNyb0Fzc2VtYmxlcjo6SnVtcCBqdW1wVG9GYWlsKTsKLQogICAgIC8v
IENhbGxlZCBvbmNlIGEgbm9kZSBoYXMgY29tcGxldGVkIGNvZGUgZ2VuZXJhdGlvbiBidXQgcHJp
b3IgdG8gc2V0dGluZwogICAgIC8vIGl0cyByZXN1bHQsIHRvIGZyZWUgdXAgaXRzIGNoaWxkcmVu
LiAoVGhpcyBtdXN0IGhhcHBlbiBwcmlvciB0byBzZXR0aW5nCiAgICAgLy8gdGhlIG5vZGVzIHJl
c3VsdCwgc2luY2UgdGhlIG5vZGUgbWF5IGhhdmUgdGhlIHNhbWUgVmlydHVhbFJlZ2lzdGVyIGFz
CkBAIC0xMzgzLDE3ICsxMzc4LDYgQEAgcHJvdGVjdGVkOgogCiAgICAgLy8gVGhlIEpJVCwgd2hp
bGUgYWxzbyBwcm92aWRlcyBNYWNyb0Fzc2VtYmxlciBmdW5jdGlvbmFsaXR5LgogICAgIEpJVENv
bXBpbGVyJiBtX2ppdDsKLSAgICAvLyBUaGlzIGZsYWcgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBz
cGVjdWxhdGl2ZSBhbmQgbm9uLXNwZWN1bGF0aXZlCi0gICAgLy8gY29kZSBnZW5lcmF0aW9uLiBU
aGlzIGlzIHNpZ25pZmljYW50IHdoZW4gZmlsbGluZyBzcGlsbGVkIHZhbHVlcwotICAgIC8vIGZy
b20gdGhlIFJlZ2lzdGVyRmlsZS4gV2hlbiBzcGlsbGluZyB3ZSBhdHRlbXB0IHRvIHN0b3JlIGlu
Zm9ybWF0aW9uCi0gICAgLy8gYXMgdG8gdGhlIHR5cGUgb2YgYm94ZWQgdmFsdWUgYmVpbmcgc3Rv
cmVkIChpbnQzMiwgZG91YmxlLCBjZWxsKSwgYW5kCi0gICAgLy8gd2hlbiBmaWxsaW5nIG9uIHRo
ZSBzcGVjdWxhdGl2ZSBwYXRoIHdlIHdpbGwgcmV0cmlldmUgdGhpcyB0eXBlIGluZm8KLSAgICAv
LyB3aGVyZSBhdmFpbGFibGUuIE9uIHRoZSBub24tc3BlY3VsYXRpdmUgcGF0aCwgaG93ZXZlciwg
d2UgY2Fubm90IHJlbHkKLSAgICAvLyBvbiB0aGUgc3BpbGwgZm9ybWF0IGluZm8sIHNpbmNlIHRo
ZSBhIHZhbHVlIGJlaW5nIGxvYWRlZCBtaWdodCBoYXZlCi0gICAgLy8gYmVlbiBzcGlsbGVkIGJ5
IGVpdGhlciB0aGUgc3BlY3VsYXRpdmUgb3Igbm9uLXNwZWN1bGF0aXZlIHBhdGhzICh3aGVyZQot
ICAgIC8vIHdlIGVudGVyZWQgdGhlIG5vbi1zcGVjdWxhdGl2ZSBwYXRoIG9uIGFuIGludGVydmVu
aW5nIGJhaWwtb3V0KSwgYW5kCi0gICAgLy8gdGhlIHZhbHVlIG1heSBoYXZlIGJlZW4gYm94ZWQg
ZGlmZmVyZW50bHkgb24gdGhlIHR3byBwYXRocy4KLSAgICBib29sIG1faXNTcGVjdWxhdGl2ZTsK
ICAgICAvLyBUaGUgY3VycmVudCBub2RlIGJlaW5nIGdlbmVyYXRlZC4KICAgICBCbG9ja0luZGV4
IG1fYmxvY2s7CiAgICAgTm9kZUluZGV4IG1fY29tcGlsZUluZGV4OwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdPcGVyYXRpb25zLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR09wZXJhdGlvbnMuY3BwCShyZXZpc2lvbiA5NjU3MSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTg3NSw3ICs4NzUsOCBAQCB2b2lkIERGR19PUEVSQVRJT04gZGVidWdPcGVyYXRpb25Q
cmludFNwCiB7CiAgICAgU3BlY3VsYXRpb25GYWlsdXJlRGVidWdJbmZvKiBkZWJ1Z0luZm8gPSBz
dGF0aWNfY2FzdDxTcGVjdWxhdGlvbkZhaWx1cmVEZWJ1Z0luZm8qPihkZWJ1Z0luZm9SYXcpOwog
ICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gZGVidWdJbmZvLT5jb2RlQmxvY2s7Ci0gICAgcHJp
bnRmKCJTcGVjdWxhdGlvbiBmYWlsdXJlIGluICVwIGF0IDB4JXggd2l0aCBleGVjdXRlQ291bnRl
ciA9ICVkLCByZW9wdGltaXphdGlvblJldHJ5Q291bnRlciA9ICV1LCBvcHRpbWl6YXRpb25EZWxh
eUNvdW50ZXIgPSAldSwgc3VjY2Vzcy9mYWlsICV1LyV1XG4iLCBjb2RlQmxvY2ssIGRlYnVnSW5m
by0+ZGVidWdPZmZzZXQsIGNvZGVCbG9jay0+YWx0ZXJuYXRpdmUoKS0+ZXhlY3V0ZUNvdW50ZXIo
KSwgY29kZUJsb2NrLT5hbHRlcm5hdGl2ZSgpLT5yZW9wdGltaXphdGlvblJldHJ5Q291bnRlcigp
LCBjb2RlQmxvY2stPmFsdGVybmF0aXZlKCktPm9wdGltaXphdGlvbkRlbGF5Q291bnRlcigpLCBj
b2RlQmxvY2stPnNwZWN1bGF0aXZlU3VjY2Vzc0NvdW50ZXIoKSwgY29kZUJsb2NrLT5zcGVjdWxh
dGl2ZUZhaWxDb3VudGVyKCkpOworICAgIENvZGVCbG9jayogYWx0ZXJuYXRpdmUgPSBjb2RlQmxv
Y2stPmFsdGVybmF0aXZlKCk7CisgICAgcHJpbnRmKCJTcGVjdWxhdGlvbiBmYWlsdXJlIGluICVw
IGF0IDB4JXggd2l0aCBleGVjdXRlQ291bnRlciA9ICVkLCByZW9wdGltaXphdGlvblJldHJ5Q291
bnRlciA9ICV1LCBvcHRpbWl6YXRpb25EZWxheUNvdW50ZXIgPSAldSwgc3VjY2Vzcy9mYWlsICV1
LyV1XG4iLCBjb2RlQmxvY2ssIGRlYnVnSW5mby0+ZGVidWdPZmZzZXQsIGFsdGVybmF0aXZlID8g
YWx0ZXJuYXRpdmUtPmV4ZWN1dGVDb3VudGVyKCkgOiAwLCBhbHRlcm5hdGl2ZSA/IGFsdGVybmF0
aXZlLT5yZW9wdGltaXphdGlvblJldHJ5Q291bnRlcigpIDogMCwgYWx0ZXJuYXRpdmUgPyBhbHRl
cm5hdGl2ZS0+b3B0aW1pemF0aW9uRGVsYXlDb3VudGVyKCkgOiAwLCBjb2RlQmxvY2stPnNwZWN1
bGF0aXZlU3VjY2Vzc0NvdW50ZXIoKSwgY29kZUJsb2NrLT5zcGVjdWxhdGl2ZUZhaWxDb3VudGVy
KCkpOwogfQogI2VuZGlmCiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3Bl
Y3VsYXRpdmVKSVQzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gOTY1NzEpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00ODIsNiArNDgyLDQ1IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVM
b2dpY2FsTm90KE4KICNlbmRpZgogfQogCit2b2lkIFNwZWN1bGF0aXZlSklUOjplbWl0QnJhbmNo
KE5vZGUmIG5vZGUpCit7CisgICAgLy8gRklYTUU6IEFkZCBmYXN0IGNhc2VzIGZvciBrbm93biBC
b29sZWFuIQorICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwor
ICAgIHZhbHVlLmZpbGwoKTsKKyAgICBHUFJSZWcgdmFsdWVUYWdHUFIgPSB2YWx1ZS50YWdHUFIo
KTsKKyAgICBHUFJSZWcgdmFsdWVQYXlsb2FkR1BSID0gdmFsdWUucGF5bG9hZEdQUigpOworCisg
ICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVz
dWx0LmdwcigpOworICAgIAorICAgIHVzZShub2RlLmNoaWxkMSgpKTsKKyAgICAKKyAgICBCbG9j
a0luZGV4IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQo
bm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOworICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBt
X2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRha2VuQnl0
ZWNvZGVPZmZzZXQoKSk7CisKKyAgICBKSVRDb21waWxlcjo6SnVtcCBmYXN0UGF0aCA9IG1faml0
LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpFcXVhbCwgdmFsdWVUYWdHUFIsIEpJVENvbXBpbGVyOjpU
cnVzdGVkSW1tMzIoSlNWYWx1ZTo6SW50MzJUYWcpKTsKKyAgICBKSVRDb21waWxlcjo6SnVtcCBz
bG93UGF0aCA9IG1faml0LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgdmFsdWVUYWdH
UFIsIEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6Qm9vbGVhblRhZykpOworCisg
ICAgZmFzdFBhdGgubGluaygmbV9qaXQpOworICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0
MzIoSklUQ29tcGlsZXI6Olplcm8sIHZhbHVlUGF5bG9hZEdQUiksIG5vdFRha2VuKTsKKyAgICBh
ZGRCcmFuY2gobV9qaXQuanVtcCgpLCB0YWtlbik7CisKKyAgICBzbG93UGF0aC5saW5rKCZtX2pp
dCk7CisgICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKKyAgICBtX2ppdC5w
dXNoKHZhbHVlVGFnR1BSKTsKKyAgICBtX2ppdC5wdXNoKHZhbHVlUGF5bG9hZEdQUik7CisgICAg
bV9qaXQucHVzaChHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAgYXBwZW5kQ2FsbFdp
dGhFeGNlcHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7CisgICAgbV9qaXQu
bW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICBzaWxlbnRGaWxs
QWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgCisgICAgYWRkQnJhbmNoKG1faml0LmJyYW5j
aFRlc3Q4KEpJVENvbXBpbGVyOjpOb25aZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7CisgICAgaWYg
KG5vdFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1w
KCksIG5vdFRha2VuKTsKKyAgICAKKyAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCwgVXNlQ2hp
bGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKK30KKwogdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGls
ZShOb2RlJiBub2RlKQogewogICAgIE5vZGVUeXBlIG9wID0gbm9kZS5vcDsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAkocmV2
aXNpb24gOTY1NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZl
SklUNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MjksNiArNTI5LDMwIEBAIHZvaWQgU3BlY3Vs
YXRpdmVKSVQ6OmNvbXBpbGVWYWx1ZUFkZChOb2QKICAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdC5n
cHIoKSwgbV9jb21waWxlSW5kZXgpOwogfQogCit2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxl
T2JqZWN0T3JPdGhlckxvZ2ljYWxOb3QoTm9kZUluZGV4IG5vZGVJbmRleCwgdm9pZCAqdnB0cikK
K3sKKyAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlSW5kZXgpOworICAgIEdQUlRl
bXBvcmFyeSByZXN1bHQodGhpcyk7CisgICAgR1BSUmVnIHZhbHVlR1BSID0gdmFsdWUuZ3ByKCk7
CisgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKKyAgICAKKyAgICBNYWNyb0Fz
c2VtYmxlcjo6SnVtcCBub3RDZWxsID0gbV9qaXQuYnJhbmNoVGVzdFB0cihNYWNyb0Fzc2VtYmxl
cjo6Tm9uWmVybywgdmFsdWVHUFIsIEdQUkluZm86OnRhZ01hc2tSZWdpc3Rlcik7CisgICAgc3Bl
Y3VsYXRpb25DaGVjayhtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVxdWFsLCBN
YWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyh2YWx1ZUdQUiksIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVk
SW1tUHRyKHZwdHIpKSk7CisgICAgbV9qaXQubW92ZShUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8
aW50MzJfdD4oVmFsdWVGYWxzZSkpLCByZXN1bHRHUFIpOworICAgIE1hY3JvQXNzZW1ibGVyOjpK
dW1wIGRvbmUgPSBtX2ppdC5qdW1wKCk7CisgICAgCisgICAgbm90Q2VsbC5saW5rKCZtX2ppdCk7
CisgICAgCisgICAgbV9qaXQubW92ZSh2YWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICBtX2ppdC5h
bmRQdHIoTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMih+VGFnQml0VW5kZWZpbmVkKSwgcmVz
dWx0R1BSKTsKKyAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2Vt
Ymxlcjo6Tm90RXF1YWwsIHJlc3VsdEdQUiwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIo
cmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oVmFsdWVOdWxsKSkpKTsKKyAgICBtX2ppdC5tb3ZlKFRy
dXN0ZWRJbW0zMihzdGF0aWNfY2FzdDxpbnQzMl90PihWYWx1ZVRydWUpKSwgcmVzdWx0R1BSKTsK
KyAgICAKKyAgICBkb25lLmxpbmsoJm1faml0KTsKKyAgICAKKyAgICBqc1ZhbHVlUmVzdWx0KHJl
c3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4pOworfQorCiB2b2lk
IFNwZWN1bGF0aXZlSklUOjpjb21waWxlTG9naWNhbE5vdChOb2RlJiBub2RlKQogewogICAgIGlm
IChpc0tub3duQm9vbGVhbihub2RlLmNoaWxkMSgpKSkgewpAQCAtNTQxLDYgKzU2NSwzMyBAQCB2
b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlTG9naWNhbE5vdChOCiAgICAgICAgIGpzVmFsdWVS
ZXN1bHQocmVzdWx0LmdwcigpLCBtX2NvbXBpbGVJbmRleCwgRGF0YUZvcm1hdEpTQm9vbGVhbik7
CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUZpbmFsT2Jq
ZWN0T3JPdGhlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBjb21waWxlT2JqZWN0T3JPdGhl
ckxvZ2ljYWxOb3Qobm9kZS5jaGlsZDEoKSwgbV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0ZpbmFsT2Jq
ZWN0VlB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNob3VsZFNwZWN1bGF0
ZUFycmF5T3JPdGhlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBjb21waWxlT2JqZWN0T3JP
dGhlckxvZ2ljYWxOb3Qobm9kZS5jaGlsZDEoKSwgbV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0FycmF5
VlB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUlu
dGVnZXIobm9kZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgU3BlY3VsYXRlSW50ZWdlck9wZXJhbmQg
dmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CisgICAgICAgIEdQUlRlbXBvcmFyeSByZXN1bHQo
dGhpcywgdmFsdWUpOworICAgICAgICBtX2ppdC5jb21wYXJlMzIoTWFjcm9Bc3NlbWJsZXI6OkVx
dWFsLCB2YWx1ZS5ncHIoKSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMigwKSwgcmVzdWx0
LmdwcigpKTsKKyAgICAgICAgbV9qaXQub3IzMihUcnVzdGVkSW1tMzIoVmFsdWVGYWxzZSksIHJl
c3VsdC5ncHIoKSk7CisgICAgICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0LmdwcigpLCBtX2NvbXBp
bGVJbmRleCwgRGF0YUZvcm1hdEpTQm9vbGVhbik7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgaWYgKHNob3VsZFNwZWN1bGF0ZU51bWJlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBT
cGVjdWxhdGVEb3VibGVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAg
ICBGUFJUZW1wb3Jhcnkgc2NyYXRjaCh0aGlzKTsKKyAgICAgICAgR1BSVGVtcG9yYXJ5IHJlc3Vs
dCh0aGlzKTsKKyAgICAgICAgbV9qaXQubW92ZShUcnVzdGVkSW1tMzIoVmFsdWVGYWxzZSksIHJl
c3VsdC5ncHIoKSk7CisgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIG5vblplcm8gPSBtX2pp
dC5icmFuY2hEb3VibGVOb25aZXJvKHZhbHVlLmZwcigpLCBzY3JhdGNoLmZwcigpKTsKKyAgICAg
ICAgbV9qaXQueG9yMzIoSW1tMzIodHJ1ZSksIHJlc3VsdC5ncHIoKSk7CisgICAgICAgIG5vblpl
cm8ubGluaygmbV9qaXQpOworICAgICAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdC5ncHIoKSwgbV9j
b21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4pOworICAgICAgICByZXR1cm47CisgICAg
fQogICAgIAogICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGlvbiA9IG1faml0LmdldFByZWRpY3Rp
b24obm9kZS5jaGlsZDEoKSk7CiAgICAgaWYgKGlzQm9vbGVhblByZWRpY3Rpb24ocHJlZGljdGlv
bikgfHwgIXByZWRpY3Rpb24pIHsKQEAgLTU4Miw2ICs2MzMsMTE2IEBAIHZvaWQgU3BlY3VsYXRp
dmVKSVQ6OmNvbXBpbGVMb2dpY2FsTm90KE4KICAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdEdQUiwg
bV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVzZUNoaWxkcmVuQ2FsbGVkRXhw
bGljaXRseSk7CiB9CiAKK3ZvaWQgU3BlY3VsYXRpdmVKSVQ6OmVtaXRPYmplY3RPck90aGVyQnJh
bmNoKE5vZGVJbmRleCBub2RlSW5kZXgsIEJsb2NrSW5kZXggdGFrZW4sIEJsb2NrSW5kZXggbm90
VGFrZW4sIHZvaWQgKnZwdHIpCit7CisgICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9k
ZUluZGV4KTsKKyAgICBHUFJSZWcgdmFsdWVHUFIgPSB2YWx1ZS5ncHIoKTsKKyAgICAKKyAgICBN
YWNyb0Fzc2VtYmxlcjo6SnVtcCBub3RDZWxsID0gbV9qaXQuYnJhbmNoVGVzdFB0cihNYWNyb0Fz
c2VtYmxlcjo6Tm9uWmVybywgdmFsdWVHUFIsIEdQUkluZm86OnRhZ01hc2tSZWdpc3Rlcik7Cisg
ICAgc3BlY3VsYXRpb25DaGVjayhtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVx
dWFsLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyh2YWx1ZUdQUiksIE1hY3JvQXNzZW1ibGVyOjpU
cnVzdGVkSW1tUHRyKHZwdHIpKSk7CisgICAgYWRkQnJhbmNoKG1faml0Lmp1bXAoKSwgdGFrZW4p
OworICAgIAorICAgIG5vdENlbGwubGluaygmbV9qaXQpOworICAgIAorICAgIG1faml0LmFuZFB0
cihNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbTMyKH5UYWdCaXRVbmRlZmluZWQpLCB2YWx1ZUdQ
Uik7CisgICAgc3BlY3VsYXRpb25DaGVjayhtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6
Ok5vdEVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIocmVpbnRl
cnByZXRfY2FzdDx2b2lkKj4oVmFsdWVOdWxsKSkpKTsKKyAgICBpZiAobm90VGFrZW4gIT0gKG1f
YmxvY2sgKyAxKSkKKyAgICAgICAgYWRkQnJhbmNoKG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOwor
ICAgIAorICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKK30KKwordm9pZCBTcGVjdWxhdGl2
ZUpJVDo6ZW1pdEJyYW5jaChOb2RlJiBub2RlKQoreworICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVl
KHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgIEdQUlJlZyB2YWx1ZUdQUiA9IHZhbHVlLmdwcigp
OworICAgIAorICAgIEJsb2NrSW5kZXggdGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhG
b3JCeXRlY29kZU9mZnNldChub2RlLnRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7CisgICAgQmxvY2tJ
bmRleCBub3RUYWtlbiA9IG1faml0LmdyYXBoKCkuYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0
KG5vZGUubm90VGFrZW5CeXRlY29kZU9mZnNldCgpKTsKKyAgICAKKyAgICBpZiAoaXNLbm93bkJv
b2xlYW4obm9kZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENv
bmRpdGlvbiBjb25kaXRpb24gPSBNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybzsKKyAgICAgICAgCisg
ICAgICAgIGlmICh0YWtlbiA9PSAobV9ibG9jayArIDEpKSB7CisgICAgICAgICAgICBjb25kaXRp
b24gPSBNYWNyb0Fzc2VtYmxlcjo6WmVybzsKKyAgICAgICAgICAgIEJsb2NrSW5kZXggdG1wID0g
dGFrZW47CisgICAgICAgICAgICB0YWtlbiA9IG5vdFRha2VuOworICAgICAgICAgICAgbm90VGFr
ZW4gPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5i
cmFuY2hUZXN0MzIoY29uZGl0aW9uLCB2YWx1ZUdQUiwgVHJ1c3RlZEltbTMyKHRydWUpKSwgdGFr
ZW4pOworICAgICAgICBpZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkKKyAgICAgICAgICAg
IGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsKKyAgICAgICAgCisgICAgICAgIG5v
UmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAgICB9IGVsc2UgaWYgKHNob3VsZFNwZWN1bGF0ZUZp
bmFsT2JqZWN0T3JPdGhlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBlbWl0T2JqZWN0T3JP
dGhlckJyYW5jaChub2RlLmNoaWxkMSgpLCB0YWtlbiwgbm90VGFrZW4sIG1faml0Lmdsb2JhbERh
dGEoKS0+anNGaW5hbE9iamVjdFZQdHIpOworICAgIH0gZWxzZSBpZiAoc2hvdWxkU3BlY3VsYXRl
QXJyYXlPck90aGVyKG5vZGUuY2hpbGQxKCkpKSB7CisgICAgICAgIGVtaXRPYmplY3RPck90aGVy
QnJhbmNoKG5vZGUuY2hpbGQxKCksIHRha2VuLCBub3RUYWtlbiwgbV9qaXQuZ2xvYmFsRGF0YSgp
LT5qc0FycmF5VlB0cik7CisgICAgfSBlbHNlIGlmIChzaG91bGRTcGVjdWxhdGVOdW1iZXIobm9k
ZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUludGVnZXIobm9kZS5j
aGlsZDEoKSkpIHsKKyAgICAgICAgICAgIGJvb2wgaW52ZXJ0ID0gZmFsc2U7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmICh0YWtlbiA9PSAobV9ibG9jayArIDEpKSB7CisgICAgICAgICAg
ICAgICAgaW52ZXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBCbG9ja0luZGV4IHRtcCA9IHRh
a2VuOworICAgICAgICAgICAgICAgIHRha2VuID0gbm90VGFrZW47CisgICAgICAgICAgICAgICAg
bm90VGFrZW4gPSB0bXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNwZWN1bGF0ZUlu
dGVnZXJPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICAgICAgYWRk
QnJhbmNoKG1faml0LmJyYW5jaFRlc3QzMihpbnZlcnQgPyBNYWNyb0Fzc2VtYmxlcjo6WmVybyA6
IE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvLCB2YWx1ZS5ncHIoKSksIHRha2VuKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIFNwZWN1bGF0ZURvdWJsZU9wZXJhbmQgdmFsdWUodGhpcywg
bm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICBGUFJUZW1wb3Jhcnkgc2NyYXRjaCh0aGlzKTsK
KyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hEb3VibGVOb25aZXJvKHZhbHVlLmZw
cigpLCBzY3JhdGNoLmZwcigpKSwgdGFrZW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBpZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkKKyAgICAgICAgICAgIGFkZEJyYW5jaCht
X2ppdC5qdW1wKCksIG5vdFRha2VuKTsKKyAgICAgICAgCisgICAgICAgIG5vUmVzdWx0KG1fY29t
cGlsZUluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRo
aXMpOworICAgICAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOworICAgICAgICAK
KyAgICAgICAgYm9vbCBwcmVkaWN0Qm9vbGVhbiA9IGlzQm9vbGVhblByZWRpY3Rpb24obV9qaXQu
Z2V0UHJlZGljdGlvbihub2RlLmNoaWxkMSgpKSk7CisgICAgCisgICAgICAgIGlmIChwcmVkaWN0
Qm9vbGVhbikgeworICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fz
c2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6
OmVuY29kZShqc0Jvb2xlYW4oZmFsc2UpKSkpLCBub3RUYWtlbik7CisgICAgICAgICAgICBhZGRC
cmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1h
Y3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVlKSkpKSwg
dGFrZW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocHJlZGljdEJvb2xlYW4p
IHsKKyAgICAgICAgICAgIHNwZWN1bGF0aW9uQ2hlY2sobV9qaXQuanVtcCgpKTsKKyAgICAgICAg
ICAgIHZhbHVlLnVzZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkQnJhbmNo
KG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fz
c2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc051bWJlcigwKSkpKSwgbm90VGFrZW4p
OworICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6
QWJvdmVPckVxdWFsLCB2YWx1ZUdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKSwg
dGFrZW4pOworICAgIAorICAgICAgICAgICAgaWYgKCFwcmVkaWN0Qm9vbGVhbikgeworICAgICAg
ICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFs
LCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29s
ZWFuKGZhbHNlKSkpKSwgbm90VGFrZW4pOworICAgICAgICAgICAgICAgIGFkZEJyYW5jaChtX2pp
dC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJs
ZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKHRydWUpKSkpLCB0YWtlbik7Cisg
ICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICB2YWx1ZS51c2UoKTsKKyAgICAKKyAgICAg
ICAgICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgICAgICAgICBt
X2ppdC5tb3ZlKHZhbHVlR1BSLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpOworICAgICAgICAgICAg
bV9qaXQubW92ZShHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRH
UFIwKTsKKyAgICAgICAgICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2soZGZnQ29udmVy
dEpTVmFsdWVUb0Jvb2xlYW4pOworICAgICAgICAgICAgbV9qaXQubW92ZShHUFJJbmZvOjpyZXR1
cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICAgICAgICAgIHNpbGVudEZpbGxBbGxSZWdpc3Rl
cnMocmVzdWx0R1BSKTsKKyAgICAKKyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hU
ZXN0OChNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybywgcmVzdWx0R1BSKSwgdGFrZW4pOworICAgICAg
ICAgICAgaWYgKG5vdFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgICAgICAgICAgYWRk
QnJhbmNoKG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOworICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5
KTsKKyAgICB9Cit9CisKIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkK
IHsKICAgICBOb2RlVHlwZSBvcCA9IG5vZGUub3A7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCShyZXZpc2lvbiA5NjU3MSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkod29ya2luZyBjb3B5KQpA
QCAtNTAwLDYgKzUwMCwxMSBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gaXNGaW5hbE9iamVj
dFByZWRpY3Rpb24ocHJlZGljdGlvbik7CiAgICAgfQogICAgIAorICAgIGJvb2wgc2hvdWxkU3Bl
Y3VsYXRlRmluYWxPYmplY3RPck90aGVyKE5vZGVJbmRleCBub2RlSW5kZXgpCisgICAgeworICAg
ICAgICByZXR1cm4gaXNGaW5hbE9iamVjdE9yT3RoZXJQcmVkaWN0aW9uKG1faml0LmdldFByZWRp
Y3Rpb24obm9kZUluZGV4KSk7CisgICAgfQorICAgIAogICAgIGJvb2wgc2hvdWxkU3BlY3VsYXRl
QXJyYXkoTm9kZUluZGV4IG5vZGVJbmRleCkKICAgICB7CiAgICAgICAgIFByZWRpY3RlZFR5cGUg
cHJlZGljdGlvbjsKQEAgLTUxMCw2ICs1MTUsMTEgQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJu
IGlzQXJyYXlQcmVkaWN0aW9uKHByZWRpY3Rpb24pOwogICAgIH0KICAgICAKKyAgICBib29sIHNo
b3VsZFNwZWN1bGF0ZUFycmF5T3JPdGhlcihOb2RlSW5kZXggbm9kZUluZGV4KQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGlzQXJyYXlPck90aGVyUHJlZGljdGlvbihtX2ppdC5nZXRQcmVkaWN0aW9u
KG5vZGVJbmRleCkpOworICAgIH0KKyAgICAKICAgICBib29sIHNob3VsZFNwZWN1bGF0ZU9iamVj
dChOb2RlSW5kZXggbm9kZUluZGV4KQogICAgIHsKICAgICAgICAgTm9kZSYgbm9kZSA9IG1faml0
LmdyYXBoKClbbm9kZUluZGV4XTsKQEAgLTU5OSw3ICs2MDksMTAgQEAgcHJpdmF0ZToKICAgICB2
b2lkIGNvbXBpbGVQZWVwSG9sZU9iamVjdEVxdWFsaXR5KE5vZGUmLCBOb2RlSW5kZXggYnJhbmNo
Tm9kZUluZGV4LCB2b2lkKiB2cHRyKTsKICAgICB2b2lkIGNvbXBpbGVPYmplY3RFcXVhbGl0eShO
b2RlJiwgdm9pZCogdnB0cik7CiAgICAgdm9pZCBjb21waWxlVmFsdWVBZGQoTm9kZSYpOworICAg
IHZvaWQgY29tcGlsZU9iamVjdE9yT3RoZXJMb2dpY2FsTm90KE5vZGVJbmRleCB2YWx1ZSwgdm9p
ZCogdnB0cik7CiAgICAgdm9pZCBjb21waWxlTG9naWNhbE5vdChOb2RlJik7CisgICAgdm9pZCBl
bWl0T2JqZWN0T3JPdGhlckJyYW5jaChOb2RlSW5kZXggdmFsdWUsIEJsb2NrSW5kZXggdGFrZW4s
IEJsb2NrSW5kZXggbm90VGFrZW4sIHZvaWQgKnZwdHIpOworICAgIHZvaWQgZW1pdEJyYW5jaChO
b2RlJik7CiAgICAgCiAgICAgLy8gSXQgaXMgYWNjZXB0YWJsZSB0byBoYXZlIHN0cnVjdHVyZSBi
ZSBlcXVhbCB0byBzY3JhdGNoLCBzbyBsb25nIGFzIHlvdSdyZSBmaW5lCiAgICAgLy8gd2l0aCB0
aGUgc3RydWN0dXJlIEdQUiBiZWluZyBjbG9iYmVyZWQuCkBAIC05NDMsNyArOTU2LDcgQEAgcHJp
dmF0ZToKIH07CiAKIGlubGluZSBTcGVjdWxhdGl2ZUpJVDo6U3BlY3VsYXRpdmVKSVQoSklUQ29t
cGlsZXImIGppdCkKLSAgICA6IEpJVENvZGVHZW5lcmF0b3Ioaml0LCB0cnVlKQorICAgIDogSklU
Q29kZUdlbmVyYXRvcihqaXQpCiAgICAgLCBtX2NvbXBpbGVPa2F5KHRydWUpCiAgICAgLCBtX2Fy
Z3VtZW50cyhqaXQuY29kZUJsb2NrKCktPm1fbnVtUGFyYW1ldGVycykKICAgICAsIG1fdmFyaWFi
bGVzKGppdC5ncmFwaCgpLm1fbG9jYWxWYXJzKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109721</attachid>
            <date>2011-10-04 17:15:39 -0700</date>
            <delta_ts>2011-10-05 12:52:06 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>objectbranch_patch_2.diff</filename>
            <type>text/plain</type>
            <size>21590</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTY2NjEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzUgQEAK
KzIwMTEtMTAtMDQgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBE
Rkcgc2hvdWxkIGJlIGNhcGFibGUgb2YgYSBicm9hZGVyIHJhbmdlIG9mIHNwZWN1bGF0aW9ucyBv
biBicmFuY2ggYW5kIG5vdAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NjkzMjIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAg
ICAgICAgCisgICAgICAgICogYnl0ZWNvZGUvUHJlZGljdGVkVHlwZS5oOgorICAgICAgICAoSlND
Ojppc0ZpbmFsT2JqZWN0T3JPdGhlclByZWRpY3Rpb24pOgorICAgICAgICAoSlNDOjppc0FycmF5
T3JPdGhlclByZWRpY3Rpb24pOgorICAgICAgICAqIGRmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmNw
cDoKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvci5oOgorICAgICAgICAoSlNDOjpE
Rkc6OkpJVENvZGVHZW5lcmF0b3I6OkpJVENvZGVHZW5lcmF0b3IpOgorICAgICAgICAqIGRmZy9E
RkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVH
ZW5lcmF0b3I6OmZpbGxEb3VibGUpOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvZGVHZW5lcmF0
b3I6OmZpbGxKU1ZhbHVlKToKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvcjY0LmNw
cDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsRG91YmxlKToKKyAg
ICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSlNWYWx1ZSk6CisgICAgICAg
ICogZGZnL0RGR09wZXJhdGlvbnMuY3BwOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJ
VC5oOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpzaG91bGRTcGVjdWxhdGVG
aW5hbE9iamVjdE9yT3RoZXIpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjpz
aG91bGRTcGVjdWxhdGVBcnJheU9yT3RoZXIpOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0
aXZlSklUOjpTcGVjdWxhdGl2ZUpJVCk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklU
MzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjplbWl0QnJhbmNo
KToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHA6CisgICAgICAgIChKU0M6
OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVPYmplY3RPck90aGVyTG9naWNhbE5vdCk6Cisg
ICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVMb2dpY2FsTm90KToKKyAg
ICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6ZW1pdE9iamVjdE9yT3RoZXJCcmFuY2gp
OgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjplbWl0QnJhbmNoKToKKwogMjAx
MS0xMC0wMyAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEpJVENv
ZGVHZW5lcmF0b3Igc2hvdWxkIG5vIGxvbmdlciBoYXZlIGNvZGUgdGhhdCB0cmllcyB0b28gaGFy
ZApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1ByZWRpY3RlZFR5cGUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvUHJlZGljdGVkVHlw
ZS5oCShyZXZpc2lvbiA5NjY2MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Q
cmVkaWN0ZWRUeXBlLmgJKHdvcmtpbmcgY29weSkKQEAgLTY3LDYgKzY3LDExIEBAIGlubGluZSBi
b29sIGlzRmluYWxPYmplY3RQcmVkaWN0aW9uKFByZWQKICAgICByZXR1cm4gdmFsdWUgPT0gUHJl
ZGljdEZpbmFsT2JqZWN0OwogfQogCitpbmxpbmUgYm9vbCBpc0ZpbmFsT2JqZWN0T3JPdGhlclBy
ZWRpY3Rpb24oUHJlZGljdGVkVHlwZSB2YWx1ZSkKK3sKKyAgICByZXR1cm4gISEodmFsdWUgJiAo
UHJlZGljdEZpbmFsT2JqZWN0IHwgUHJlZGljdE90aGVyKSkgJiYgISh2YWx1ZSAmIH4oUHJlZGlj
dEZpbmFsT2JqZWN0IHwgUHJlZGljdE90aGVyKSk7Cit9CisKIGlubGluZSBib29sIGlzU3RyaW5n
UHJlZGljdGlvbihQcmVkaWN0ZWRUeXBlIHZhbHVlKQogewogICAgIHJldHVybiB2YWx1ZSA9PSBQ
cmVkaWN0U3RyaW5nOwpAQCAtNzcsNiArODIsMTEgQEAgaW5saW5lIGJvb2wgaXNBcnJheVByZWRp
Y3Rpb24oUHJlZGljdGVkVAogICAgIHJldHVybiB2YWx1ZSA9PSBQcmVkaWN0QXJyYXk7CiB9CiAK
K2lubGluZSBib29sIGlzQXJyYXlPck90aGVyUHJlZGljdGlvbihQcmVkaWN0ZWRUeXBlIHZhbHVl
KQoreworICAgIHJldHVybiAhISh2YWx1ZSAmIChQcmVkaWN0QXJyYXkgfCBQcmVkaWN0T3RoZXIp
KSAmJiAhKHZhbHVlICYgfihQcmVkaWN0QXJyYXkgfCBQcmVkaWN0T3RoZXIpKTsKK30KKwogaW5s
aW5lIGJvb2wgaXNJbnQzMlByZWRpY3Rpb24oUHJlZGljdGVkVHlwZSB2YWx1ZSkKIHsKICAgICBy
ZXR1cm4gdmFsdWUgPT0gUHJlZGljdEludDMyOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdPcGVyYXRpb25zLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR09wZXJhdGlvbnMuY3BwCShyZXZpc2lvbiA5NjY2MSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHT3BlcmF0aW9ucy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg3NSw3
ICs4NzUsOCBAQCB2b2lkIERGR19PUEVSQVRJT04gZGVidWdPcGVyYXRpb25QcmludFNwCiB7CiAg
ICAgU3BlY3VsYXRpb25GYWlsdXJlRGVidWdJbmZvKiBkZWJ1Z0luZm8gPSBzdGF0aWNfY2FzdDxT
cGVjdWxhdGlvbkZhaWx1cmVEZWJ1Z0luZm8qPihkZWJ1Z0luZm9SYXcpOwogICAgIENvZGVCbG9j
ayogY29kZUJsb2NrID0gZGVidWdJbmZvLT5jb2RlQmxvY2s7Ci0gICAgcHJpbnRmKCJTcGVjdWxh
dGlvbiBmYWlsdXJlIGluICVwIGF0IDB4JXggd2l0aCBleGVjdXRlQ291bnRlciA9ICVkLCByZW9w
dGltaXphdGlvblJldHJ5Q291bnRlciA9ICV1LCBvcHRpbWl6YXRpb25EZWxheUNvdW50ZXIgPSAl
dSwgc3VjY2Vzcy9mYWlsICV1LyV1XG4iLCBjb2RlQmxvY2ssIGRlYnVnSW5mby0+ZGVidWdPZmZz
ZXQsIGNvZGVCbG9jay0+YWx0ZXJuYXRpdmUoKS0+ZXhlY3V0ZUNvdW50ZXIoKSwgY29kZUJsb2Nr
LT5hbHRlcm5hdGl2ZSgpLT5yZW9wdGltaXphdGlvblJldHJ5Q291bnRlcigpLCBjb2RlQmxvY2st
PmFsdGVybmF0aXZlKCktPm9wdGltaXphdGlvbkRlbGF5Q291bnRlcigpLCBjb2RlQmxvY2stPnNw
ZWN1bGF0aXZlU3VjY2Vzc0NvdW50ZXIoKSwgY29kZUJsb2NrLT5zcGVjdWxhdGl2ZUZhaWxDb3Vu
dGVyKCkpOworICAgIENvZGVCbG9jayogYWx0ZXJuYXRpdmUgPSBjb2RlQmxvY2stPmFsdGVybmF0
aXZlKCk7CisgICAgcHJpbnRmKCJTcGVjdWxhdGlvbiBmYWlsdXJlIGluICVwIGF0IDB4JXggd2l0
aCBleGVjdXRlQ291bnRlciA9ICVkLCByZW9wdGltaXphdGlvblJldHJ5Q291bnRlciA9ICV1LCBv
cHRpbWl6YXRpb25EZWxheUNvdW50ZXIgPSAldSwgc3VjY2Vzcy9mYWlsICV1LyV1XG4iLCBjb2Rl
QmxvY2ssIGRlYnVnSW5mby0+ZGVidWdPZmZzZXQsIGFsdGVybmF0aXZlID8gYWx0ZXJuYXRpdmUt
PmV4ZWN1dGVDb3VudGVyKCkgOiAwLCBhbHRlcm5hdGl2ZSA/IGFsdGVybmF0aXZlLT5yZW9wdGlt
aXphdGlvblJldHJ5Q291bnRlcigpIDogMCwgYWx0ZXJuYXRpdmUgPyBhbHRlcm5hdGl2ZS0+b3B0
aW1pemF0aW9uRGVsYXlDb3VudGVyKCkgOiAwLCBjb2RlQmxvY2stPnNwZWN1bGF0aXZlU3VjY2Vz
c0NvdW50ZXIoKSwgY29kZUJsb2NrLT5zcGVjdWxhdGl2ZUZhaWxDb3VudGVyKCkpOwogfQogI2Vu
ZGlmCiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQz
Ml82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVj
dWxhdGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gOTY2NjEpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
MzUsOSArNDM1LDcwIEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVWYWx1ZUFkZChOb2QK
ICAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdFRhZy5ncHIoKSwgcmVzdWx0UGF5bG9hZC5ncHIoKSwg
bV9jb21waWxlSW5kZXgpOwogfQogCit2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlT2JqZWN0
T3JPdGhlckxvZ2ljYWxOb3QoTm9kZUluZGV4IG5vZGVJbmRleCwgdm9pZCogdnB0cikKK3sKKyAg
ICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlSW5kZXgpOworICAgIEdQUlRlbXBvcmFy
eSByZXN1bHRUYWcodGhpcyk7CisgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdFBheWxvYWQodGhpcyk7
CisgICAgR1BSUmVnIHZhbHVlVGFnR1BSID0gdmFsdWUudGFnR1BSKCk7CisgICAgR1BSUmVnIHZh
bHVlUGF5bG9hZEdQUiA9IHZhbHVlLnBheWxvYWRHUFIoKTsKKyAgICBHUFJSZWcgcmVzdWx0VGFn
R1BSID0gcmVzdWx0VGFnLmdwcigpOworICAgIEdQUlJlZyByZXN1bHRQYXlsb2FkR1BSID0gcmVz
dWx0UGF5bG9hZC5ncHIoKTsKKyAgICAKKyAgICBtX2ppdC5tb3ZlKFRydXN0ZWRJbW0zMihKU1Zh
bHVlOjpCb29sZWFuVGFnKSwgcmVzdWx0VGFnLmdwcigpKTsKKyAgICAKKyAgICBNYWNyb0Fzc2Vt
Ymxlcjo6SnVtcCBub3RDZWxsID0gbV9qaXQuYnJhbmNoMzIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVx
dWFsLCB2YWx1ZVRhZ0dQUiwgVHJ1c3RlZEltbTMyKEpTVmFsdWU6OkNlbGxUYWcpKTsKKyAgICBz
cGVjdWxhdGlvbkNoZWNrKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWws
IE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKHZhbHVlUGF5bG9hZEdQUiksIE1hY3JvQXNzZW1ibGVy
OjpUcnVzdGVkSW1tUHRyKHZwdHIpKSk7CisgICAgbV9qaXQubW92ZShUcnVzdGVkSW1tMzIoMSks
IHJlc3VsdFBheWxvYWRHUFIpOworICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIGRvbmUgPSBtX2pp
dC5qdW1wKCk7CisgICAgCisgICAgbm90Q2VsbC5saW5rKCZtX2ppdCk7CisgICAgCisgICAgbV9q
aXQubW92ZSh2YWx1ZVRhZ0dQUiwgcmVzdWx0UGF5bG9hZEdQUik7CisgICAgbV9qaXQuYW5kMzIo
TWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMihKU1ZhbHVlOjpVbmRlZmluZWRUYWcpLCByZXN1
bHRQYXlsb2FkR1BSKTsKKyAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0LmJyYW5jaDMyKE1hY3Jv
QXNzZW1ibGVyOjpOb3RFcXVhbCwgcmVzdWx0UGF5bG9hZEdQUiwgVHJ1c3RlZEltbTMyKEpTVmFs
dWU6OlVuZGVmaW5lZFRhZykpKTsKKyAgICBtX2ppdC5tb3ZlKFRydXN0ZWRJbW0zMigwKSwgcmVz
dWx0UGF5bG9hZEdQUik7CisgICAgCisgICAgZG9uZS5saW5rKCZtX2ppdCk7CisgICAgCisgICAg
anNWYWx1ZVJlc3VsdChyZXN1bHRUYWdHUFIsIHJlc3VsdFBheWxvYWRHUFIsIG1fY29tcGlsZUlu
ZGV4LCBEYXRhRm9ybWF0SlNCb29sZWFuKTsKK30KKwogdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29t
cGlsZUxvZ2ljYWxOb3QoTm9kZSYgbm9kZSkKIHsKICAgICAvLyBGSVhNRTogTmVlZCB0byBhZGQg
ZmFzdCBwYXRocyBmb3Iga25vd24gYm9vbGVhbnMuCisKKyAgICBpZiAoc2hvdWxkU3BlY3VsYXRl
RmluYWxPYmplY3RPck90aGVyKG5vZGUuY2hpbGQxKCkpKSB7CisgICAgICAgIGNvbXBpbGVPYmpl
Y3RPck90aGVyTG9naWNhbE5vdChub2RlLmNoaWxkMSgpLCBtX2ppdC5nbG9iYWxEYXRhKCktPmpz
RmluYWxPYmplY3RWUHRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc2hvdWxk
U3BlY3VsYXRlQXJyYXlPck90aGVyKG5vZGUuY2hpbGQxKCkpKSB7CisgICAgICAgIGNvbXBpbGVP
YmplY3RPck90aGVyTG9naWNhbE5vdChub2RlLmNoaWxkMSgpLCBtX2ppdC5nbG9iYWxEYXRhKCkt
PmpzQXJyYXlWUHRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc2hvdWxkU3Bl
Y3VsYXRlSW50ZWdlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBTcGVjdWxhdGVJbnRlZ2Vy
T3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgR1BSVGVtcG9yYXJ5
IHJlc3VsdFBheWxvYWQodGhpcywgdmFsdWUpOworICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0
VGFnKHRoaXMpOworICAgICAgICBtX2ppdC5jb21wYXJlMzIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFs
LCB2YWx1ZS5ncHIoKSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMigwKSwgcmVzdWx0UGF5
bG9hZC5ncHIoKSk7CisgICAgICAgIG1faml0Lm1vdmUoVHJ1c3RlZEltbTMyKEpTVmFsdWU6OkJv
b2xlYW5UYWcpLCByZXN1bHRUYWcuZ3ByKCkpOworICAgICAgICBqc1ZhbHVlUmVzdWx0KHJlc3Vs
dFRhZy5ncHIoKSwgcmVzdWx0UGF5bG9hZC5ncHIoKSwgbV9jb21waWxlSW5kZXgsIERhdGFGb3Jt
YXRKU0Jvb2xlYW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzaG91bGRTcGVj
dWxhdGVOdW1iZXIobm9kZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgU3BlY3VsYXRlRG91YmxlT3Bl
cmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgRlBSVGVtcG9yYXJ5IHNj
cmF0Y2godGhpcyk7CisgICAgICAgIEdQUlRlbXBvcmFyeSByZXN1bHRUYWcodGhpcyk7CisgICAg
ICAgIEdQUlRlbXBvcmFyeSByZXN1bHRQYXlsb2FkKHRoaXMpOworICAgICAgICBtX2ppdC5tb3Zl
KFRydXN0ZWRJbW0zMigwKSwgcmVzdWx0UGF5bG9hZC5ncHIoKSk7CisgICAgICAgIE1hY3JvQXNz
ZW1ibGVyOjpKdW1wIG5vblplcm8gPSBtX2ppdC5icmFuY2hEb3VibGVOb25aZXJvKHZhbHVlLmZw
cigpLCBzY3JhdGNoLmZwcigpKTsKKyAgICAgICAgbV9qaXQubW92ZShUcnVzdGVkSW1tMzIoMSks
IHJlc3VsdFBheWxvYWQuZ3ByKCkpOworICAgICAgICBub25aZXJvLmxpbmsoJm1faml0KTsKKyAg
ICAgICAgbV9qaXQubW92ZShUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6Qm9vbGVhblRhZyksIHJlc3Vs
dFRhZy5ncHIoKSk7CisgICAgICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0VGFnLmdwcigpLCByZXN1
bHRQYXlsb2FkLmdwcigpLCBtX2NvbXBpbGVJbmRleCwgRGF0YUZvcm1hdEpTQm9vbGVhbik7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCiAgICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhp
cywgbm9kZS5jaGlsZDEoKSk7CiAgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdFRhZyh0aGlzLCB2YWx1
ZSk7CiAgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdFBheWxvYWQodGhpcywgdmFsdWUsIGZhbHNlKTsK
QEAgLTQ4Miw0MyArNTQzLDkzIEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVMb2dpY2Fs
Tm90KE4KICNlbmRpZgogfQogCi12b2lkIFNwZWN1bGF0aXZlSklUOjplbWl0QnJhbmNoKE5vZGUm
IG5vZGUpCit2b2lkIFNwZWN1bGF0aXZlSklUOjplbWl0T2JqZWN0T3JPdGhlckJyYW5jaChOb2Rl
SW5kZXggbm9kZUluZGV4LCBCbG9ja0luZGV4IHRha2VuLCBCbG9ja0luZGV4IG5vdFRha2VuLCB2
b2lkICp2cHRyKQogewotICAgIC8vIEZJWE1FOiBBZGQgZmFzdCBjYXNlcyBmb3Iga25vd24gQm9v
bGVhbiEKLSAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKLSAg
ICB2YWx1ZS5maWxsKCk7CisgICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZUluZGV4
KTsKICAgICBHUFJSZWcgdmFsdWVUYWdHUFIgPSB2YWx1ZS50YWdHUFIoKTsKICAgICBHUFJSZWcg
dmFsdWVQYXlsb2FkR1BSID0gdmFsdWUucGF5bG9hZEdQUigpOwotCi0gICAgR1BSVGVtcG9yYXJ5
IHJlc3VsdCh0aGlzKTsKLSAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOwogICAg
IAotICAgIHVzZShub2RlLmNoaWxkMSgpKTsKKyAgICBNYWNyb0Fzc2VtYmxlcjo6SnVtcCBub3RD
ZWxsID0gbV9qaXQuYnJhbmNoMzIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVxdWFsLCB2YWx1ZVRhZ0dQ
UiwgVHJ1c3RlZEltbTMyKEpTVmFsdWU6OkNlbGxUYWcpKTsKKyAgICBzcGVjdWxhdGlvbkNoZWNr
KG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1ibGVy
OjpBZGRyZXNzKHZhbHVlUGF5bG9hZEdQUiksIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRy
KHZwdHIpKSk7CisgICAgYWRkQnJhbmNoKG1faml0Lmp1bXAoKSwgdGFrZW4pOworICAgIAorICAg
IG5vdENlbGwubGluaygmbV9qaXQpOworICAgIAorICAgIG1faml0LmFuZDMyKE1hY3JvQXNzZW1i
bGVyOjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6VW5kZWZpbmVkVGFnKSwgdmFsdWVUYWdHUFIpOwor
ICAgIHNwZWN1bGF0aW9uQ2hlY2sobV9qaXQuYnJhbmNoMzIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVx
dWFsLCB2YWx1ZVRhZ0dQUiwgVHJ1c3RlZEltbTMyKEpTVmFsdWU6OlVuZGVmaW5lZFRhZykpKTsK
KyAgICBpZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkKKyAgICAgICAgYWRkQnJhbmNoKG1f
aml0Lmp1bXAoKSwgbm90VGFrZW4pOwogICAgIAorICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4
KTsKK30KKwordm9pZCBTcGVjdWxhdGl2ZUpJVDo6ZW1pdEJyYW5jaChOb2RlJiBub2RlKQorewog
ICAgIEJsb2NrSW5kZXggdGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29k
ZU9mZnNldChub2RlLnRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7CiAgICAgQmxvY2tJbmRleCBub3RU
YWtlbiA9IG1faml0LmdyYXBoKCkuYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KG5vZGUubm90
VGFrZW5CeXRlY29kZU9mZnNldCgpKTsKIAotICAgIEpJVENvbXBpbGVyOjpKdW1wIGZhc3RQYXRo
ID0gbV9qaXQuYnJhbmNoMzIoSklUQ29tcGlsZXI6OkVxdWFsLCB2YWx1ZVRhZ0dQUiwgSklUQ29t
cGlsZXI6OlRydXN0ZWRJbW0zMihKU1ZhbHVlOjpJbnQzMlRhZykpOwotICAgIEpJVENvbXBpbGVy
OjpKdW1wIHNsb3dQYXRoID0gbV9qaXQuYnJhbmNoMzIoSklUQ29tcGlsZXI6Ok5vdEVxdWFsLCB2
YWx1ZVRhZ0dQUiwgSklUQ29tcGlsZXI6OlRydXN0ZWRJbW0zMihKU1ZhbHVlOjpCb29sZWFuVGFn
KSk7CisgICAgLy8gRklYTUU6IEFkZCBmYXN0IGNhc2VzIGZvciBrbm93biBCb29sZWFuIQogCi0g
ICAgZmFzdFBhdGgubGluaygmbV9qaXQpOwotICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0
MzIoSklUQ29tcGlsZXI6Olplcm8sIHZhbHVlUGF5bG9hZEdQUiksIG5vdFRha2VuKTsKLSAgICBh
ZGRCcmFuY2gobV9qaXQuanVtcCgpLCB0YWtlbik7CisgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUZp
bmFsT2JqZWN0T3JPdGhlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBlbWl0T2JqZWN0T3JP
dGhlckJyYW5jaChub2RlLmNoaWxkMSgpLCB0YWtlbiwgbm90VGFrZW4sIG1faml0Lmdsb2JhbERh
dGEoKS0+anNGaW5hbE9iamVjdFZQdHIpOworICAgIH0gZWxzZSBpZiAoc2hvdWxkU3BlY3VsYXRl
QXJyYXlPck90aGVyKG5vZGUuY2hpbGQxKCkpKSB7CisgICAgICAgIGVtaXRPYmplY3RPck90aGVy
QnJhbmNoKG5vZGUuY2hpbGQxKCksIHRha2VuLCBub3RUYWtlbiwgbV9qaXQuZ2xvYmFsRGF0YSgp
LT5qc0FycmF5VlB0cik7CisgICAgfSBlbHNlIGlmIChzaG91bGRTcGVjdWxhdGVOdW1iZXIobm9k
ZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUludGVnZXIobm9kZS5j
aGlsZDEoKSkpIHsKKyAgICAgICAgICAgIGJvb2wgaW52ZXJ0ID0gZmFsc2U7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmICh0YWtlbiA9PSAobV9ibG9jayArIDEpKSB7CisgICAgICAgICAg
ICAgICAgaW52ZXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBCbG9ja0luZGV4IHRtcCA9IHRh
a2VuOworICAgICAgICAgICAgICAgIHRha2VuID0gbm90VGFrZW47CisgICAgICAgICAgICAgICAg
bm90VGFrZW4gPSB0bXA7CisgICAgICAgICAgICB9CiAKLSAgICBzbG93UGF0aC5saW5rKCZtX2pp
dCk7Ci0gICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKLSAgICBtX2ppdC5w
dXNoKHZhbHVlVGFnR1BSKTsKLSAgICBtX2ppdC5wdXNoKHZhbHVlUGF5bG9hZEdQUik7Ci0gICAg
bV9qaXQucHVzaChHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rlcik7Ci0gICAgYXBwZW5kQ2FsbFdp
dGhFeGNlcHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7Ci0gICAgbV9qaXQu
bW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKLSAgICBzaWxlbnRGaWxs
QWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgICAgICAgICBTcGVjdWxhdGVJbnRlZ2VyT3Bl
cmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAgICAgICAgICAgIGFkZEJyYW5jaCht
X2ppdC5icmFuY2hUZXN0MzIoaW52ZXJ0ID8gTWFjcm9Bc3NlbWJsZXI6Olplcm8gOiBNYWNyb0Fz
c2VtYmxlcjo6Tm9uWmVybywgdmFsdWUuZ3ByKCkpLCB0YWtlbik7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBTcGVjdWxhdGVEb3VibGVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hp
bGQxKCkpOworICAgICAgICAgICAgRlBSVGVtcG9yYXJ5IHNjcmF0Y2godGhpcyk7CisgICAgICAg
ICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoRG91YmxlTm9uWmVybyh2YWx1ZS5mcHIoKSwgc2Ny
YXRjaC5mcHIoKSksIHRha2VuKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG5v
dFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVt
cCgpLCBub3RUYWtlbik7CisgICAgICAgIAorICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRl
eCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9k
ZS5jaGlsZDEoKSk7CisgICAgICAgIHZhbHVlLmZpbGwoKTsKKyAgICAgICAgR1BSUmVnIHZhbHVl
VGFnR1BSID0gdmFsdWUudGFnR1BSKCk7CisgICAgICAgIEdQUlJlZyB2YWx1ZVBheWxvYWRHUFIg
PSB2YWx1ZS5wYXlsb2FkR1BSKCk7CisKKyAgICAgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlz
KTsKKyAgICAgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKICAgICAKLSAgICBh
ZGRCcmFuY2gobV9qaXQuYnJhbmNoVGVzdDgoSklUQ29tcGlsZXI6Ok5vblplcm8sIHJlc3VsdEdQ
UiksIHRha2VuKTsKLSAgICBpZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkKLSAgICAgICAg
YWRkQnJhbmNoKG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOworICAgICAgICB1c2Uobm9kZS5jaGls
ZDEoKSk7CiAgICAgCi0gICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgsIFVzZUNoaWxkcmVuQ2Fs
bGVkRXhwbGljaXRseSk7CisgICAgICAgIEpJVENvbXBpbGVyOjpKdW1wIGZhc3RQYXRoID0gbV9q
aXQuYnJhbmNoMzIoSklUQ29tcGlsZXI6OkVxdWFsLCB2YWx1ZVRhZ0dQUiwgSklUQ29tcGlsZXI6
OlRydXN0ZWRJbW0zMihKU1ZhbHVlOjpJbnQzMlRhZykpOworICAgICAgICBKSVRDb21waWxlcjo6
SnVtcCBzbG93UGF0aCA9IG1faml0LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgdmFs
dWVUYWdHUFIsIEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6Qm9vbGVhblRhZykp
OworCisgICAgICAgIGZhc3RQYXRoLmxpbmsoJm1faml0KTsKKyAgICAgICAgYWRkQnJhbmNoKG1f
aml0LmJyYW5jaFRlc3QzMihKSVRDb21waWxlcjo6WmVybywgdmFsdWVQYXlsb2FkR1BSKSwgbm90
VGFrZW4pOworICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCB0YWtlbik7CisKKyAgICAg
ICAgc2xvd1BhdGgubGluaygmbV9qaXQpOworICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVy
cyhyZXN1bHRHUFIpOworICAgICAgICBtX2ppdC5wdXNoKHZhbHVlVGFnR1BSKTsKKyAgICAgICAg
bV9qaXQucHVzaCh2YWx1ZVBheWxvYWRHUFIpOworICAgICAgICBtX2ppdC5wdXNoKEdQUkluZm86
OmNhbGxGcmFtZVJlZ2lzdGVyKTsKKyAgICAgICAgYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVj
ayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7CisgICAgICAgIG1faml0Lm1vdmUoR1BSSW5m
bzo6cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7CisgICAgICAgIHNpbGVudEZpbGxBbGxSZWdp
c3RlcnMocmVzdWx0R1BSKTsKKyAgICAKKyAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFRl
c3Q4KEpJVENvbXBpbGVyOjpOb25aZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7CisgICAgICAgIGlm
IChub3RUYWtlbiAhPSAobV9ibG9jayArIDEpKQorICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0
Lmp1bXAoKSwgbm90VGFrZW4pOworICAgIAorICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRl
eCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKKyAgICB9CiB9CiAKIHZvaWQgU3BlY3Vs
YXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAkocmV2aXNpb24gOTY2NjEpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC01MjksNiArNTI5LDMwIEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBp
bGVWYWx1ZUFkZChOb2QKICAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdC5ncHIoKSwgbV9jb21waWxl
SW5kZXgpOwogfQogCit2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlT2JqZWN0T3JPdGhlckxv
Z2ljYWxOb3QoTm9kZUluZGV4IG5vZGVJbmRleCwgdm9pZCAqdnB0cikKK3sKKyAgICBKU1ZhbHVl
T3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlSW5kZXgpOworICAgIEdQUlRlbXBvcmFyeSByZXN1bHQo
dGhpcyk7CisgICAgR1BSUmVnIHZhbHVlR1BSID0gdmFsdWUuZ3ByKCk7CisgICAgR1BSUmVnIHJl
c3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKKyAgICAKKyAgICBNYWNyb0Fzc2VtYmxlcjo6SnVtcCBu
b3RDZWxsID0gbV9qaXQuYnJhbmNoVGVzdFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybywgdmFs
dWVHUFIsIEdQUkluZm86OnRhZ01hc2tSZWdpc3Rlcik7CisgICAgc3BlY3VsYXRpb25DaGVjayht
X2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6Ok5vdEVxdWFsLCBNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyh2YWx1ZUdQUiksIE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVkSW1tUHRyKHZwdHIpKSk7
CisgICAgbV9qaXQubW92ZShUcnVzdGVkSW1tMzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVG
YWxzZSkpLCByZXN1bHRHUFIpOworICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIGRvbmUgPSBtX2pp
dC5qdW1wKCk7CisgICAgCisgICAgbm90Q2VsbC5saW5rKCZtX2ppdCk7CisgICAgCisgICAgbV9q
aXQubW92ZSh2YWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICBtX2ppdC5hbmRQdHIoTWFjcm9Bc3Nl
bWJsZXI6OlRydXN0ZWRJbW0zMih+VGFnQml0VW5kZWZpbmVkKSwgcmVzdWx0R1BSKTsKKyAgICBz
cGVjdWxhdGlvbkNoZWNrKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWws
IHJlc3VsdEdQUiwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIocmVpbnRlcnByZXRfY2Fz
dDx2b2lkKj4oVmFsdWVOdWxsKSkpKTsKKyAgICBtX2ppdC5tb3ZlKFRydXN0ZWRJbW0zMihzdGF0
aWNfY2FzdDxpbnQzMl90PihWYWx1ZVRydWUpKSwgcmVzdWx0R1BSKTsKKyAgICAKKyAgICBkb25l
LmxpbmsoJm1faml0KTsKKyAgICAKKyAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdEdQUiwgbV9jb21w
aWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4pOworfQorCiB2b2lkIFNwZWN1bGF0aXZlSklU
Ojpjb21waWxlTG9naWNhbE5vdChOb2RlJiBub2RlKQogewogICAgIGlmIChpc0tub3duQm9vbGVh
bihub2RlLmNoaWxkMSgpKSkgewpAQCAtNTQxLDYgKzU2NSwzMyBAQCB2b2lkIFNwZWN1bGF0aXZl
SklUOjpjb21waWxlTG9naWNhbE5vdChOCiAgICAgICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0Lmdw
cigpLCBtX2NvbXBpbGVJbmRleCwgRGF0YUZvcm1hdEpTQm9vbGVhbik7CiAgICAgICAgIHJldHVy
bjsKICAgICB9CisgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0T3JPdGhlcihub2Rl
LmNoaWxkMSgpKSkgeworICAgICAgICBjb21waWxlT2JqZWN0T3JPdGhlckxvZ2ljYWxOb3Qobm9k
ZS5jaGlsZDEoKSwgbV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0ZpbmFsT2JqZWN0VlB0cik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUFycmF5T3JPdGhlcihu
b2RlLmNoaWxkMSgpKSkgeworICAgICAgICBjb21waWxlT2JqZWN0T3JPdGhlckxvZ2ljYWxOb3Qo
bm9kZS5jaGlsZDEoKSwgbV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0FycmF5VlB0cik7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgaWYgKHNob3VsZFNwZWN1bGF0ZUludGVnZXIobm9kZS5jaGls
ZDEoKSkpIHsKKyAgICAgICAgU3BlY3VsYXRlSW50ZWdlck9wZXJhbmQgdmFsdWUodGhpcywgbm9k
ZS5jaGlsZDEoKSk7CisgICAgICAgIEdQUlRlbXBvcmFyeSByZXN1bHQodGhpcywgdmFsdWUpOwor
ICAgICAgICBtX2ppdC5jb21wYXJlMzIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZS5ncHIo
KSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW0zMigwKSwgcmVzdWx0LmdwcigpKTsKKyAgICAg
ICAgbV9qaXQub3IzMihUcnVzdGVkSW1tMzIoVmFsdWVGYWxzZSksIHJlc3VsdC5ncHIoKSk7Cisg
ICAgICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0LmdwcigpLCBtX2NvbXBpbGVJbmRleCwgRGF0YUZv
cm1hdEpTQm9vbGVhbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNob3VsZFNw
ZWN1bGF0ZU51bWJlcihub2RlLmNoaWxkMSgpKSkgeworICAgICAgICBTcGVjdWxhdGVEb3VibGVP
cGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAgICAgICBGUFJUZW1wb3Jhcnkg
c2NyYXRjaCh0aGlzKTsKKyAgICAgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICAg
ICAgbV9qaXQubW92ZShUcnVzdGVkSW1tMzIoVmFsdWVGYWxzZSksIHJlc3VsdC5ncHIoKSk7Cisg
ICAgICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIG5vblplcm8gPSBtX2ppdC5icmFuY2hEb3VibGVO
b25aZXJvKHZhbHVlLmZwcigpLCBzY3JhdGNoLmZwcigpKTsKKyAgICAgICAgbV9qaXQueG9yMzIo
SW1tMzIodHJ1ZSksIHJlc3VsdC5ncHIoKSk7CisgICAgICAgIG5vblplcm8ubGluaygmbV9qaXQp
OworICAgICAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdC5ncHIoKSwgbV9jb21waWxlSW5kZXgsIERh
dGFGb3JtYXRKU0Jvb2xlYW4pOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIAogICAgIFBy
ZWRpY3RlZFR5cGUgcHJlZGljdGlvbiA9IG1faml0LmdldFByZWRpY3Rpb24obm9kZS5jaGlsZDEo
KSk7CiAgICAgaWYgKGlzQm9vbGVhblByZWRpY3Rpb24ocHJlZGljdGlvbikgfHwgIXByZWRpY3Rp
b24pIHsKQEAgLTU4Miw2ICs2MzMsMjUgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZUxv
Z2ljYWxOb3QoTgogICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0R1BSLCBtX2NvbXBpbGVJbmRleCwg
RGF0YUZvcm1hdEpTQm9vbGVhbiwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKIH0KIAor
dm9pZCBTcGVjdWxhdGl2ZUpJVDo6ZW1pdE9iamVjdE9yT3RoZXJCcmFuY2goTm9kZUluZGV4IG5v
ZGVJbmRleCwgQmxvY2tJbmRleCB0YWtlbiwgQmxvY2tJbmRleCBub3RUYWtlbiwgdm9pZCAqdnB0
cikKK3sKKyAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlSW5kZXgpOworICAgIEdQ
UlJlZyB2YWx1ZUdQUiA9IHZhbHVlLmdwcigpOworICAgIAorICAgIE1hY3JvQXNzZW1ibGVyOjpK
dW1wIG5vdENlbGwgPSBtX2ppdC5icmFuY2hUZXN0UHRyKE1hY3JvQXNzZW1ibGVyOjpOb25aZXJv
LCB2YWx1ZUdQUiwgR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICBzcGVjdWxhdGlvbkNo
ZWNrKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIE1hY3JvQXNzZW1i
bGVyOjpBZGRyZXNzKHZhbHVlR1BSKSwgTWFjcm9Bc3NlbWJsZXI6OlRydXN0ZWRJbW1QdHIodnB0
cikpKTsKKyAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCB0YWtlbik7CisgICAgCisgICAgbm90
Q2VsbC5saW5rKCZtX2ppdCk7CisgICAgCisgICAgbV9qaXQuYW5kUHRyKE1hY3JvQXNzZW1ibGVy
OjpUcnVzdGVkSW1tMzIoflRhZ0JpdFVuZGVmaW5lZCksIHZhbHVlR1BSKTsKKyAgICBzcGVjdWxh
dGlvbkNoZWNrKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6Tm90RXF1YWwsIHZhbHVl
R1BSLCBNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihyZWludGVycHJldF9jYXN0PHZvaWQq
PihWYWx1ZU51bGwpKSkpOworICAgIGlmIChub3RUYWtlbiAhPSAobV9ibG9jayArIDEpKQorICAg
ICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBub3RUYWtlbik7CisgICAgCisgICAgbm9SZXN1
bHQobV9jb21waWxlSW5kZXgpOworfQorCiB2b2lkIFNwZWN1bGF0aXZlSklUOjplbWl0QnJhbmNo
KE5vZGUmIG5vZGUpCiB7CiAgICAgSlNWYWx1ZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGls
ZDEoKSk7CkBAIC02MDUsNiArNjc1LDMzIEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmVtaXRCcmFu
Y2goTm9kZSYgbm8KICAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2Vu
KTsKICAgICAgICAgCiAgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKKyAgICB9IGVs
c2UgaWYgKHNob3VsZFNwZWN1bGF0ZUZpbmFsT2JqZWN0T3JPdGhlcihub2RlLmNoaWxkMSgpKSkg
eworICAgICAgICBlbWl0T2JqZWN0T3JPdGhlckJyYW5jaChub2RlLmNoaWxkMSgpLCB0YWtlbiwg
bm90VGFrZW4sIG1faml0Lmdsb2JhbERhdGEoKS0+anNGaW5hbE9iamVjdFZQdHIpOworICAgIH0g
ZWxzZSBpZiAoc2hvdWxkU3BlY3VsYXRlQXJyYXlPck90aGVyKG5vZGUuY2hpbGQxKCkpKSB7Cisg
ICAgICAgIGVtaXRPYmplY3RPck90aGVyQnJhbmNoKG5vZGUuY2hpbGQxKCksIHRha2VuLCBub3RU
YWtlbiwgbV9qaXQuZ2xvYmFsRGF0YSgpLT5qc0FycmF5VlB0cik7CisgICAgfSBlbHNlIGlmIChz
aG91bGRTcGVjdWxhdGVOdW1iZXIobm9kZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgaWYgKHNob3Vs
ZFNwZWN1bGF0ZUludGVnZXIobm9kZS5jaGlsZDEoKSkpIHsKKyAgICAgICAgICAgIGJvb2wgaW52
ZXJ0ID0gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0YWtlbiA9PSAobV9i
bG9jayArIDEpKSB7CisgICAgICAgICAgICAgICAgaW52ZXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICBCbG9ja0luZGV4IHRtcCA9IHRha2VuOworICAgICAgICAgICAgICAgIHRha2VuID0gbm90
VGFrZW47CisgICAgICAgICAgICAgICAgbm90VGFrZW4gPSB0bXA7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIFNwZWN1bGF0ZUludGVnZXJPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hp
bGQxKCkpOworICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFRlc3QzMihpbnZlcnQg
PyBNYWNyb0Fzc2VtYmxlcjo6WmVybyA6IE1hY3JvQXNzZW1ibGVyOjpOb25aZXJvLCB2YWx1ZS5n
cHIoKSksIHRha2VuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNwZWN1bGF0ZURv
dWJsZU9wZXJhbmQgdmFsdWUodGhpcywgbm9kZS5jaGlsZDEoKSk7CisgICAgICAgICAgICBGUFJU
ZW1wb3Jhcnkgc2NyYXRjaCh0aGlzKTsKKyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFu
Y2hEb3VibGVOb25aZXJvKHZhbHVlLmZwcigpLCBzY3JhdGNoLmZwcigpKSwgdGFrZW4pOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkK
KyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsKKyAgICAgICAg
CisgICAgICAgIG5vUmVzdWx0KG1fY29tcGlsZUluZGV4KTsKICAgICB9IGVsc2UgewogICAgICAg
ICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMpOwogICAgICAgICBHUFJSZWcgcmVzdWx0R1BSID0g
cmVzdWx0LmdwcigpOwpAQCAtNjE0LDE1ICs3MTEsMTkgQEAgdm9pZCBTcGVjdWxhdGl2ZUpJVDo6
ZW1pdEJyYW5jaChOb2RlJiBubwogICAgICAgICBpZiAocHJlZGljdEJvb2xlYW4pIHsKICAgICAg
ICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2
YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFu
KGZhbHNlKSkpKSwgbm90VGFrZW4pOwogICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5j
aFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1t
UHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4odHJ1ZSkpKSksIHRha2VuKTsKLQorICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBpZiAocHJlZGljdEJvb2xlYW4pIHsKICAgICAgICAgICAg
IHNwZWN1bGF0aW9uQ2hlY2sobV9qaXQuanVtcCgpKTsKICAgICAgICAgICAgIHZhbHVlLnVzZSgp
OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0
cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRy
KEpTVmFsdWU6OmVuY29kZShqc051bWJlcigwKSkpKSwgbm90VGFrZW4pOwogICAgICAgICAgICAg
YWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6QWJvdmVPckVxdWFsLCB2
YWx1ZUdQUiwgR1BSSW5mbzo6dGFnVHlwZU51bWJlclJlZ2lzdGVyKSwgdGFrZW4pOwogICAgIAot
ICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1
YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jv
b2xlYW4oZmFsc2UpKSkpLCBub3RUYWtlbik7Ci0gICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQu
YnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVy
OjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVlKSkpKSwgdGFrZW4pOworICAg
ICAgICAgICAgaWYgKCFwcmVkaWN0Qm9vbGVhbikgeworICAgICAgICAgICAgICAgIGFkZEJyYW5j
aChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9B
c3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKGZhbHNlKSkpKSwgbm90
VGFrZW4pOworICAgICAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9B
c3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVl
OjplbmNvZGUoanNCb29sZWFuKHRydWUpKSkpLCB0YWtlbik7CisgICAgICAgICAgICB9CiAgICAg
CiAgICAgICAgICAgICB2YWx1ZS51c2UoKTsKICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgJKHJldmlzaW9uIDk2NjYxKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCSh3b3JraW5nIGNvcHkp
CkBAIC01MDAsNiArNTAwLDExIEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiBpc0ZpbmFsT2Jq
ZWN0UHJlZGljdGlvbihwcmVkaWN0aW9uKTsKICAgICB9CiAgICAgCisgICAgYm9vbCBzaG91bGRT
cGVjdWxhdGVGaW5hbE9iamVjdE9yT3RoZXIoTm9kZUluZGV4IG5vZGVJbmRleCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBpc0ZpbmFsT2JqZWN0T3JPdGhlclByZWRpY3Rpb24obV9qaXQuZ2V0UHJl
ZGljdGlvbihub2RlSW5kZXgpKTsKKyAgICB9CisgICAgCiAgICAgYm9vbCBzaG91bGRTcGVjdWxh
dGVBcnJheShOb2RlSW5kZXggbm9kZUluZGV4KQogICAgIHsKICAgICAgICAgUHJlZGljdGVkVHlw
ZSBwcmVkaWN0aW9uOwpAQCAtNTEwLDYgKzUxNSwxMSBAQCBwcml2YXRlOgogICAgICAgICByZXR1
cm4gaXNBcnJheVByZWRpY3Rpb24ocHJlZGljdGlvbik7CiAgICAgfQogICAgIAorICAgIGJvb2wg
c2hvdWxkU3BlY3VsYXRlQXJyYXlPck90aGVyKE5vZGVJbmRleCBub2RlSW5kZXgpCisgICAgewor
ICAgICAgICByZXR1cm4gaXNBcnJheU9yT3RoZXJQcmVkaWN0aW9uKG1faml0LmdldFByZWRpY3Rp
b24obm9kZUluZGV4KSk7CisgICAgfQorICAgIAogICAgIGJvb2wgc2hvdWxkU3BlY3VsYXRlT2Jq
ZWN0KE5vZGVJbmRleCBub2RlSW5kZXgpCiAgICAgewogICAgICAgICBOb2RlJiBub2RlID0gbV9q
aXQuZ3JhcGgoKVtub2RlSW5kZXhdOwpAQCAtNTk5LDcgKzYwOSw5IEBAIHByaXZhdGU6CiAgICAg
dm9pZCBjb21waWxlUGVlcEhvbGVPYmplY3RFcXVhbGl0eShOb2RlJiwgTm9kZUluZGV4IGJyYW5j
aE5vZGVJbmRleCwgdm9pZCogdnB0cik7CiAgICAgdm9pZCBjb21waWxlT2JqZWN0RXF1YWxpdHko
Tm9kZSYsIHZvaWQqIHZwdHIpOwogICAgIHZvaWQgY29tcGlsZVZhbHVlQWRkKE5vZGUmKTsKKyAg
ICB2b2lkIGNvbXBpbGVPYmplY3RPck90aGVyTG9naWNhbE5vdChOb2RlSW5kZXggdmFsdWUsIHZv
aWQqIHZwdHIpOwogICAgIHZvaWQgY29tcGlsZUxvZ2ljYWxOb3QoTm9kZSYpOworICAgIHZvaWQg
ZW1pdE9iamVjdE9yT3RoZXJCcmFuY2goTm9kZUluZGV4IHZhbHVlLCBCbG9ja0luZGV4IHRha2Vu
LCBCbG9ja0luZGV4IG5vdFRha2VuLCB2b2lkICp2cHRyKTsKICAgICB2b2lkIGVtaXRCcmFuY2go
Tm9kZSYpOwogICAgIAogICAgIC8vIEl0IGlzIGFjY2VwdGFibGUgdG8gaGF2ZSBzdHJ1Y3R1cmUg
YmUgZXF1YWwgdG8gc2NyYXRjaCwgc28gbG9uZyBhcyB5b3UncmUgZmluZQo=
</data>
<flag name="review"
          id="107021"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>