<?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>154511</bug_id>
          
          <creation_ts>2016-02-21 00:31:07 -0800</creation_ts>
          <short_desc>[ES6] Implement Proxy.[[Set]]</short_desc>
          <delta_ts>2016-02-25 14:58:55 -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>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>sukolsak</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1166818</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-21 00:31:07 -0800</bug_when>
    <thetext>...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167301</commentid>
    <comment_count>1</comment_count>
      <attachid>271983</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-22 19:29:17 -0800</bug_when>
    <thetext>Created attachment 271983
RFC WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167302</commentid>
    <comment_count>2</comment_count>
      <attachid>271984</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-22 19:30:28 -0800</bug_when>
    <thetext>Created attachment 271984
RFC WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167304</commentid>
    <comment_count>3</comment_count>
      <attachid>271984</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-22 19:33:23 -0800</bug_when>
    <thetext>Comment on attachment 271984
RFC WIP

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

&gt; Source/JavaScriptCore/runtime/JSObject.cpp:429
&gt; +        if (obj-&gt;type() == ProxyObjectType) {
&gt; +            ProxyObject* proxy = jsCast&lt;ProxyObject*&gt;(obj);
&gt; +            proxy-&gt;ProxyObject::put(proxy, exec, propertyName, value, slot);
&gt; +            return;
&gt; +        }

Not sure if this is the best way to do this.

&gt; Source/JavaScriptCore/runtime/JSObject.cpp:1929
&gt; +        if (current-&gt;type() == ProxyObjectType) {
&gt; +            ProxyObject* proxy = jsCast&lt;ProxyObject*&gt;(current);
&gt; +            proxy-&gt;putByIndexCommon(exec, thisValue, i, value, shouldThrow);
&gt; +            return true;
&gt; +        }

ditto.

&gt; Source/JavaScriptCore/runtime/ProxyObject.h:50
&gt; +        return Structure::create(vm, globalObject, prototype, TypeInfo(ProxyObjectType, StructureFlags), info(), NonArray | MayHaveIndexedAccessors);

I&apos;m not sure if it&apos;s a big anti-pattern to put MayHaveIndexedAccessors in the Structure&apos;s creation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167305</commentid>
    <comment_count>4</comment_count>
      <attachid>271984</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2016-02-22 19:41:36 -0800</bug_when>
    <thetext>Comment on attachment 271984
RFC WIP

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

&gt;&gt; Source/JavaScriptCore/runtime/JSObject.cpp:429
&gt;&gt; +        }
&gt; 
&gt; Not sure if this is the best way to do this.

i feel if (ProxyObject* proxy = jsDynamicCast&lt;ProxyObject*&gt;(obj)) { ... }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167442</commentid>
    <comment_count>5</comment_count>
      <attachid>271984</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-02-23 10:07:53 -0800</bug_when>
    <thetext>Comment on attachment 271984
RFC WIP

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

&gt;&gt;&gt; Source/JavaScriptCore/runtime/JSObject.cpp:429
&gt;&gt;&gt; +        }
&gt;&gt; 
&gt;&gt; Not sure if this is the best way to do this.
&gt; 
&gt; i feel if (ProxyObject* proxy = jsDynamicCast&lt;ProxyObject*&gt;(obj)) { ... }

Oliver&apos;s version might be slower.

Saam, why aren&apos;t you overriding JSObject::put in ProxyObject?  That might obviate the need for this.  Remember, JSObject::put is a virtual method.  You can override it.  We won&apos;t call putInline in that case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167498</commentid>
    <comment_count>6</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-23 12:33:36 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Comment on attachment 271984 [details]
&gt; RFC WIP
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=271984&amp;action=review
&gt; 
&gt; &gt;&gt; Source/JavaScriptCore/runtime/JSObject.cpp:429
&gt; &gt;&gt; +        }
&gt; &gt; 
&gt; &gt; Not sure if this is the best way to do this.
&gt; 
&gt; i feel if (ProxyObject* proxy = jsDynamicCast&lt;ProxyObject*&gt;(obj)) { ... }
I agree that this reads better, but it&apos;s much slower for when
the dynamic cast returns nullptr, which will almost always be true
because Proxy&apos;s aren&apos;t used on the web.

I&apos;m tempted to write a function like this to make this style of
code read better:
```
template &lt;JSType type, typename CellType, typename FromType&gt;
CellType jsDynamicTypeCast(FromType* from) { // there must exist a better name
    if (from-&gt;type() == type)
        return jsCast&lt;CellType&gt;(from);
     return nullptr;
}
```</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167499</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-23 12:36:54 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 271984 [details]
&gt; RFC WIP
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=271984&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Source/JavaScriptCore/runtime/JSObject.cpp:429
&gt; &gt;&gt;&gt; +        }
&gt; &gt;&gt; 
&gt; &gt;&gt; Not sure if this is the best way to do this.
&gt; &gt; 
&gt; &gt; i feel if (ProxyObject* proxy = jsDynamicCast&lt;ProxyObject*&gt;(obj)) { ... }
&gt; 
&gt; Oliver&apos;s version might be slower.
&gt; 
&gt; Saam, why aren&apos;t you overriding JSObject::put in ProxyObject?  That might
&gt; obviate the need for this.  Remember, JSObject::put is a virtual method. 
&gt; You can override it.  We won&apos;t call putInline in that case.

I am overwriting both put and putByIndex on ProxyObject.
This code is for making Proxy&apos;s be able to intercept puts
when the Proxy is in the __proto__ chain of another object.
i.e, code like this:
```
let target = {};
let handler  = {
    set: function(theTarget, propName, ...etc) {
        assert(propName === &quot;notOwnProp&quot;);
        // etc...
    }
};
let proxy = new Proxy(target, handler);
let obj = Object.create(proxy, {
   ownProp: { value: 40, etc... }
});
obj.ownProp = 50;
assert(set was *not* called);
obj.notOwnProp = 55;
assert(set was called)
```</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167560</commentid>
    <comment_count>8</comment_count>
      <attachid>272056</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-23 15:01:56 -0800</bug_when>
    <thetext>Created attachment 272056
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167564</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-02-23 15:04:14 -0800</bug_when>
    <thetext>Attachment 272056 did not pass style-queue:


ERROR: Source/JavaScriptCore/runtime/ProxyObject.cpp:357:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/runtime/ProxyObject.cpp:370:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/runtime/JSObject.h:858:  The parameter name &quot;exec&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 3 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1168192</commentid>
    <comment_count>10</comment_count>
      <attachid>272056</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-02-25 13:12:48 -0800</bug_when>
    <thetext>Comment on attachment 272056
patch

Please run lots of benchmarks on this.  It would be great to post dynbench scores.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1168195</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-25 13:20:47 -0800</bug_when>
    <thetext>JSC benchmark results. (I&apos;m going to run dynbench now and post).

Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on Saams-MacBook-Pro (MacBookPro11,3).

VMs tested:
&quot;og&quot; at /Volumes/Data/WK/a/OpenSource/WebKitBuild/Release/jsc (r196871)
&quot;proxyChange&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r196871)

Collected 8 samples per benchmark/VM, with 8 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
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.

                                                            og                   proxyChange                                    
SunSpider:
   3d-cube                                            7.2343+-0.2250            7.0856+-0.0932          might be 1.0210x faster
   3d-morph                                           7.9536+-0.0645            7.9486+-0.0496        
   3d-raytrace                                        8.4907+-0.1022     ?      8.6294+-0.1584        ? might be 1.0163x slower
   access-binary-trees                                3.1611+-0.0760     ?      3.2866+-0.3587        ? might be 1.0397x slower
   access-fannkuch                                    9.0539+-0.1752     ?      9.5140+-0.8775        ? might be 1.0508x slower
   access-nbody                                       4.0527+-0.0560     ?      4.0605+-0.1273        ?
   access-nsieve                                      4.9573+-0.3520     ?      5.1627+-0.7329        ? might be 1.0414x slower
   bitops-3bit-bits-in-byte                           1.7636+-0.1582            1.6844+-0.0339          might be 1.0471x faster
   bitops-bits-in-byte                                4.9711+-0.7550     ?      5.0100+-0.7674        ?
   bitops-bitwise-and                                 3.0740+-0.0324            3.0526+-0.0418        
   bitops-nsieve-bits                                 4.4174+-0.0252     ?      4.4345+-0.0368        ?
   controlflow-recursive                              3.5902+-0.2026            3.4944+-0.0563          might be 1.0274x faster
   crypto-aes                                         6.0435+-0.0458     ?      6.1636+-0.1973        ? might be 1.0199x slower
   crypto-md5                                         3.7821+-0.0597     ?      4.2066+-0.6863        ? might be 1.1123x slower
   crypto-sha1                                        3.4117+-0.0318     ?      3.4680+-0.1204        ? might be 1.0165x slower
   date-format-tofte                                 10.7195+-0.2947     ?     10.9065+-0.3268        ? might be 1.0174x slower
   date-format-xparb                                  7.2696+-0.1223            7.1937+-0.1889          might be 1.0106x faster
   math-cordic                                        4.4037+-0.0663            4.3759+-0.0491        
   math-partial-sums                                  7.3939+-0.0349     ?      7.4610+-0.0492        ?
   math-spectral-norm                                 3.0103+-0.1797            2.9468+-0.0290          might be 1.0215x faster
   regexp-dna                                         9.4425+-0.1007            9.3296+-0.2139          might be 1.0121x faster
   string-base64                                      6.7599+-0.1150     ?      6.7861+-0.0951        ?
   string-fasta                                       8.9114+-0.1907     ?      9.0345+-0.2063        ? might be 1.0138x slower
   string-tagcloud                                   11.8355+-0.2522     ?     11.9145+-0.2321        ?
   string-unpack-code                                27.3241+-0.3256     ?     27.3752+-0.2883        ?
   string-validate-input                              6.5905+-0.2610            6.4330+-0.0764          might be 1.0245x faster

   &lt;arithmetic&gt;                                       6.9084+-0.0370     ?      6.9599+-0.0615        ? might be 1.0075x slower

                                                            og                   proxyChange                                    
LongSpider:
   3d-cube                                         1256.6468+-8.1919         1247.3336+-6.9675        
   3d-morph                                         920.7004+-0.3683     ?    921.5131+-1.9427        ?
   3d-raytrace                                      968.7795+-3.3165     ?    973.6702+-2.8502        ?
   access-binary-trees                             1257.3333+-25.1617        1252.7005+-22.1948       
   access-fannkuch                                  464.2554+-26.1997         443.7499+-39.4881         might be 1.0462x faster
   access-nbody                                     799.5085+-5.0980          797.1594+-0.6421        
   access-nsieve                                    513.5686+-4.5027          511.1152+-2.2543        
   bitops-3bit-bits-in-byte                          51.9554+-0.8214           51.5436+-0.1049        
   bitops-bits-in-byte                              168.5128+-2.3962     ?    168.6420+-2.2807        ?
   bitops-nsieve-bits                               598.6717+-2.0805          597.9127+-4.3338        
   controlflow-recursive                            706.9135+-1.8897          706.7847+-1.8461        
   crypto-aes                                       991.0749+-7.7627          989.0860+-4.8379        
   crypto-md5                                       919.4498+-10.0727    ?    956.1241+-70.0299       ? might be 1.0399x slower
   crypto-sha1                                     1154.7932+-18.3630        1145.5314+-4.7912        
   date-format-tofte                                896.6587+-21.1073         871.5286+-12.1393         might be 1.0288x faster
   date-format-xparb                               1006.9630+-5.7653     ?   1073.3900+-122.4274      ? might be 1.0660x slower
   hash-map                                         237.4641+-4.5349     ?    238.8645+-3.8205        ?
   math-cordic                                      736.5042+-8.0466          733.5936+-6.0873        
   math-partial-sums                                636.1102+-0.2458          635.6807+-1.8775        
   math-spectral-norm                               854.2440+-0.5634     ?    854.9320+-1.8372        ?
   string-base64                                    580.5926+-4.3454          576.1747+-4.2678        
   string-fasta                                     544.8398+-5.5651          543.5369+-3.8175        
   string-tagcloud                                  256.6876+-1.3237          255.5600+-1.0049        

   &lt;geometric&gt;                                      597.8508+-2.4182          597.1774+-4.9495          might be 1.0011x faster

                                                            og                   proxyChange                                    
V8Spider:
   crypto                                            57.4310+-0.3178           57.4111+-0.3923        
   deltablue                                         76.8689+-1.7991     ?     77.3070+-1.6592        ?
   earley-boyer                                      59.8966+-0.7679     ?     60.9863+-1.3562        ? might be 1.0182x slower
   raytrace                                          30.6981+-0.3645     ?     31.0980+-0.3876        ? might be 1.0130x slower
   regexp                                           100.6296+-9.5301           95.6357+-1.5682          might be 1.0522x faster
   richards                                          63.5811+-2.4931           62.7164+-0.6621          might be 1.0138x faster
   splay                                             51.1426+-6.8545           48.5316+-0.6330          might be 1.0538x faster

   &lt;geometric&gt;                                       59.4356+-1.3115           58.8612+-0.3183          might be 1.0098x faster

                                                            og                   proxyChange                                    
Octane:
   encrypt                                           0.23888+-0.00331    ?     0.24168+-0.00246       ? might be 1.0117x slower
   decrypt                                           4.32035+-0.01219    ?     4.32461+-0.01509       ?
   deltablue                                x2       0.21163+-0.01165          0.20712+-0.00297         might be 1.0217x faster
   earley                                            0.45290+-0.00413          0.44938+-0.00558       
   boyer                                             7.59791+-0.30834          7.42364+-0.03350         might be 1.0235x faster
   navier-stokes                            x2       7.60917+-0.01028          7.60205+-0.00536       
   raytrace                                 x2       1.39999+-0.00956    ?     1.40327+-0.00830       ?
   richards                                 x2       0.12627+-0.00138          0.12595+-0.00102       
   splay                                    x2       0.51819+-0.00609    ?     0.52295+-0.00713       ?
   regexp                                   x2      40.54022+-0.41417         39.52752+-0.84991         might be 1.0256x faster
   pdfjs                                    x2      58.35193+-0.49585    ?    58.35548+-0.54808       ?
   mandreel                                 x2      70.37693+-0.64425    ?    70.45091+-0.95391       ?
   gbemu                                    x2      42.28767+-0.72050         41.84394+-0.25511         might be 1.0106x faster
   closure                                           0.86712+-0.00187    ?     0.87603+-0.01351       ? might be 1.0103x slower
   jquery                                           11.42017+-0.13328         11.31840+-0.03222       
   box2d                                    x2      15.43918+-0.05835    ?    15.50155+-0.18505       ?
   zlib                                     x2     567.10389+-13.13708   ?   568.69585+-13.63543      ?
   typescript                               x2     960.60086+-7.54712    ?   961.47641+-3.44683       ?

   &lt;geometric&gt;                                       8.20724+-0.03643          8.18137+-0.00741         might be 1.0032x faster

                                                            og                   proxyChange                                    
Kraken:
   ai-astar                                          152.028+-3.616            147.834+-2.465           might be 1.0284x faster
   audio-beat-detection                               65.334+-0.359             65.209+-0.153         
   audio-dft                                         144.558+-0.354      ?     145.237+-0.641         ?
   audio-fft                                          49.188+-1.252             48.690+-0.141           might be 1.0102x faster
   audio-oscillator                                   81.190+-15.386            74.363+-0.269           might be 1.0918x faster
   imaging-darkroom                                   89.858+-0.448             89.306+-0.309         
   imaging-desaturate                                 69.523+-1.550      ?      71.598+-2.825         ? might be 1.0298x slower
   imaging-gaussian-blur                             116.959+-4.089      ?     117.473+-6.760         ?
   json-parse-financial                               56.486+-0.399             56.017+-0.553         
   json-stringify-tinderbox                           36.633+-0.543      !      38.244+-0.524         ! definitely 1.0440x slower
   stanford-crypto-aes                                60.504+-0.317      ?      60.528+-0.537         ?
   stanford-crypto-ccm                                55.231+-1.967      ?      56.128+-1.581         ? might be 1.0163x slower
   stanford-crypto-pbkdf2                            155.417+-3.108            154.791+-0.597         
   stanford-crypto-sha256-iterative                   59.384+-1.018             59.288+-0.371         

   &lt;arithmetic&gt;                                       85.164+-1.110             84.622+-0.499           might be 1.0064x faster

                                                            og                   proxyChange                                    
JSRegress:
   abc-forward-loop-equal                            36.3361+-0.2999           36.0953+-0.1320        
   abc-postfix-backward-loop                         45.6347+-0.3442           45.5258+-0.0775        
   abc-simple-backward-loop                          35.9806+-0.1546     ?     36.0252+-0.0808        ?
   abc-simple-forward-loop                           36.2376+-0.0677     ?     36.2919+-0.2734        ?
   abc-skippy-loop                                   31.7246+-0.3503           31.7077+-0.7026        
   abs-boolean                                        3.6869+-0.0231     ?      3.7486+-0.0796        ? might be 1.0167x slower
   adapt-to-double-divide                            22.1665+-0.2071     ?     22.1805+-0.1805        ?
   aliased-arguments-getbyval                         1.6642+-0.0324     ?      1.7383+-0.0974        ? might be 1.0445x slower
   allocate-big-object                                3.3011+-0.1925     ?      3.3646+-0.0551        ? might be 1.0192x slower
   arguments-named-and-reflective                    12.5925+-0.8679           12.5040+-0.4416        
   arguments-out-of-bounds                           10.2285+-0.0450           10.2110+-0.0712        
   arguments-strict-mode                             71.9798+-0.7437     ?     72.9438+-3.1924        ? might be 1.0134x slower
   arguments                                         10.2112+-0.0209     ?     10.2440+-0.0588        ?
   arity-mismatch-inlining                            1.2789+-0.0205            1.2630+-0.0419          might be 1.0126x faster
   array-access-polymorphic-structure                11.0752+-0.2635           10.9177+-0.2527          might be 1.0144x faster
   array-nonarray-polymorhpic-access                 29.7630+-0.2682     ?     29.9141+-0.4841        ?
   array-prototype-every                            105.6543+-1.4309     ?    106.5237+-0.9671        ?
   array-prototype-forEach                          104.6103+-1.0292     ?    105.6260+-0.4944        ?
   array-prototype-map                              113.0716+-1.7536          112.4147+-0.7056        
   array-prototype-reduce                            99.8792+-0.2320     ?    111.8891+-25.4544       ? might be 1.1202x slower
   array-prototype-reduceRight                      124.1609+-0.2302     ^    123.2921+-0.5309        ^ definitely 1.0070x faster
   array-prototype-some                             106.3005+-0.3461          106.0297+-0.9979        
   array-splice-contiguous                           33.8611+-0.3708     ?     34.4256+-0.3062        ? might be 1.0167x slower
   array-with-double-add                              5.2325+-0.0330     ?      5.2457+-0.0399        ?
   array-with-double-increment                        4.6484+-0.0376     ?      5.0209+-0.7429        ? might be 1.0801x slower
   array-with-double-mul-add                          6.7155+-0.0651     ?      6.7565+-0.0609        ?
   array-with-double-sum                              4.7485+-0.0241     ?      4.7910+-0.0766        ?
   array-with-int32-add-sub                           9.3643+-0.0935            9.3570+-0.0837        
   array-with-int32-or-double-sum                     4.9061+-0.0528            4.8760+-0.0254        
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     42.8138+-0.6421           42.1647+-0.3798          might be 1.0154x faster
   ArrayBuffer-DataView-alloc-long-lived             19.1696+-0.1221     ?     19.2391+-0.1021        ?
   ArrayBuffer-Int32Array-byteOffset                  5.3870+-0.0462     ?      5.4023+-0.0308        ?
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     42.4205+-0.5700           42.4038+-0.6139        
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     31.4386+-0.9250           30.9793+-0.8911          might be 1.0148x faster
   ArrayBuffer-Int8Array-alloc-long-lived            17.5070+-0.1293     ?     17.6127+-0.2091        ?
   ArrayBuffer-Int8Array-alloc                       14.8887+-0.2030           14.7742+-0.1790        
   arrowfunction-call                                15.1301+-0.2238           14.9845+-0.1758        
   asmjs_bool_bug                                    11.2910+-0.1563           11.2318+-0.0492        
   assign-custom-setter-polymorphic                   3.8345+-0.0384     ?      3.9727+-0.1317        ? might be 1.0360x slower
   assign-custom-setter                               5.6200+-0.5781            5.4927+-0.0355          might be 1.0232x faster
   basic-set                                         11.9464+-0.3870           11.8595+-0.4183        
   big-int-mul                                        4.6283+-0.0272     ?      4.6372+-0.0309        ?
   boolean-test                                       5.0277+-0.1351            4.9843+-0.0277        
   branch-fold                                        5.3142+-0.0324     ?      5.3165+-0.0877        ?
   branch-on-string-as-boolean                       17.6567+-0.4225     ?     17.7931+-0.4429        ?
   by-val-generic                                     6.7682+-0.2682            6.6095+-0.3664          might be 1.0240x faster
   call-spread-apply                                 68.2819+-0.6453           67.3885+-1.2369          might be 1.0133x faster
   call-spread-call                                 105.9384+-2.0797          104.4588+-1.9866          might be 1.0142x faster
   captured-assignments                               0.6632+-0.0188            0.6533+-0.0142          might be 1.0151x faster
   cast-int-to-double                                 7.5128+-0.0278     ?      7.5370+-0.0340        ?
   cell-argument                                      4.2494+-0.0843     ?      4.5166+-0.6775        ? might be 1.0629x slower
   cfg-simplify                                       4.3155+-0.1188            4.3085+-0.0495        
   chain-getter-access                               17.0460+-0.1272     ?     17.0599+-0.1923        ?
   cmpeq-obj-to-obj-other                            13.1789+-0.2739     ?     13.5444+-0.5691        ? might be 1.0277x slower
   constant-test                                      7.1140+-0.0532            7.0613+-0.0377        
   create-lots-of-functions                          11.9521+-1.0099           11.4361+-0.8998          might be 1.0451x faster
   cse-new-array-buffer                               3.2037+-0.0345     ?      3.2261+-0.0344        ?
   cse-new-array                                      3.3116+-0.1650            3.2489+-0.1353          might be 1.0193x faster
   custom-setter-getter-as-put-get-by-id              0.7269+-0.0110     ?      0.7495+-0.0184        ? might be 1.0311x slower
   DataView-custom-properties                        50.5493+-0.6149     ?     51.1683+-0.7531        ? might be 1.0122x slower
   delay-tear-off-arguments-strictmode               17.7763+-0.1496           17.6463+-0.2808        
   deltablue-varargs                                 64.8590+-16.7251          57.9390+-0.4535          might be 1.1194x faster
   destructuring-arguments                          244.4657+-1.7781          240.7522+-2.3845          might be 1.0154x faster
   destructuring-parameters-overridden-by-function   
                                                      0.6743+-0.0105     ?      0.6883+-0.0361        ? might be 1.0208x slower
   destructuring-swap                                 7.0356+-0.0845            7.0150+-0.0340        
   direct-arguments-getbyval                          1.6905+-0.0586     ?      1.7927+-0.2767        ? might be 1.0604x slower
   div-boolean-double                                 7.0488+-0.0962            6.9760+-0.0420          might be 1.0104x faster
   div-boolean                                       11.6628+-0.0857     ?     11.8021+-0.1880        ? might be 1.0119x slower
   double-get-by-val-out-of-bounds                    6.5097+-0.2066            6.2938+-0.2043          might be 1.0343x faster
   double-pollution-getbyval                         12.6805+-0.0812           12.6386+-0.0737        
   double-pollution-putbyoffset                       5.2752+-0.0380     ?      5.4993+-0.4039        ? might be 1.0425x slower
   double-real-use                                   38.0400+-1.9998     ?     39.7208+-2.8717        ? might be 1.0442x slower
   double-to-int32-typed-array-no-inline              2.9654+-0.0333     ?      2.9992+-0.0703        ? might be 1.0114x slower
   double-to-int32-typed-array                        2.9760+-0.0637     ?      3.0700+-0.1881        ? might be 1.0316x slower
   double-to-uint32-typed-array-no-inline             3.0442+-0.0531     ?      3.3785+-0.8329        ? might be 1.1098x slower
   double-to-uint32-typed-array                       3.0498+-0.0329     ^      2.9844+-0.0308        ^ definitely 1.0219x faster
   elidable-new-object-dag                           46.5600+-0.1043     ?     47.0118+-0.5709        ?
   elidable-new-object-roflcopter                    48.5388+-0.4337           48.0928+-0.2282        
   elidable-new-object-then-call                     38.4742+-6.4870           35.7544+-0.1637          might be 1.0761x faster
   elidable-new-object-tree                          48.8749+-1.8081           47.9422+-0.1393          might be 1.0195x faster
   empty-string-plus-int                              7.2811+-0.0894     ?      7.3471+-0.0883        ?
   emscripten-cube2hash                              37.0045+-0.5207           36.9743+-0.5139        
   exit-length-on-plain-object                       23.3378+-0.4406           23.2857+-0.4208        
   external-arguments-getbyval                        1.7163+-0.1015     ?      1.7437+-0.2672        ? might be 1.0160x slower
   external-arguments-putbyval                        3.3283+-0.1119            3.2159+-0.0314          might be 1.0350x faster
   fixed-typed-array-storage-var-index                1.7636+-0.0394     ?      1.8098+-0.0966        ? might be 1.0261x slower
   fixed-typed-array-storage                          1.3387+-0.0211     ?      1.3493+-0.0343        ?
   Float32Array-matrix-mult                           6.8128+-0.1110     ?      6.8403+-0.0959        ?
   Float32Array-to-Float64Array-set                  66.1976+-0.6145           65.3823+-1.1414          might be 1.0125x faster
   Float64Array-alloc-long-lived                     83.8807+-0.8409           83.3891+-0.7736        
   Float64Array-to-Int16Array-set                    85.4021+-0.4365     !     87.2577+-0.4184        ! definitely 1.0217x slower
   fold-double-to-int                                19.6282+-0.0442     ?     19.9161+-0.3277        ? might be 1.0147x slower
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     13.2616+-0.2898           13.0324+-0.2575          might be 1.0176x faster
   fold-get-by-id-to-multi-get-by-offset             10.6023+-0.1072     ?     10.6619+-0.1347        ?
   fold-multi-get-by-offset-to-get-by-offset   
                                                     12.1537+-1.7519           10.9781+-2.0273          might be 1.1071x faster
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                     12.7043+-1.4243           11.1005+-2.1026          might be 1.1445x faster
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                     12.2674+-1.4085           11.9451+-1.4198          might be 1.0270x faster
   fold-multi-put-by-offset-to-put-by-offset   
                                                     10.2485+-1.5237     ?     10.7878+-1.2350        ? might be 1.0526x slower
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                     14.3481+-0.1699     ?     14.8160+-0.9205        ? might be 1.0326x slower
   fold-put-by-id-to-multi-put-by-offset             12.4695+-0.1973           12.4210+-0.3024        
   fold-put-by-val-with-string-to-multi-put-by-offset   
                                                     12.2432+-0.2078     ?     12.5438+-0.1462        ? might be 1.0245x slower
   fold-put-by-val-with-symbol-to-multi-put-by-offset   
                                                     12.8825+-1.1465           12.4646+-0.2521          might be 1.0335x faster
   fold-put-structure                                 8.4883+-2.9229            7.2859+-0.1197          might be 1.1650x faster
   for-of-iterate-array-entries                      14.7395+-0.2222           14.6226+-0.1583        
   for-of-iterate-array-keys                          4.9472+-0.0743     ?      5.2033+-0.5410        ? might be 1.0518x slower
   for-of-iterate-array-values                        4.7767+-0.0758            4.7659+-0.1036        
   fround                                            17.9857+-0.2171     ?     18.0558+-0.2322        ?
   ftl-library-inlining-dataview                     93.3969+-0.1315     ^     88.3304+-0.1378        ^ definitely 1.0574x faster
   ftl-library-inlining                              35.8470+-0.7388           35.3511+-0.2206          might be 1.0140x faster
   ftl-polymorphic-bitand                           173.7003+-2.5802     ?    174.7766+-1.1258        ?
   ftl-polymorphic-bitor                            171.8883+-2.1768     ?    173.1668+-0.5463        ?
   ftl-polymorphic-bitxor                           171.8810+-1.0612     !    174.8039+-0.9654        ! definitely 1.0170x slower
   ftl-polymorphic-div                              683.9837+-1.0755     !    686.8210+-1.1273        ! definitely 1.0041x slower
   ftl-polymorphic-lshift                           217.3232+-1.3706     ?    218.5643+-0.3090        ?
   ftl-polymorphic-mul                              335.9874+-1.5144     ?    336.4486+-1.1917        ?
   ftl-polymorphic-rshift                           217.2646+-1.0602     !    221.5540+-1.5838        ! definitely 1.0197x slower
   ftl-polymorphic-StringFromCharCode                64.2830+-0.1369     ?     69.7814+-12.3227       ? might be 1.0855x slower
   ftl-polymorphic-sub                              252.4412+-0.7900     ?    252.5656+-0.4131        ?
   ftl-polymorphic-urshift                          238.3672+-1.5292     ?    242.4545+-5.2932        ? might be 1.0171x slower
   function-call                                     15.8697+-0.1994     ?     15.9641+-0.2165        ?
   function-dot-apply                                 3.0619+-0.0440            2.9986+-0.0348          might be 1.0211x faster
   function-test                                      4.7297+-0.0278     ?      4.9663+-0.5424        ? might be 1.0500x slower
   function-with-eval                               141.8480+-0.4952     ?    142.3727+-0.5559        ?
   gcse-poly-get-less-obvious                        22.8405+-0.5368           22.5198+-0.2119          might be 1.0142x faster
   gcse-poly-get                                     24.2095+-2.8020     ?     25.6432+-2.0030        ? might be 1.0592x slower
   gcse                                               5.0132+-0.0316     ?      5.0150+-0.0189        ?
   generator-create                                   1.0811+-0.0204     ?      1.0860+-0.0213        ?
   generator-fib                                    153.6734+-4.8649          153.2467+-0.4585        
   generator-function-create                          5.6309+-0.3920            5.3423+-0.0970          might be 1.0540x faster
   generator-sunspider-access-nsieve                  8.4795+-0.0835            8.4119+-0.0785        
   generator-with-several-types                     489.3354+-14.3327         488.9330+-15.4995       
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      3.9434+-0.1563            3.8932+-0.0393          might be 1.0129x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                      7.1729+-0.0270     ?      7.3916+-0.6440        ? might be 1.0305x slower
   get-by-id-chain-from-try-block                     2.8907+-0.0872            2.8504+-0.0305          might be 1.0141x faster
   get-by-id-check-structure-elimination              5.8807+-0.0371            5.8574+-0.0286        
   get-by-id-proto-or-self                           15.5116+-1.0483           15.0007+-0.8221          might be 1.0341x faster
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      4.4218+-0.3113            4.2965+-0.0551          might be 1.0292x faster
   get-by-id-self-or-proto                           14.8944+-0.9230           14.4814+-0.7626          might be 1.0285x faster
   get-by-val-out-of-bounds                           5.9720+-0.2006     ?      6.0272+-0.1930        ?
   get-by-val-with-string-bimorphic-check-structure-elimination-simple   
                                                      4.0607+-0.0401            4.0519+-0.0694        
   get-by-val-with-string-bimorphic-check-structure-elimination   
                                                      9.5435+-0.0717     ?      9.5588+-0.1154        ?
   get-by-val-with-string-chain-from-try-block   
                                                      3.0368+-0.2510            2.9190+-0.0414          might be 1.0404x faster
   get-by-val-with-string-check-structure-elimination   
                                                      8.4633+-0.0452            8.4511+-0.0346        
   get-by-val-with-string-proto-or-self              19.1771+-1.5496           17.9925+-1.7444          might be 1.0658x faster
   get-by-val-with-string-quadmorphic-check-structure-elimination-simple   
                                                      4.5280+-0.0590     ?      4.9384+-0.8186        ? might be 1.0906x slower
   get-by-val-with-string-self-or-proto              18.7235+-1.4321           18.4016+-1.1363          might be 1.0175x faster
   get-by-val-with-symbol-bimorphic-check-structure-elimination-simple   
                                                      4.6526+-0.0270     ?      4.6920+-0.0655        ?
   get-by-val-with-symbol-bimorphic-check-structure-elimination   
                                                     18.5738+-0.1258     ?     18.5771+-0.1866        ?
   get-by-val-with-symbol-chain-from-try-block   
                                                      2.9041+-0.0593     ?      3.1577+-0.5108        ? might be 1.0873x slower
   get-by-val-with-symbol-check-structure-elimination   
                                                     17.1390+-0.2033           17.0316+-0.1534        
   get-by-val-with-symbol-proto-or-self              19.0211+-0.6379           17.7319+-1.8706          might be 1.0727x faster
   get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple   
                                                      5.5698+-0.0685            5.5019+-0.0356          might be 1.0123x faster
   get-by-val-with-symbol-self-or-proto              17.5632+-1.2142     ?     17.9904+-1.7572        ? might be 1.0243x slower
   get_callee_monomorphic                             3.1821+-0.1453     ?      3.2200+-0.1284        ? might be 1.0119x slower
   get_callee_polymorphic                             4.7663+-0.0916     ?      4.8193+-0.0308        ? might be 1.0111x slower
   getter-no-activation                               5.6604+-0.0549     ?      5.6785+-0.0265        ?
   getter-prototype                                   7.2393+-0.0919            7.2132+-0.0665        
   getter-richards-try-catch                       1522.9624+-21.0320    ?   1541.5680+-23.6719       ? might be 1.0122x slower
   getter-richards                                  118.1818+-27.9387         105.9038+-1.4359          might be 1.1159x faster
   getter                                             6.5079+-0.0373     ?      6.5209+-0.0952        ?
   global-object-access-with-mutating-structure   
                                                      6.9633+-0.1318     ?      7.2594+-0.6013        ? might be 1.0425x slower
   global-var-const-infer-fire-from-opt               1.1829+-0.1546            1.1273+-0.0958          might be 1.0492x faster
   global-var-const-infer                             0.9956+-0.0486            0.9756+-0.0185          might be 1.0205x faster
   hard-overflow-check-equal                         36.1069+-1.2057           35.4628+-0.1120          might be 1.0182x faster
   hard-overflow-check                               35.3305+-0.0602           35.3302+-0.0551        
   HashMap-put-get-iterate-keys                      35.8952+-4.2073           34.1398+-0.3423          might be 1.0514x faster
   HashMap-put-get-iterate                           33.8590+-0.1644     ?     34.1164+-0.6492        ?
   HashMap-string-put-get-iterate                    37.5590+-0.6527     ?     43.4051+-14.1966       ? might be 1.1557x slower
   hoist-make-rope                                    5.6078+-0.0951     ?      5.7280+-0.2638        ? might be 1.0214x slower
   hoist-poly-check-structure-effectful-loop   
                                                      4.3387+-0.0559            4.3097+-0.0744        
   hoist-poly-check-structure                         3.0908+-0.1025     ?      3.1834+-0.1586        ? might be 1.0300x slower
   imul-double-only                                   4.8215+-0.1280            4.7563+-0.1263          might be 1.0137x faster
   imul-int-only                                      7.4237+-0.0360            7.4140+-0.0469        
   imul-mixed                                         5.0756+-0.0885            5.0720+-0.1211        
   in-four-cases                                     23.4564+-0.2275     ?     23.5954+-0.2668        ?
   in-one-case-false                                 14.3851+-0.2087           14.2573+-0.2290        
   in-one-case-true                                  15.5325+-2.9136           14.3069+-0.1383          might be 1.0857x faster
   in-two-cases                                      14.4051+-0.3100     ?     14.4296+-0.1898        ?
   indexed-properties-in-objects                      4.1893+-0.0269     ?      4.2089+-0.0267        ?
   infer-closure-const-then-mov-no-inline             4.1642+-0.0537            4.1307+-0.0299        
   infer-closure-const-then-mov                      12.8798+-0.4442           12.6823+-0.2550          might be 1.0156x faster
   infer-closure-const-then-put-to-scope-no-inline   
                                                     15.5789+-0.0733     ?     15.7153+-0.2061        ?
   infer-closure-const-then-put-to-scope             33.0500+-0.9767           32.9811+-0.8874        
   infer-closure-const-then-reenter-no-inline   
                                                     76.9274+-0.6582           76.7123+-0.1176        
   infer-closure-const-then-reenter                  34.3584+-0.7284     ?     34.7270+-0.3363        ? might be 1.0107x slower
   infer-constant-global-property                     5.1668+-0.0224     ?      5.2604+-0.1860        ? might be 1.0181x slower
   infer-constant-property                            3.9207+-0.0680     ?      3.9341+-0.0373        ?
   infer-one-time-closure-ten-vars                   10.3382+-0.0602           10.3242+-0.0263        
   infer-one-time-closure-two-vars                    9.6653+-0.0624     ?      9.7186+-0.0783        ?
   infer-one-time-closure                             9.6017+-0.0379     ?      9.6141+-0.0395        ?
   infer-one-time-deep-closure                       17.8183+-0.2218           17.5708+-0.0715          might be 1.0141x faster
   inline-arguments-access                            5.1877+-0.1373            5.1781+-0.2186        
   inline-arguments-aliased-access                    5.5066+-0.2842            5.3083+-0.1116          might be 1.0374x faster
   inline-arguments-local-escape                      5.3022+-0.1389     ?      5.3084+-0.1117        ?
   inline-get-scoped-var                              4.7354+-0.0305            4.7285+-0.0264        
   inlined-put-by-id-transition                      12.2202+-0.2268     ?     12.3578+-0.4849        ? might be 1.0113x slower
   inlined-put-by-val-with-string-transition   
                                                     62.5209+-0.4297     ?     62.6252+-0.4308        ?
   inlined-put-by-val-with-symbol-transition   
                                                     62.8344+-0.5252           62.3865+-0.3501        
   instanceof-bound                                  31.5696+-0.6157           31.4603+-0.1222        
   int-or-other-abs-then-get-by-val                   6.8304+-0.0359            6.8241+-0.0426        
   int-or-other-abs-zero-then-get-by-val             24.4081+-0.3112           24.0895+-0.2928          might be 1.0132x faster
   int-or-other-add-then-get-by-val                   6.2264+-0.0601            6.2055+-0.0451        
   int-or-other-add                                   7.2651+-0.0395     ?      7.3292+-0.1362        ?
   int-or-other-div-then-get-by-val                   5.6071+-0.0328            5.6064+-0.0269        
   int-or-other-max-then-get-by-val                   5.8682+-0.0245     ?      5.9004+-0.0357        ?
   int-or-other-min-then-get-by-val                   5.8738+-0.0850     ?      5.9717+-0.2594        ? might be 1.0167x slower
   int-or-other-mod-then-get-by-val                   5.2123+-0.0594     ?      5.2223+-0.0937        ?
   int-or-other-mul-then-get-by-val                   5.2789+-0.0594            5.2701+-0.0414        
   int-or-other-neg-then-get-by-val                   6.3691+-0.0255     ?      6.4218+-0.0988        ?
   int-or-other-neg-zero-then-get-by-val             23.9037+-0.0742           23.8958+-0.1473        
   int-or-other-sub-then-get-by-val                   6.2282+-0.2101     ?      6.2873+-0.2387        ?
   int-or-other-sub                                   5.1840+-0.0328            5.1496+-0.0322        
   int-overflow-local                                 6.0473+-0.1008     ?      6.0677+-0.0512        ?
   Int16Array-alloc-long-lived                       62.8468+-0.2907     ?     62.8699+-0.4970        ?
   Int16Array-bubble-sort-with-byteLength            29.9664+-1.3255     ?     30.5769+-0.8703        ? might be 1.0204x slower
   Int16Array-bubble-sort                            24.5555+-0.3096     ?     24.7281+-0.7713        ?
   Int16Array-load-int-mul                            2.1948+-0.0187     ?      2.2129+-0.0097        ?
   Int16Array-to-Int32Array-set                      65.8331+-0.2850     ?     65.8820+-0.4114        ?
   Int32Array-alloc-large                            17.2617+-0.4015           16.8440+-0.3124          might be 1.0248x faster
   Int32Array-alloc-long-lived                       69.2657+-2.2663           68.9286+-2.5896        
   Int32Array-alloc                                   3.7521+-0.0640     ?      3.7585+-0.1459        ?
   Int32Array-Int8Array-view-alloc                    9.3407+-0.4791            9.1984+-0.4224          might be 1.0155x faster
   int52-spill                                        7.2760+-0.4830            7.0139+-0.0637          might be 1.0374x faster
   Int8Array-alloc-long-lived                        57.6043+-0.4169     ?     57.6668+-0.8404        ?
   Int8Array-load-with-byteLength                     5.0153+-0.0612     ?      5.3296+-0.6608        ? might be 1.0627x slower
   Int8Array-load                                     5.0375+-0.0195     ?      5.5522+-0.8877        ? might be 1.1022x slower
   integer-divide                                    16.1094+-0.0831     ?     17.6361+-3.1195        ? might be 1.0948x slower
   integer-modulo                                     2.3519+-0.0353     ?      2.3669+-0.0366        ?
   is-boolean-fold-tricky                             5.7531+-0.0298            5.7241+-0.0766        
   is-boolean-fold                                    4.2717+-0.6696            3.9740+-0.0373          might be 1.0749x faster
   is-function-fold-tricky-internal-function   
                                                     15.5594+-0.1753     ^     14.9393+-0.1252        ^ definitely 1.0415x faster
   is-function-fold-tricky                            6.0409+-0.0200     !      6.1341+-0.0578        ! definitely 1.0154x slower
   is-function-fold                                   4.0399+-0.0270     ?      4.3310+-0.7196        ? might be 1.0721x slower
   is-number-fold-tricky                              5.9999+-0.0532            5.9789+-0.0501        
   is-number-fold                                     4.0955+-0.2273            4.0511+-0.2114          might be 1.0110x faster
   is-object-or-null-fold-functions                   4.0350+-0.0350     ?      4.0519+-0.0283        ?
   is-object-or-null-fold-less-tricky                 6.1070+-0.0643            6.0841+-0.0535        
   is-object-or-null-fold-tricky                      7.3634+-0.1188     ?      7.4122+-0.2030        ?
   is-object-or-null-fold                             4.0468+-0.0322     ?      4.0517+-0.0493        ?
   is-object-or-null-trickier-function                6.3055+-0.4037            6.1133+-0.0655          might be 1.0314x faster
   is-object-or-null-trickier-internal-function   
                                                     16.7815+-3.6362           15.1963+-0.1405          might be 1.1043x faster
   is-object-or-null-tricky-function                  6.0970+-0.0557     ?      6.1104+-0.0635        ?
   is-object-or-null-tricky-internal-function   
                                                     10.8958+-0.1110     !     11.3734+-0.3179        ! definitely 1.0438x slower
   is-string-fold-tricky                              5.9859+-0.0498            5.9675+-0.0632        
   is-string-fold                                     3.9924+-0.0479            3.9690+-0.0200        
   is-undefined-fold-tricky                           5.0600+-0.0373     ?      5.0718+-0.0853        ?
   is-undefined-fold                                  3.9804+-0.0329            3.9792+-0.0254        
   JSONP-negative-0                                   0.3985+-0.0130     ?      0.4101+-0.0139        ? might be 1.0291x slower
   large-int-captured                                 4.3930+-0.5757            4.2246+-0.2336          might be 1.0399x faster
   large-int-neg                                     19.7072+-0.7862           19.2707+-0.3585          might be 1.0227x faster
   large-int                                         17.5024+-0.2607     ?     17.5494+-0.2737        ?
   load-varargs-elimination                          29.0326+-0.2677     ?     29.0754+-0.2797        ?
   logical-not-weird-types                            3.8886+-0.0711     ?      3.9663+-0.1031        ? might be 1.0200x slower
   logical-not                                        5.8940+-0.0616     ?      5.9741+-0.1340        ? might be 1.0136x slower
   lots-of-fields                                    13.1725+-0.3948           13.1644+-0.1881        
   make-indexed-storage                               3.9971+-0.0525     ^      3.7374+-0.1594        ^ definitely 1.0695x faster
   make-rope-cse                                      5.5727+-0.4701            5.4402+-0.1586          might be 1.0244x faster
   map-for-each                                       7.4753+-0.0419     ?      7.4926+-0.0416        ?
   map-for-of                                        24.7532+-0.1723           24.3918+-0.8776          might be 1.0148x faster
   marsaglia-larger-ints                             48.8179+-0.1725     ?     48.8713+-0.1000        ?
   marsaglia-osr-entry                               26.9283+-0.1566           26.7641+-0.0963        
   math-random                                       23.3682+-0.2214           23.1389+-0.1468        
   math-with-out-of-bounds-array-values              43.4211+-0.1342     ?     43.6467+-0.6143        ?
   max-boolean                                        3.9654+-0.0543     ?      4.0982+-0.3039        ? might be 1.0335x slower
   method-on-number                                  25.8767+-0.6550           25.4478+-0.3200          might be 1.0169x faster
   min-boolean                                        4.0323+-0.0896            3.9725+-0.0400          might be 1.0151x faster
   minus-boolean-double                               4.6540+-0.0770            4.6515+-0.0907        
   minus-boolean                                      3.5413+-0.0338     ?      3.6203+-0.1515        ? might be 1.0223x slower
   misc-strict-eq                                    34.2281+-1.0253           31.9740+-1.4381          might be 1.0705x faster
   mod-boolean-double                                14.9933+-0.1977     ?     15.1786+-0.8462        ? might be 1.0124x slower
   mod-boolean                                       11.5327+-0.2282           11.5303+-0.1568        
   mul-boolean-double                                 5.1750+-0.1158     ?      5.2780+-0.0766        ? might be 1.0199x slower
   mul-boolean                                        4.3407+-0.0697            4.2873+-0.0425          might be 1.0124x faster
   neg-boolean                                        4.6639+-0.0215     ?      4.6791+-0.0422        ?
   negative-zero-divide                               0.5354+-0.0104            0.5341+-0.0138        
   negative-zero-modulo                               0.5377+-0.0276            0.5290+-0.0162          might be 1.0165x faster
   negative-zero-negate                               0.5044+-0.0034     ?      0.5081+-0.0099        ?
   nested-function-parsing                           50.2484+-1.2376           49.4436+-0.2964          might be 1.0163x faster
   new-array-buffer-dead                            117.9307+-0.7414          117.8274+-0.5789        
   new-array-buffer-push                              8.1481+-0.1404            7.9745+-0.1931          might be 1.0218x faster
   new-array-dead                                    13.3529+-0.2519     ?     14.1997+-1.5097        ? might be 1.0634x slower
   new-array-push                                     5.6221+-0.1517     ?      5.6437+-0.1350        ?
   no-inline-constructor                             44.4926+-0.8178     ?     45.4482+-1.2004        ? might be 1.0215x slower
   number-test                                        4.9844+-0.0441            4.9442+-0.0236        
   object-closure-call                                7.0704+-0.0784     ?      7.0767+-0.1459        ?
   object-get-own-property-symbols-on-large-array   
                                                      5.8216+-0.1470     ?      6.0448+-0.2309        ? might be 1.0383x slower
   object-test                                        4.7399+-0.0531     ?      4.8108+-0.1013        ? might be 1.0150x slower
   obvious-sink-pathology-taken                     161.2893+-0.6961     ?    171.8881+-25.9691       ? might be 1.0657x slower
   obvious-sink-pathology                            35.2794+-0.2242           35.0896+-0.2365        
   obviously-elidable-new-object                     32.1866+-0.2072           32.1841+-0.2837        
   plus-boolean-arith                                 3.5977+-0.0481     ?      3.6156+-0.0909        ?
   plus-boolean-double                                4.7802+-0.2117            4.6217+-0.0569          might be 1.0343x faster
   plus-boolean                                       3.8399+-0.0754            3.7281+-0.0816          might be 1.0300x faster
   poly-chain-access-different-prototypes-simple   
                                                      3.9045+-0.0824            3.8848+-0.0099        
   poly-chain-access-different-prototypes             3.7989+-0.0328     ?      3.8145+-0.0282        ?
   poly-chain-access-simpler                          3.8654+-0.0265     ?      3.8915+-0.0572        ?
   poly-chain-access                                  3.7676+-0.0289     ?      3.7831+-0.0322        ?
   poly-stricteq                                     81.6447+-0.1093     ^     79.5761+-0.1712        ^ definitely 1.0260x faster
   polymorphic-array-call                             1.7480+-0.0260     ?      1.7570+-0.0674        ?
   polymorphic-get-by-id                              2.8849+-0.0651     ?      2.9036+-0.1102        ?
   polymorphic-put-by-id                             40.0562+-0.3651           39.9093+-0.3495        
   polymorphic-put-by-val-with-string                41.6633+-0.3204           41.1744+-0.3117          might be 1.0119x faster
   polymorphic-put-by-val-with-symbol                41.4432+-0.3318     ?     41.5225+-0.4110        ?
   polymorphic-structure                             19.2795+-0.4576           18.9647+-0.0582          might be 1.0166x faster
   polyvariant-monomorphic-get-by-id                  7.2101+-0.0538            7.1602+-0.0455        
   proto-getter-access                               16.9752+-0.1914     ?     17.0139+-0.1887        ?
   prototype-access-with-mutating-prototype           6.5910+-0.1723            6.5435+-0.2079        
   put-by-id-replace-and-transition                  11.1862+-0.4890           11.0780+-0.4701        
   put-by-id-slightly-polymorphic                     4.0420+-0.0601            4.0267+-0.0168        
   put-by-id                                         13.7204+-1.1031           13.2573+-0.1585          might be 1.0349x faster
   put-by-val-direct                                  0.6277+-0.0427            0.6039+-0.0138          might be 1.0394x faster
   put-by-val-large-index-blank-indexing-type   
                                                      7.5161+-0.0676     ?      7.6055+-0.1567        ? might be 1.0119x slower
   put-by-val-machine-int                             3.5205+-0.1000     ?      3.5767+-0.0419        ? might be 1.0160x slower
   put-by-val-with-string-replace-and-transition   
                                                     14.4226+-0.2634           14.3203+-0.2858        
   put-by-val-with-string-slightly-polymorphic   
                                                      4.2229+-0.0611            4.2030+-0.0311        
   put-by-val-with-string                            13.8620+-0.2401           13.7765+-0.1361        
   put-by-val-with-symbol-replace-and-transition   
                                                     15.0728+-0.2862           15.0035+-0.1556        
   put-by-val-with-symbol-slightly-polymorphic   
                                                      4.8788+-0.0199     ^      4.8074+-0.0505        ^ definitely 1.0148x faster
   put-by-val-with-symbol                            13.9158+-0.2089           13.8102+-0.1329        
   rare-osr-exit-on-local                            21.1559+-3.2243           19.8445+-0.4429          might be 1.0661x faster
   raytrace-with-empty-try-catch                      9.1619+-0.2675            8.8488+-0.2636          might be 1.0354x faster
   raytrace-with-try-catch                           14.5651+-0.3195           14.4473+-0.3351        
   register-pressure-from-osr                        23.7005+-0.2015           23.6738+-0.1261        
   repeat-multi-get-by-offset                        28.0985+-0.0891     ?     28.1972+-0.1660        ?
   richards-empty-try-catch                          69.7075+-1.2316           69.0013+-0.3595          might be 1.0102x faster
   richards-try-catch                               323.7489+-1.3653     ?    325.2354+-0.7586        ?
   set-for-each                                       6.6721+-0.0799            6.6694+-0.1386        
   set-for-of                                        12.5648+-0.2718     ?     12.5663+-0.1504        ?
   setter-prototype                                   6.8944+-0.0876            6.8838+-0.0420        
   setter                                             6.0511+-0.0880            5.9995+-0.0476        
   simple-activation-demo                            33.3482+-0.1599           33.3228+-0.1840        
   simple-getter-access                              26.1145+-0.1278     ?     26.2340+-0.2771        ?
   simple-poly-call-nested                            8.5837+-0.3788            8.3532+-0.0765          might be 1.0276x faster
   simple-poly-call                                   1.7480+-0.0542     ?      1.7685+-0.0886        ? might be 1.0117x slower
   sin-boolean                                       21.6209+-0.1761     ?     22.0388+-0.5358        ? might be 1.0193x slower
   singleton-scope                                   84.8455+-0.1708           84.8094+-0.0564        
   sink-function                                      9.5870+-0.7307            9.3564+-0.9313          might be 1.0246x faster
   sink-huge-activation                              17.7086+-0.3803     ?     17.9445+-0.2180        ? might be 1.0133x slower
   sinkable-new-object-dag                           76.6638+-2.4568           75.6274+-0.8089          might be 1.0137x faster
   sinkable-new-object-taken                         58.9533+-0.1525     ?     59.1017+-0.4310        ?
   sinkable-new-object                               35.2811+-0.1759           35.2006+-0.1864        
   slow-array-profile-convergence                     3.8170+-0.1078            3.7691+-0.1387          might be 1.0127x faster
   slow-convergence                                   3.8282+-0.0609            3.7904+-0.0245        
   slow-ternaries                                    22.6042+-4.6918           20.7440+-0.3142          might be 1.0897x faster
   sorting-benchmark                                 26.9682+-0.2841     ?     27.4068+-0.3287        ? might be 1.0163x slower
   sparse-conditional                                 1.7260+-0.0323     ?      1.7380+-0.0457        ?
   splice-to-remove                                  20.0354+-0.1000           19.9795+-0.1308        
   string-char-code-at                               21.7851+-0.2144           21.6015+-0.1216        
   string-concat-object                               2.8764+-0.1224     ?      2.9317+-0.1019        ? might be 1.0192x slower
   string-concat-pair-object                          2.8707+-0.1132     ?      2.9160+-0.1448        ? might be 1.0158x slower
   string-concat-pair-simple                         12.7625+-0.0641     ?     13.0876+-0.5591        ? might be 1.0255x slower
   string-concat-simple                              13.0988+-0.1735           12.9944+-0.0643        
   string-cons-repeat                                 9.4752+-0.2765     ?      9.5669+-0.4831        ?
   string-cons-tower                                  9.8091+-0.1315            9.7310+-0.1391        
   string-equality                                   27.2510+-0.2223           27.1876+-0.1806        
   string-from-char-code                             10.2584+-0.0460           10.2129+-0.0704        
   string-get-by-val-big-char                         9.8427+-0.2724            9.6994+-0.3224          might be 1.0148x faster
   string-get-by-val-out-of-bounds-insane             4.9914+-0.1829            4.9114+-0.0483          might be 1.0163x faster
   string-get-by-val-out-of-bounds                    6.6420+-0.0593            6.5940+-0.0567        
   string-get-by-val                                  4.1828+-0.0538     ?      4.2867+-0.1003        ? might be 1.0248x slower
   string-hash                                        2.7746+-0.0319     ?      2.8426+-0.1141        ? might be 1.0245x slower
   string-long-ident-equality                        22.1812+-0.2907     ?     22.3050+-0.1563        ?
   string-out-of-bounds                               9.9604+-0.0583            9.9579+-0.0530        
   string-repeat-arith                               38.2129+-11.6431          33.6110+-0.2549          might be 1.1369x faster
   string-rope-with-object                           23.9638+-0.1755     ?     24.0262+-0.1189        ?
   string-sub                                        54.4128+-0.2465     ?     54.6054+-0.0844        ?
   string-test                                        4.7462+-0.0381     ?      4.8120+-0.0982        ? might be 1.0139x slower
   string-var-equality                               43.1371+-0.6333           42.7549+-0.1945        
   structure-hoist-over-transitions                   3.3874+-0.0263            3.3687+-0.0577        
   substring-concat-weird                            55.0164+-0.3494           54.7564+-0.2089        
   substring-concat                                  60.0378+-0.5526     ?     61.2937+-2.1025        ? might be 1.0209x slower
   substring                                         67.8298+-0.0515     !     68.0756+-0.1271        ! definitely 1.0036x slower
   switch-char-constant                               4.0161+-0.0657            3.9457+-0.0321          might be 1.0179x faster
   switch-char                                        7.8608+-0.0771            7.8452+-0.0542        
   switch-constant                                    9.7530+-0.3011     ?      9.8802+-0.3644        ? might be 1.0130x slower
   switch-string-basic-big-var                       21.5758+-0.1122     ?     21.6736+-0.1823        ?
   switch-string-basic-big                           18.7775+-0.1564           18.7606+-0.2058        
   switch-string-basic-var                           21.3913+-0.1339     ?     21.4017+-0.2234        ?
   switch-string-basic                               17.1540+-0.1059     ?     17.2222+-0.1075        ?
   switch-string-big-length-tower-var                29.5555+-0.2345           29.4424+-0.1582        
   switch-string-length-tower-var                    21.2765+-0.1507           21.2358+-0.0935        
   switch-string-length-tower                        16.4341+-0.1114     ?     16.5332+-0.1548        ?
   switch-string-short                               16.5953+-0.2571           16.4867+-0.1566        
   switch                                            14.1568+-0.4887           14.0163+-1.0122          might be 1.0100x faster
   symbol-tostringtag                                 4.8847+-0.5879            4.6284+-0.0234          might be 1.0554x faster
   tear-off-arguments-simple                          3.5661+-0.0754     ?      3.8981+-0.7746        ? might be 1.0931x slower
   tear-off-arguments                                 4.8554+-0.0536            4.8251+-0.0971        
   temporal-structure                                18.0463+-0.2163     ^     17.6635+-0.1432        ^ definitely 1.0217x faster
   to-int32-boolean                                  20.7237+-0.0992     ?     20.8977+-0.2309        ?
   try-catch-get-by-val-cloned-arguments              9.3968+-0.2194     ?      9.9892+-0.4079        ? might be 1.0630x slower
   try-catch-get-by-val-direct-arguments              2.9506+-0.0744     ?      2.9631+-0.0840        ?
   try-catch-get-by-val-scoped-arguments              6.1166+-0.1185     ?      6.1982+-0.1491        ? might be 1.0133x slower
   typed-array-get-set-by-val-profiling              29.9327+-0.1569     ?     30.1447+-0.1995        ?
   undefined-property-access                        435.9730+-0.2449     ?    437.3591+-1.9004        ?
   undefined-test                                     5.0366+-0.0469            5.0291+-0.0438        
   unprofiled-licm                                    9.1922+-0.1477            9.1775+-0.2300        
   untyped-string-from-char-code                     16.3684+-0.2298     ?     16.4197+-0.3229        ?
   v8-raytrace-with-empty-try-catch                  75.0970+-0.6355     ?     77.3665+-2.3118        ? might be 1.0302x slower
   v8-raytrace-with-try-catch-high-frequency-throws   
                                                    580.7301+-3.2505     ?    582.5197+-4.6125        ?
   v8-raytrace-with-try-catch                        94.5211+-0.9413     ?     94.6595+-0.4332        ?
   v8-regexp-search                                  78.4705+-0.3415     ?     87.4689+-20.0549       ? might be 1.1147x slower
   varargs-call                                      18.4760+-0.0450           18.4552+-0.1062        
   varargs-construct-inline                          27.9250+-0.5593     ?     28.5342+-0.5965        ? might be 1.0218x slower
   varargs-construct                                 36.8081+-0.1368     ?     37.1172+-0.5674        ?
   varargs-inline                                    12.4366+-0.0578     ?     12.4807+-0.0863        ?
   varargs-strict-mode                               14.0750+-0.1488     ?     14.8805+-1.7868        ? might be 1.0572x slower
   varargs                                           14.4083+-1.1871           14.2198+-0.7897          might be 1.0133x faster
   weird-inlining-const-prop                          2.9881+-0.0553     ?      3.0102+-0.0745        ?

   &lt;geometric&gt;                                       12.3082+-0.0118           12.3025+-0.0318          might be 1.0005x faster

                                                            og                   proxyChange                                    
AsmBench:
   bigfib.cpp                                       656.3740+-9.9477     ?    661.2441+-10.4875       ?
   cray.c                                           561.7526+-0.9358     ?    561.8357+-1.3565        ?
   dry.c                                            699.0316+-75.1415    ?    708.3568+-76.2570       ? might be 1.0133x slower
   FloatMM.c                                       1102.5650+-7.5409         1101.4511+-6.6142        
   gcc-loops.cpp                                   5536.2467+-7.3613     ?   5550.9092+-13.0143       ?
   n-body.c                                        1245.2029+-2.0641     ?   1246.5170+-3.9409        ?
   Quicksort.c                                      617.1970+-4.5458     ?    617.3183+-4.5441        ?
   stepanov_container.cpp                          5162.4799+-52.0534        5143.1206+-24.4504       
   Towers.c                                         413.6564+-1.1582          412.7647+-0.7648        

   &lt;geometric&gt;                                     1110.3760+-11.7796    ?   1112.5813+-15.2551       ? might be 1.0020x slower

                                                            og                   proxyChange                                    
CompressionBench:
   huffman                                           44.2266+-0.6327           44.1172+-0.2114        
   arithmetic-simple                                407.7043+-10.5615         403.3882+-1.2796          might be 1.0107x faster
   arithmetic-precise                               374.8503+-0.8862     ?    376.9473+-2.3662        ?
   arithmetic-complex-precise                       377.2675+-1.9009     ?    380.9084+-2.2982        ?
   arithmetic-precise-order-0                       408.4185+-1.2078     ?    408.5169+-0.7248        ?
   arithmetic-precise-order-1                       459.4550+-1.5960     ?    462.4607+-1.6116        ?
   arithmetic-precise-order-2                       528.0421+-2.7235     ?    529.2390+-3.0640        ?
   arithmetic-simple-order-1                        473.9734+-2.2016     ?    476.3744+-1.7762        ?
   arithmetic-simple-order-2                        549.1588+-4.3257     ?    552.4953+-3.6972        ?
   lz-string                                        493.1142+-6.5482          491.6933+-10.1734       

   &lt;geometric&gt;                                      355.6859+-1.2905     ?    356.3841+-0.8571        ? might be 1.0020x slower

                                                            og                   proxyChange                                    
Geomean of preferred means:
   &lt;scaled-result&gt;                                   73.3035+-0.2457           73.2189+-0.1492          might be 1.0012x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1168198</commentid>
    <comment_count>12</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-25 13:29:16 -0800</bug_when>
    <thetext>Dynbench results:

3 runs of baseline version:
Non Strict Dynamic Get By Id: 25.459114 ms.
Non Strict Dynamic Put By Id Replace: 57.614040 ms.
Non Strict Dynamic Allocation and Put By Id Transition: 105.483635 ms.
Non Strict Dynamic Get By Id With Dynamic Store Context: 20.167006 ms.
Non Strict Dynamic Put By Id Replace With Dynamic Store Context: 37.867042 ms.
Non Strict Dynamic Allocation and Put By Id Transition With Dynamic Store Context: 84.399685 ms.
~/WK/a/OpenSource $ DYLD_FRAMEWORK_PATH=WebKitBuild/Release/ WebKitBuild/Release/dynbench 
Non Strict Dynamic Get By Id: 21.886131 ms.
Non Strict Dynamic Put By Id Replace: 66.505328 ms.
Non Strict Dynamic Allocation and Put By Id Transition: 107.604908 ms.
Non Strict Dynamic Get By Id With Dynamic Store Context: 20.194181 ms.
Non Strict Dynamic Put By Id Replace With Dynamic Store Context: 33.599729 ms.
Non Strict Dynamic Allocation and Put By Id Transition With Dynamic Store Context: 87.153118 ms.
~/WK/a/OpenSource $ DYLD_FRAMEWORK_PATH=WebKitBuild/Release/ WebKitBuild/Release/dynbench 
Non Strict Dynamic Get By Id: 20.796533 ms.
Non Strict Dynamic Put By Id Replace: 58.799648 ms.
Non Strict Dynamic Allocation and Put By Id Transition: 107.189133 ms.
Non Strict Dynamic Get By Id With Dynamic Store Context: 20.269449 ms.
Non Strict Dynamic Put By Id Replace With Dynamic Store Context: 33.956090 ms.
Non Strict Dynamic Allocation and Put By Id Transition With Dynamic Store Context: 82.797676 ms.


3 runs of proxy changes:
Non Strict Dynamic Get By Id: 21.082398 ms.
Non Strict Dynamic Put By Id Replace: 59.691301 ms.
Non Strict Dynamic Allocation and Put By Id Transition: 105.253568 ms.
Non Strict Dynamic Get By Id With Dynamic Store Context: 20.553612 ms.
Non Strict Dynamic Put By Id Replace With Dynamic Store Context: 35.185132 ms.
Non Strict Dynamic Allocation and Put By Id Transition With Dynamic Store Context: 82.790028 ms.
~/WK/b/OpenSource $ DYLD_FRAMEWORK_PATH=./WebKitBuild/Release/ ./WebKitBuild/Release/dynbench 
Non Strict Dynamic Get By Id: 21.738562 ms.
Non Strict Dynamic Put By Id Replace: 58.487482 ms.
Non Strict Dynamic Allocation and Put By Id Transition: 105.037340 ms.
Non Strict Dynamic Get By Id With Dynamic Store Context: 20.408665 ms.
Non Strict Dynamic Put By Id Replace With Dynamic Store Context: 35.811473 ms.
Non Strict Dynamic Allocation and Put By Id Transition With Dynamic Store Context: 90.754568 ms.
~/WK/b/OpenSource $ DYLD_FRAMEWORK_PATH=./WebKitBuild/Release/ ./WebKitBuild/Release/dynbench 
Non Strict Dynamic Get By Id: 21.018869 ms.
Non Strict Dynamic Put By Id Replace: 57.060267 ms.
Non Strict Dynamic Allocation and Put By Id Transition: 105.995514 ms.
Non Strict Dynamic Get By Id With Dynamic Store Context: 20.414194 ms.
Non Strict Dynamic Put By Id Replace With Dynamic Store Context: 35.766752 ms.
Non Strict Dynamic Allocation and Put By Id Transition With Dynamic Store Context: 83.488039 ms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1168248</commentid>
    <comment_count>13</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-02-25 14:58:55 -0800</bug_when>
    <thetext>landed in:
http://trac.webkit.org/changeset/197136</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>271983</attachid>
            <date>2016-02-22 19:29:17 -0800</date>
            <delta_ts>2016-02-22 19:30:28 -0800</delta_ts>
            <desc>RFC WIP</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>30428</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5jcHAJKHJldmlz
aW9uIDE5Njg3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDIyLDYgKzQyMiwxMSBAQCB2b2lkIEpTT2JqZWN0OjpwdXRJ
bmxpbmVTbG93KEV4ZWNTdGF0ZSogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQog
ICAgICAgICB9CisgICAgICAgIGlmIChvYmotPnR5cGUoKSA9PSBQcm94eU9iamVjdFR5cGUpIHsK
KyAgICAgICAgICAgIFByb3h5T2JqZWN0KiBwcm94eSA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KG9i
aik7CisgICAgICAgICAgICBwcm94eS0+UHJveHlPYmplY3Q6OnB1dChwcm94eSwgZXhlYywgcHJv
cGVydHlOYW1lLCB2YWx1ZSwgc2xvdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
ICAgICAgICAgSlNWYWx1ZSBwcm90b3R5cGUgPSBvYmotPnByb3RvdHlwZSgpOwogICAgICAgICBp
ZiAocHJvdG90eXBlLmlzTnVsbCgpKQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTE2LDYgKzE5
MjEsMTIgQEAgYm9vbCBKU09iamVjdDo6YXR0ZW1wdFRvSW50ZXJjZXB0UHV0QnlJbgogICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAg
ICAgaWYgKGN1cnJlbnQtPnR5cGUoKSA9PSBQcm94eU9iamVjdFR5cGUpIHsKKyAgICAgICAgICAg
IFByb3h5T2JqZWN0KiBwcm94eSA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KGN1cnJlbnQpOworICAg
ICAgICAgICAgcHJveHktPnB1dEJ5SW5kZXhDb21tb24oZXhlYywgdGhpc1ZhbHVlLCBpLCB2YWx1
ZSwgc2hvdWxkVGhyb3cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAg
ICAgICAgCiAgICAgICAgIEpTVmFsdWUgcHJvdG90eXBlVmFsdWUgPSBjdXJyZW50LT5wcm90b3R5
cGUoKTsKICAgICAgICAgaWYgKHByb3RvdHlwZVZhbHVlLmlzTnVsbCgpKQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5oCShyZXZpc2lvbiAxOTY4NzEpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBA
IC04NTUsNiArODU1LDcgQEAgcHJpdmF0ZToKICAgICAgICAgCiAgICAgdGVtcGxhdGU8UHV0TW9k
ZT4KICAgICBib29sIHB1dERpcmVjdEludGVybmFsKFZNJiwgUHJvcGVydHlOYW1lLCBKU1ZhbHVl
LCB1bnNpZ25lZCBhdHRyLCBQdXRQcm9wZXJ0eVNsb3QmKTsKKyAgICBib29sIGNhblBlcmZvcm1G
YXN0UHV0SW5saW5lKEV4ZWNTdGF0ZSogZXhlYywgVk0mLCBQcm9wZXJ0eU5hbWUpOwogCiAgICAg
SlNfRVhQT1JUX1BSSVZBVEUgTkVWRVJfSU5MSU5FIHZvaWQgcHV0SW5saW5lU2xvdyhFeGVjU3Rh
dGUqLCBQcm9wZXJ0eU5hbWUsIEpTVmFsdWUsIFB1dFByb3BlcnR5U2xvdCYpOwogCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdElubGluZXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdElubGluZXMuaAkocmV2
aXNpb24gMTk2ODcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPYmplY3RJ
bmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDI4IEBACiAKIG5hbWVzcGFjZSBK
U0MgewogCitBTFdBWVNfSU5MSU5FIGJvb2wgSlNPYmplY3Q6OmNhblBlcmZvcm1GYXN0UHV0SW5s
aW5lKEV4ZWNTdGF0ZSogZXhlYywgVk0mIHZtLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lKQor
eworICAgIGlmIChVTkxJS0VMWShwcm9wZXJ0eU5hbWUgPT0gZXhlYy0+cHJvcGVydHlOYW1lcygp
LnVuZGVyc2NvcmVQcm90bykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENoZWNr
IGlmIHRoZXJlIGFyZSBhbnkgc2V0dGVycyBvciBnZXR0ZXJzIGluIHRoZSBwcm90b3R5cGUgY2hh
aW4KKyAgICBKU1ZhbHVlIHByb3RvdHlwZTsKKyAgICBKU09iamVjdCogb2JqID0gdGhpczsKKyAg
ICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAob2JqLT5zdHJ1Y3R1cmUodm0pLT5oYXNSZWFk
T25seU9yR2V0dGVyU2V0dGVyUHJvcGVydGllc0V4Y2x1ZGluZ1Byb3RvKCkgfHwgb2JqLT50eXBl
KCkgPT0gUHJveHlPYmplY3RUeXBlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIHByb3RvdHlwZSA9IG9iai0+cHJvdG90eXBlKCk7CisgICAgICAgIGlmIChwcm90b3R5cGUu
aXNOdWxsKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBvYmogPSBhc09i
amVjdChwcm90b3R5cGUpOworICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVE
KCk7Cit9CisKIC8vIEVDTUEgOC42LjIuMgogQUxXQVlTX0lOTElORSB2b2lkIEpTT2JqZWN0Ojpw
dXRJbmxpbmUoSlNDZWxsKiBjZWxsLCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9w
ZXJ0eU5hbWUsIEpTVmFsdWUgdmFsdWUsIFB1dFByb3BlcnR5U2xvdCYgc2xvdCkKIHsKQEAgLTQ0
LDIzICs2NiwxNCBAQCBBTFdBWVNfSU5MSU5FIHZvaWQgSlNPYmplY3Q6OnB1dElubGluZShKCiAg
ICAgICAgIHB1dEJ5SW5kZXgodGhpc09iamVjdCwgZXhlYywgaW5kZXgudmFsdWUoKSwgdmFsdWUs
IHNsb3QuaXNTdHJpY3RNb2RlKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIAotICAg
IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgc2V0dGVycyBvciBnZXR0ZXJzIGluIHRoZSBwcm90
b3R5cGUgY2hhaW4KLSAgICBKU1ZhbHVlIHByb3RvdHlwZTsKLSAgICBpZiAocHJvcGVydHlOYW1l
ICE9IGV4ZWMtPnByb3BlcnR5TmFtZXMoKS51bmRlcnNjb3JlUHJvdG8pIHsKLSAgICAgICAgZm9y
IChKU09iamVjdCogb2JqID0gdGhpc09iamVjdDsgIW9iai0+c3RydWN0dXJlKHZtKS0+aGFzUmVh
ZE9ubHlPckdldHRlclNldHRlclByb3BlcnRpZXNFeGNsdWRpbmdQcm90bygpOyBvYmogPSBhc09i
amVjdChwcm90b3R5cGUpKSB7Ci0gICAgICAgICAgICBwcm90b3R5cGUgPSBvYmotPnByb3RvdHlw
ZSgpOwotICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5pc051bGwoKSkgewotICAgICAgICAgICAg
ICAgIEFTU0VSVCghdGhpc09iamVjdC0+c3RydWN0dXJlKHZtKS0+cHJvdG90eXBlQ2hhaW5NYXlJ
bnRlcmNlcHRTdG9yZVRvKGV4ZWMtPnZtKCksIHByb3BlcnR5TmFtZSkpOwotICAgICAgICAgICAg
ICAgIGlmICghdGhpc09iamVjdC0+cHV0RGlyZWN0SW50ZXJuYWw8UHV0TW9kZVB1dD4odm0sIHBy
b3BlcnR5TmFtZSwgdmFsdWUsIDAsIHNsb3QpCi0gICAgICAgICAgICAgICAgICAgICYmIHNsb3Qu
aXNTdHJpY3RNb2RlKCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93VHlwZUVycm9yKGV4ZWMs
IEFTQ0lJTGl0ZXJhbChTdHJpY3RNb2RlUmVhZG9ubHlQcm9wZXJ0eVdyaXRlRXJyb3IpKTsKLSAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiAK
LSAgICB0aGlzT2JqZWN0LT5wdXRJbmxpbmVTbG93KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUs
IHNsb3QpOworICAgIGlmICh0aGlzT2JqZWN0LT5jYW5QZXJmb3JtRmFzdFB1dElubGluZShleGVj
LCB2bSwgcHJvcGVydHlOYW1lKSkgeworICAgICAgICBBU1NFUlQoIXRoaXNPYmplY3QtPnN0cnVj
dHVyZSh2bSktPnByb3RvdHlwZUNoYWluTWF5SW50ZXJjZXB0U3RvcmVUbyhleGVjLT52bSgpLCBw
cm9wZXJ0eU5hbWUpKTsKKyAgICAgICAgaWYgKCF0aGlzT2JqZWN0LT5wdXREaXJlY3RJbnRlcm5h
bDxQdXRNb2RlUHV0Pih2bSwgcHJvcGVydHlOYW1lLCB2YWx1ZSwgMCwgc2xvdCkKKyAgICAgICAg
ICAgICYmIHNsb3QuaXNTdHJpY3RNb2RlKCkpCisgICAgICAgICAgICB0aHJvd1R5cGVFcnJvcihl
eGVjLCBBU0NJSUxpdGVyYWwoU3RyaWN0TW9kZVJlYWRvbmx5UHJvcGVydHlXcml0ZUVycm9yKSk7
CisgICAgfSBlbHNlCisgICAgICAgIHRoaXNPYmplY3QtPnB1dElubGluZVNsb3coZXhlYywgcHJv
cGVydHlOYW1lLCB2YWx1ZSwgc2xvdCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNUeXBlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNUeXBlLmgJKHJldmlzaW9uIDE5Njg3MSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTVHlwZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC03OCw3ICs3OCw5IEBAIGVudW0gSlNUeXBlIDogdWludDhfdCB7CiAgICAgR2xvYmFsT2JqZWN0
VHlwZSwKICAgICBDbG9zdXJlT2JqZWN0VHlwZSwKIAotICAgIExhc3RKU0NPYmplY3RUeXBlID0g
Q2xvc3VyZU9iamVjdFR5cGUsCisgICAgUHJveHlPYmplY3RUeXBlLAorCisgICAgTGFzdEpTQ09i
amVjdFR5cGUgPSBQcm94eU9iamVjdFR5cGUsCiB9OwogCiBDT01QSUxFX0FTU0VSVChzaXplb2Yo
SlNUeXBlKSA9PSBzaXplb2YodWludDhfdCksIHNpemVvZl9qc3R5cGVfaXNfb25lX2J5dGUpOwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJveHlPYmplY3QuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb3h5T2JqZWN0LmNwcAko
cmV2aXNpb24gMTk2ODcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJveHlP
YmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMDAsNiArMzAwLDg5IEBAIGJvb2wgUHJveHlP
YmplY3Q6OmdldE93blByb3BlcnR5U2xvdEJ5SW4KICAgICByZXR1cm4gdGhpc09iamVjdC0+Z2V0
T3duUHJvcGVydHlTbG90Q29tbW9uKGV4ZWMsIGlkZW50LmltcGwoKSwgc2xvdCk7CiB9CiAKK3Rl
bXBsYXRlIDx0eXBlbmFtZSBQZXJmb3JtRGVmYXVsdFB1dEZ1bmN0aW9uPgordm9pZCBQcm94eU9i
amVjdDo6cHV0Q29tbW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBwdXRWYWx1ZSwgSlNWYWx1
ZSB0aGlzVmFsdWUsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFBlcmZvcm1EZWZhdWx0UHV0
RnVuY3Rpb24gcGVyZm9ybURlZmF1bHRQdXRGdW5jdGlvbikKK3sKKyAgICBWTSYgdm0gPSBleGVj
LT52bSgpOworICAgIEpTVmFsdWUgaGFuZGxlclZhbHVlID0gdGhpcy0+aGFuZGxlcigpOworICAg
IGlmIChoYW5kbGVyVmFsdWUuaXNOdWxsKCkpIHsKKyAgICAgICAgdGhyb3dWTVR5cGVFcnJvcihl
eGVjLCBBU0NJSUxpdGVyYWwoIlByb3h5ICdoYW5kbGVyJyBpcyBudWxsLiBJdCBzaG91bGQgYmUg
YW4gT2JqZWN0LiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEpTT2JqZWN0KiBo
YW5kbGVyID0ganNDYXN0PEpTT2JqZWN0Kj4oaGFuZGxlclZhbHVlKTsKKyAgICBDYWxsRGF0YSBj
YWxsRGF0YTsKKyAgICBDYWxsVHlwZSBjYWxsVHlwZTsKKyAgICBKU1ZhbHVlIHNldE1ldGhvZCA9
IGhhbmRsZXItPmdldE1ldGhvZChleGVjLCBjYWxsRGF0YSwgY2FsbFR5cGUsIHZtLnByb3BlcnR5
TmFtZXMtPnNldCwgQVNDSUlMaXRlcmFsKCInc2V0JyBwcm9wZXJ0eSBvZiBhIFByb3h5J3MgaGFu
ZGxlciBzaG91bGQgYmUgY2FsbGFibGUuIikpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24o
KSkKKyAgICAgICAgcmV0dXJuOworICAgIEpTT2JqZWN0KiB0YXJnZXQgPSB0aGlzLT50YXJnZXQo
KTsKKyAgICBpZiAoc2V0TWV0aG9kLmlzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgcGVyZm9ybURl
ZmF1bHRQdXRGdW5jdGlvbigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTWFya2Vk
QXJndW1lbnRCdWZmZXIgYXJndW1lbnRzOworICAgIGFyZ3VtZW50cy5hcHBlbmQodGFyZ2V0KTsK
KyAgICBhcmd1bWVudHMuYXBwZW5kKGlkZW50aWZpZXJUb1NhZmVQdWJsaWNKU1ZhbHVlKHZtLCBJ
ZGVudGlmaWVyOjpmcm9tVWlkKCZ2bSwgcHJvcGVydHlOYW1lLnVpZCgpKSkpOworICAgIGFyZ3Vt
ZW50cy5hcHBlbmQocHV0VmFsdWUpOworICAgIGFyZ3VtZW50cy5hcHBlbmQodGhpc1ZhbHVlKTsK
KyAgICBKU1ZhbHVlIHRyYXBSZXN1bHQgPSBjYWxsKGV4ZWMsIHNldE1ldGhvZCwgY2FsbFR5cGUs
IGNhbGxEYXRhLCBoYW5kbGVyLCBhcmd1bWVudHMpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRp
b24oKSkKKyAgICAgICAgcmV0dXJuOworICAgIGJvb2wgdHJhcFJlc3VsdEFzQm9vbCA9IHRyYXBS
ZXN1bHQudG9Cb29sZWFuKGV4ZWMpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAg
ICAgICAgcmV0dXJuOworICAgIGlmICghdHJhcFJlc3VsdEFzQm9vbCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgaWYgKHRhcmdldC0+
Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGV4ZWMsIHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcikp
IHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuaXNEYXRhRGVzY3JpcHRvcigpICYmICFkZXNjcmlw
dG9yLmNvbmZpZ3VyYWJsZSgpICYmICFkZXNjcmlwdG9yLndyaXRhYmxlKCkpIHsKKyAgICAgICAg
ICAgIGlmICghc2FtZVZhbHVlKGV4ZWMsIGRlc2NyaXB0b3IudmFsdWUoKSwgcHV0VmFsdWUpKSB7
CisgICAgICAgICAgICAgICAgdGhyb3dWTVR5cGVFcnJvcihleGVjLCBBU0NJSUxpdGVyYWwoIlBy
b3h5IGhhbmRsZXIncyAnc2V0JyBvbiBhIG5vbi1jb25maWd1cmFibGUgYW5kIG5vbi13cml0YWJs
ZSBwcm9wZXJ0eSBvbiAndGFyZ2V0JyBzaG91bGQgZWl0aGVyIHJldHVybiBmYWxzZSBvciBiZSB0
aGUgc2FtZSB2YWx1ZSBhbHJlYWR5IG9uIHRoZSAndGFyZ2V0Jy4iKSk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3Iu
aXNBY2Nlc3NvckRlc2NyaXB0b3IoKSAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUoKSAmJiBk
ZXNjcmlwdG9yLnNldHRlcigpLmlzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIHRocm93Vk1U
eXBlRXJyb3IoZXhlYywgQVNDSUlMaXRlcmFsKCJQcm94eSBoYW5kbGVyJ3MgJ3NldCcgbWV0aG9k
IG9uIGEgbm9uLWNvbmZpZ3VyYWJsZSBhY2Nlc3NvciBwcm9wZXJ0eSB3aXRob3V0IGEgc2V0dGVy
IHNob3VsZCByZXR1cm4gZmFsc2UuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgfQorfQorCit2b2lkIFByb3h5T2JqZWN0OjpwdXQoSlNDZWxsKiBjZWxsLCBFeGVjU3Rh
dGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUgdmFsdWUsIFB1dFBy
b3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIFByb3h5
T2JqZWN0KiB0aGlzT2JqZWN0ID0ganNDYXN0PFByb3h5T2JqZWN0Kj4oY2VsbCk7CisgICAgYXV0
byBwZXJmb3JtRGVmYXVsdFB1dCA9IFsmXSAoKSB7CisgICAgICAgIEpTT2JqZWN0KiB0YXJnZXQg
PSBqc0Nhc3Q8SlNPYmplY3QqPih0aGlzT2JqZWN0LT50YXJnZXQoKSk7CisgICAgICAgIHRhcmdl
dC0+bWV0aG9kVGFibGUodm0pLT5wdXQodGFyZ2V0LCBleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVl
LCBzbG90KTsKKyAgICB9OworICAgIHRoaXNPYmplY3QtPnB1dENvbW1vbihleGVjLCB2YWx1ZSwg
c2xvdC50aGlzVmFsdWUoKSwgcHJvcGVydHlOYW1lLCBwZXJmb3JtRGVmYXVsdFB1dCk7Cit9CisK
K3ZvaWQgUHJveHlPYmplY3Q6OnB1dEJ5SW5kZXhDb21tb24oRXhlY1N0YXRlKiBleGVjLCBKU1Zh
bHVlIHRoaXNWYWx1ZSwgdW5zaWduZWQgcHJvcGVydHlOYW1lLCBKU1ZhbHVlIHB1dFZhbHVlLCBi
b29sIHNob3VsZFRocm93KQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgSWRlbnRp
ZmllciBpZGVudCA9IElkZW50aWZpZXI6OmZyb20oZXhlYywgcHJvcGVydHlOYW1lKTsgCisgICAg
aWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm47CisgICAgYXV0byBwZXJm
b3JtRGVmYXVsdFB1dCA9IFsmXSAoKSB7CisgICAgICAgIEpTT2JqZWN0KiB0YXJnZXQgPSB0aGlz
LT50YXJnZXQoKTsKKyAgICAgICAgYm9vbCBpc1N0cmljdE1vZGUgPSBzaG91bGRUaHJvdzsKKyAg
ICAgICAgUHV0UHJvcGVydHlTbG90IHNsb3QodGhpc1ZhbHVlLCBpc1N0cmljdE1vZGUpOworICAg
ICAgICB0YXJnZXQtPm1ldGhvZFRhYmxlKHZtKS0+cHV0KHRhcmdldCwgZXhlYywgaWRlbnQuaW1w
bCgpLCBwdXRWYWx1ZSwgc2xvdCk7CisgICAgICAgIC8vdGFyZ2V0LT5tZXRob2RUYWJsZSh2bSkt
PnB1dEJ5SW5kZXgodGFyZ2V0LCBleGVjLCBwcm9wZXJ0eU5hbWUsIHB1dFZhbHVlLCBzaG91bGRU
aHJvdyk7CisgICAgfTsKKyAgICBwdXRDb21tb24oZXhlYywgcHV0VmFsdWUsIHRoaXNWYWx1ZSwg
aWRlbnQuaW1wbCgpLCBwZXJmb3JtRGVmYXVsdFB1dCk7Cit9CisKK3ZvaWQgUHJveHlPYmplY3Q6
OnB1dEJ5SW5kZXgoSlNDZWxsKiBjZWxsLCBFeGVjU3RhdGUqIGV4ZWMsIHVuc2lnbmVkIHByb3Bl
cnR5TmFtZSwgSlNWYWx1ZSB2YWx1ZSwgYm9vbCBzaG91bGRUaHJvdykKK3sKKyAgICBQcm94eU9i
amVjdCogdGhpc09iamVjdCA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KGNlbGwpOworICAgIHRoaXNP
YmplY3QtPnB1dEJ5SW5kZXhDb21tb24oZXhlYywgdGhpc09iamVjdCwgcHJvcGVydHlOYW1lLCB2
YWx1ZSwgc2hvdWxkVGhyb3cpOworfQorCiBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBwZXJmb3JtUHJveHlDYWxsKEV4ZWNTdGF0ZSogZXhlYykKIHsKICAgICBWTSYgdm0gPSBl
eGVjLT52bSgpOwpAQCAtMzQ1LDE2ICs0MjgsNiBAQCBDYWxsVHlwZSBQcm94eU9iamVjdDo6Z2V0
Q2FsbERhdGEoSlNDZWxsCiAgICAgcmV0dXJuIENhbGxUeXBlSG9zdDsKIH0KIAotdm9pZCBQcm94
eU9iamVjdDo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9y
KQotewotICAgIFByb3h5T2JqZWN0KiB0aGlzT2JqZWN0ID0ganNDYXN0PFByb3h5T2JqZWN0Kj4o
Y2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkp
OwotICAgIEJhc2U6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0KLSAgICB2
aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV90YXJnZXQpOwotICAgIHZpc2l0b3IuYXBwZW5k
KCZ0aGlzT2JqZWN0LT5tX2hhbmRsZXIpOwotfQotCiBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlND
X0hPU1RfQ0FMTCBwZXJmb3JtUHJveHlDb25zdHJ1Y3QoRXhlY1N0YXRlKiBleGVjKQogewogICAg
IFZNJiB2bSA9IGV4ZWMtPnZtKCk7CkBAIC00MDUsNCArNDc4LDE0IEBAIENvbnN0cnVjdFR5cGUg
UHJveHlPYmplY3Q6OmdldENvbnN0cnVjdEQKICAgICByZXR1cm4gQ29uc3RydWN0VHlwZUhvc3Q7
CiB9CiAKK3ZvaWQgUHJveHlPYmplY3Q6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90
VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBQcm94eU9iamVjdCogdGhpc09iamVjdCA9IGpzQ2Fz
dDxQcm94eU9iamVjdCo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhp
c09iamVjdCwgaW5mbygpKTsKKyAgICBCYXNlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZp
c2l0b3IpOworCisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdGFyZ2V0KTsKKyAg
ICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9oYW5kbGVyKTsKK30KKwogfSAvLyBuYW1l
c3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Qcm94eU9iamVj
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb3h5T2Jq
ZWN0LmgJKHJldmlzaW9uIDE5Njg3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L1Byb3h5T2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTM1LDcgKzM1LDcgQEAgY2xhc3MgUHJv
eHlPYmplY3QgOiBwdWJsaWMgSlNOb25GaW5hbE9iagogcHVibGljOgogICAgIHR5cGVkZWYgSlNO
b25GaW5hbE9iamVjdCBCYXNlOwogCi0gICAgY29uc3Qgc3RhdGljIHVuc2lnbmVkIFN0cnVjdHVy
ZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBPdmVycmlkZXNHZXRPd25Qcm9wZXJ0eVNs
b3QgfCBUeXBlT2ZTaG91bGRDYWxsR2V0Q2FsbERhdGE7CisgICAgY29uc3Qgc3RhdGljIHVuc2ln
bmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBPdmVycmlkZXNHZXRP
d25Qcm9wZXJ0eVNsb3QgfCBUeXBlT2ZTaG91bGRDYWxsR2V0Q2FsbERhdGEgfCBJbnRlcmNlcHRz
R2V0T3duUHJvcGVydHlTbG90QnlJbmRleEV2ZW5XaGVuTGVuZ3RoSXNOb3RaZXJvOwogCiAgICAg
c3RhdGljIFByb3h5T2JqZWN0KiBjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBTdHJ1Y3R1cmUqIHN0
cnVjdHVyZSwgSlNWYWx1ZSB0YXJnZXQsIEpTVmFsdWUgaGFuZGxlcikKICAgICB7CkBAIC00Nyw3
ICs0Nyw3IEBAIHB1YmxpYzoKIAogICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVy
ZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG90eXBl
KQogICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmpl
Y3QsIHByb3RvdHlwZSwgVHlwZUluZm8oT2JqZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZv
KCkpOyAKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3Qs
IHByb3RvdHlwZSwgVHlwZUluZm8oUHJveHlPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGlu
Zm8oKSwgTm9uQXJyYXkgfCBNYXlIYXZlSW5kZXhlZEFjY2Vzc29ycyk7CiAgICAgfQogCiAgICAg
REVDTEFSRV9FWFBPUlRfSU5GTzsKQEAgLTU1LDYgKzU1LDEwIEBAIHB1YmxpYzoKICAgICBKU09i
amVjdCogdGFyZ2V0KCkgeyByZXR1cm4gbV90YXJnZXQuZ2V0KCk7IH0KICAgICBKU1ZhbHVlIGhh
bmRsZXIoKSB7IHJldHVybiBtX2hhbmRsZXIuZ2V0KCk7IH0KIAorICAgIHN0YXRpYyB2b2lkIHB1
dChKU0NlbGwqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWUsIEpTVmFsdWUsIFB1dFByb3BlcnR5
U2xvdCYpOworICAgIHN0YXRpYyB2b2lkIHB1dEJ5SW5kZXgoSlNDZWxsKiwgRXhlY1N0YXRlKiwg
dW5zaWduZWQgcHJvcGVydHlOYW1lLCBKU1ZhbHVlLCBib29sIHNob3VsZFRocm93KTsKKyAgICB2
b2lkIHB1dEJ5SW5kZXhDb21tb24oRXhlY1N0YXRlKiwgSlNWYWx1ZSB0aGlzVmFsdWUsIHVuc2ln
bmVkIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSBwdXRWYWx1ZSwgYm9vbCBzaG91bGRUaHJvdyk7CisK
IHByaXZhdGU6CiAgICAgUHJveHlPYmplY3QoVk0mLCBTdHJ1Y3R1cmUqKTsKICAgICB2b2lkIGZp
bmlzaENyZWF0aW9uKFZNJiwgRXhlY1N0YXRlKiwgSlNWYWx1ZSB0YXJnZXQsIEpTVmFsdWUgaGFu
ZGxlcik7CkBAIC02MywxMSArNjcsMTQgQEAgcHJpdmF0ZToKICAgICBzdGF0aWMgYm9vbCBnZXRP
d25Qcm9wZXJ0eVNsb3RCeUluZGV4KEpTT2JqZWN0KiwgRXhlY1N0YXRlKiwgdW5zaWduZWQgcHJv
cGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmKTsKICAgICBzdGF0aWMgQ2FsbFR5cGUgZ2V0Q2FsbERh
dGEoSlNDZWxsKiwgQ2FsbERhdGEmKTsKICAgICBzdGF0aWMgQ29uc3RydWN0VHlwZSBnZXRDb25z
dHJ1Y3REYXRhKEpTQ2VsbCosIENvbnN0cnVjdERhdGEmKTsKKwogICAgIHN0YXRpYyB2b2lkIHZp
c2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKIAogICAgIGJvb2wgZ2V0T3duUHJv
cGVydHlTbG90Q29tbW9uKEV4ZWNTdGF0ZSosIFByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90Jik7
CiAgICAgYm9vbCBwZXJmb3JtSW50ZXJuYWxNZXRob2RHZXRPd25Qcm9wZXJ0eShFeGVjU3RhdGUq
LCBQcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYpOwogICAgIGJvb2wgcGVyZm9ybUhhc1Byb3Bl
cnR5KEV4ZWNTdGF0ZSosIFByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90Jik7CisgICAgdGVtcGxh
dGUgPHR5cGVuYW1lIFBlcmZvcm1EZWZhdWx0UHV0RnVuY3Rpb24+CisgICAgdm9pZCBwdXRDb21t
b24oRXhlY1N0YXRlKiwgSlNWYWx1ZSBwdXRWYWx1ZSwgSlNWYWx1ZSB0aGlzVmFsdWUsIFByb3Bl
cnR5TmFtZSwgUGVyZm9ybURlZmF1bHRQdXRGdW5jdGlvbik7CiAKICAgICBXcml0ZUJhcnJpZXI8
SlNPYmplY3Q+IG1fdGFyZ2V0OwogICAgIFdyaXRlQmFycmllcjxVbmtub3duPiBtX2hhbmRsZXI7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvZXM2LnlhbWwKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL2VzNi55YW1sCShyZXZpc2lvbiAxOTY4NzEp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvZXM2LnlhbWwJKHdvcmtpbmcgY29weSkK
QEAgLTk2Myw3ICs5NjMsNyBAQAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfZ2V0X2NhbGxz
X0FycmF5LnByb3RvdHlwZS50b1N0cmluZy5qcwogICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBh
dGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9nZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlX2l0ZXJhdGlv
bl9tZXRob2RzLmpzCi0gIGNtZDogcnVuRVM2IDpmYWlsCisgIGNtZDogcnVuRVM2IDpub3JtYWwK
IC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX2dldF9jYWxsc19DbGFzc0RlZmluaXRpb25FdmFs
dWF0aW9uLmpzCiAgIGNtZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVy
bmFsX2dldF9jYWxsc19DcmVhdGVEeW5hbWljRnVuY3Rpb24uanMKQEAgLTEwMzMsMjcgKzEwMzMs
MjcgQEAKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX293bktleXNfY2FsbHNfVGVzdEludGVn
cml0eUxldmVsLmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRl
cm5hbF9zZXRfY2FsbHNfQXJyYXkuZnJvbS5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6
IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJy
YXkub2YuanMKLSAgY21kOiBydW5FUzYgOmZhaWwKKyAgY21kOiBydW5FUzYgOm5vcm1hbAogLSBw
YXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0X2NhbGxzX0FycmF5LnByb3RvdHlwZS5jb3B5V2l0
aGluLmpzCi0gIGNtZDogcnVuRVM2IDpmYWlsCisgIGNtZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0
aDogZXM2L1Byb3h5X2ludGVybmFsX3NldF9jYWxsc19BcnJheS5wcm90b3R5cGUuZmlsbC5qcwot
ICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Q
cm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlLnBvcC5qcwotICBjbWQ6IHJ1
bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRl
cm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlLnB1c2guanMKLSAgY21kOiBydW5FUzYgOmZh
aWwKKyAgY21kOiBydW5FUzYgOm5vcm1hbAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0
X2NhbGxzX0FycmF5LnByb3RvdHlwZS5yZXZlcnNlLmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAt
IHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlLnNoaWZ0
LmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRf
Y2FsbHNfQXJyYXkucHJvdG90eXBlLnNwbGljZS5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBj
bWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRfY2FsbHNf
QXJyYXkucHJvdG90eXBlLnVuc2hpZnQuanMKICAgY21kOiBydW5FUzYgOmZhaWwKIC0gcGF0aDog
ZXM2L1Byb3h5X2ludGVybmFsX3NldF9jYWxsc19PYmplY3QuYXNzaWduLmpzCi0gIGNtZDogcnVu
RVM2IDpmYWlsCisgIGNtZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0aDogZXM2L1Byb3h5X2lzRXh0
ZW5zaWJsZV9oYW5kbGVyLmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9Qcm94
eV9KU09OLnN0cmluZ2lmeV9zdXBwb3J0LmpzCkBAIC0xMDY1LDkgKzEwNjUsOSBAQAogLSBwYXRo
OiBlczYvUHJveHlfUHJveHkucmV2b2NhYmxlLmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBh
dGg6IGVzNi9Qcm94eV9zZXRfaGFuZGxlci5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6
IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9zZXRfaGFuZGxlcl9pbnN0YW5jZXNf
b2ZfcHJveGllcy5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFs
CiAtIHBhdGg6IGVzNi9Qcm94eV9zZXRQcm90b3R5cGVPZl9oYW5kbGVyLmpzCiAgIGNtZDogcnVu
RVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9SZWZsZWN0X1JlZmxlY3QuY29uc3RydWN0LmpzCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3Byb3h5LXNldC5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3Byb3h5LXNldC5qcwko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvcHJveHkt
c2V0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQ2IEBACitmdW5jdGlvbiBhc3NlcnQo
YikgeworICAgIGlmICghYikKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQgYXNzZXJ0aW9u
Iik7Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0geworICAgICAgICB4OiAzMAorICAgIH07CisK
KyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNl
dDogNDUKKyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxl
cik7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbGV0IHRo
cmV3ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm94eS54ID0gNDA7Cisg
ICAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICAgICAgYXNzZXJ0KGUudG9TdHJpbmcoKSA9PT0g
IlR5cGVFcnJvcjogJ3NldCcgcHJvcGVydHkgb2YgYSBQcm94eSdzIGhhbmRsZXIgc2hvdWxkIGJl
IGNhbGxhYmxlLiIpOworICAgICAgICAgICAgdGhyZXcgPSB0cnVlOworICAgICAgICB9CisgICAg
ICAgIGFzc2VydCh0aHJldyk7CisgICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsKKyAg
ICAgICAgeDogMzAKKyAgICB9OworCisgICAgbGV0IGVycm9yID0gbnVsbDsKKyAgICBsZXQgaGFu
ZGxlciA9IHsKKyAgICAgICAgZ2V0IHNldCgpIHsKKyAgICAgICAgICAgIGVycm9yID0gbmV3IEVy
cm9yOworICAgICAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICAgIH0KKyAgICB9OworCisgICAg
bGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9
IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbGV0IHRocmV3ID0gZmFsc2U7CisgICAgICAg
IHRyeSB7CisgICAgICAgICAgICBwcm94eS54ID0gNDA7CisgICAgICAgIH0gY2F0Y2goZSkgewor
ICAgICAgICAgICAgYXNzZXJ0KGUgPT09IGVycm9yKTsKKyAgICAgICAgICAgIHRocmV3ID0gdHJ1
ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQodGhyZXcpOworICAgICAgICBlcnJvciA9IG51
bGw7CisgICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsKKyAgICAgICAgeDogMzAKKyAg
ICB9OworCisgICAgbGV0IGVycm9yID0gbnVsbDsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAg
ICAgc2V0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yOworICAg
ICAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbGV0IHByb3h5
ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAx
MDAwOyBpKyspIHsKKyAgICAgICAgbGV0IHRocmV3ID0gZmFsc2U7CisgICAgICAgIHRyeSB7Cisg
ICAgICAgICAgICBwcm94eS54ID0gNDA7CisgICAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICAg
ICAgYXNzZXJ0KGUgPT09IGVycm9yKTsKKyAgICAgICAgICAgIHRocmV3ID0gdHJ1ZTsKKyAgICAg
ICAgfQorICAgICAgICBhc3NlcnQodGhyZXcpOworICAgICAgICBlcnJvciA9IG51bGw7CisgICAg
fQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsgfTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVy
dHkodGFyZ2V0LCAieCIsIHsKKyAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKKyAgICAgICAg
d3JpdGFibGU6IGZhbHNlLAorICAgICAgICB2YWx1ZTogNTAwCisgICAgfSk7CisKKyAgICBsZXQg
Y2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rp
b24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBh
c3NlcnQodGhlVGFyZ2V0ID09PSB0YXJnZXQpOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsK
KyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsgICAgCisgICAgICAgIH0KKyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3
IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBp
KyspIHsKKyAgICAgICAgcHJveHkueCA9IDQwOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAg
ICAgICAgYXNzZXJ0KHByb3h5LnggPT09IDUwMCk7CisgICAgICAgIGFzc2VydCh0YXJnZXQueCA9
PT0gNTAwKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgfQorfQorCit7CisgICAgbGV0
IHRhcmdldCA9IHsgfTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCAieCIsIHsK
KyAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKKyAgICAgICAgd3JpdGFibGU6IGZhbHNlLAor
ICAgICAgICB2YWx1ZTogNTAwCisgICAgfSk7CisKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAg
ICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsK
KyAgICAgICAgICAgIGFzc2VydCh0aGVUYXJnZXQgPT09IHRhcmdldCk7CisgICAgICAgICAgICB0
aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQorICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5k
bGVyKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBsZXQg
dGhyZXcgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3h5LnggPSA0MDsK
KyAgICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgICAgICB0aHJldyA9IHRydWU7CisgICAgICAg
ICAgICBhc3NlcnQoZS50b1N0cmluZygpID09PSAiVHlwZUVycm9yOiBQcm94eSBoYW5kbGVyJ3Mg
J3NldCcgb24gYSBub24tY29uZmlndXJhYmxlIGFuZCBub24td3JpdGFibGUgcHJvcGVydHkgb24g
J3RhcmdldCcgc2hvdWxkIGVpdGhlciByZXR1cm4gZmFsc2Ugb3IgYmUgdGhlIHNhbWUgdmFsdWUg
YWxyZWFkeSBvbiB0aGUgJ3RhcmdldCcuIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHRo
cmV3KTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0geyB9OworICAgIE9iamVjdC5k
ZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICJ4IiwgeworICAgICAgICBjb25maWd1cmFibGU6IGZhbHNl
LAorICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIDI1OworICAg
ICAgICB9CisgICAgfSk7CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRs
ZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUs
IHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGhlVGFyZ2V0ID09PSB0YXJnZXQpOwor
ICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFt
ZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07
CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBmb3Ig
KGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBwcm94eS54ID0gNDA7CisgICAg
ICAgIGFzc2VydChwcm94eS54ID09PSAyNSk7CisgICAgICAgIGFzc2VydChjYWxsZWQpOworICAg
ICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0geyB9
OworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICJ4IiwgeworICAgICAgICBjb25m
aWd1cmFibGU6IGZhbHNlLAorICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAg
cmV0dXJuIDI1OworICAgICAgICB9CisgICAgfSk7CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7
CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBw
cm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGhlVGFyZ2V0
ID09PSB0YXJnZXQpOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRo
ZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRs
ZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIGxldCB0
aHJldyA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJveHkueCA9IDQwOwor
ICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIHRocmV3ID0gdHJ1ZTsKKyAgICAgICAg
ICAgIGFzc2VydChlLnRvU3RyaW5nKCkgPT09ICJUeXBlRXJyb3I6IFByb3h5IGhhbmRsZXIncyAn
c2V0JyBtZXRob2Qgb24gYSBub24tY29uZmlndXJhYmxlIGFjY2Vzc29yIHByb3BlcnR5IHdpdGhv
dXQgYSBzZXR0ZXIgc2hvdWxkIHJldHVybiBmYWxzZS4iKTsKKyAgICAgICAgfQorICAgICAgICBh
c3NlcnQodGhyZXcpOworICAgIH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSB7IH07CisgICAg
T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgIngiLCB7CisgICAgICAgIGNvbmZpZ3VyYWJs
ZTogZmFsc2UsCisgICAgICAgIHdyaXRhYmxlOiB0cnVlLAorICAgICAgICB2YWx1ZTogNTAKKyAg
ICB9KTsKKworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAg
ICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIp
IHsKKyAgICAgICAgICAgIGFzc2VydCh0aGVUYXJnZXQgPT09IHRhcmdldCk7CisgICAgICAgICAg
ICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVl
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbGV0
IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9IDA7
IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgcHJveHkueCA9IGk7CisgICAgICAgIGFzc2VydChj
YWxsZWQpOworICAgICAgICBhc3NlcnQocHJveHkueCA9PT0gaSk7CisgICAgICAgIGFzc2VydCh0
YXJnZXQueCA9PT0gaSk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAgIH0KK30KKworewor
ICAgIGxldCB0YXJnZXQgPSB7CisgICAgICAgIHg6IDMwCisgICAgfTsKKworICAgIGxldCBjYWxs
ZWQgPSBmYWxzZTsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0
aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2Vy
dCh0YXJnZXQgPT09IHRoZVRhcmdldCk7CisgICAgICAgICAgICBhc3NlcnQocmVjaWV2ZXIgPT09
IHByb3h5KTsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB0aGVUYXJn
ZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbGV0IHByb3h5
ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAx
MDAwOyBpKyspIHsKKyAgICAgICAgcHJveHkueCA9IGk7CisgICAgICAgIGFzc2VydChjYWxsZWQp
OworICAgICAgICBhc3NlcnQocHJveHkueCA9PT0gaSk7CisgICAgICAgIGFzc2VydCh0YXJnZXQu
eCA9PT0gaSk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworCisgICAgICAgIHByb3h5WyJ5Il0g
PSBpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5LnkgPT09
IGkpOworICAgICAgICBhc3NlcnQodGFyZ2V0LnkgPT09IGkpOworICAgICAgICBjYWxsZWQgPSBm
YWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0geworICAgICAgICB4OiAzMAor
ICAgIH07CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7Cisg
ICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVy
KSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJnZXQpOworICAgICAgICAg
ICAgYXNzZXJ0KHJlY2lldmVyID09PSBwcm94eSk7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVl
OworICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICB9Cisg
ICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHByb3h5LnggPSBpOwor
ICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5LnggPT09IGkpOwor
ICAgICAgICBhc3NlcnQodGFyZ2V0LnggPT09IGkpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsK
KworICAgICAgICBwcm94eVsieSJdID0gaTsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAg
ICAgIGFzc2VydChwcm94eS55ID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldC55ID09PSBp
KTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgfQorfQorCit7CisgICAgbGV0IHRhcmdl
dCA9IFtdOworCisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCBoYW5kbGVyID0geyB9
OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9y
IChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgcHJveHlbaV0gPSBpOworICAg
ICAgICBhc3NlcnQocHJveHlbaV0gPT09IGkpOworICAgICAgICBhc3NlcnQodGFyZ2V0W2ldID09
PSBpKTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0gW107CisKKyAgICBsZXQgY2Fs
bGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24o
dGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3Nl
cnQodGFyZ2V0ID09PSB0aGVUYXJnZXQpOworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09
PSBwcm94eSk7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhlVGFy
Z2V0W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94
eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwg
MTAwMDsgaSsrKSB7CisgICAgICAgIHByb3h5W2ldID0gaTsKKyAgICAgICAgYXNzZXJ0KHByb3h5
W2ldID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFtpXSA9PT0gaSk7CisgICAgICAgIGFz
c2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAg
ICBsZXQgdGFyZ2V0ID0gW107CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhh
bmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFs
dWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJnZXQp
OworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09PSBwcm94eSk7CisgICAgICAgICAgICBj
YWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlOwor
ICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhh
bmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHBy
b3h5W2ldID0gaTsKKyAgICAgICAgYXNzZXJ0KHByb3h5W2ldID09PSBpKTsKKyAgICAgICAgYXNz
ZXJ0KHRhcmdldFtpXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBj
YWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7Cisg
ICAgbGV0IHRhcmdldCA9IHsKKyAgICAgICAgc2V0IHgodikgeworICAgICAgICAgICAgYXNzZXJ0
KHRoaXMgPT09IHRhcmdldCk7CisgICAgICAgICAgICB0aGlzLl94ID0gdjsKKyAgICAgICAgICAg
IGNhbGxlZCA9IHRydWU7CisgICAgICAgIH0sCisgICAgICAgIGdldCB4KCkgeworICAgICAgICAg
ICAgYXNzZXJ0KHRoaXMgPT09IHRhcmdldCk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5feDsK
KyAgICAgICAgfQorICAgIH07CisKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBm
dW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAg
ICAgIGFzc2VydCh0YXJnZXQgPT09IHRoZVRhcmdldCk7CisgICAgICAgICAgICBhc3NlcnQocmVj
aWV2ZXIgPT09IHByb3h5KTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1
ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxl
dCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAw
OyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHByb3h5LnggPSBpOworICAgICAgICBhc3NlcnQo
Y2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5LnggPT09IGkpOworICAgICAgICBhc3NlcnQo
dGFyZ2V0LnggPT09IGkpOworICAgICAgICBhc3NlcnQocHJveHkuX3ggPT09IGkpOworICAgICAg
ICBhc3NlcnQodGFyZ2V0Ll94ID09PSBpKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAg
fQorfQorCit7CisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCB0YXJnZXQgPSB7fTsK
KyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHBy
b3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCh0YXJnZXQgPT09
IHRoZVRhcmdldCk7CisgICAgICAgICAgICBhc3NlcnQocmVjaWV2ZXIgPT09IG9iaik7CisgICAg
ICAgICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgICAgICBjYWxsZWQg
PSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisg
ICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgbGV0IG9iaiA9
IE9iamVjdC5jcmVhdGUocHJveHksIHsKKyAgICAgICAgb3duOiB7CisgICAgICAgICAgICB3cml0
YWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAg
IHZhbHVlOiBudWxsCisgICAgICAgIH0KKyAgICB9KTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8
IDEwMDA7IGkrKykgeworICAgICAgICBvYmoub3duID0gaTsKKyAgICAgICAgYXNzZXJ0KCFjYWxs
ZWQpOworICAgICAgICBhc3NlcnQob2JqLm93biA9PT0gaSk7CisKKyAgICAgICAgb2JqLm5vdE93
biA9IGk7CisgICAgICAgIGFzc2VydCh0YXJnZXQubm90T3duID09PSBpKTsKKyAgICAgICAgYXNz
ZXJ0KHByb3h5Lm5vdE93biA9PT0gaSk7CisgICAgICAgIGFzc2VydChvYmoubm90T3duID09PSBp
KTsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAg
IH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSB7fTsKKyAgICBsZXQgaGFuZGxlciA9IHsgfTsK
KworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGxldCBv
YmogPSBPYmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAgICAgIG93bjogeworICAgICAgICAgICAg
d3JpdGFibGU6IHRydWUsCisgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAg
ICAgICB2YWx1ZTogbnVsbAorICAgICAgICB9CisgICAgfSk7CisgICAgZm9yIChsZXQgaSA9IDA7
IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgb2JqLm93biA9IGk7CisgICAgICAgIGFzc2VydChv
Ymoub3duID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5Lm93biA9PT0gdW5kZWZpbmVkKTsK
KworICAgICAgICBvYmoubm90T3duID0gaTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldC5ub3RPd24g
PT09IGkpOworICAgICAgICBhc3NlcnQocHJveHkubm90T3duID09PSBpKTsKKyAgICAgICAgYXNz
ZXJ0KG9iai5ub3RPd24gPT09IGkpOworICAgIH0KK30KKworeworICAgIGxldCBjYWxsZWQgPSBm
YWxzZTsKKyAgICBsZXQgdGFyZ2V0ID0ge307CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAg
IHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7Cisg
ICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJnZXQpOworICAgICAgICAgICAgYXNz
ZXJ0KHJlY2lldmVyID09PSBvYmopOworICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BOYW1lXSA9
IHZhbHVlOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJn
ZXQsIGhhbmRsZXIpOworICAgIGxldCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAg
ICAgIFswXTogeworICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCisgICAgICAgICAgICBjb25m
aWd1cmFibGU6IHRydWUsCisgICAgICAgICAgICB2YWx1ZTogbnVsbAorICAgICAgICB9CisgICAg
fSk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgb2JqWzBd
ID0gaTsKKyAgICAgICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAgICBhc3NlcnQob2JqWzBdID09
PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzBdID09PSB1bmRlZmluZWQpOworCisgICAgICAg
IG9ialsxXSA9IGk7CisgICAgICAgIGFzc2VydCh0YXJnZXRbMV0gPT09IGkpOworICAgICAgICBh
c3NlcnQocHJveHlbMV0gPT09IGkpOworICAgICAgICBhc3NlcnQob2JqWzFdID09PSBpKTsKKyAg
ICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAgIH0KK30K
KworeworICAgIGxldCB0YXJnZXQgPSB7fTsKKyAgICBsZXQgaGFuZGxlciA9IHsgfTsKKworICAg
IGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGxldCBvYmogPSBP
YmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAgICAgIFswXTogeworICAgICAgICAgICAgd3JpdGFi
bGU6IHRydWUsCisgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgICB2
YWx1ZTogbnVsbAorICAgICAgICB9CisgICAgfSk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAx
MDAwOyBpKyspIHsKKyAgICAgICAgb2JqWzBdID0gaTsKKyAgICAgICAgYXNzZXJ0KG9ialswXSA9
PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94eVswXSA9PT0gdW5kZWZpbmVkKTsKKworICAgICAg
ICBvYmpbMV0gPSBpOworICAgICAgICBhc3NlcnQodGFyZ2V0WzFdID09PSBpKTsKKyAgICAgICAg
YXNzZXJ0KHByb3h5WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KG9ialsxXSA9PT0gaSk7Cisg
ICAgfQorfQorCit7CisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCB0YXJnZXQgPSB7
fTsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQs
IHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCh0YXJnZXQg
PT09IHRoZVRhcmdldCk7CisgICAgICAgICAgICAvL2Fzc2VydChyZWNpZXZlciA9PT0gb2JqKTsK
KyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIGNh
bGxlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07
CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBsZXQg
b2JqID0gT2JqZWN0LmNyZWF0ZShwcm94eSwgeworICAgICAgICBbMF06IHsKKyAgICAgICAgICAg
IHdyaXRhYmxlOiB0cnVlLAorICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgICAg
ICAgICAgdmFsdWU6IG51bGwKKyAgICAgICAgfQorICAgIH0pOworICAgIGZvciAobGV0IGkgPSAw
OyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIG9ialswXSA9IGk7CisgICAgICAgIGFzc2VydCgh
Y2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KG9ialswXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChw
cm94eVswXSA9PT0gdW5kZWZpbmVkKTsKKworICAgICAgICBvYmpbMV0gPSBpOworICAgICAgICBh
c3NlcnQodGFyZ2V0WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzFdID09PSBpKTsK
KyAgICAgICAgYXNzZXJ0KG9ialsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChjYWxsZWQpOwor
ICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgY2FsbGVkID0g
ZmFsc2U7CisgICAgbGV0IHRhcmdldCA9IFsyNV07CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAg
ICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7
CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJnZXQpOworICAgICAgICAgICAg
Ly9hc3NlcnQocmVjaWV2ZXIgPT09IG9iaik7CisgICAgICAgICAgICB0aGVUYXJnZXRbcHJvcE5h
bWVdID0gdmFsdWU7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5
KHRhcmdldCwgaGFuZGxlcik7CisgICAgbGV0IG9iaiA9IE9iamVjdC5jcmVhdGUocHJveHksIHsK
KyAgICAgICAgWzBdOiB7CisgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICAg
IGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHZhbHVlOiBudWxsCisgICAgICAgIH0K
KyAgICB9KTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBv
YmpbMF0gPSBpOworICAgICAgICBhc3NlcnQoIWNhbGxlZCk7CisgICAgICAgIGFzc2VydChvYmpb
MF0gPT09IGkpOworICAgICAgICBhc3NlcnQocHJveHlbMF0gPT09IDI1KTsKKworICAgICAgICBv
YmpbMV0gPSBpOworICAgICAgICBhc3NlcnQodGFyZ2V0WzFdID09PSBpKTsKKyAgICAgICAgYXNz
ZXJ0KHByb3h5WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KG9ialsxXSA9PT0gaSk7CisgICAg
ICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisK
K3sKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IG9nVGFyZ2V0ID0ge307CisgICAg
bGV0IHRhcmdldCA9IG5ldyBQcm94eShvZ1RhcmdldCwgeworICAgICAgICBzZXQ6IGZ1bmN0aW9u
KHRoZVRhcmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZlcikgeworICAgICAgICAgICAgYXNz
ZXJ0KHRoZVRhcmdldCA9PT0gb2dUYXJnZXQpOworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVy
ID09PSBvYmopOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoZVRh
cmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0pOworICAgIGxldCBoYW5k
bGVyID0geyB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7
CisgICAgbGV0IG9iaiA9IE9iamVjdC5jcmVhdGUocHJveHksIHsKKyAgICAgICAgb3duOiB7Cisg
ICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1
ZSwKKyAgICAgICAgICAgIHZhbHVlOiBudWxsCisgICAgICAgIH0KKyAgICB9KTsKKyAgICBmb3Ig
KGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBvYmoub3duID0gaTsKKyAgICAg
ICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAgICBhc3NlcnQob2JqLm93biA9PT0gaSk7CisgICAg
ICAgIGFzc2VydChwcm94eS5vd24gPT09IHVuZGVmaW5lZCk7CisKKyAgICAgICAgb2JqLm5vdE93
biA9IGk7CisgICAgICAgIGFzc2VydCh0YXJnZXQubm90T3duID09PSBpKTsKKyAgICAgICAgYXNz
ZXJ0KHByb3h5Lm5vdE93biA9PT0gaSk7CisgICAgICAgIGFzc2VydChvYmoubm90T3duID09PSBp
KTsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAg
IH0KK30KKworeworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBsZXQgb2dUYXJnZXQgPSBb
MjVdOworICAgIGxldCB0YXJnZXQgPSBuZXcgUHJveHkob2dUYXJnZXQsIHsKKyAgICAgICAgc2V0
OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAg
ICAgICAgIGFzc2VydCh0aGVUYXJnZXQgPT09IG9nVGFyZ2V0KTsKKyAgICAgICAgICAgIGFzc2Vy
dChyZWNpZXZlciA9PT0gb2JqKTsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAg
ICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9KTsKKyAg
ICBsZXQgaGFuZGxlciA9IHsgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQs
IGhhbmRsZXIpOworICAgIGxldCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAgICAg
IFswXTogeworICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCisgICAgICAgICAgICBjb25maWd1
cmFibGU6IHRydWUsCisgICAgICAgICAgICB2YWx1ZTogbnVsbAorICAgICAgICB9CisgICAgfSk7
CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgb2JqWzBdID0g
aTsKKyAgICAgICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAgICBhc3NlcnQob2JqWzBdID09PSBp
KTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzBdID09PSAyNSk7CisKKyAgICAgICAgb2JqWzFdID0g
aTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94
eVsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChvYmpbMV0gPT09IGkpOworICAgICAgICBhc3Nl
cnQoY2FsbGVkKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgfQorfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>271984</attachid>
            <date>2016-02-22 19:30:28 -0800</date>
            <delta_ts>2016-02-23 15:01:56 -0800</delta_ts>
            <desc>RFC WIP</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>30420</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5jcHAJKHJldmlz
aW9uIDE5Njg3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDIyLDYgKzQyMiwxMSBAQCB2b2lkIEpTT2JqZWN0OjpwdXRJ
bmxpbmVTbG93KEV4ZWNTdGF0ZSogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQog
ICAgICAgICB9CisgICAgICAgIGlmIChvYmotPnR5cGUoKSA9PSBQcm94eU9iamVjdFR5cGUpIHsK
KyAgICAgICAgICAgIFByb3h5T2JqZWN0KiBwcm94eSA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KG9i
aik7CisgICAgICAgICAgICBwcm94eS0+UHJveHlPYmplY3Q6OnB1dChwcm94eSwgZXhlYywgcHJv
cGVydHlOYW1lLCB2YWx1ZSwgc2xvdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
ICAgICAgICAgSlNWYWx1ZSBwcm90b3R5cGUgPSBvYmotPnByb3RvdHlwZSgpOwogICAgICAgICBp
ZiAocHJvdG90eXBlLmlzTnVsbCgpKQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTE2LDYgKzE5
MjEsMTIgQEAgYm9vbCBKU09iamVjdDo6YXR0ZW1wdFRvSW50ZXJjZXB0UHV0QnlJbgogICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAg
ICAgaWYgKGN1cnJlbnQtPnR5cGUoKSA9PSBQcm94eU9iamVjdFR5cGUpIHsKKyAgICAgICAgICAg
IFByb3h5T2JqZWN0KiBwcm94eSA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KGN1cnJlbnQpOworICAg
ICAgICAgICAgcHJveHktPnB1dEJ5SW5kZXhDb21tb24oZXhlYywgdGhpc1ZhbHVlLCBpLCB2YWx1
ZSwgc2hvdWxkVGhyb3cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAg
ICAgICAgCiAgICAgICAgIEpTVmFsdWUgcHJvdG90eXBlVmFsdWUgPSBjdXJyZW50LT5wcm90b3R5
cGUoKTsKICAgICAgICAgaWYgKHByb3RvdHlwZVZhbHVlLmlzTnVsbCgpKQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5oCShyZXZpc2lvbiAxOTY4NzEpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBA
IC04NTUsNiArODU1LDcgQEAgcHJpdmF0ZToKICAgICAgICAgCiAgICAgdGVtcGxhdGU8UHV0TW9k
ZT4KICAgICBib29sIHB1dERpcmVjdEludGVybmFsKFZNJiwgUHJvcGVydHlOYW1lLCBKU1ZhbHVl
LCB1bnNpZ25lZCBhdHRyLCBQdXRQcm9wZXJ0eVNsb3QmKTsKKyAgICBib29sIGNhblBlcmZvcm1G
YXN0UHV0SW5saW5lKEV4ZWNTdGF0ZSogZXhlYywgVk0mLCBQcm9wZXJ0eU5hbWUpOwogCiAgICAg
SlNfRVhQT1JUX1BSSVZBVEUgTkVWRVJfSU5MSU5FIHZvaWQgcHV0SW5saW5lU2xvdyhFeGVjU3Rh
dGUqLCBQcm9wZXJ0eU5hbWUsIEpTVmFsdWUsIFB1dFByb3BlcnR5U2xvdCYpOwogCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdElubGluZXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdElubGluZXMuaAkocmV2
aXNpb24gMTk2ODcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPYmplY3RJ
bmxpbmVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDI4IEBACiAKIG5hbWVzcGFjZSBK
U0MgewogCitBTFdBWVNfSU5MSU5FIGJvb2wgSlNPYmplY3Q6OmNhblBlcmZvcm1GYXN0UHV0SW5s
aW5lKEV4ZWNTdGF0ZSogZXhlYywgVk0mIHZtLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lKQor
eworICAgIGlmIChVTkxJS0VMWShwcm9wZXJ0eU5hbWUgPT0gZXhlYy0+cHJvcGVydHlOYW1lcygp
LnVuZGVyc2NvcmVQcm90bykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENoZWNr
IGlmIHRoZXJlIGFyZSBhbnkgc2V0dGVycyBvciBnZXR0ZXJzIGluIHRoZSBwcm90b3R5cGUgY2hh
aW4KKyAgICBKU1ZhbHVlIHByb3RvdHlwZTsKKyAgICBKU09iamVjdCogb2JqID0gdGhpczsKKyAg
ICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAob2JqLT5zdHJ1Y3R1cmUodm0pLT5oYXNSZWFk
T25seU9yR2V0dGVyU2V0dGVyUHJvcGVydGllc0V4Y2x1ZGluZ1Byb3RvKCkgfHwgb2JqLT50eXBl
KCkgPT0gUHJveHlPYmplY3RUeXBlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIHByb3RvdHlwZSA9IG9iai0+cHJvdG90eXBlKCk7CisgICAgICAgIGlmIChwcm90b3R5cGUu
aXNOdWxsKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBvYmogPSBhc09i
amVjdChwcm90b3R5cGUpOworICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQor
CiAvLyBFQ01BIDguNi4yLjIKIEFMV0FZU19JTkxJTkUgdm9pZCBKU09iamVjdDo6cHV0SW5saW5l
KEpTQ2VsbCogY2VsbCwgRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1l
LCBKU1ZhbHVlIHZhbHVlLCBQdXRQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7CkBAIC00NCwyMyArNjYs
MTQgQEAgQUxXQVlTX0lOTElORSB2b2lkIEpTT2JqZWN0OjpwdXRJbmxpbmUoSgogICAgICAgICBw
dXRCeUluZGV4KHRoaXNPYmplY3QsIGV4ZWMsIGluZGV4LnZhbHVlKCksIHZhbHVlLCBzbG90Lmlz
U3RyaWN0TW9kZSgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICAKLSAgICAvLyBDaGVj
ayBpZiB0aGVyZSBhcmUgYW55IHNldHRlcnMgb3IgZ2V0dGVycyBpbiB0aGUgcHJvdG90eXBlIGNo
YWluCi0gICAgSlNWYWx1ZSBwcm90b3R5cGU7Ci0gICAgaWYgKHByb3BlcnR5TmFtZSAhPSBleGVj
LT5wcm9wZXJ0eU5hbWVzKCkudW5kZXJzY29yZVByb3RvKSB7Ci0gICAgICAgIGZvciAoSlNPYmpl
Y3QqIG9iaiA9IHRoaXNPYmplY3Q7ICFvYmotPnN0cnVjdHVyZSh2bSktPmhhc1JlYWRPbmx5T3JH
ZXR0ZXJTZXR0ZXJQcm9wZXJ0aWVzRXhjbHVkaW5nUHJvdG8oKTsgb2JqID0gYXNPYmplY3QocHJv
dG90eXBlKSkgewotICAgICAgICAgICAgcHJvdG90eXBlID0gb2JqLT5wcm90b3R5cGUoKTsKLSAg
ICAgICAgICAgIGlmIChwcm90b3R5cGUuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBBU1NF
UlQoIXRoaXNPYmplY3QtPnN0cnVjdHVyZSh2bSktPnByb3RvdHlwZUNoYWluTWF5SW50ZXJjZXB0
U3RvcmVUbyhleGVjLT52bSgpLCBwcm9wZXJ0eU5hbWUpKTsKLSAgICAgICAgICAgICAgICBpZiAo
IXRoaXNPYmplY3QtPnB1dERpcmVjdEludGVybmFsPFB1dE1vZGVQdXQ+KHZtLCBwcm9wZXJ0eU5h
bWUsIHZhbHVlLCAwLCBzbG90KQotICAgICAgICAgICAgICAgICAgICAmJiBzbG90LmlzU3RyaWN0
TW9kZSgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvd1R5cGVFcnJvcihleGVjLCBBU0NJSUxp
dGVyYWwoU3RyaWN0TW9kZVJlYWRvbmx5UHJvcGVydHlXcml0ZUVycm9yKSk7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogCi0gICAgdGhp
c09iamVjdC0+cHV0SW5saW5lU2xvdyhleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBzbG90KTsK
KyAgICBpZiAodGhpc09iamVjdC0+Y2FuUGVyZm9ybUZhc3RQdXRJbmxpbmUoZXhlYywgdm0sIHBy
b3BlcnR5TmFtZSkpIHsKKyAgICAgICAgQVNTRVJUKCF0aGlzT2JqZWN0LT5zdHJ1Y3R1cmUodm0p
LT5wcm90b3R5cGVDaGFpbk1heUludGVyY2VwdFN0b3JlVG8oZXhlYy0+dm0oKSwgcHJvcGVydHlO
YW1lKSk7CisgICAgICAgIGlmICghdGhpc09iamVjdC0+cHV0RGlyZWN0SW50ZXJuYWw8UHV0TW9k
ZVB1dD4odm0sIHByb3BlcnR5TmFtZSwgdmFsdWUsIDAsIHNsb3QpCisgICAgICAgICAgICAmJiBz
bG90LmlzU3RyaWN0TW9kZSgpKQorICAgICAgICAgICAgdGhyb3dUeXBlRXJyb3IoZXhlYywgQVND
SUlMaXRlcmFsKFN0cmljdE1vZGVSZWFkb25seVByb3BlcnR5V3JpdGVFcnJvcikpOworICAgIH0g
ZWxzZQorICAgICAgICB0aGlzT2JqZWN0LT5wdXRJbmxpbmVTbG93KGV4ZWMsIHByb3BlcnR5TmFt
ZSwgdmFsdWUsIHNsb3QpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTVHlwZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL0pTVHlwZS5oCShyZXZpc2lvbiAxOTY4NzEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU1R5cGUuaAkod29ya2luZyBjb3B5KQpAQCAtNzgsNyAr
NzgsOSBAQCBlbnVtIEpTVHlwZSA6IHVpbnQ4X3QgewogICAgIEdsb2JhbE9iamVjdFR5cGUsCiAg
ICAgQ2xvc3VyZU9iamVjdFR5cGUsCiAKLSAgICBMYXN0SlNDT2JqZWN0VHlwZSA9IENsb3N1cmVP
YmplY3RUeXBlLAorICAgIFByb3h5T2JqZWN0VHlwZSwKKworICAgIExhc3RKU0NPYmplY3RUeXBl
ID0gUHJveHlPYmplY3RUeXBlLAogfTsKIAogQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEpTVHlwZSkg
PT0gc2l6ZW9mKHVpbnQ4X3QpLCBzaXplb2ZfanN0eXBlX2lzX29uZV9ieXRlKTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb3h5T2JqZWN0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Qcm94eU9iamVjdC5jcHAJKHJldmlzaW9u
IDE5Njg3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb3h5T2JqZWN0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzAwLDYgKzMwMCw4OSBAQCBib29sIFByb3h5T2JqZWN0Ojpn
ZXRPd25Qcm9wZXJ0eVNsb3RCeUluCiAgICAgcmV0dXJuIHRoaXNPYmplY3QtPmdldE93blByb3Bl
cnR5U2xvdENvbW1vbihleGVjLCBpZGVudC5pbXBsKCksIHNsb3QpOwogfQogCit0ZW1wbGF0ZSA8
dHlwZW5hbWUgUGVyZm9ybURlZmF1bHRQdXRGdW5jdGlvbj4KK3ZvaWQgUHJveHlPYmplY3Q6OnB1
dENvbW1vbihFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgcHV0VmFsdWUsIEpTVmFsdWUgdGhpc1Zh
bHVlLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lLCBQZXJmb3JtRGVmYXVsdFB1dEZ1bmN0aW9u
IHBlcmZvcm1EZWZhdWx0UHV0RnVuY3Rpb24pCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsK
KyAgICBKU1ZhbHVlIGhhbmRsZXJWYWx1ZSA9IHRoaXMtPmhhbmRsZXIoKTsKKyAgICBpZiAoaGFu
ZGxlclZhbHVlLmlzTnVsbCgpKSB7CisgICAgICAgIHRocm93Vk1UeXBlRXJyb3IoZXhlYywgQVND
SUlMaXRlcmFsKCJQcm94eSAnaGFuZGxlcicgaXMgbnVsbC4gSXQgc2hvdWxkIGJlIGFuIE9iamVj
dC4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBKU09iamVjdCogaGFuZGxlciA9
IGpzQ2FzdDxKU09iamVjdCo+KGhhbmRsZXJWYWx1ZSk7CisgICAgQ2FsbERhdGEgY2FsbERhdGE7
CisgICAgQ2FsbFR5cGUgY2FsbFR5cGU7CisgICAgSlNWYWx1ZSBzZXRNZXRob2QgPSBoYW5kbGVy
LT5nZXRNZXRob2QoZXhlYywgY2FsbERhdGEsIGNhbGxUeXBlLCB2bS5wcm9wZXJ0eU5hbWVzLT5z
ZXQsIEFTQ0lJTGl0ZXJhbCgiJ3NldCcgcHJvcGVydHkgb2YgYSBQcm94eSdzIGhhbmRsZXIgc2hv
dWxkIGJlIGNhbGxhYmxlLiIpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAg
ICAgIHJldHVybjsKKyAgICBKU09iamVjdCogdGFyZ2V0ID0gdGhpcy0+dGFyZ2V0KCk7CisgICAg
aWYgKHNldE1ldGhvZC5pc1VuZGVmaW5lZCgpKSB7CisgICAgICAgIHBlcmZvcm1EZWZhdWx0UHV0
RnVuY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE1hcmtlZEFyZ3VtZW50
QnVmZmVyIGFyZ3VtZW50czsKKyAgICBhcmd1bWVudHMuYXBwZW5kKHRhcmdldCk7CisgICAgYXJn
dW1lbnRzLmFwcGVuZChpZGVudGlmaWVyVG9TYWZlUHVibGljSlNWYWx1ZSh2bSwgSWRlbnRpZmll
cjo6ZnJvbVVpZCgmdm0sIHByb3BlcnR5TmFtZS51aWQoKSkpKTsKKyAgICBhcmd1bWVudHMuYXBw
ZW5kKHB1dFZhbHVlKTsKKyAgICBhcmd1bWVudHMuYXBwZW5kKHRoaXNWYWx1ZSk7CisgICAgSlNW
YWx1ZSB0cmFwUmVzdWx0ID0gY2FsbChleGVjLCBzZXRNZXRob2QsIGNhbGxUeXBlLCBjYWxsRGF0
YSwgaGFuZGxlciwgYXJndW1lbnRzKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisg
ICAgICAgIHJldHVybjsKKyAgICBib29sIHRyYXBSZXN1bHRBc0Jvb2wgPSB0cmFwUmVzdWx0LnRv
Qm9vbGVhbihleGVjKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJl
dHVybjsKKyAgICBpZiAoIXRyYXBSZXN1bHRBc0Jvb2wpCisgICAgICAgIHJldHVybjsKKworICAg
IFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOworICAgIGlmICh0YXJnZXQtPmdldE93blBy
b3BlcnR5RGVzY3JpcHRvcihleGVjLCBwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IpKSB7CisgICAg
ICAgIGlmIChkZXNjcmlwdG9yLmlzRGF0YURlc2NyaXB0b3IoKSAmJiAhZGVzY3JpcHRvci5jb25m
aWd1cmFibGUoKSAmJiAhZGVzY3JpcHRvci53cml0YWJsZSgpKSB7CisgICAgICAgICAgICBpZiAo
IXNhbWVWYWx1ZShleGVjLCBkZXNjcmlwdG9yLnZhbHVlKCksIHB1dFZhbHVlKSkgeworICAgICAg
ICAgICAgICAgIHRocm93Vk1UeXBlRXJyb3IoZXhlYywgQVNDSUlMaXRlcmFsKCJQcm94eSBoYW5k
bGVyJ3MgJ3NldCcgb24gYSBub24tY29uZmlndXJhYmxlIGFuZCBub24td3JpdGFibGUgcHJvcGVy
dHkgb24gJ3RhcmdldCcgc2hvdWxkIGVpdGhlciByZXR1cm4gZmFsc2Ugb3IgYmUgdGhlIHNhbWUg
dmFsdWUgYWxyZWFkeSBvbiB0aGUgJ3RhcmdldCcuIikpOworICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLmlzQWNjZXNz
b3JEZXNjcmlwdG9yKCkgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlKCkgJiYgZGVzY3JpcHRv
ci5zZXR0ZXIoKS5pc1VuZGVmaW5lZCgpKSB7CisgICAgICAgICAgICB0aHJvd1ZNVHlwZUVycm9y
KGV4ZWMsIEFTQ0lJTGl0ZXJhbCgiUHJveHkgaGFuZGxlcidzICdzZXQnIG1ldGhvZCBvbiBhIG5v
bi1jb25maWd1cmFibGUgYWNjZXNzb3IgcHJvcGVydHkgd2l0aG91dCBhIHNldHRlciBzaG91bGQg
cmV0dXJuIGZhbHNlLiIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0K
K30KKwordm9pZCBQcm94eU9iamVjdDo6cHV0KEpTQ2VsbCogY2VsbCwgRXhlY1N0YXRlKiBleGVj
LCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lLCBKU1ZhbHVlIHZhbHVlLCBQdXRQcm9wZXJ0eVNs
b3QmIHNsb3QpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAgICBQcm94eU9iamVjdCog
dGhpc09iamVjdCA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KGNlbGwpOworICAgIGF1dG8gcGVyZm9y
bURlZmF1bHRQdXQgPSBbJl0gKCkgeworICAgICAgICBKU09iamVjdCogdGFyZ2V0ID0ganNDYXN0
PEpTT2JqZWN0Kj4odGhpc09iamVjdC0+dGFyZ2V0KCkpOworICAgICAgICB0YXJnZXQtPm1ldGhv
ZFRhYmxlKHZtKS0+cHV0KHRhcmdldCwgZXhlYywgcHJvcGVydHlOYW1lLCB2YWx1ZSwgc2xvdCk7
CisgICAgfTsKKyAgICB0aGlzT2JqZWN0LT5wdXRDb21tb24oZXhlYywgdmFsdWUsIHNsb3QudGhp
c1ZhbHVlKCksIHByb3BlcnR5TmFtZSwgcGVyZm9ybURlZmF1bHRQdXQpOworfQorCit2b2lkIFBy
b3h5T2JqZWN0OjpwdXRCeUluZGV4Q29tbW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSB0aGlz
VmFsdWUsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSBwdXRWYWx1ZSwgYm9vbCBzaG91
bGRUaHJvdykKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIElkZW50aWZpZXIgaWRl
bnQgPSBJZGVudGlmaWVyOjpmcm9tKGV4ZWMsIHByb3BlcnR5TmFtZSk7IAorICAgIGlmIChleGVj
LT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuOworICAgIGF1dG8gcGVyZm9ybURlZmF1
bHRQdXQgPSBbJl0gKCkgeworICAgICAgICBKU09iamVjdCogdGFyZ2V0ID0gdGhpcy0+dGFyZ2V0
KCk7CisgICAgICAgIGJvb2wgaXNTdHJpY3RNb2RlID0gc2hvdWxkVGhyb3c7CisgICAgICAgIFB1
dFByb3BlcnR5U2xvdCBzbG90KHRoaXNWYWx1ZSwgaXNTdHJpY3RNb2RlKTsKKyAgICAgICAgdGFy
Z2V0LT5tZXRob2RUYWJsZSh2bSktPnB1dCh0YXJnZXQsIGV4ZWMsIGlkZW50LmltcGwoKSwgcHV0
VmFsdWUsIHNsb3QpOworICAgICAgICAvL3RhcmdldC0+bWV0aG9kVGFibGUodm0pLT5wdXRCeUlu
ZGV4KHRhcmdldCwgZXhlYywgcHJvcGVydHlOYW1lLCBwdXRWYWx1ZSwgc2hvdWxkVGhyb3cpOwor
ICAgIH07CisgICAgcHV0Q29tbW9uKGV4ZWMsIHB1dFZhbHVlLCB0aGlzVmFsdWUsIGlkZW50Lmlt
cGwoKSwgcGVyZm9ybURlZmF1bHRQdXQpOworfQorCit2b2lkIFByb3h5T2JqZWN0OjpwdXRCeUlu
ZGV4KEpTQ2VsbCogY2VsbCwgRXhlY1N0YXRlKiBleGVjLCB1bnNpZ25lZCBwcm9wZXJ0eU5hbWUs
IEpTVmFsdWUgdmFsdWUsIGJvb2wgc2hvdWxkVGhyb3cpCit7CisgICAgUHJveHlPYmplY3QqIHRo
aXNPYmplY3QgPSBqc0Nhc3Q8UHJveHlPYmplY3QqPihjZWxsKTsKKyAgICB0aGlzT2JqZWN0LT5w
dXRCeUluZGV4Q29tbW9uKGV4ZWMsIHRoaXNPYmplY3QsIHByb3BlcnR5TmFtZSwgdmFsdWUsIHNo
b3VsZFRocm93KTsKK30KKwogc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgcGVy
Zm9ybVByb3h5Q2FsbChFeGVjU3RhdGUqIGV4ZWMpCiB7CiAgICAgVk0mIHZtID0gZXhlYy0+dm0o
KTsKQEAgLTM0NSwxNiArNDI4LDYgQEAgQ2FsbFR5cGUgUHJveHlPYmplY3Q6OmdldENhbGxEYXRh
KEpTQ2VsbAogICAgIHJldHVybiBDYWxsVHlwZUhvc3Q7CiB9CiAKLXZvaWQgUHJveHlPYmplY3Q6
OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAg
ICBQcm94eU9iamVjdCogdGhpc09iamVjdCA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KGNlbGwpOwot
ICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBC
YXNlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOwotCi0gICAgdmlzaXRvci5h
cHBlbmQoJnRoaXNPYmplY3QtPm1fdGFyZ2V0KTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09i
amVjdC0+bV9oYW5kbGVyKTsKLX0KLQogc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NB
TEwgcGVyZm9ybVByb3h5Q29uc3RydWN0KEV4ZWNTdGF0ZSogZXhlYykKIHsKICAgICBWTSYgdm0g
PSBleGVjLT52bSgpOwpAQCAtNDA1LDQgKzQ3OCwxNCBAQCBDb25zdHJ1Y3RUeXBlIFByb3h5T2Jq
ZWN0OjpnZXRDb25zdHJ1Y3RECiAgICAgcmV0dXJuIENvbnN0cnVjdFR5cGVIb3N0OwogfQogCit2
b2lkIFByb3h5T2JqZWN0Ojp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3Im
IHZpc2l0b3IpCit7CisgICAgUHJveHlPYmplY3QqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8UHJveHlP
YmplY3QqPihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3Qs
IGluZm8oKSk7CisgICAgQmFzZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsK
KworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3RhcmdldCk7CisgICAgdmlzaXRv
ci5hcHBlbmQoJnRoaXNPYmplY3QtPm1faGFuZGxlcik7Cit9CisKIH0gLy8gbmFtZXNwYWNlIEpT
QwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJveHlPYmplY3QuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Qcm94eU9iamVjdC5oCShy
ZXZpc2lvbiAxOTY4NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Qcm94eU9i
amVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw3ICszNSw3IEBAIGNsYXNzIFByb3h5T2JqZWN0
IDogcHVibGljIEpTTm9uRmluYWxPYmoKIHB1YmxpYzoKICAgICB0eXBlZGVmIEpTTm9uRmluYWxP
YmplY3QgQmFzZTsKIAotICAgIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9
IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgT3ZlcnJpZGVzR2V0T3duUHJvcGVydHlTbG90IHwgVHlw
ZU9mU2hvdWxkQ2FsbEdldENhbGxEYXRhOworICAgIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBTdHJ1
Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgT3ZlcnJpZGVzR2V0T3duUHJvcGVy
dHlTbG90IHwgVHlwZU9mU2hvdWxkQ2FsbEdldENhbGxEYXRhIHwgSW50ZXJjZXB0c0dldE93blBy
b3BlcnR5U2xvdEJ5SW5kZXhFdmVuV2hlbkxlbmd0aElzTm90WmVybzsKIAogICAgIHN0YXRpYyBQ
cm94eU9iamVjdCogY3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgU3RydWN0dXJlKiBzdHJ1Y3R1cmUs
IEpTVmFsdWUgdGFyZ2V0LCBKU1ZhbHVlIGhhbmRsZXIpCiAgICAgewpAQCAtNDcsNyArNDcsNyBA
QCBwdWJsaWM6CiAKICAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZt
LCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvdHlwZSkKICAgICB7
Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90
b3R5cGUsIFR5cGVJbmZvKE9iamVjdFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsgCisg
ICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5
cGUsIFR5cGVJbmZvKFByb3h5T2JqZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCksIE5v
bkFycmF5IHwgTWF5SGF2ZUluZGV4ZWRBY2Nlc3NvcnMpOwogICAgIH0KIAogICAgIERFQ0xBUkVf
RVhQT1JUX0lORk87CkBAIC01NSw2ICs1NSwxMCBAQCBwdWJsaWM6CiAgICAgSlNPYmplY3QqIHRh
cmdldCgpIHsgcmV0dXJuIG1fdGFyZ2V0LmdldCgpOyB9CiAgICAgSlNWYWx1ZSBoYW5kbGVyKCkg
eyByZXR1cm4gbV9oYW5kbGVyLmdldCgpOyB9CiAKKyAgICBzdGF0aWMgdm9pZCBwdXQoSlNDZWxs
KiwgRXhlY1N0YXRlKiwgUHJvcGVydHlOYW1lLCBKU1ZhbHVlLCBQdXRQcm9wZXJ0eVNsb3QmKTsK
KyAgICBzdGF0aWMgdm9pZCBwdXRCeUluZGV4KEpTQ2VsbCosIEV4ZWNTdGF0ZSosIHVuc2lnbmVk
IHByb3BlcnR5TmFtZSwgSlNWYWx1ZSwgYm9vbCBzaG91bGRUaHJvdyk7CisgICAgdm9pZCBwdXRC
eUluZGV4Q29tbW9uKEV4ZWNTdGF0ZSosIEpTVmFsdWUgdGhpc1ZhbHVlLCB1bnNpZ25lZCBwcm9w
ZXJ0eU5hbWUsIEpTVmFsdWUgcHV0VmFsdWUsIGJvb2wgc2hvdWxkVGhyb3cpOworCiBwcml2YXRl
OgogICAgIFByb3h5T2JqZWN0KFZNJiwgU3RydWN0dXJlKik7CiAgICAgdm9pZCBmaW5pc2hDcmVh
dGlvbihWTSYsIEV4ZWNTdGF0ZSosIEpTVmFsdWUgdGFyZ2V0LCBKU1ZhbHVlIGhhbmRsZXIpOwpA
QCAtNjMsMTEgKzY3LDE0IEBAIHByaXZhdGU6CiAgICAgc3RhdGljIGJvb2wgZ2V0T3duUHJvcGVy
dHlTbG90QnlJbmRleChKU09iamVjdCosIEV4ZWNTdGF0ZSosIHVuc2lnbmVkIHByb3BlcnR5TmFt
ZSwgUHJvcGVydHlTbG90Jik7CiAgICAgc3RhdGljIENhbGxUeXBlIGdldENhbGxEYXRhKEpTQ2Vs
bCosIENhbGxEYXRhJik7CiAgICAgc3RhdGljIENvbnN0cnVjdFR5cGUgZ2V0Q29uc3RydWN0RGF0
YShKU0NlbGwqLCBDb25zdHJ1Y3REYXRhJik7CisKICAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxk
cmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7CiAKICAgICBib29sIGdldE93blByb3BlcnR5U2xv
dENvbW1vbihFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYpOwogICAgIGJv
b2wgcGVyZm9ybUludGVybmFsTWV0aG9kR2V0T3duUHJvcGVydHkoRXhlY1N0YXRlKiwgUHJvcGVy
dHlOYW1lLCBQcm9wZXJ0eVNsb3QmKTsKICAgICBib29sIHBlcmZvcm1IYXNQcm9wZXJ0eShFeGVj
U3RhdGUqLCBQcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYpOworICAgIHRlbXBsYXRlIDx0eXBl
bmFtZSBQZXJmb3JtRGVmYXVsdFB1dEZ1bmN0aW9uPgorICAgIHZvaWQgcHV0Q29tbW9uKEV4ZWNT
dGF0ZSosIEpTVmFsdWUgcHV0VmFsdWUsIEpTVmFsdWUgdGhpc1ZhbHVlLCBQcm9wZXJ0eU5hbWUs
IFBlcmZvcm1EZWZhdWx0UHV0RnVuY3Rpb24pOwogCiAgICAgV3JpdGVCYXJyaWVyPEpTT2JqZWN0
PiBtX3RhcmdldDsKICAgICBXcml0ZUJhcnJpZXI8VW5rbm93bj4gbV9oYW5kbGVyOwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL2VzNi55YW1sCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9lczYueWFtbAkocmV2aXNpb24gMTk2ODcxKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL2VzNi55YW1sCSh3b3JraW5nIGNvcHkpCkBAIC05NjMs
NyArOTYzLDcgQEAKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX2dldF9jYWxsc19BcnJheS5w
cm90b3R5cGUudG9TdHJpbmcuanMKICAgY21kOiBydW5FUzYgOm5vcm1hbAogLSBwYXRoOiBlczYv
UHJveHlfaW50ZXJuYWxfZ2V0X2NhbGxzX0FycmF5LnByb3RvdHlwZV9pdGVyYXRpb25fbWV0aG9k
cy5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6
IGVzNi9Qcm94eV9pbnRlcm5hbF9nZXRfY2FsbHNfQ2xhc3NEZWZpbml0aW9uRXZhbHVhdGlvbi5q
cwogICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9nZXRf
Y2FsbHNfQ3JlYXRlRHluYW1pY0Z1bmN0aW9uLmpzCkBAIC0xMDMzLDI3ICsxMDMzLDI3IEBACiAt
IHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9vd25LZXlzX2NhbGxzX1Rlc3RJbnRlZ3JpdHlMZXZl
bC5qcwogICBjbWQ6IHJ1bkVTNiA6ZmFpbAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0
X2NhbGxzX0FycmF5LmZyb20uanMKLSAgY21kOiBydW5FUzYgOmZhaWwKKyAgY21kOiBydW5FUzYg
Om5vcm1hbAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0X2NhbGxzX0FycmF5Lm9mLmpz
Ci0gIGNtZDogcnVuRVM2IDpmYWlsCisgIGNtZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0aDogZXM2
L1Byb3h5X2ludGVybmFsX3NldF9jYWxsc19BcnJheS5wcm90b3R5cGUuY29weVdpdGhpbi5qcwot
ICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Q
cm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlLmZpbGwuanMKLSAgY21kOiBy
dW5FUzYgOmZhaWwKKyAgY21kOiBydW5FUzYgOm5vcm1hbAogLSBwYXRoOiBlczYvUHJveHlfaW50
ZXJuYWxfc2V0X2NhbGxzX0FycmF5LnByb3RvdHlwZS5wb3AuanMKLSAgY21kOiBydW5FUzYgOmZh
aWwKKyAgY21kOiBydW5FUzYgOm5vcm1hbAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0
X2NhbGxzX0FycmF5LnByb3RvdHlwZS5wdXNoLmpzCi0gIGNtZDogcnVuRVM2IDpmYWlsCisgIGNt
ZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX3NldF9jYWxsc19B
cnJheS5wcm90b3R5cGUucmV2ZXJzZS5qcwogICBjbWQ6IHJ1bkVTNiA6ZmFpbAogLSBwYXRoOiBl
czYvUHJveHlfaW50ZXJuYWxfc2V0X2NhbGxzX0FycmF5LnByb3RvdHlwZS5zaGlmdC5qcwogICBj
bWQ6IHJ1bkVTNiA6ZmFpbAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0X2NhbGxzX0Fy
cmF5LnByb3RvdHlwZS5zcGxpY2UuanMKLSAgY21kOiBydW5FUzYgOmZhaWwKKyAgY21kOiBydW5F
UzYgOm5vcm1hbAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0X2NhbGxzX0FycmF5LnBy
b3RvdHlwZS51bnNoaWZ0LmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9Qcm94
eV9pbnRlcm5hbF9zZXRfY2FsbHNfT2JqZWN0LmFzc2lnbi5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFp
bAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pc0V4dGVuc2libGVf
aGFuZGxlci5qcwogICBjbWQ6IHJ1bkVTNiA6ZmFpbAogLSBwYXRoOiBlczYvUHJveHlfSlNPTi5z
dHJpbmdpZnlfc3VwcG9ydC5qcwpAQCAtMTA2NSw5ICsxMDY1LDkgQEAKIC0gcGF0aDogZXM2L1By
b3h5X1Byb3h5LnJldm9jYWJsZS5qcwogICBjbWQ6IHJ1bkVTNiA6ZmFpbAogLSBwYXRoOiBlczYv
UHJveHlfc2V0X2hhbmRsZXIuanMKLSAgY21kOiBydW5FUzYgOmZhaWwKKyAgY21kOiBydW5FUzYg
Om5vcm1hbAogLSBwYXRoOiBlczYvUHJveHlfc2V0X2hhbmRsZXJfaW5zdGFuY2VzX29mX3Byb3hp
ZXMuanMKLSAgY21kOiBydW5FUzYgOmZhaWwKKyAgY21kOiBydW5FUzYgOm5vcm1hbAogLSBwYXRo
OiBlczYvUHJveHlfc2V0UHJvdG90eXBlT2ZfaGFuZGxlci5qcwogICBjbWQ6IHJ1bkVTNiA6ZmFp
bAogLSBwYXRoOiBlczYvUmVmbGVjdF9SZWZsZWN0LmNvbnN0cnVjdC5qcwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9wcm94eS1zZXQuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9wcm94eS1zZXQuanMJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3Byb3h5LXNldC5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY0NiBAQAorZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAg
ICBpZiAoIWIpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQmFkIGFzc2VydGlvbiIpOworfQor
Cit7CisgICAgbGV0IHRhcmdldCA9IHsKKyAgICAgICAgeDogMzAKKyAgICB9OworCisgICAgbGV0
IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCBoYW5kbGVyID0geworICAgICAgICBzZXQ6IDQ1Cisg
ICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIGxldCB0aHJldyA9IGZh
bHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJveHkueCA9IDQwOworICAgICAgICB9
IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIGFzc2VydChlLnRvU3RyaW5nKCkgPT09ICJUeXBlRXJy
b3I6ICdzZXQnIHByb3BlcnR5IG9mIGEgUHJveHkncyBoYW5kbGVyIHNob3VsZCBiZSBjYWxsYWJs
ZS4iKTsKKyAgICAgICAgICAgIHRocmV3ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3Nl
cnQodGhyZXcpOworICAgIH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSB7CisgICAgICAgIHg6
IDMwCisgICAgfTsKKworICAgIGxldCBlcnJvciA9IG51bGw7CisgICAgbGV0IGhhbmRsZXIgPSB7
CisgICAgICAgIGdldCBzZXQoKSB7CisgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcjsKKyAg
ICAgICAgICAgIHRocm93IGVycm9yOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94
eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwg
MTAwMDsgaSsrKSB7CisgICAgICAgIGxldCB0aHJldyA9IGZhbHNlOworICAgICAgICB0cnkgewor
ICAgICAgICAgICAgcHJveHkueCA9IDQwOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAg
ICAgIGFzc2VydChlID09PSBlcnJvcik7CisgICAgICAgICAgICB0aHJldyA9IHRydWU7CisgICAg
ICAgIH0KKyAgICAgICAgYXNzZXJ0KHRocmV3KTsKKyAgICAgICAgZXJyb3IgPSBudWxsOworICAg
IH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSB7CisgICAgICAgIHg6IDMwCisgICAgfTsKKwor
ICAgIGxldCBlcnJvciA9IG51bGw7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDog
ZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcjsKKyAgICAgICAgICAg
IHRocm93IGVycm9yOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQ
cm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsr
KSB7CisgICAgICAgIGxldCB0aHJldyA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAg
ICAgcHJveHkueCA9IDQwOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIGFzc2Vy
dChlID09PSBlcnJvcik7CisgICAgICAgICAgICB0aHJldyA9IHRydWU7CisgICAgICAgIH0KKyAg
ICAgICAgYXNzZXJ0KHRocmV3KTsKKyAgICAgICAgZXJyb3IgPSBudWxsOworICAgIH0KK30KKwor
eworICAgIGxldCB0YXJnZXQgPSB7IH07CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdl
dCwgIngiLCB7CisgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgICAgICAgIHdyaXRhYmxl
OiBmYWxzZSwKKyAgICAgICAgdmFsdWU6IDUwMAorICAgIH0pOworCisgICAgbGV0IGNhbGxlZCA9
IGZhbHNlOworICAgIGxldCBoYW5kbGVyID0geworICAgICAgICBzZXQ6IGZ1bmN0aW9uKHRoZVRh
cmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZlcikgeworICAgICAgICAgICAgYXNzZXJ0KHRo
ZVRhcmdldCA9PT0gdGFyZ2V0KTsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAg
ICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7ICAgIAorICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0
YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7Cisg
ICAgICAgIHByb3h5LnggPSA0MDsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGFz
c2VydChwcm94eS54ID09PSA1MDApOworICAgICAgICBhc3NlcnQodGFyZ2V0LnggPT09IDUwMCk7
CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAgIH0KK30KKworeworICAgIGxldCB0YXJnZXQg
PSB7IH07CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgIngiLCB7CisgICAgICAg
IGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKKyAgICAgICAg
dmFsdWU6IDUwMAorICAgIH0pOworCisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDog
ZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAg
ICAgICBhc3NlcnQodGhlVGFyZ2V0ID09PSB0YXJnZXQpOworICAgICAgICAgICAgdGhlVGFyZ2V0
W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0K
KyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7Cisg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbGV0IHRocmV3ID0g
ZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm94eS54ID0gNDA7CisgICAgICAg
IH0gY2F0Y2goZSkgeworICAgICAgICAgICAgdGhyZXcgPSB0cnVlOworICAgICAgICAgICAgYXNz
ZXJ0KGUudG9TdHJpbmcoKSA9PT0gIlR5cGVFcnJvcjogUHJveHkgaGFuZGxlcidzICdzZXQnIG9u
IGEgbm9uLWNvbmZpZ3VyYWJsZSBhbmQgbm9uLXdyaXRhYmxlIHByb3BlcnR5IG9uICd0YXJnZXQn
IHNob3VsZCBlaXRoZXIgcmV0dXJuIGZhbHNlIG9yIGJlIHRoZSBzYW1lIHZhbHVlIGFscmVhZHkg
b24gdGhlICd0YXJnZXQnLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydCh0aHJldyk7Cisg
ICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsgfTsKKyAgICBPYmplY3QuZGVmaW5lUHJv
cGVydHkodGFyZ2V0LCAieCIsIHsKKyAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKKyAgICAg
ICAgZ2V0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAyNTsKKyAgICAgICAgfQor
ICAgIH0pOworCisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCBoYW5kbGVyID0gewor
ICAgICAgICBzZXQ6IGZ1bmN0aW9uKHRoZVRhcmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZl
cikgeworICAgICAgICAgICAgYXNzZXJ0KHRoZVRhcmdldCA9PT0gdGFyZ2V0KTsKKyAgICAgICAg
ICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFs
dWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAg
bGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9
IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgcHJveHkueCA9IDQwOworICAgICAgICBhc3Nl
cnQocHJveHkueCA9PT0gMjUpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAgY2Fs
bGVkID0gZmFsc2U7CisgICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsgfTsKKyAgICBP
YmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCAieCIsIHsKKyAgICAgICAgY29uZmlndXJhYmxl
OiBmYWxzZSwKKyAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAy
NTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxl
dCBoYW5kbGVyID0geworICAgICAgICBzZXQ6IGZ1bmN0aW9uKHRoZVRhcmdldCwgcHJvcE5hbWUs
IHZhbHVlLCByZWNpZXZlcikgeworICAgICAgICAgICAgYXNzZXJ0KHRoZVRhcmdldCA9PT0gdGFy
Z2V0KTsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB0aGVUYXJnZXRb
cHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQor
ICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAg
ICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBsZXQgdGhyZXcgPSBm
YWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3h5LnggPSA0MDsKKyAgICAgICAg
fSBjYXRjaChlKSB7CisgICAgICAgICAgICB0aHJldyA9IHRydWU7CisgICAgICAgICAgICBhc3Nl
cnQoZS50b1N0cmluZygpID09PSAiVHlwZUVycm9yOiBQcm94eSBoYW5kbGVyJ3MgJ3NldCcgbWV0
aG9kIG9uIGEgbm9uLWNvbmZpZ3VyYWJsZSBhY2Nlc3NvciBwcm9wZXJ0eSB3aXRob3V0IGEgc2V0
dGVyIHNob3VsZCByZXR1cm4gZmFsc2UuIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHRo
cmV3KTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0geyB9OworICAgIE9iamVjdC5k
ZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICJ4IiwgeworICAgICAgICBjb25maWd1cmFibGU6IGZhbHNl
LAorICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgdmFsdWU6IDUwCisgICAgfSk7CisK
KyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNl
dDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAg
ICAgICAgICBhc3NlcnQodGhlVGFyZ2V0ID09PSB0YXJnZXQpOworICAgICAgICAgICAgY2FsbGVk
ID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9
IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAw
MDsgaSsrKSB7CisgICAgICAgIHByb3h5LnggPSBpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsK
KyAgICAgICAgYXNzZXJ0KHByb3h5LnggPT09IGkpOworICAgICAgICBhc3NlcnQodGFyZ2V0Lngg
PT09IGkpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQg
dGFyZ2V0ID0geworICAgICAgICB4OiAzMAorICAgIH07CisKKyAgICBsZXQgY2FsbGVkID0gZmFs
c2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0
LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0
ID09PSB0aGVUYXJnZXQpOworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09PSBwcm94eSk7
CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BO
YW1lXSA9IHZhbHVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQ
cm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsr
KSB7CisgICAgICAgIHByb3h5LnggPSBpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAg
ICAgYXNzZXJ0KHByb3h5LnggPT09IGkpOworICAgICAgICBhc3NlcnQodGFyZ2V0LnggPT09IGkp
OworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKworICAgICAgICBwcm94eVsieSJdID0gaTsKKyAg
ICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGFzc2VydChwcm94eS55ID09PSBpKTsKKyAg
ICAgICAgYXNzZXJ0KHRhcmdldC55ID09PSBpKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7Cisg
ICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsKKyAgICAgICAgeDogMzAKKyAgICB9Owor
CisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCBoYW5kbGVyID0geworICAgICAgICBz
ZXQ6IGZ1bmN0aW9uKHRoZVRhcmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZlcikgeworICAg
ICAgICAgICAgYXNzZXJ0KHRhcmdldCA9PT0gdGhlVGFyZ2V0KTsKKyAgICAgICAgICAgIGFzc2Vy
dChyZWNpZXZlciA9PT0gcHJveHkpOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH07CisK
KyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBmb3IgKGxl
dCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBwcm94eS54ID0gaTsKKyAgICAgICAg
YXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGFzc2VydChwcm94eS54ID09PSBpKTsKKyAgICAgICAg
YXNzZXJ0KHRhcmdldC54ID09PSBpKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisKKyAgICAg
ICAgcHJveHlbInkiXSA9IGk7CisgICAgICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBhc3Nl
cnQocHJveHkueSA9PT0gaSk7CisgICAgICAgIGFzc2VydCh0YXJnZXQueSA9PT0gaSk7CisgICAg
ICAgIGNhbGxlZCA9IGZhbHNlOworICAgIH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSBbXTsK
KworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBsZXQgaGFuZGxlciA9IHsgfTsKKworICAg
IGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHByb3h5W2ldID0gaTsKKyAgICAgICAgYXNz
ZXJ0KHByb3h5W2ldID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFtpXSA9PT0gaSk7Cisg
ICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IFtdOworCisgICAgbGV0IGNhbGxlZCA9IGZh
bHNlOworICAgIGxldCBoYW5kbGVyID0geworICAgICAgICBzZXQ6IGZ1bmN0aW9uKHRoZVRhcmdl
dCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZlcikgeworICAgICAgICAgICAgYXNzZXJ0KHRhcmdl
dCA9PT0gdGhlVGFyZ2V0KTsKKyAgICAgICAgICAgIGFzc2VydChyZWNpZXZlciA9PT0gcHJveHkp
OworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9w
TmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcg
UHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkr
KykgeworICAgICAgICBwcm94eVtpXSA9IGk7CisgICAgICAgIGFzc2VydChwcm94eVtpXSA9PT0g
aSk7CisgICAgICAgIGFzc2VydCh0YXJnZXRbaV0gPT09IGkpOworICAgICAgICBhc3NlcnQoY2Fs
bGVkKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgfQorfQorCit7CisgICAgbGV0IHRh
cmdldCA9IFtdOworCisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCBoYW5kbGVyID0g
eworICAgICAgICBzZXQ6IGZ1bmN0aW9uKHRoZVRhcmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNp
ZXZlcikgeworICAgICAgICAgICAgYXNzZXJ0KHRhcmdldCA9PT0gdGhlVGFyZ2V0KTsKKyAgICAg
ICAgICAgIGFzc2VydChyZWNpZXZlciA9PT0gcHJveHkpOworICAgICAgICAgICAgY2FsbGVkID0g
dHJ1ZTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAg
fQorICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsK
KyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBwcm94eVtpXSA9
IGk7CisgICAgICAgIGFzc2VydChwcm94eVtpXSA9PT0gaSk7CisgICAgICAgIGFzc2VydCh0YXJn
ZXRbaV0gPT09IGkpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAgY2FsbGVkID0g
ZmFsc2U7CisgICAgfQorfQorCit7CisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCB0
YXJnZXQgPSB7CisgICAgICAgIHNldCB4KHYpIHsKKyAgICAgICAgICAgIGFzc2VydCh0aGlzID09
PSB0YXJnZXQpOworICAgICAgICAgICAgdGhpcy5feCA9IHY7CisgICAgICAgICAgICBjYWxsZWQg
PSB0cnVlOworICAgICAgICB9LAorICAgICAgICBnZXQgeCgpIHsKKyAgICAgICAgICAgIGFzc2Vy
dCh0aGlzID09PSB0YXJnZXQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3g7CisgICAgICAg
IH0KKyAgICB9OworCisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24o
dGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3Nl
cnQodGFyZ2V0ID09PSB0aGVUYXJnZXQpOworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09
PSBwcm94eSk7CisgICAgICAgICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBsZXQgcHJveHkg
PSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEw
MDA7IGkrKykgeworICAgICAgICBwcm94eS54ID0gaTsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7
CisgICAgICAgIGFzc2VydChwcm94eS54ID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldC54
ID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5Ll94ID09PSBpKTsKKyAgICAgICAgYXNzZXJ0
KHRhcmdldC5feCA9PT0gaSk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAgIH0KK30KKwor
eworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBsZXQgdGFyZ2V0ID0ge307CisgICAgbGV0
IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwg
dmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJn
ZXQpOworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09PSBvYmopOworICAgICAgICAgICAg
dGhlVGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBw
cm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGxldCBvYmogPSBPYmplY3Qu
Y3JlYXRlKHByb3h5LCB7CisgICAgICAgIG93bjogeworICAgICAgICAgICAgd3JpdGFibGU6IHRy
dWUsCisgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgICB2YWx1ZTog
bnVsbAorICAgICAgICB9CisgICAgfSk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBp
KyspIHsKKyAgICAgICAgb2JqLm93biA9IGk7CisgICAgICAgIGFzc2VydCghY2FsbGVkKTsKKyAg
ICAgICAgYXNzZXJ0KG9iai5vd24gPT09IGkpOworCisgICAgICAgIG9iai5ub3RPd24gPSBpOwor
ICAgICAgICBhc3NlcnQodGFyZ2V0Lm5vdE93biA9PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94
eS5ub3RPd24gPT09IGkpOworICAgICAgICBhc3NlcnQob2JqLm5vdE93biA9PT0gaSk7CisgICAg
ICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisK
K3sKKyAgICBsZXQgdGFyZ2V0ID0ge307CisgICAgbGV0IGhhbmRsZXIgPSB7IH07CisKKyAgICBs
ZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBsZXQgb2JqID0gT2Jq
ZWN0LmNyZWF0ZShwcm94eSwgeworICAgICAgICBvd246IHsKKyAgICAgICAgICAgIHdyaXRhYmxl
OiB0cnVlLAorICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgICAgICAgICAgdmFs
dWU6IG51bGwKKyAgICAgICAgfQorICAgIH0pOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAw
MDsgaSsrKSB7CisgICAgICAgIG9iai5vd24gPSBpOworICAgICAgICBhc3NlcnQob2JqLm93biA9
PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94eS5vd24gPT09IHVuZGVmaW5lZCk7CisKKyAgICAg
ICAgb2JqLm5vdE93biA9IGk7CisgICAgICAgIGFzc2VydCh0YXJnZXQubm90T3duID09PSBpKTsK
KyAgICAgICAgYXNzZXJ0KHByb3h5Lm5vdE93biA9PT0gaSk7CisgICAgICAgIGFzc2VydChvYmou
bm90T3duID09PSBpKTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7Cisg
ICAgbGV0IHRhcmdldCA9IHt9OworICAgIGxldCBoYW5kbGVyID0geworICAgICAgICBzZXQ6IGZ1
bmN0aW9uKHRoZVRhcmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZlcikgeworICAgICAgICAg
ICAgYXNzZXJ0KHRhcmdldCA9PT0gdGhlVGFyZ2V0KTsKKyAgICAgICAgICAgIGFzc2VydChyZWNp
ZXZlciA9PT0gb2JqKTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsK
KyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQorICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5k
bGVyKTsKKyAgICBsZXQgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm94eSwgeworICAgICAgICBbMF06
IHsKKyAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLAorICAgICAgICAgICAgY29uZmlndXJhYmxl
OiB0cnVlLAorICAgICAgICAgICAgdmFsdWU6IG51bGwKKyAgICAgICAgfQorICAgIH0pOworICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIG9ialswXSA9IGk7Cisg
ICAgICAgIGFzc2VydCghY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KG9ialswXSA9PT0gaSk7Cisg
ICAgICAgIGFzc2VydChwcm94eVswXSA9PT0gdW5kZWZpbmVkKTsKKworICAgICAgICBvYmpbMV0g
PSBpOworICAgICAgICBhc3NlcnQodGFyZ2V0WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHBy
b3h5WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KG9ialsxXSA9PT0gaSk7CisgICAgICAgIGFz
c2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAg
ICBsZXQgdGFyZ2V0ID0ge307CisgICAgbGV0IGhhbmRsZXIgPSB7IH07CisKKyAgICBsZXQgcHJv
eHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBsZXQgb2JqID0gT2JqZWN0LmNy
ZWF0ZShwcm94eSwgeworICAgICAgICBbMF06IHsKKyAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVl
LAorICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAorICAgICAgICAgICAgdmFsdWU6IG51
bGwKKyAgICAgICAgfQorICAgIH0pOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsr
KSB7CisgICAgICAgIG9ialswXSA9IGk7CisgICAgICAgIGFzc2VydChvYmpbMF0gPT09IGkpOwor
ICAgICAgICBhc3NlcnQocHJveHlbMF0gPT09IHVuZGVmaW5lZCk7CisKKyAgICAgICAgb2JqWzFd
ID0gaTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChw
cm94eVsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChvYmpbMV0gPT09IGkpOworICAgIH0KK30K
KworeworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBsZXQgdGFyZ2V0ID0ge307CisgICAg
bGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFt
ZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVU
YXJnZXQpOworICAgICAgICAgICAgLy9hc3NlcnQocmVjaWV2ZXIgPT09IG9iaik7CisgICAgICAg
ICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgICAgICBjYWxsZWQgPSB0
cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAg
bGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgbGV0IG9iaiA9IE9i
amVjdC5jcmVhdGUocHJveHksIHsKKyAgICAgICAgWzBdOiB7CisgICAgICAgICAgICB3cml0YWJs
ZTogdHJ1ZSwKKyAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHZh
bHVlOiBudWxsCisgICAgICAgIH0KKyAgICB9KTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEw
MDA7IGkrKykgeworICAgICAgICBvYmpbMF0gPSBpOworICAgICAgICBhc3NlcnQoIWNhbGxlZCk7
CisgICAgICAgIGFzc2VydChvYmpbMF0gPT09IGkpOworICAgICAgICBhc3NlcnQocHJveHlbMF0g
PT09IHVuZGVmaW5lZCk7CisKKyAgICAgICAgb2JqWzFdID0gaTsKKyAgICAgICAgYXNzZXJ0KHRh
cmdldFsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94eVsxXSA9PT0gaSk7CisgICAgICAg
IGFzc2VydChvYmpbMV0gPT09IGkpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAg
Y2FsbGVkID0gZmFsc2U7CisgICAgfQorfQorCit7CisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOwor
ICAgIGxldCB0YXJnZXQgPSBbMjVdOworICAgIGxldCBoYW5kbGVyID0geworICAgICAgICBzZXQ6
IGZ1bmN0aW9uKHRoZVRhcmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZlcikgeworICAgICAg
ICAgICAgYXNzZXJ0KHRhcmdldCA9PT0gdGhlVGFyZ2V0KTsKKyAgICAgICAgICAgIC8vYXNzZXJ0
KHJlY2lldmVyID09PSBvYmopOworICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BOYW1lXSA9IHZh
bHVlOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQs
IGhhbmRsZXIpOworICAgIGxldCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAgICAg
IFswXTogeworICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCisgICAgICAgICAgICBjb25maWd1
cmFibGU6IHRydWUsCisgICAgICAgICAgICB2YWx1ZTogbnVsbAorICAgICAgICB9CisgICAgfSk7
CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgb2JqWzBdID0g
aTsKKyAgICAgICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAgICBhc3NlcnQob2JqWzBdID09PSBp
KTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzBdID09PSAyNSk7CisKKyAgICAgICAgb2JqWzFdID0g
aTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94
eVsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChvYmpbMV0gPT09IGkpOworICAgICAgICBhc3Nl
cnQoY2FsbGVkKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgfQorfQorCit7CisgICAg
bGV0IGNhbGxlZCA9IGZhbHNlOworICAgIGxldCBvZ1RhcmdldCA9IHt9OworICAgIGxldCB0YXJn
ZXQgPSBuZXcgUHJveHkob2dUYXJnZXQsIHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJn
ZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCh0aGVU
YXJnZXQgPT09IG9nVGFyZ2V0KTsKKyAgICAgICAgICAgIGFzc2VydChyZWNpZXZlciA9PT0gb2Jq
KTsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB0aGVUYXJnZXRbcHJv
cE5hbWVdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBsZXQgaGFuZGxlciA9IHsg
fTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGxl
dCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAgICAgIG93bjogeworICAgICAgICAg
ICAgd3JpdGFibGU6IHRydWUsCisgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAg
ICAgICAgICB2YWx1ZTogbnVsbAorICAgICAgICB9CisgICAgfSk7CisgICAgZm9yIChsZXQgaSA9
IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgb2JqLm93biA9IGk7CisgICAgICAgIGFzc2Vy
dCghY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KG9iai5vd24gPT09IGkpOworICAgICAgICBhc3Nl
cnQocHJveHkub3duID09PSB1bmRlZmluZWQpOworCisgICAgICAgIG9iai5ub3RPd24gPSBpOwor
ICAgICAgICBhc3NlcnQodGFyZ2V0Lm5vdE93biA9PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94
eS5ub3RPd24gPT09IGkpOworICAgICAgICBhc3NlcnQob2JqLm5vdE93biA9PT0gaSk7CisgICAg
ICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisK
K3sKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IG9nVGFyZ2V0ID0gWzI1XTsKKyAg
ICBsZXQgdGFyZ2V0ID0gbmV3IFByb3h5KG9nVGFyZ2V0LCB7CisgICAgICAgIHNldDogZnVuY3Rp
b24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBh
c3NlcnQodGhlVGFyZ2V0ID09PSBvZ1RhcmdldCk7CisgICAgICAgICAgICBhc3NlcnQocmVjaWV2
ZXIgPT09IG9iaik7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhl
VGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICB9CisgICAgfSk7CisgICAgbGV0IGhh
bmRsZXIgPSB7IH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVy
KTsKKyAgICBsZXQgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm94eSwgeworICAgICAgICBbMF06IHsK
KyAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLAorICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0
cnVlLAorICAgICAgICAgICAgdmFsdWU6IG51bGwKKyAgICAgICAgfQorICAgIH0pOworICAgIGZv
ciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIG9ialswXSA9IGk7CisgICAg
ICAgIGFzc2VydCghY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KG9ialswXSA9PT0gaSk7CisgICAg
ICAgIGFzc2VydChwcm94eVswXSA9PT0gMjUpOworCisgICAgICAgIG9ialsxXSA9IGk7CisgICAg
ICAgIGFzc2VydCh0YXJnZXRbMV0gPT09IGkpOworICAgICAgICBhc3NlcnQocHJveHlbMV0gPT09
IGkpOworICAgICAgICBhc3NlcnQob2JqWzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KGNhbGxl
ZCk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworICAgIH0KK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>272056</attachid>
            <date>2016-02-23 15:01:56 -0800</date>
            <delta_ts>2016-02-25 13:12:48 -0800</delta_ts>
            <desc>patch</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>32555</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTk3MDAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDUyIEBA
CisyMDE2LTAyLTIzICBTYWFtIGJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFtFUzZdIEltcGxlbWVudCBQcm94eS5bW1NldF1dCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTQ1MTEKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGlzIG1vc3RseSBhbiBpbXBsZW1lbnRh
dGlvbiBvZgorICAgICAgICBQcm94eS5bW1NldF1dIHdpdGggcmVzcGVjdCB0byBzZWN0aW9uIDku
NS45CisgICAgICAgIG9mIHRoZSBFQ01BU2NyaXB0IHNwZWMuCisgICAgICAgIGh0dHBzOi8vdGMz
OS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb3h5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFu
ZC1pbnRlcm5hbC1zbG90cy1zZXQtcC12LXJlY2VpdmVyCisKKyAgICAgICAgVGhpcyBwYXRjaCBh
bHNvIGNoYW5nZXMgSlNPYmplY3Q6OnB1dElubGluZSBhbmQgSlNPYmplY3Q6OnB1dEJ5SW5kZXgK
KyAgICAgICAgdG8gYmUgYXdhcmUgdGhhdCBhIFByb3h5IGluIHRoZSBwcm90b3R5cGUgY2hhaW4g
d2lsbCBpbnRlcmNlcHQKKyAgICAgICAgcHJvcGVydHkgYWNjZXNzZXMuCisKKyAgICAgICAgKiBy
dW50aW1lL0pTT2JqZWN0LmNwcDoKKyAgICAgICAgKEpTQzo6SlNPYmplY3Q6OnB1dElubGluZVNs
b3cpOgorICAgICAgICAoSlNDOjpKU09iamVjdDo6YXR0ZW1wdFRvSW50ZXJjZXB0UHV0QnlJbmRl
eE9uSG9sZUZvclByb3RvdHlwZSk6CisgICAgICAgICogcnVudGltZS9KU09iamVjdC5oOgorICAg
ICAgICAqIHJ1bnRpbWUvSlNPYmplY3RJbmxpbmVzLmg6CisgICAgICAgIChKU0M6OkpTT2JqZWN0
OjpjYW5QZXJmb3JtRmFzdFB1dElubGluZSk6CisgICAgICAgIChKU0M6OkpTT2JqZWN0OjpwdXRJ
bmxpbmUpOgorICAgICAgICAqIHJ1bnRpbWUvSlNUeXBlLmg6CisgICAgICAgICogcnVudGltZS9Q
cm94eU9iamVjdC5jcHA6CisgICAgICAgIChKU0M6OlByb3h5T2JqZWN0OjpnZXRPd25Qcm9wZXJ0
eVNsb3RCeUluZGV4KToKKyAgICAgICAgKEpTQzo6UHJveHlPYmplY3Q6OnB1dENvbW1vbik6Cisg
ICAgICAgIChKU0M6OlByb3h5T2JqZWN0OjpwdXQpOgorICAgICAgICAoSlNDOjpQcm94eU9iamVj
dDo6cHV0QnlJbmRleENvbW1vbik6CisgICAgICAgIChKU0M6OlByb3h5T2JqZWN0OjpwdXRCeUlu
ZGV4KToKKyAgICAgICAgKEpTQzo6cGVyZm9ybVByb3h5Q2FsbCk6CisgICAgICAgIChKU0M6OlBy
b3h5T2JqZWN0OjpnZXRDYWxsRGF0YSk6CisgICAgICAgIChKU0M6OnBlcmZvcm1Qcm94eUNvbnN0
cnVjdCk6CisgICAgICAgIChKU0M6OlByb3h5T2JqZWN0OjpnZXRDb25zdHJ1Y3REYXRhKToKKyAg
ICAgICAgKEpTQzo6UHJveHlPYmplY3Q6OnZpc2l0Q2hpbGRyZW4pOgorICAgICAgICAqIHJ1bnRp
bWUvUHJveHlPYmplY3QuaDoKKyAgICAgICAgKEpTQzo6UHJveHlPYmplY3Q6OmNyZWF0ZSk6Cisg
ICAgICAgIChKU0M6OlByb3h5T2JqZWN0OjpjcmVhdGVTdHJ1Y3R1cmUpOgorICAgICAgICAoSlND
OjpQcm94eU9iamVjdDo6dGFyZ2V0KToKKyAgICAgICAgKEpTQzo6UHJveHlPYmplY3Q6OmhhbmRs
ZXIpOgorICAgICAgICAqIHRlc3RzL2VzNi55YW1sOgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9w
cm94eS1zZXQuanM6IEFkZGVkLgorICAgICAgICAoYXNzZXJ0KToKKyAgICAgICAgKHRocm93Lm5l
dy5FcnJvci5sZXQuaGFuZGxlci5zZXQgNDUpOgorICAgICAgICAodGhyb3cubmV3LkVycm9yKToK
KyAgICAgICAgKGxldC50YXJnZXQuc2V0IHgpOgorICAgICAgICAobGV0LnRhcmdldC5nZXQgeCk6
CisgICAgICAgIChzZXQgbGV0KToKKwogMjAxNi0wMi0yMyAgU2FhbSBiYXJhdGkgIDxzYmFyYXRp
QGFwcGxlLmNvbT4KIAogICAgICAgICBNYWtlIEpTT2JqZWN0OjpnZXRNZXRob2QgaGF2ZSBmZXdl
ciBicmFuY2hlcwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPYmplY3Qu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0
LmNwcAkocmV2aXNpb24gMTk3MDAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
SlNPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MjIsNiArNDIyLDExIEBAIHZvaWQgSlNP
YmplY3Q6OnB1dElubGluZVNsb3coRXhlY1N0YXRlKiAKICAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG9iai0+dHlwZSgpID09IFByb3h5T2Jq
ZWN0VHlwZSkgeworICAgICAgICAgICAgUHJveHlPYmplY3QqIHByb3h5ID0ganNDYXN0PFByb3h5
T2JqZWN0Kj4ob2JqKTsKKyAgICAgICAgICAgIHByb3h5LT5Qcm94eU9iamVjdDo6cHV0KHByb3h5
LCBleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBzbG90KTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQogICAgICAgICBKU1ZhbHVlIHByb3RvdHlwZSA9IG9iai0+cHJvdG90eXBlKCk7
CiAgICAgICAgIGlmIChwcm90b3R5cGUuaXNOdWxsKCkpCiAgICAgICAgICAgICBicmVhazsKQEAg
LTE5MTYsNiArMTkyMSwxMiBAQCBib29sIEpTT2JqZWN0OjphdHRlbXB0VG9JbnRlcmNlcHRQdXRC
eUluCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAg
IH0KKworICAgICAgICBpZiAoY3VycmVudC0+dHlwZSgpID09IFByb3h5T2JqZWN0VHlwZSkgewor
ICAgICAgICAgICAgUHJveHlPYmplY3QqIHByb3h5ID0ganNDYXN0PFByb3h5T2JqZWN0Kj4oY3Vy
cmVudCk7CisgICAgICAgICAgICBwcm94eS0+cHV0QnlJbmRleENvbW1vbihleGVjLCB0aGlzVmFs
dWUsIGksIHZhbHVlLCBzaG91bGRUaHJvdyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQogICAgICAgICAKICAgICAgICAgSlNWYWx1ZSBwcm90b3R5cGVWYWx1ZSA9IGN1cnJl
bnQtPnByb3RvdHlwZSgpOwogICAgICAgICBpZiAocHJvdG90eXBlVmFsdWUuaXNOdWxsKCkpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09iamVjdC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0LmgJKHJldmlzaW9uIDE5
NzAwMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0LmgJKHdvcmtp
bmcgY29weSkKQEAgLTg1NSw2ICs4NTUsNyBAQCBwcml2YXRlOgogICAgICAgICAKICAgICB0ZW1w
bGF0ZTxQdXRNb2RlPgogICAgIGJvb2wgcHV0RGlyZWN0SW50ZXJuYWwoVk0mLCBQcm9wZXJ0eU5h
bWUsIEpTVmFsdWUsIHVuc2lnbmVkIGF0dHIsIFB1dFByb3BlcnR5U2xvdCYpOworICAgIGJvb2wg
Y2FuUGVyZm9ybUZhc3RQdXRJbmxpbmUoRXhlY1N0YXRlKiBleGVjLCBWTSYsIFByb3BlcnR5TmFt
ZSk7CiAKICAgICBKU19FWFBPUlRfUFJJVkFURSBORVZFUl9JTkxJTkUgdm9pZCBwdXRJbmxpbmVT
bG93KEV4ZWNTdGF0ZSosIFByb3BlcnR5TmFtZSwgSlNWYWx1ZSwgUHV0UHJvcGVydHlTbG90Jik7
CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0SW5saW5lcy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT2JqZWN0SW5s
aW5lcy5oCShyZXZpc2lvbiAxOTcwMDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9KU09iamVjdElubGluZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsMjggQEAKIAog
bmFtZXNwYWNlIEpTQyB7CiAKK0FMV0FZU19JTkxJTkUgYm9vbCBKU09iamVjdDo6Y2FuUGVyZm9y
bUZhc3RQdXRJbmxpbmUoRXhlY1N0YXRlKiBleGVjLCBWTSYgdm0sIFByb3BlcnR5TmFtZSBwcm9w
ZXJ0eU5hbWUpCit7CisgICAgaWYgKFVOTElLRUxZKHByb3BlcnR5TmFtZSA9PSBleGVjLT5wcm9w
ZXJ0eU5hbWVzKCkudW5kZXJzY29yZVByb3RvKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzZXR0ZXJzIG9yIGdldHRlcnMgaW4gdGhlIHBy
b3RvdHlwZSBjaGFpbgorICAgIEpTVmFsdWUgcHJvdG90eXBlOworICAgIEpTT2JqZWN0KiBvYmog
PSB0aGlzOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChvYmotPnN0cnVjdHVyZSh2
bSktPmhhc1JlYWRPbmx5T3JHZXR0ZXJTZXR0ZXJQcm9wZXJ0aWVzRXhjbHVkaW5nUHJvdG8oKSB8
fCBvYmotPnR5cGUoKSA9PSBQcm94eU9iamVjdFR5cGUpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgcHJvdG90eXBlID0gb2JqLT5wcm90b3R5cGUoKTsKKyAgICAgICAgaWYg
KHByb3RvdHlwZS5pc051bGwoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAg
IG9iaiA9IGFzT2JqZWN0KHByb3RvdHlwZSk7CisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Cit9CisKIC8vIEVDTUEgOC42LjIuMgogQUxXQVlTX0lOTElORSB2b2lkIEpTT2JqZWN0
OjpwdXRJbmxpbmUoSlNDZWxsKiBjZWxsLCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBw
cm9wZXJ0eU5hbWUsIEpTVmFsdWUgdmFsdWUsIFB1dFByb3BlcnR5U2xvdCYgc2xvdCkKIHsKQEAg
LTQ0LDIzICs2NiwxNCBAQCBBTFdBWVNfSU5MSU5FIHZvaWQgSlNPYmplY3Q6OnB1dElubGluZShK
CiAgICAgICAgIHB1dEJ5SW5kZXgodGhpc09iamVjdCwgZXhlYywgaW5kZXgudmFsdWUoKSwgdmFs
dWUsIHNsb3QuaXNTdHJpY3RNb2RlKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIAot
ICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgc2V0dGVycyBvciBnZXR0ZXJzIGluIHRoZSBw
cm90b3R5cGUgY2hhaW4KLSAgICBKU1ZhbHVlIHByb3RvdHlwZTsKLSAgICBpZiAocHJvcGVydHlO
YW1lICE9IGV4ZWMtPnByb3BlcnR5TmFtZXMoKS51bmRlcnNjb3JlUHJvdG8pIHsKLSAgICAgICAg
Zm9yIChKU09iamVjdCogb2JqID0gdGhpc09iamVjdDsgIW9iai0+c3RydWN0dXJlKHZtKS0+aGFz
UmVhZE9ubHlPckdldHRlclNldHRlclByb3BlcnRpZXNFeGNsdWRpbmdQcm90bygpOyBvYmogPSBh
c09iamVjdChwcm90b3R5cGUpKSB7Ci0gICAgICAgICAgICBwcm90b3R5cGUgPSBvYmotPnByb3Rv
dHlwZSgpOwotICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5pc051bGwoKSkgewotICAgICAgICAg
ICAgICAgIEFTU0VSVCghdGhpc09iamVjdC0+c3RydWN0dXJlKHZtKS0+cHJvdG90eXBlQ2hhaW5N
YXlJbnRlcmNlcHRTdG9yZVRvKGV4ZWMtPnZtKCksIHByb3BlcnR5TmFtZSkpOwotICAgICAgICAg
ICAgICAgIGlmICghdGhpc09iamVjdC0+cHV0RGlyZWN0SW50ZXJuYWw8UHV0TW9kZVB1dD4odm0s
IHByb3BlcnR5TmFtZSwgdmFsdWUsIDAsIHNsb3QpCi0gICAgICAgICAgICAgICAgICAgICYmIHNs
b3QuaXNTdHJpY3RNb2RlKCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93VHlwZUVycm9yKGV4
ZWMsIEFTQ0lJTGl0ZXJhbChTdHJpY3RNb2RlUmVhZG9ubHlQcm9wZXJ0eVdyaXRlRXJyb3IpKTsK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
CiAKLSAgICB0aGlzT2JqZWN0LT5wdXRJbmxpbmVTbG93KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFs
dWUsIHNsb3QpOworICAgIGlmICh0aGlzT2JqZWN0LT5jYW5QZXJmb3JtRmFzdFB1dElubGluZShl
eGVjLCB2bSwgcHJvcGVydHlOYW1lKSkgeworICAgICAgICBBU1NFUlQoIXRoaXNPYmplY3QtPnN0
cnVjdHVyZSh2bSktPnByb3RvdHlwZUNoYWluTWF5SW50ZXJjZXB0U3RvcmVUbyhleGVjLT52bSgp
LCBwcm9wZXJ0eU5hbWUpKTsKKyAgICAgICAgaWYgKCF0aGlzT2JqZWN0LT5wdXREaXJlY3RJbnRl
cm5hbDxQdXRNb2RlUHV0Pih2bSwgcHJvcGVydHlOYW1lLCB2YWx1ZSwgMCwgc2xvdCkKKyAgICAg
ICAgICAgICYmIHNsb3QuaXNTdHJpY3RNb2RlKCkpCisgICAgICAgICAgICB0aHJvd1R5cGVFcnJv
cihleGVjLCBBU0NJSUxpdGVyYWwoU3RyaWN0TW9kZVJlYWRvbmx5UHJvcGVydHlXcml0ZUVycm9y
KSk7CisgICAgfSBlbHNlCisgICAgICAgIHRoaXNPYmplY3QtPnB1dElubGluZVNsb3coZXhlYywg
cHJvcGVydHlOYW1lLCB2YWx1ZSwgc2xvdCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNUeXBlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNUeXBlLmgJKHJldmlzaW9uIDE5NzAwMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTVHlwZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC03OCw3ICs3OCw5IEBAIGVudW0gSlNUeXBlIDogdWludDhfdCB7CiAgICAgR2xvYmFsT2Jq
ZWN0VHlwZSwKICAgICBDbG9zdXJlT2JqZWN0VHlwZSwKIAotICAgIExhc3RKU0NPYmplY3RUeXBl
ID0gQ2xvc3VyZU9iamVjdFR5cGUsCisgICAgUHJveHlPYmplY3RUeXBlLAorCisgICAgTGFzdEpT
Q09iamVjdFR5cGUgPSBQcm94eU9iamVjdFR5cGUsCiB9OwogCiBDT01QSUxFX0FTU0VSVChzaXpl
b2YoSlNUeXBlKSA9PSBzaXplb2YodWludDhfdCksIHNpemVvZl9qc3R5cGVfaXNfb25lX2J5dGUp
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJveHlPYmplY3QuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb3h5T2JqZWN0LmNw
cAkocmV2aXNpb24gMTk3MDAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJv
eHlPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMDAsNiArMzAwLDg4IEBAIGJvb2wgUHJv
eHlPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdEJ5SW4KICAgICByZXR1cm4gdGhpc09iamVjdC0+
Z2V0T3duUHJvcGVydHlTbG90Q29tbW9uKGV4ZWMsIGlkZW50LmltcGwoKSwgc2xvdCk7CiB9CiAK
K3RlbXBsYXRlIDx0eXBlbmFtZSBQZXJmb3JtRGVmYXVsdFB1dEZ1bmN0aW9uPgordm9pZCBQcm94
eU9iamVjdDo6cHV0Q29tbW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBwdXRWYWx1ZSwgSlNW
YWx1ZSB0aGlzVmFsdWUsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFBlcmZvcm1EZWZhdWx0
UHV0RnVuY3Rpb24gcGVyZm9ybURlZmF1bHRQdXRGdW5jdGlvbikKK3sKKyAgICBWTSYgdm0gPSBl
eGVjLT52bSgpOworICAgIEpTVmFsdWUgaGFuZGxlclZhbHVlID0gdGhpcy0+aGFuZGxlcigpOwor
ICAgIGlmIChoYW5kbGVyVmFsdWUuaXNOdWxsKCkpIHsKKyAgICAgICAgdGhyb3dWTVR5cGVFcnJv
cihleGVjLCBBU0NJSUxpdGVyYWwoIlByb3h5ICdoYW5kbGVyJyBpcyBudWxsLiBJdCBzaG91bGQg
YmUgYW4gT2JqZWN0LiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEpTT2JqZWN0
KiBoYW5kbGVyID0ganNDYXN0PEpTT2JqZWN0Kj4oaGFuZGxlclZhbHVlKTsKKyAgICBDYWxsRGF0
YSBjYWxsRGF0YTsKKyAgICBDYWxsVHlwZSBjYWxsVHlwZTsKKyAgICBKU1ZhbHVlIHNldE1ldGhv
ZCA9IGhhbmRsZXItPmdldE1ldGhvZChleGVjLCBjYWxsRGF0YSwgY2FsbFR5cGUsIHZtLnByb3Bl
cnR5TmFtZXMtPnNldCwgQVNDSUlMaXRlcmFsKCInc2V0JyBwcm9wZXJ0eSBvZiBhIFByb3h5J3Mg
aGFuZGxlciBzaG91bGQgYmUgY2FsbGFibGUuIikpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRp
b24oKSkKKyAgICAgICAgcmV0dXJuOworICAgIEpTT2JqZWN0KiB0YXJnZXQgPSB0aGlzLT50YXJn
ZXQoKTsKKyAgICBpZiAoc2V0TWV0aG9kLmlzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgcGVyZm9y
bURlZmF1bHRQdXRGdW5jdGlvbigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTWFy
a2VkQXJndW1lbnRCdWZmZXIgYXJndW1lbnRzOworICAgIGFyZ3VtZW50cy5hcHBlbmQodGFyZ2V0
KTsKKyAgICBhcmd1bWVudHMuYXBwZW5kKGlkZW50aWZpZXJUb1NhZmVQdWJsaWNKU1ZhbHVlKHZt
LCBJZGVudGlmaWVyOjpmcm9tVWlkKCZ2bSwgcHJvcGVydHlOYW1lLnVpZCgpKSkpOworICAgIGFy
Z3VtZW50cy5hcHBlbmQocHV0VmFsdWUpOworICAgIGFyZ3VtZW50cy5hcHBlbmQodGhpc1ZhbHVl
KTsKKyAgICBKU1ZhbHVlIHRyYXBSZXN1bHQgPSBjYWxsKGV4ZWMsIHNldE1ldGhvZCwgY2FsbFR5
cGUsIGNhbGxEYXRhLCBoYW5kbGVyLCBhcmd1bWVudHMpOworICAgIGlmIChleGVjLT5oYWRFeGNl
cHRpb24oKSkKKyAgICAgICAgcmV0dXJuOworICAgIGJvb2wgdHJhcFJlc3VsdEFzQm9vbCA9IHRy
YXBSZXN1bHQudG9Cb29sZWFuKGV4ZWMpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkK
KyAgICAgICAgcmV0dXJuOworICAgIGlmICghdHJhcFJlc3VsdEFzQm9vbCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgaWYgKHRhcmdl
dC0+Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGV4ZWMsIHByb3BlcnR5TmFtZSwgZGVzY3JpcHRv
cikpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuaXNEYXRhRGVzY3JpcHRvcigpICYmICFkZXNj
cmlwdG9yLmNvbmZpZ3VyYWJsZSgpICYmICFkZXNjcmlwdG9yLndyaXRhYmxlKCkpIHsKKyAgICAg
ICAgICAgIGlmICghc2FtZVZhbHVlKGV4ZWMsIGRlc2NyaXB0b3IudmFsdWUoKSwgcHV0VmFsdWUp
KSB7CisgICAgICAgICAgICAgICAgdGhyb3dWTVR5cGVFcnJvcihleGVjLCBBU0NJSUxpdGVyYWwo
IlByb3h5IGhhbmRsZXIncyAnc2V0JyBvbiBhIG5vbi1jb25maWd1cmFibGUgYW5kIG5vbi13cml0
YWJsZSBwcm9wZXJ0eSBvbiAndGFyZ2V0JyBzaG91bGQgZWl0aGVyIHJldHVybiBmYWxzZSBvciBi
ZSB0aGUgc2FtZSB2YWx1ZSBhbHJlYWR5IG9uIHRoZSAndGFyZ2V0Jy4iKSk7CisgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0
b3IuaXNBY2Nlc3NvckRlc2NyaXB0b3IoKSAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUoKSAm
JiBkZXNjcmlwdG9yLnNldHRlcigpLmlzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIHRocm93
Vk1UeXBlRXJyb3IoZXhlYywgQVNDSUlMaXRlcmFsKCJQcm94eSBoYW5kbGVyJ3MgJ3NldCcgbWV0
aG9kIG9uIGEgbm9uLWNvbmZpZ3VyYWJsZSBhY2Nlc3NvciBwcm9wZXJ0eSB3aXRob3V0IGEgc2V0
dGVyIHNob3VsZCByZXR1cm4gZmFsc2UuIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgfQorfQorCit2b2lkIFByb3h5T2JqZWN0OjpwdXQoSlNDZWxsKiBjZWxsLCBFeGVj
U3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUgdmFsdWUsIFB1
dFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIFBy
b3h5T2JqZWN0KiB0aGlzT2JqZWN0ID0ganNDYXN0PFByb3h5T2JqZWN0Kj4oY2VsbCk7CisgICAg
YXV0byBwZXJmb3JtRGVmYXVsdFB1dCA9IFsmXSAoKSB7CisgICAgICAgIEpTT2JqZWN0KiB0YXJn
ZXQgPSBqc0Nhc3Q8SlNPYmplY3QqPih0aGlzT2JqZWN0LT50YXJnZXQoKSk7CisgICAgICAgIHRh
cmdldC0+bWV0aG9kVGFibGUodm0pLT5wdXQodGFyZ2V0LCBleGVjLCBwcm9wZXJ0eU5hbWUsIHZh
bHVlLCBzbG90KTsKKyAgICB9OworICAgIHRoaXNPYmplY3QtPnB1dENvbW1vbihleGVjLCB2YWx1
ZSwgc2xvdC50aGlzVmFsdWUoKSwgcHJvcGVydHlOYW1lLCBwZXJmb3JtRGVmYXVsdFB1dCk7Cit9
CisKK3ZvaWQgUHJveHlPYmplY3Q6OnB1dEJ5SW5kZXhDb21tb24oRXhlY1N0YXRlKiBleGVjLCBK
U1ZhbHVlIHRoaXNWYWx1ZSwgdW5zaWduZWQgcHJvcGVydHlOYW1lLCBKU1ZhbHVlIHB1dFZhbHVl
LCBib29sIHNob3VsZFRocm93KQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgSWRl
bnRpZmllciBpZGVudCA9IElkZW50aWZpZXI6OmZyb20oZXhlYywgcHJvcGVydHlOYW1lKTsgCisg
ICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm47CisgICAgYXV0byBw
ZXJmb3JtRGVmYXVsdFB1dCA9IFsmXSAoKSB7CisgICAgICAgIEpTT2JqZWN0KiB0YXJnZXQgPSB0
aGlzLT50YXJnZXQoKTsKKyAgICAgICAgYm9vbCBpc1N0cmljdE1vZGUgPSBzaG91bGRUaHJvdzsK
KyAgICAgICAgUHV0UHJvcGVydHlTbG90IHNsb3QodGhpc1ZhbHVlLCBpc1N0cmljdE1vZGUpOyAv
LyBXZSBtdXN0IHByZXNlcnZlIHRoZSAidGhpcyIgdGFyZ2V0IG9mIHRoZSBwdXRCeUluZGV4Lgor
ICAgICAgICB0YXJnZXQtPm1ldGhvZFRhYmxlKHZtKS0+cHV0KHRhcmdldCwgZXhlYywgaWRlbnQu
aW1wbCgpLCBwdXRWYWx1ZSwgc2xvdCk7CisgICAgfTsKKyAgICBwdXRDb21tb24oZXhlYywgcHV0
VmFsdWUsIHRoaXNWYWx1ZSwgaWRlbnQuaW1wbCgpLCBwZXJmb3JtRGVmYXVsdFB1dCk7Cit9CisK
K3ZvaWQgUHJveHlPYmplY3Q6OnB1dEJ5SW5kZXgoSlNDZWxsKiBjZWxsLCBFeGVjU3RhdGUqIGV4
ZWMsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSB2YWx1ZSwgYm9vbCBzaG91bGRUaHJv
dykKK3sKKyAgICBQcm94eU9iamVjdCogdGhpc09iamVjdCA9IGpzQ2FzdDxQcm94eU9iamVjdCo+
KGNlbGwpOworICAgIHRoaXNPYmplY3QtPnB1dEJ5SW5kZXhDb21tb24oZXhlYywgdGhpc09iamVj
dCwgcHJvcGVydHlOYW1lLCB2YWx1ZSwgc2hvdWxkVGhyb3cpOworfQorCiBzdGF0aWMgRW5jb2Rl
ZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBwZXJmb3JtUHJveHlDYWxsKEV4ZWNTdGF0ZSogZXhlYykK
IHsKICAgICBWTSYgdm0gPSBleGVjLT52bSgpOwpAQCAtMzQ1LDE2ICs0MjcsNiBAQCBDYWxsVHlw
ZSBQcm94eU9iamVjdDo6Z2V0Q2FsbERhdGEoSlNDZWxsCiAgICAgcmV0dXJuIENhbGxUeXBlSG9z
dDsKIH0KIAotdm9pZCBQcm94eU9iamVjdDo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNs
b3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIFByb3h5T2JqZWN0KiB0aGlzT2JqZWN0ID0ganND
YXN0PFByb3h5T2JqZWN0Kj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0
aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIEJhc2U6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwg
dmlzaXRvcik7Ci0KLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV90YXJnZXQpOwot
ICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX2hhbmRsZXIpOwotfQotCiBzdGF0aWMg
RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBwZXJmb3JtUHJveHlDb25zdHJ1Y3QoRXhlY1N0
YXRlKiBleGVjKQogewogICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CkBAIC00MDUsNCArNDc3LDE0
IEBAIENvbnN0cnVjdFR5cGUgUHJveHlPYmplY3Q6OmdldENvbnN0cnVjdEQKICAgICByZXR1cm4g
Q29uc3RydWN0VHlwZUhvc3Q7CiB9CiAKK3ZvaWQgUHJveHlPYmplY3Q6OnZpc2l0Q2hpbGRyZW4o
SlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBQcm94eU9iamVjdCog
dGhpc09iamVjdCA9IGpzQ2FzdDxQcm94eU9iamVjdCo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19P
QkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBCYXNlOjp2aXNpdENoaWxk
cmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworCisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmpl
Y3QtPm1fdGFyZ2V0KTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9oYW5kbGVy
KTsKK30KKwogfSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9Qcm94eU9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL1Byb3h5T2JqZWN0LmgJKHJldmlzaW9uIDE5NzAwMCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL1Byb3h5T2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTM1LDcg
KzM1LDcgQEAgY2xhc3MgUHJveHlPYmplY3QgOiBwdWJsaWMgSlNOb25GaW5hbE9iagogcHVibGlj
OgogICAgIHR5cGVkZWYgSlNOb25GaW5hbE9iamVjdCBCYXNlOwogCi0gICAgY29uc3Qgc3RhdGlj
IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBPdmVycmlk
ZXNHZXRPd25Qcm9wZXJ0eVNsb3QgfCBUeXBlT2ZTaG91bGRDYWxsR2V0Q2FsbERhdGE7CisgICAg
Y29uc3Qgc3RhdGljIHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxh
Z3MgfCBPdmVycmlkZXNHZXRPd25Qcm9wZXJ0eVNsb3QgfCBUeXBlT2ZTaG91bGRDYWxsR2V0Q2Fs
bERhdGEgfCBJbnRlcmNlcHRzR2V0T3duUHJvcGVydHlTbG90QnlJbmRleEV2ZW5XaGVuTGVuZ3Ro
SXNOb3RaZXJvOwogCiAgICAgc3RhdGljIFByb3h5T2JqZWN0KiBjcmVhdGUoRXhlY1N0YXRlKiBl
eGVjLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgSlNWYWx1ZSB0YXJnZXQsIEpTVmFsdWUgaGFuZGxl
cikKICAgICB7CkBAIC00Nyw3ICs0Nyw3IEBAIHB1YmxpYzoKIAogICAgIHN0YXRpYyBTdHJ1Y3R1
cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3Qs
IEpTVmFsdWUgcHJvdG90eXBlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3Jl
YXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvdHlwZSwgVHlwZUluZm8oT2JqZWN0VHlwZSwgU3Ry
dWN0dXJlRmxhZ3MpLCBpbmZvKCkpOyAKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRl
KHZtLCBnbG9iYWxPYmplY3QsIHByb3RvdHlwZSwgVHlwZUluZm8oUHJveHlPYmplY3RUeXBlLCBT
dHJ1Y3R1cmVGbGFncyksIGluZm8oKSwgTm9uQXJyYXkgfCBNYXlIYXZlSW5kZXhlZEFjY2Vzc29y
cyk7CiAgICAgfQogCiAgICAgREVDTEFSRV9FWFBPUlRfSU5GTzsKQEAgLTU1LDYgKzU1LDEwIEBA
IHB1YmxpYzoKICAgICBKU09iamVjdCogdGFyZ2V0KCkgeyByZXR1cm4gbV90YXJnZXQuZ2V0KCk7
IH0KICAgICBKU1ZhbHVlIGhhbmRsZXIoKSB7IHJldHVybiBtX2hhbmRsZXIuZ2V0KCk7IH0KIAor
ICAgIHN0YXRpYyB2b2lkIHB1dChKU0NlbGwqLCBFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWUsIEpT
VmFsdWUsIFB1dFByb3BlcnR5U2xvdCYpOworICAgIHN0YXRpYyB2b2lkIHB1dEJ5SW5kZXgoSlND
ZWxsKiwgRXhlY1N0YXRlKiwgdW5zaWduZWQgcHJvcGVydHlOYW1lLCBKU1ZhbHVlLCBib29sIHNo
b3VsZFRocm93KTsKKyAgICB2b2lkIHB1dEJ5SW5kZXhDb21tb24oRXhlY1N0YXRlKiwgSlNWYWx1
ZSB0aGlzVmFsdWUsIHVuc2lnbmVkIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSBwdXRWYWx1ZSwgYm9v
bCBzaG91bGRUaHJvdyk7CisKIHByaXZhdGU6CiAgICAgUHJveHlPYmplY3QoVk0mLCBTdHJ1Y3R1
cmUqKTsKICAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiwgRXhlY1N0YXRlKiwgSlNWYWx1ZSB0
YXJnZXQsIEpTVmFsdWUgaGFuZGxlcik7CkBAIC02MywxMSArNjcsMTQgQEAgcHJpdmF0ZToKICAg
ICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3RCeUluZGV4KEpTT2JqZWN0KiwgRXhlY1N0
YXRlKiwgdW5zaWduZWQgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmKTsKICAgICBzdGF0aWMg
Q2FsbFR5cGUgZ2V0Q2FsbERhdGEoSlNDZWxsKiwgQ2FsbERhdGEmKTsKICAgICBzdGF0aWMgQ29u
c3RydWN0VHlwZSBnZXRDb25zdHJ1Y3REYXRhKEpTQ2VsbCosIENvbnN0cnVjdERhdGEmKTsKKwog
ICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKIAog
ICAgIGJvb2wgZ2V0T3duUHJvcGVydHlTbG90Q29tbW9uKEV4ZWNTdGF0ZSosIFByb3BlcnR5TmFt
ZSwgUHJvcGVydHlTbG90Jik7CiAgICAgYm9vbCBwZXJmb3JtSW50ZXJuYWxNZXRob2RHZXRPd25Q
cm9wZXJ0eShFeGVjU3RhdGUqLCBQcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYpOwogICAgIGJv
b2wgcGVyZm9ybUhhc1Byb3BlcnR5KEV4ZWNTdGF0ZSosIFByb3BlcnR5TmFtZSwgUHJvcGVydHlT
bG90Jik7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFBlcmZvcm1EZWZhdWx0UHV0RnVuY3Rpb24+
CisgICAgdm9pZCBwdXRDb21tb24oRXhlY1N0YXRlKiwgSlNWYWx1ZSBwdXRWYWx1ZSwgSlNWYWx1
ZSB0aGlzVmFsdWUsIFByb3BlcnR5TmFtZSwgUGVyZm9ybURlZmF1bHRQdXRGdW5jdGlvbik7CiAK
ICAgICBXcml0ZUJhcnJpZXI8SlNPYmplY3Q+IG1fdGFyZ2V0OwogICAgIFdyaXRlQmFycmllcjxV
bmtub3duPiBtX2hhbmRsZXI7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvZXM2
LnlhbWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL2VzNi55YW1s
CShyZXZpc2lvbiAxOTcwMDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvZXM2Lnlh
bWwJKHdvcmtpbmcgY29weSkKQEAgLTk2Myw3ICs5NjMsNyBAQAogLSBwYXRoOiBlczYvUHJveHlf
aW50ZXJuYWxfZ2V0X2NhbGxzX0FycmF5LnByb3RvdHlwZS50b1N0cmluZy5qcwogICBjbWQ6IHJ1
bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9nZXRfY2FsbHNfQXJyYXku
cHJvdG90eXBlX2l0ZXJhdGlvbl9tZXRob2RzLmpzCi0gIGNtZDogcnVuRVM2IDpmYWlsCisgIGNt
ZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX2dldF9jYWxsc19D
bGFzc0RlZmluaXRpb25FdmFsdWF0aW9uLmpzCiAgIGNtZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0
aDogZXM2L1Byb3h5X2ludGVybmFsX2dldF9jYWxsc19DcmVhdGVEeW5hbWljRnVuY3Rpb24uanMK
QEAgLTEwMzMsMjcgKzEwMzMsMjcgQEAKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX293bktl
eXNfY2FsbHNfVGVzdEludGVncml0eUxldmVsLmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBh
dGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkuZnJvbS5qcwotICBjbWQ6IHJ1
bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRl
cm5hbF9zZXRfY2FsbHNfQXJyYXkub2YuanMKLSAgY21kOiBydW5FUzYgOmZhaWwKKyAgY21kOiBy
dW5FUzYgOm5vcm1hbAogLSBwYXRoOiBlczYvUHJveHlfaW50ZXJuYWxfc2V0X2NhbGxzX0FycmF5
LnByb3RvdHlwZS5jb3B5V2l0aGluLmpzCi0gIGNtZDogcnVuRVM2IDpmYWlsCisgIGNtZDogcnVu
RVM2IDpub3JtYWwKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX3NldF9jYWxsc19BcnJheS5w
cm90b3R5cGUuZmlsbC5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9y
bWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBl
LnBvcC5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBh
dGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlLnB1c2guanMK
LSAgY21kOiBydW5FUzYgOmZhaWwKKyAgY21kOiBydW5FUzYgOm5vcm1hbAogLSBwYXRoOiBlczYv
UHJveHlfaW50ZXJuYWxfc2V0X2NhbGxzX0FycmF5LnByb3RvdHlwZS5yZXZlcnNlLmpzCiAgIGNt
ZDogcnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9Qcm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJy
YXkucHJvdG90eXBlLnNoaWZ0LmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9Q
cm94eV9pbnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlLnNwbGljZS5qcwotICBjbWQ6
IHJ1bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9p
bnRlcm5hbF9zZXRfY2FsbHNfQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuanMKICAgY21kOiBydW5F
UzYgOmZhaWwKIC0gcGF0aDogZXM2L1Byb3h5X2ludGVybmFsX3NldF9jYWxsc19PYmplY3QuYXNz
aWduLmpzCi0gIGNtZDogcnVuRVM2IDpmYWlsCisgIGNtZDogcnVuRVM2IDpub3JtYWwKIC0gcGF0
aDogZXM2L1Byb3h5X2lzRXh0ZW5zaWJsZV9oYW5kbGVyLmpzCiAgIGNtZDogcnVuRVM2IDpmYWls
CiAtIHBhdGg6IGVzNi9Qcm94eV9KU09OLnN0cmluZ2lmeV9zdXBwb3J0LmpzCkBAIC0xMDY1LDkg
KzEwNjUsOSBAQAogLSBwYXRoOiBlczYvUHJveHlfUHJveHkucmV2b2NhYmxlLmpzCiAgIGNtZDog
cnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9Qcm94eV9zZXRfaGFuZGxlci5qcwotICBjbWQ6IHJ1
bkVTNiA6ZmFpbAorICBjbWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9zZXRf
aGFuZGxlcl9pbnN0YW5jZXNfb2ZfcHJveGllcy5qcwotICBjbWQ6IHJ1bkVTNiA6ZmFpbAorICBj
bWQ6IHJ1bkVTNiA6bm9ybWFsCiAtIHBhdGg6IGVzNi9Qcm94eV9zZXRQcm90b3R5cGVPZl9oYW5k
bGVyLmpzCiAgIGNtZDogcnVuRVM2IDpmYWlsCiAtIHBhdGg6IGVzNi9SZWZsZWN0X1JlZmxlY3Qu
Y29uc3RydWN0LmpzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3By
b3h5LXNldC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3Ry
ZXNzL3Byb3h5LXNldC5qcwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90
ZXN0cy9zdHJlc3MvcHJveHktc2V0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQ2IEBA
CitmdW5jdGlvbiBhc3NlcnQoYikgeworICAgIGlmICghYikKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYXNzZXJ0aW9uIik7Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0geworICAgICAg
ICB4OiAzMAorICAgIH07CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRs
ZXIgPSB7CisgICAgICAgIHNldDogNDUKKyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFBy
b3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKysp
IHsKKyAgICAgICAgbGV0IHRocmV3ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAg
ICBwcm94eS54ID0gNDA7CisgICAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICAgICAgYXNzZXJ0
KGUudG9TdHJpbmcoKSA9PT0gIlR5cGVFcnJvcjogJ3NldCcgcHJvcGVydHkgb2YgYSBQcm94eSdz
IGhhbmRsZXIgc2hvdWxkIGJlIGNhbGxhYmxlLiIpOworICAgICAgICAgICAgdGhyZXcgPSB0cnVl
OworICAgICAgICB9CisgICAgICAgIGFzc2VydCh0aHJldyk7CisgICAgfQorfQorCit7CisgICAg
bGV0IHRhcmdldCA9IHsKKyAgICAgICAgeDogMzAKKyAgICB9OworCisgICAgbGV0IGVycm9yID0g
bnVsbDsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAgICAgZ2V0IHNldCgpIHsKKyAgICAgICAg
ICAgIGVycm9yID0gbmV3IEVycm9yOworICAgICAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICAg
IH0KKyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7
CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbGV0IHRocmV3
ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm94eS54ID0gNDA7CisgICAg
ICAgIH0gY2F0Y2goZSkgeworICAgICAgICAgICAgYXNzZXJ0KGUgPT09IGVycm9yKTsKKyAgICAg
ICAgICAgIHRocmV3ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQodGhyZXcpOwor
ICAgICAgICBlcnJvciA9IG51bGw7CisgICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsK
KyAgICAgICAgeDogMzAKKyAgICB9OworCisgICAgbGV0IGVycm9yID0gbnVsbDsKKyAgICBsZXQg
aGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGVycm9y
ID0gbmV3IEVycm9yOworICAgICAgICAgICAgdGhyb3cgZXJyb3I7CisgICAgICAgIH0KKyAgICB9
OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9y
IChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbGV0IHRocmV3ID0gZmFsc2U7
CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm94eS54ID0gNDA7CisgICAgICAgIH0gY2F0
Y2goZSkgeworICAgICAgICAgICAgYXNzZXJ0KGUgPT09IGVycm9yKTsKKyAgICAgICAgICAgIHRo
cmV3ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQodGhyZXcpOworICAgICAgICBl
cnJvciA9IG51bGw7CisgICAgfQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsgfTsKKyAgICBP
YmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCAieCIsIHsKKyAgICAgICAgY29uZmlndXJhYmxl
OiBmYWxzZSwKKyAgICAgICAgd3JpdGFibGU6IGZhbHNlLAorICAgICAgICB2YWx1ZTogNTAwCisg
ICAgfSk7CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7Cisg
ICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVy
KSB7CisgICAgICAgICAgICBhc3NlcnQodGhlVGFyZ2V0ID09PSB0YXJnZXQpOworICAgICAgICAg
ICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1
ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgCisgICAgICAgIH0KKyAgICB9OworCisg
ICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9yIChsZXQg
aSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgcHJveHkueCA9IDQwOworICAgICAgICBh
c3NlcnQoY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5LnggPT09IDUwMCk7CisgICAgICAg
IGFzc2VydCh0YXJnZXQueCA9PT0gNTAwKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAg
fQorfQorCit7CisgICAgbGV0IHRhcmdldCA9IHsgfTsKKyAgICBPYmplY3QuZGVmaW5lUHJvcGVy
dHkodGFyZ2V0LCAieCIsIHsKKyAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKKyAgICAgICAg
d3JpdGFibGU6IGZhbHNlLAorICAgICAgICB2YWx1ZTogNTAwCisgICAgfSk7CisKKyAgICBsZXQg
aGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2
YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCh0aGVUYXJnZXQgPT09IHRhcmdl
dCk7CisgICAgICAgICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcg
UHJveHkodGFyZ2V0LCBoYW5kbGVyKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkr
KykgeworICAgICAgICBsZXQgdGhyZXcgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAg
ICAgIHByb3h5LnggPSA0MDsKKyAgICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgICAgICB0aHJl
dyA9IHRydWU7CisgICAgICAgICAgICBhc3NlcnQoZS50b1N0cmluZygpID09PSAiVHlwZUVycm9y
OiBQcm94eSBoYW5kbGVyJ3MgJ3NldCcgb24gYSBub24tY29uZmlndXJhYmxlIGFuZCBub24td3Jp
dGFibGUgcHJvcGVydHkgb24gJ3RhcmdldCcgc2hvdWxkIGVpdGhlciByZXR1cm4gZmFsc2Ugb3Ig
YmUgdGhlIHNhbWUgdmFsdWUgYWxyZWFkeSBvbiB0aGUgJ3RhcmdldCcuIik7CisgICAgICAgIH0K
KyAgICAgICAgYXNzZXJ0KHRocmV3KTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0g
eyB9OworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICJ4IiwgeworICAgICAgICBj
b25maWd1cmFibGU6IGZhbHNlLAorICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAg
ICAgcmV0dXJuIDI1OworICAgICAgICB9CisgICAgfSk7CisKKyAgICBsZXQgY2FsbGVkID0gZmFs
c2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0
LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGhlVGFy
Z2V0ID09PSB0YXJnZXQpOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAg
IHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBo
YW5kbGVyKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBw
cm94eS54ID0gNDA7CisgICAgICAgIGFzc2VydChwcm94eS54ID09PSAyNSk7CisgICAgICAgIGFz
c2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAg
ICBsZXQgdGFyZ2V0ID0geyB9OworICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICJ4
IiwgeworICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAorICAgICAgICBnZXQ6IGZ1bmN0aW9u
KCkgeworICAgICAgICAgICAgcmV0dXJuIDI1OworICAgICAgICB9CisgICAgfSk7CisKKyAgICBs
ZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVu
Y3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAg
ICBhc3NlcnQodGhlVGFyZ2V0ID09PSB0YXJnZXQpOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1
ZTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQ
cm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsr
KSB7CisgICAgICAgIGxldCB0aHJldyA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAg
ICAgcHJveHkueCA9IDQwOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIHRocmV3
ID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydChlLnRvU3RyaW5nKCkgPT09ICJUeXBlRXJyb3I6
IFByb3h5IGhhbmRsZXIncyAnc2V0JyBtZXRob2Qgb24gYSBub24tY29uZmlndXJhYmxlIGFjY2Vz
c29yIHByb3BlcnR5IHdpdGhvdXQgYSBzZXR0ZXIgc2hvdWxkIHJldHVybiBmYWxzZS4iKTsKKyAg
ICAgICAgfQorICAgICAgICBhc3NlcnQodGhyZXcpOworICAgIH0KK30KKworeworICAgIGxldCB0
YXJnZXQgPSB7IH07CisgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgIngiLCB7Cisg
ICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCisgICAgICAgIHdyaXRhYmxlOiB0cnVlLAorICAg
ICAgICB2YWx1ZTogNTAKKyAgICB9KTsKKworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBs
ZXQgaGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1l
LCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCh0aGVUYXJnZXQgPT09IHRh
cmdldCk7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhlVGFyZ2V0
W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0K
KyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7Cisg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgcHJveHkueCA9IGk7
CisgICAgICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBhc3NlcnQocHJveHkueCA9PT0gaSk7
CisgICAgICAgIGFzc2VydCh0YXJnZXQueCA9PT0gaSk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNl
OworICAgIH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSB7CisgICAgICAgIHg6IDMwCisgICAg
fTsKKworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAg
ICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsK
KyAgICAgICAgICAgIGFzc2VydCh0YXJnZXQgPT09IHRoZVRhcmdldCk7CisgICAgICAgICAgICBh
c3NlcnQocmVjaWV2ZXIgPT09IHByb3h5KTsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7Cisg
ICAgICAgICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9
OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgZm9y
IChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgcHJveHkueCA9IGk7CisgICAg
ICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBhc3NlcnQocHJveHkueCA9PT0gaSk7CisgICAg
ICAgIGFzc2VydCh0YXJnZXQueCA9PT0gaSk7CisgICAgICAgIGNhbGxlZCA9IGZhbHNlOworCisg
ICAgICAgIHByb3h5WyJ5Il0gPSBpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAg
YXNzZXJ0KHByb3h5LnkgPT09IGkpOworICAgICAgICBhc3NlcnQodGFyZ2V0LnkgPT09IGkpOwor
ICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0g
eworICAgICAgICB4OiAzMAorICAgIH07CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAg
bGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFt
ZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVU
YXJnZXQpOworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09PSBwcm94eSk7CisgICAgICAg
ICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BOYW1lXSA9IHZh
bHVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJn
ZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAg
ICAgIHByb3h5LnggPSBpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0
KHByb3h5LnggPT09IGkpOworICAgICAgICBhc3NlcnQodGFyZ2V0LnggPT09IGkpOworICAgICAg
ICBjYWxsZWQgPSBmYWxzZTsKKworICAgICAgICBwcm94eVsieSJdID0gaTsKKyAgICAgICAgYXNz
ZXJ0KGNhbGxlZCk7CisgICAgICAgIGFzc2VydChwcm94eS55ID09PSBpKTsKKyAgICAgICAgYXNz
ZXJ0KHRhcmdldC55ID09PSBpKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7CisgICAgfQorfQor
Cit7CisgICAgbGV0IHRhcmdldCA9IFtdOworCisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAg
IGxldCBoYW5kbGVyID0geyB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwg
aGFuZGxlcik7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAg
cHJveHlbaV0gPSBpOworICAgICAgICBhc3NlcnQocHJveHlbaV0gPT09IGkpOworICAgICAgICBh
c3NlcnQodGFyZ2V0W2ldID09PSBpKTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0g
W107CisKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAg
ICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7
CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJnZXQpOworICAgICAgICAgICAg
YXNzZXJ0KHJlY2lldmVyID09PSBwcm94eSk7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOwor
ICAgICAgICAgICAgdGhlVGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICB9CisgICAg
fTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZv
ciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHByb3h5W2ldID0gaTsKKyAg
ICAgICAgYXNzZXJ0KHByb3h5W2ldID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFtpXSA9
PT0gaSk7CisgICAgICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsK
KyAgICB9Cit9CisKK3sKKyAgICBsZXQgdGFyZ2V0ID0gW107CisKKyAgICBsZXQgY2FsbGVkID0g
ZmFsc2U7CisgICAgbGV0IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFy
Z2V0LCBwcm9wTmFtZSwgdmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFy
Z2V0ID09PSB0aGVUYXJnZXQpOworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09PSBwcm94
eSk7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgdGhlVGFyZ2V0W3By
b3BOYW1lXSA9IHZhbHVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5l
dyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsg
aSsrKSB7CisgICAgICAgIHByb3h5W2ldID0gaTsKKyAgICAgICAgYXNzZXJ0KHByb3h5W2ldID09
PSBpKTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFtpXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChj
YWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQg
Y2FsbGVkID0gZmFsc2U7CisgICAgbGV0IHRhcmdldCA9IHsKKyAgICAgICAgc2V0IHgodikgewor
ICAgICAgICAgICAgYXNzZXJ0KHRoaXMgPT09IHRhcmdldCk7CisgICAgICAgICAgICB0aGlzLl94
ID0gdjsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgIH0sCisgICAgICAgIGdl
dCB4KCkgeworICAgICAgICAgICAgYXNzZXJ0KHRoaXMgPT09IHRhcmdldCk7CisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5feDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBsZXQgaGFuZGxlciA9
IHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVj
aWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCh0YXJnZXQgPT09IHRoZVRhcmdldCk7CisgICAg
ICAgICAgICBhc3NlcnQocmVjaWV2ZXIgPT09IHByb3h5KTsKKyAgICAgICAgICAgIHRoZVRhcmdl
dFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9
CisgICAgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOwor
ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHByb3h5LnggPSBp
OworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5LnggPT09IGkp
OworICAgICAgICBhc3NlcnQodGFyZ2V0LnggPT09IGkpOworICAgICAgICBhc3NlcnQocHJveHku
X3ggPT09IGkpOworICAgICAgICBhc3NlcnQodGFyZ2V0Ll94ID09PSBpKTsKKyAgICAgICAgY2Fs
bGVkID0gZmFsc2U7CisgICAgfQorfQorCit7CisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOworICAg
IGxldCB0YXJnZXQgPSB7fTsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBmdW5j
dGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAgICAg
IGFzc2VydCh0YXJnZXQgPT09IHRoZVRhcmdldCk7CisgICAgICAgICAgICBhc3NlcnQocmVjaWV2
ZXIgPT09IG9iaik7CisgICAgICAgICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7Cisg
ICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxl
cik7CisgICAgbGV0IG9iaiA9IE9iamVjdC5jcmVhdGUocHJveHksIHsKKyAgICAgICAgb3duOiB7
CisgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTog
dHJ1ZSwKKyAgICAgICAgICAgIHZhbHVlOiBudWxsCisgICAgICAgIH0KKyAgICB9KTsKKyAgICBm
b3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBvYmoub3duID0gaTsKKyAg
ICAgICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAgICBhc3NlcnQob2JqLm93biA9PT0gaSk7CisK
KyAgICAgICAgb2JqLm5vdE93biA9IGk7CisgICAgICAgIGFzc2VydCh0YXJnZXQubm90T3duID09
PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5Lm5vdE93biA9PT0gaSk7CisgICAgICAgIGFzc2Vy
dChvYmoubm90T3duID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGNh
bGxlZCA9IGZhbHNlOworICAgIH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSB7fTsKKyAgICBs
ZXQgaGFuZGxlciA9IHsgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhh
bmRsZXIpOworICAgIGxldCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAgICAgIG93
bjogeworICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCisgICAgICAgICAgICBjb25maWd1cmFi
bGU6IHRydWUsCisgICAgICAgICAgICB2YWx1ZTogbnVsbAorICAgICAgICB9CisgICAgfSk7Cisg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgb2JqLm93biA9IGk7
CisgICAgICAgIGFzc2VydChvYmoub3duID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5Lm93
biA9PT0gdW5kZWZpbmVkKTsKKworICAgICAgICBvYmoubm90T3duID0gaTsKKyAgICAgICAgYXNz
ZXJ0KHRhcmdldC5ub3RPd24gPT09IGkpOworICAgICAgICBhc3NlcnQocHJveHkubm90T3duID09
PSBpKTsKKyAgICAgICAgYXNzZXJ0KG9iai5ub3RPd24gPT09IGkpOworICAgIH0KK30KKworewor
ICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAgICBsZXQgdGFyZ2V0ID0ge307CisgICAgbGV0IGhh
bmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwgdmFs
dWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJnZXQp
OworICAgICAgICAgICAgYXNzZXJ0KHJlY2lldmVyID09PSBvYmopOworICAgICAgICAgICAgdGhl
VGFyZ2V0W3Byb3BOYW1lXSA9IHZhbHVlOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGxldCBwcm94
eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGxldCBvYmogPSBPYmplY3QuY3Jl
YXRlKHByb3h5LCB7CisgICAgICAgIFswXTogeworICAgICAgICAgICAgd3JpdGFibGU6IHRydWUs
CisgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgICB2YWx1ZTogbnVs
bAorICAgICAgICB9CisgICAgfSk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKysp
IHsKKyAgICAgICAgb2JqWzBdID0gaTsKKyAgICAgICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAg
ICBhc3NlcnQob2JqWzBdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzBdID09PSB1bmRl
ZmluZWQpOworCisgICAgICAgIG9ialsxXSA9IGk7CisgICAgICAgIGFzc2VydCh0YXJnZXRbMV0g
PT09IGkpOworICAgICAgICBhc3NlcnQocHJveHlbMV0gPT09IGkpOworICAgICAgICBhc3NlcnQo
b2JqWzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGNhbGxlZCA9
IGZhbHNlOworICAgIH0KK30KKworeworICAgIGxldCB0YXJnZXQgPSB7fTsKKyAgICBsZXQgaGFu
ZGxlciA9IHsgfTsKKworICAgIGxldCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIp
OworICAgIGxldCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3h5LCB7CisgICAgICAgIFswXTogewor
ICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCisgICAgICAgICAgICBjb25maWd1cmFibGU6IHRy
dWUsCisgICAgICAgICAgICB2YWx1ZTogbnVsbAorICAgICAgICB9CisgICAgfSk7CisgICAgZm9y
IChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgb2JqWzBdID0gaTsKKyAgICAg
ICAgYXNzZXJ0KG9ialswXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94eVswXSA9PT0gdW5k
ZWZpbmVkKTsKKworICAgICAgICBvYmpbMV0gPSBpOworICAgICAgICBhc3NlcnQodGFyZ2V0WzFd
ID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0
KG9ialsxXSA9PT0gaSk7CisgICAgfQorfQorCit7CisgICAgbGV0IGNhbGxlZCA9IGZhbHNlOwor
ICAgIGxldCB0YXJnZXQgPSB7fTsKKyAgICBsZXQgaGFuZGxlciA9IHsKKyAgICAgICAgc2V0OiBm
dW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwgcmVjaWV2ZXIpIHsKKyAgICAgICAg
ICAgIGFzc2VydCh0YXJnZXQgPT09IHRoZVRhcmdldCk7CisgICAgICAgICAgICAvL2Fzc2VydChy
ZWNpZXZlciA9PT0gb2JqKTsKKyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1
ZTsKKyAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgfQorICAgIH07CisKKyAgICBsZXQgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBo
YW5kbGVyKTsKKyAgICBsZXQgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm94eSwgeworICAgICAgICBb
MF06IHsKKyAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLAorICAgICAgICAgICAgY29uZmlndXJh
YmxlOiB0cnVlLAorICAgICAgICAgICAgdmFsdWU6IG51bGwKKyAgICAgICAgfQorICAgIH0pOwor
ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIG9ialswXSA9IGk7
CisgICAgICAgIGFzc2VydCghY2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0KG9ialswXSA9PT0gaSk7
CisgICAgICAgIGFzc2VydChwcm94eVswXSA9PT0gdW5kZWZpbmVkKTsKKworICAgICAgICBvYmpb
MV0gPSBpOworICAgICAgICBhc3NlcnQodGFyZ2V0WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0
KHByb3h5WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KG9ialsxXSA9PT0gaSk7CisgICAgICAg
IGFzc2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3sK
KyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IHRhcmdldCA9IFsyNV07CisgICAgbGV0
IGhhbmRsZXIgPSB7CisgICAgICAgIHNldDogZnVuY3Rpb24odGhlVGFyZ2V0LCBwcm9wTmFtZSwg
dmFsdWUsIHJlY2lldmVyKSB7CisgICAgICAgICAgICBhc3NlcnQodGFyZ2V0ID09PSB0aGVUYXJn
ZXQpOworICAgICAgICAgICAgLy9hc3NlcnQocmVjaWV2ZXIgPT09IG9iaik7CisgICAgICAgICAg
ICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVl
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgbGV0
IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7CisgICAgbGV0IG9iaiA9IE9iamVj
dC5jcmVhdGUocHJveHksIHsKKyAgICAgICAgWzBdOiB7CisgICAgICAgICAgICB3cml0YWJsZTog
dHJ1ZSwKKyAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHZhbHVl
OiBudWxsCisgICAgICAgIH0KKyAgICB9KTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7
IGkrKykgeworICAgICAgICBvYmpbMF0gPSBpOworICAgICAgICBhc3NlcnQoIWNhbGxlZCk7Cisg
ICAgICAgIGFzc2VydChvYmpbMF0gPT09IGkpOworICAgICAgICBhc3NlcnQocHJveHlbMF0gPT09
IDI1KTsKKworICAgICAgICBvYmpbMV0gPSBpOworICAgICAgICBhc3NlcnQodGFyZ2V0WzFdID09
PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzFdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KG9i
alsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChjYWxsZWQpOworICAgICAgICBjYWxsZWQgPSBm
YWxzZTsKKyAgICB9Cit9CisKK3sKKyAgICBsZXQgY2FsbGVkID0gZmFsc2U7CisgICAgbGV0IG9n
VGFyZ2V0ID0ge307CisgICAgbGV0IHRhcmdldCA9IG5ldyBQcm94eShvZ1RhcmdldCwgeworICAg
ICAgICBzZXQ6IGZ1bmN0aW9uKHRoZVRhcmdldCwgcHJvcE5hbWUsIHZhbHVlLCByZWNpZXZlcikg
eworICAgICAgICAgICAgYXNzZXJ0KHRoZVRhcmdldCA9PT0gb2dUYXJnZXQpOworICAgICAgICAg
ICAgYXNzZXJ0KHJlY2lldmVyID09PSBvYmopOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsK
KyAgICAgICAgICAgIHRoZVRhcmdldFtwcm9wTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAg
IH0pOworICAgIGxldCBoYW5kbGVyID0geyB9OworCisgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5
KHRhcmdldCwgaGFuZGxlcik7CisgICAgbGV0IG9iaiA9IE9iamVjdC5jcmVhdGUocHJveHksIHsK
KyAgICAgICAgb3duOiB7CisgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKKyAgICAgICAgICAg
IGNvbmZpZ3VyYWJsZTogdHJ1ZSwKKyAgICAgICAgICAgIHZhbHVlOiBudWxsCisgICAgICAgIH0K
KyAgICB9KTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBv
Ymoub3duID0gaTsKKyAgICAgICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAgICBhc3NlcnQob2Jq
Lm93biA9PT0gaSk7CisgICAgICAgIGFzc2VydChwcm94eS5vd24gPT09IHVuZGVmaW5lZCk7CisK
KyAgICAgICAgb2JqLm5vdE93biA9IGk7CisgICAgICAgIGFzc2VydCh0YXJnZXQubm90T3duID09
PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5Lm5vdE93biA9PT0gaSk7CisgICAgICAgIGFzc2Vy
dChvYmoubm90T3duID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KGNhbGxlZCk7CisgICAgICAgIGNh
bGxlZCA9IGZhbHNlOworICAgIH0KK30KKworeworICAgIGxldCBjYWxsZWQgPSBmYWxzZTsKKyAg
ICBsZXQgb2dUYXJnZXQgPSBbMjVdOworICAgIGxldCB0YXJnZXQgPSBuZXcgUHJveHkob2dUYXJn
ZXQsIHsKKyAgICAgICAgc2V0OiBmdW5jdGlvbih0aGVUYXJnZXQsIHByb3BOYW1lLCB2YWx1ZSwg
cmVjaWV2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCh0aGVUYXJnZXQgPT09IG9nVGFyZ2V0KTsK
KyAgICAgICAgICAgIGFzc2VydChyZWNpZXZlciA9PT0gb2JqKTsKKyAgICAgICAgICAgIGNhbGxl
ZCA9IHRydWU7CisgICAgICAgICAgICB0aGVUYXJnZXRbcHJvcE5hbWVdID0gdmFsdWU7CisgICAg
ICAgIH0KKyAgICB9KTsKKyAgICBsZXQgaGFuZGxlciA9IHsgfTsKKworICAgIGxldCBwcm94eSA9
IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpOworICAgIGxldCBvYmogPSBPYmplY3QuY3JlYXRl
KHByb3h5LCB7CisgICAgICAgIFswXTogeworICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCisg
ICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCisgICAgICAgICAgICB2YWx1ZTogbnVsbAor
ICAgICAgICB9CisgICAgfSk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsK
KyAgICAgICAgb2JqWzBdID0gaTsKKyAgICAgICAgYXNzZXJ0KCFjYWxsZWQpOworICAgICAgICBh
c3NlcnQob2JqWzBdID09PSBpKTsKKyAgICAgICAgYXNzZXJ0KHByb3h5WzBdID09PSAyNSk7CisK
KyAgICAgICAgb2JqWzFdID0gaTsKKyAgICAgICAgYXNzZXJ0KHRhcmdldFsxXSA9PT0gaSk7Cisg
ICAgICAgIGFzc2VydChwcm94eVsxXSA9PT0gaSk7CisgICAgICAgIGFzc2VydChvYmpbMV0gPT09
IGkpOworICAgICAgICBhc3NlcnQoY2FsbGVkKTsKKyAgICAgICAgY2FsbGVkID0gZmFsc2U7Cisg
ICAgfQorfQo=
</data>
<flag name="review"
          id="296862"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>