<?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>69321</bug_id>
          
          <creation_ts>2011-10-03 23:57:21 -0700</creation_ts>
          <short_desc>JITCodeGenerator should no longer have code that tries too hard to be both speculative and non-speculative</short_desc>
          <delta_ts>2011-10-04 16:02:15 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>69322</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>barraclough</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>477463</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-03 23:57:21 -0700</bug_when>
    <thetext>JITCodeGenerator used to be a superclass for NonSpeculativeJIT and SpeculativeJIT.  Now the NonSpeculativeJIT is gone.  There are some warts from this:

- JITCodeGenerator has a m_isSpeculative field.  This field is now always true.

- JITCodeGenerator has a method to emit a speculation check, if we&apos;re in speculative mode.  Code that needs speculation checks should probably just be moved to SpeculativeJIT.

- JITCodeGenerator has an emitBranch method that tries to unify both speculative and non-speculative handling of branches.  Now it should probably just be speculative.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477464</commentid>
    <comment_count>1</comment_count>
      <attachid>109585</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-03 23:59:30 -0700</bug_when>
    <thetext>Created attachment 109585
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477629</commentid>
    <comment_count>2</comment_count>
      <attachid>109585</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2011-10-04 08:56:32 -0700</bug_when>
    <thetext>Comment on attachment 109585
the patch

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

While i realize this patch is only trying to simplify the emitBranch logic, it seems sad that we don&apos;t emit code for object checks, etc inline when the profiles tell us we&apos;re looking at objects.

r- though because the 64bit version of emitBranch has weird control flow layout

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:487
&gt; +    // FIXME: Add fast cases for known Boolean!

Boolean implies boxed boolean to me -- do you mean boxed or unboxed here?

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:496
&gt; +    use(node.child1());

What does this do? (unrelated to this particular patch, i just don&apos;t think i&apos;ve seen use() before)

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:502
&gt; +    JITCompiler::Jump fastPath = m_jit.branch32(JITCompiler::Equal, valueTagGPR, JITCompiler::TrustedImm32(JSValue::Int32Tag));
&gt; +    JITCompiler::Jump slowPath = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::BooleanTag));

It would be nice if we could rework our encoding to make this work with a single branch, but again unrelated to this patch

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:593
&gt; +    if (isKnownBoolean(node.child1())) {

no numeric fast case?

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:621
&gt; +        if (predictBoolean) {
&gt; +            addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(false)))), notTaken);
&gt; +            addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(true)))), taken);
&gt; +        }
&gt; +        
&gt; +        if (predictBoolean) {
&gt; +            speculationCheck(m_jit.jump());
&gt; +            value.use();

Why are these in two separate blocks

&gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:626
&gt; +            if (!predictBoolean) {

This branch is always taken</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477850</commentid>
    <comment_count>3</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-04 12:44:09 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 109585 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=109585&amp;action=review
&gt; 
&gt; While i realize this patch is only trying to simplify the emitBranch logic, it seems sad that we don&apos;t emit code for object checks, etc inline when the profiles tell us we&apos;re looking at objects.

Actually, it&apos;s trying to eliminate speculative code from the DFGJITCodeGenerator, and eliminate code in DFGJITCodeGenerator that tries to be generic generic over m_isSpeculative.  emitBranch() was simply moved, almost entirely untouched, from DFGJITCodeGenerator into DFGSpeculativeJIT.

&gt; 
&gt; r- though because the 64bit version of emitBranch has weird control flow layout
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:487
&gt; &gt; +    // FIXME: Add fast cases for known Boolean!
&gt; 
&gt; Boolean implies boxed boolean to me -- do you mean boxed or unboxed here?

Not my comment, it was already there.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:496
&gt; &gt; +    use(node.child1());
&gt; 
&gt; What does this do? (unrelated to this particular patch, i just don&apos;t think i&apos;ve seen use() before)

I didn&apos;t add it in this patch, it was already there.

It simply marks to the reg alloc that the value associated with this node does not have to be kept alive if we spill/fill.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:502
&gt; &gt; +    JITCompiler::Jump fastPath = m_jit.branch32(JITCompiler::Equal, valueTagGPR, JITCompiler::TrustedImm32(JSValue::Int32Tag));
&gt; &gt; +    JITCompiler::Jump slowPath = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::BooleanTag));
&gt; 
&gt; It would be nice if we could rework our encoding to make this work with a single branch, but again unrelated to this patch

That&apos;s not my code; I think our friend at Intel wrote that.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:593
&gt; &gt; +    if (isKnownBoolean(node.child1())) {
&gt; 
&gt; no numeric fast case?

There has never been one in this code.  I have a separate bug for that: https://bugs.webkit.org/show_bug.cgi?id=69322

My plan was to put that up for review once emitBranch() was moved to SpeculativeJIT.

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:621
&gt; &gt; +        if (predictBoolean) {
&gt; &gt; +            addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(false)))), notTaken);
&gt; &gt; +            addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(true)))), taken);
&gt; &gt; +        }
&gt; &gt; +        
&gt; &gt; +        if (predictBoolean) {
&gt; &gt; +            speculationCheck(m_jit.jump());
&gt; &gt; +            value.use();
&gt; 
&gt; Why are these in two separate blocks

That&apos;s a screw-up.  Previously the second block tested for m_isSpeculative.  Now it doesn&apos;t, so I guess they should be merged and….

&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:626
&gt; &gt; +            if (!predictBoolean) {
&gt; 
&gt; This branch is always taken

This should be killed.

Bottom line, I&apos;m happy to simply just do this as one patch (see https://bugs.webkit.org/show_bug.cgi?id=69322), but I wanted to have a separate patch that gets rid of:

JITCodeGenerator::m_isSpeculative  (it&apos;s always true)
JITCodeGenerator::speculationCheck  (it&apos;s a horrible hack from the days when the DFG had two JITs)

and to do that I have to move emitBranch() to SpeculativeJIT, since that&apos;s the most egregious use of the two above things, which only existed because previously emitBranch() had to be in JITCodeGenerator to avoid code duplication.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477903</commentid>
    <comment_count>4</comment_count>
      <attachid>109676</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-04 13:50:51 -0700</bug_when>
    <thetext>Created attachment 109676
the patch - address some of review

The goal of this patch is to remove m_isSpeculative and speculationCheck() from JITCodeGenerator, since neither of those members belong there now that we don&apos;t have a non-speculative DFG JIT.  To do that, it moves emitBranch() to SpeculativeJIT, and does not change it other than obvious clean-ups (like when you remove m_isSpeculative and assume that it&apos;s always true then some control flow changes).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477973</commentid>
    <comment_count>5</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-10-04 14:44:39 -0700</bug_when>
    <thetext>I&apos;m a little confused, is speculationCheck not used in other places? assuming I&apos;m missing something, r+.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>477984</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-04 15:01:43 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; I&apos;m a little confused, is speculationCheck not used in other places? assuming I&apos;m missing something, r+.

I&apos;m referring to JITCodeGenerator::speculationCheck() which did something like:

void JITCodeGenerator::speculationCheck(...)
{
   ASSERT(m_isSpeculative);
   static_cast&lt;SpeculativeJIT*&gt;(this)-&gt;speculationCheck(...);
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>478039</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-04 16:02:15 -0700</bug_when>
    <thetext>Landed in r96661.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109585</attachid>
            <date>2011-10-03 23:59:30 -0700</date>
            <delta_ts>2011-10-04 13:50:51 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>betterjit_patch_1.diff</filename>
            <type>text/plain</type>
            <size>17857</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTY1NzMpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzAgQEAK
KzIwMTEtMTAtMDMgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBK
SVRDb2RlR2VuZXJhdG9yIHNob3VsZCBubyBsb25nZXIgaGF2ZSBjb2RlIHRoYXQgdHJpZXMgdG9v
IGhhcmQKKyAgICAgICAgdG8gYmUgYm90aCBzcGVjdWxhdGl2ZSBhbmQgbm9uLXNwZWN1bGF0aXZl
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02OTMyMQor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAgICAg
U2ltcGxlIHJlZmFjdG9yaW5nIGFuZCBzaW1wbGlmaWNhdGlvbiwgbm8gbWVhc3VyYWJsZSBwZXJm
b3JtYW5jZQorICAgICAgICBlZmZlY3QuCisKKyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVy
YXRvci5jcHA6CisgICAgICAgICogZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuaDoKKyAgICAgICAg
KEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpKSVRDb2RlR2VuZXJhdG9yKToKKyAgICAgICAg
KiBkZmcvREZHSklUQ29kZUdlbmVyYXRvcjMyXzY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpK
SVRDb2RlR2VuZXJhdG9yOjpmaWxsRG91YmxlKToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2Rl
R2VuZXJhdG9yOjpmaWxsSlNWYWx1ZSk6CisgICAgICAgICogZGZnL0RGR0pJVENvZGVHZW5lcmF0
b3I2NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6ZmlsbERvdWJs
ZSk6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6ZmlsbEpTVmFsdWUpOgor
ICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oOgorICAgICAgICAoSlNDOjpERkc6OlNw
ZWN1bGF0aXZlSklUOjpTcGVjdWxhdGl2ZUpJVCk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0
aXZlSklUMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZlSklUOjplbWl0
QnJhbmNoKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHA6CisgICAgICAg
IChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmVtaXRCcmFuY2gpOgorCiAyMDExLTEwLTAzICBG
aWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAgREZHIHNob3VsZCBpbmxp
bmUgQXJyYXkucHVzaCBhbmQgQXJyYXkucG9wCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwCShyZXZpc2lvbiA5
NjU3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvcjMy
XzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM2LDcgKzEzNiw3IEBAIEZQUlJlZyBKSVRDb2Rl
R2VuZXJhdG9yOjpmaWxsRG91YmxlKE5vZGUKICAgICAgICAgICAgIG1faml0LmVtaXRMb2FkKG5v
ZGVJbmRleCwgdGFnLCBwYXlsb2FkKTsKICAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4odGFnLCB2
aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKICAgICAgICAgICAgIG1fZ3Bycy5y
ZXRhaW4ocGF5bG9hZCwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9yZGVyU3BpbGxlZCk7Ci0gICAg
ICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKHRhZywgcGF5bG9hZCwgbV9pc1NwZWN1bGF0aXZlID8g
c3BpbGxGb3JtYXQgOiBEYXRhRm9ybWF0SlMpOworICAgICAgICAgICAgaW5mby5maWxsSlNWYWx1
ZSh0YWcsIHBheWxvYWQsIHNwaWxsRm9ybWF0KTsKICAgICAgICAgICAgIHVubG9jayh0YWcpOwog
ICAgICAgICAgICAgdW5sb2NrKHBheWxvYWQpOwogICAgICAgICB9CkBAIC0yNDIsNyArMjQyLDcg
QEAgYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSlNWYWx1ZShOb2RlSQogICAgICAgICAgICAg
bV9qaXQuZW1pdExvYWQobm9kZUluZGV4LCB0YWdHUFIsIHBheWxvYWRHUFIpOwogICAgICAgICAg
ICAgbV9ncHJzLnJldGFpbih0YWdHUFIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxPcmRlclNwaWxs
ZWQpOwogICAgICAgICAgICAgbV9ncHJzLnJldGFpbihwYXlsb2FkR1BSLCB2aXJ0dWFsUmVnaXN0
ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKLSAgICAgICAgICAgIGluZm8uZmlsbEpTVmFsdWUodGFn
R1BSLCBwYXlsb2FkR1BSLCBtX2lzU3BlY3VsYXRpdmUgPyBzcGlsbEZvcm1hdCA6IERhdGFGb3Jt
YXRKUyk7CisgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKHRhZ0dQUiwgcGF5bG9hZEdQUiwg
c3BpbGxGb3JtYXQpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNTE3
LDQ1ICsxNTE3LDYgQEAgdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZU5vbgog
ICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0VGFnR1BSLCByZXN1bHRQYXlsb2FkR1BSLCBtX2NvbXBp
bGVJbmRleCwgRGF0YUZvcm1hdEpTQm9vbGVhbiwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5
KTsKIH0KIAotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjplbWl0QnJhbmNoKE5vZGUmIG5vZGUpCi17
Ci0gICAgLy8gRklYTUU6IEFkZCBmYXN0IGNhc2VzIGZvciBrbm93biBCb29sZWFuIQotICAgIEpT
VmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgIHZhbHVlLmZpbGwo
KTsKLSAgICBHUFJSZWcgdmFsdWVUYWdHUFIgPSB2YWx1ZS50YWdHUFIoKTsKLSAgICBHUFJSZWcg
dmFsdWVQYXlsb2FkR1BSID0gdmFsdWUucGF5bG9hZEdQUigpOwotCi0gICAgR1BSVGVtcG9yYXJ5
IHJlc3VsdCh0aGlzKTsKLSAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOwotICAg
IAotICAgIHVzZShub2RlLmNoaWxkMSgpKTsKLSAgICAKLSAgICBCbG9ja0luZGV4IHRha2VuID0g
bV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQobm9kZS50YWtlbkJ5dGVj
b2RlT2Zmc2V0KCkpOwotICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJs
b2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7
Ci0KLSAgICBKSVRDb21waWxlcjo6SnVtcCBmYXN0UGF0aCA9IG1faml0LmJyYW5jaDMyKEpJVENv
bXBpbGVyOjpFcXVhbCwgdmFsdWVUYWdHUFIsIEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoSlNW
YWx1ZTo6SW50MzJUYWcpKTsKLSAgICBKSVRDb21waWxlcjo6SnVtcCBzbG93UGF0aCA9IG1faml0
LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgdmFsdWVUYWdHUFIsIEpJVENvbXBpbGVy
OjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6Qm9vbGVhblRhZykpOwotCi0gICAgZmFzdFBhdGgubGlu
aygmbV9qaXQpOwotICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0MzIoSklUQ29tcGlsZXI6
Olplcm8sIHZhbHVlUGF5bG9hZEdQUiksIG5vdFRha2VuKTsKLSAgICBhZGRCcmFuY2gobV9qaXQu
anVtcCgpLCB0YWtlbik7Ci0KLSAgICBzbG93UGF0aC5saW5rKCZtX2ppdCk7Ci0gICAgc2lsZW50
U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKLSAgICBtX2ppdC5wdXNoKHZhbHVlVGFnR1BS
KTsKLSAgICBtX2ppdC5wdXNoKHZhbHVlUGF5bG9hZEdQUik7Ci0gICAgbV9qaXQucHVzaChHUFJJ
bmZvOjpjYWxsRnJhbWVSZWdpc3Rlcik7Ci0gICAgYXBwZW5kQ2FsbFdpdGhFeGNlcHRpb25DaGVj
ayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7Ci0gICAgbV9qaXQubW92ZShHUFJJbmZvOjpy
ZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKLSAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJl
c3VsdEdQUik7Ci0gICAgCi0gICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFRlc3Q4KEpJVENvbXBp
bGVyOjpOb25aZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7Ci0gICAgaWYgKG5vdFRha2VuICE9ICht
X2Jsb2NrICsgMSkpCi0gICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsK
LSAgICAKLSAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBs
aWNpdGx5KTsKLX0KLQogdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjplbWl0Q2FsbChOb2RlJiBub2Rl
KQogewogICAgIFBfREZHT3BlcmF0aW9uX0Ugc2xvd0NhbGxGdW5jdGlvbjsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvcjY0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3I2NC5jcHAJ
KHJldmlzaW9uIDk2NTcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2Rl
R2VuZXJhdG9yNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDgsNyArMTQ4LDcgQEAgRlBSUmVn
IEpJVENvZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUoTm9kZQogICAgICAgICAgICAgQVNTRVJUKHNw
aWxsRm9ybWF0ICYgRGF0YUZvcm1hdEpTKTsKICAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4oZ3By
LCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKICAgICAgICAgICAgIG1faml0
LmxvYWRQdHIoSklUQ29tcGlsZXI6OmFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVyKSwgZ3ByKTsK
LSAgICAgICAgICAgIGluZm8uZmlsbEpTVmFsdWUoZ3ByLCBtX2lzU3BlY3VsYXRpdmUgPyBzcGls
bEZvcm1hdCA6IERhdGFGb3JtYXRKUyk7CisgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdw
ciwgc3BpbGxGb3JtYXQpOwogICAgICAgICAgICAgdW5sb2NrKGdwcik7CiAgICAgICAgIH0KICAg
ICB9CkBAIC0yNjYsNyArMjY2LDcgQEAgR1BSUmVnIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxKU1Zh
bHVlKE5vZAogICAgICAgICAgICAgQVNTRVJUKHNwaWxsRm9ybWF0ICYgRGF0YUZvcm1hdEpTKTsK
ICAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3Jk
ZXJTcGlsbGVkKTsKICAgICAgICAgICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGlsZXI6OmFkZHJl
c3NGb3IodmlydHVhbFJlZ2lzdGVyKSwgZ3ByKTsKLSAgICAgICAgICAgIGluZm8uZmlsbEpTVmFs
dWUoZ3ByLCBtX2lzU3BlY3VsYXRpdmUgPyBzcGlsbEZvcm1hdCA6IERhdGFGb3JtYXRKUyk7Cisg
ICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdwciwgc3BpbGxGb3JtYXQpOwogICAgICAgICB9
CiAgICAgICAgIHJldHVybiBncHI7CiAgICAgfQpAQCAtMTQ2MSw3MCArMTQ2MSw2IEBAIHZvaWQg
SklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVOb24KICAgICBqc1ZhbHVlUmVzdWx0KHJl
c3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVzZUNoaWxkcmVu
Q2FsbGVkRXhwbGljaXRseSk7CiB9CiAKLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6ZW1pdEJyYW5j
aChOb2RlJiBub2RlKQotewotICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hp
bGQxKCkpOwotICAgIEdQUlJlZyB2YWx1ZUdQUiA9IHZhbHVlLmdwcigpOwotICAgIAotICAgIEJs
b2NrSW5kZXggdGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNl
dChub2RlLnRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7Ci0gICAgQmxvY2tJbmRleCBub3RUYWtlbiA9
IG1faml0LmdyYXBoKCkuYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KG5vZGUubm90VGFrZW5C
eXRlY29kZU9mZnNldCgpKTsKLSAgICAKLSAgICBpZiAoaXNLbm93bkJvb2xlYW4obm9kZS5jaGls
ZDEoKSkpIHsKLSAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENvbmRpdGlvbiBjb25kaXRp
b24gPSBNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybzsKLSAgICAgICAgCi0gICAgICAgIGlmICh0YWtl
biA9PSAobV9ibG9jayArIDEpKSB7Ci0gICAgICAgICAgICBjb25kaXRpb24gPSBNYWNyb0Fzc2Vt
Ymxlcjo6WmVybzsKLSAgICAgICAgICAgIEJsb2NrSW5kZXggdG1wID0gdGFrZW47Ci0gICAgICAg
ICAgICB0YWtlbiA9IG5vdFRha2VuOwotICAgICAgICAgICAgbm90VGFrZW4gPSB0bXA7Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0MzIoY29u
ZGl0aW9uLCB2YWx1ZUdQUiwgVHJ1c3RlZEltbTMyKHRydWUpKSwgdGFrZW4pOwotICAgICAgICBp
ZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkKLSAgICAgICAgICAgIGFkZEJyYW5jaChtX2pp
dC5qdW1wKCksIG5vdFRha2VuKTsKLSAgICAgICAgCi0gICAgICAgIG5vUmVzdWx0KG1fY29tcGls
ZUluZGV4KTsKLSAgICB9IGVsc2UgewotICAgICAgICBHUFJUZW1wb3JhcnkgcmVzdWx0KHRoaXMp
OwotICAgICAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOwotICAgICAgICAKLSAg
ICAgICAgYm9vbCBwcmVkaWN0Qm9vbGVhbiA9IGlzQm9vbGVhblByZWRpY3Rpb24obV9qaXQuZ2V0
UHJlZGljdGlvbihub2RlLmNoaWxkMSgpKSk7Ci0gICAgCi0gICAgICAgIGlmIChwcmVkaWN0Qm9v
bGVhbikgewotICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2Vt
Ymxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVu
Y29kZShqc0Jvb2xlYW4oZmFsc2UpKSkpLCBub3RUYWtlbik7Ci0gICAgICAgICAgICBhZGRCcmFu
Y2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3Jv
QXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVlKSkpKSwgdGFr
ZW4pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobV9pc1NwZWN1bGF0aXZlICYm
IHByZWRpY3RCb29sZWFuKSB7Ci0gICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKG1faml0Lmp1
bXAoKSk7Ci0gICAgICAgICAgICB2YWx1ZS51c2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2
YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNOdW1iZXIo
MCkpKSksIG5vdFRha2VuKTsKLSAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIo
TWFjcm9Bc3NlbWJsZXI6OkFib3ZlT3JFcXVhbCwgdmFsdWVHUFIsIEdQUkluZm86OnRhZ1R5cGVO
dW1iZXJSZWdpc3RlciksIHRha2VuKTsKLSAgICAKLSAgICAgICAgICAgIGlmICghcHJlZGljdEJv
b2xlYW4pIHsKLSAgICAgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3Jv
QXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1
ZTo6ZW5jb2RlKGpzQm9vbGVhbihmYWxzZSkpKSksIG5vdFRha2VuKTsKLSAgICAgICAgICAgICAg
ICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVH
UFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVl
KSkpKSwgdGFrZW4pOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgdmFsdWUudXNl
KCk7Ci0gICAgCi0gICAgICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIp
OwotICAgICAgICAgICAgbV9qaXQubW92ZSh2YWx1ZUdQUiwgR1BSSW5mbzo6YXJndW1lbnRHUFIx
KTsKLSAgICAgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQ
UkluZm86OmFyZ3VtZW50R1BSMCk7Ci0gICAgICAgICAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlv
bkNoZWNrKGRmZ0NvbnZlcnRKU1ZhbHVlVG9Cb29sZWFuKTsKLSAgICAgICAgICAgIG1faml0Lm1v
dmUoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7Ci0gICAgICAgICAgICBzaWxl
bnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgCi0gICAgICAgICAgICBhZGRCcmFu
Y2gobV9qaXQuYnJhbmNoVGVzdDgoTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm8sIHJlc3VsdEdQUiks
IHRha2VuKTsKLSAgICAgICAgICAgIGlmIChub3RUYWtlbiAhPSAobV9ibG9jayArIDEpKQotICAg
ICAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsKLSAgICAgICAg
fQotICAgICAgICAKLSAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgsIFVzZUNoaWxkcmVu
Q2FsbGVkRXhwbGljaXRseSk7Ci0gICAgfQotfQotCiB2b2lkIEpJVENvZGVHZW5lcmF0b3I6OmVt
aXRDYWxsKE5vZGUmIG5vZGUpCiB7CiAgICAgUF9ERkdPcGVyYXRpb25fRSBzbG93Q2FsbEZ1bmN0
aW9uOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9y
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVH
ZW5lcmF0b3IuY3BwCShyZXZpc2lvbiA5NjU3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHSklUQ29kZUdlbmVyYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3NywxMiArMzc3
LDYgQEAgYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZVN0cgogICAgIHJldHVy
biBmYWxzZTsKIH0KIAotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpzcGVjdWxhdGlvbkNoZWNrKE1h
Y3JvQXNzZW1ibGVyOjpKdW1wIGp1bXBUb0ZhaWwpCi17Ci0gICAgQVNTRVJUKG1faXNTcGVjdWxh
dGl2ZSk7Ci0gICAgc3RhdGljX2Nhc3Q8U3BlY3VsYXRpdmVKSVQqPih0aGlzKS0+c3BlY3VsYXRp
b25DaGVjayhqdW1wVG9GYWlsKTsKLX0KLQogI2lmbmRlZiBOREVCVUcKIHN0YXRpYyBjb25zdCBj
aGFyKiBkYXRhRm9ybWF0U3RyaW5nKERhdGFGb3JtYXQgZm9ybWF0KQogewpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgJKHJldmlzaW9u
IDk2NTcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9y
LmgJKHdvcmtpbmcgY29weSkKQEAgLTIzMiw5ICsyMzIsOCBAQCBwdWJsaWM6CiAgICAgfQogCiBw
cm90ZWN0ZWQ6Ci0gICAgSklUQ29kZUdlbmVyYXRvcihKSVRDb21waWxlciYgaml0LCBib29sIGlz
U3BlY3VsYXRpdmUpCisgICAgSklUQ29kZUdlbmVyYXRvcihKSVRDb21waWxlciYgaml0KQogICAg
ICAgICA6IG1faml0KGppdCkKLSAgICAgICAgLCBtX2lzU3BlY3VsYXRpdmUoaXNTcGVjdWxhdGl2
ZSkKICAgICAgICAgLCBtX2NvbXBpbGVJbmRleCgwKQogICAgICAgICAsIG1fZ2VuZXJhdGlvbklu
Zm8obV9qaXQuY29kZUJsb2NrKCktPm1fbnVtQ2FsbGVlUmVnaXN0ZXJzKQogICAgICAgICAsIG1f
YmxvY2tIZWFkcyhqaXQuZ3JhcGgoKS5tX2Jsb2Nrcy5zaXplKCkpCkBAIC03NzgsOCArNzc3LDYg
QEAgcHJvdGVjdGVkOgogICAgIHZvaWQgbm9uU3BlY3VsYXRpdmVOb25QZWVwaG9sZVN0cmljdEVx
KE5vZGUmLCBib29sIGludmVydCA9IGZhbHNlKTsKICAgICBib29sIG5vblNwZWN1bGF0aXZlU3Ry
aWN0RXEoTm9kZSYsIGJvb2wgaW52ZXJ0ID0gZmFsc2UpOwogICAgIAotICAgIHZvaWQgZW1pdEJy
YW5jaChOb2RlJik7Ci0gICAgCiAgICAgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MgYWRkcmVzc09m
Q2FsbERhdGEoaW50IGlkeCkKICAgICB7CiAgICAgICAgIHJldHVybiBNYWNyb0Fzc2VtYmxlcjo6
QWRkcmVzcyhHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgKG1faml0LmNvZGVCbG9jaygpLT5t
X251bUNhbGxlZVJlZ2lzdGVycyArIGlkeCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihSZWdp
c3RlcikpKTsKQEAgLTc5OSw4ICs3OTYsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2b2lkIGVtaXRD
YWxsKE5vZGUmKTsKICAgICAKLSAgICB2b2lkIHNwZWN1bGF0aW9uQ2hlY2soTWFjcm9Bc3NlbWJs
ZXI6Okp1bXAganVtcFRvRmFpbCk7Ci0KICAgICAvLyBDYWxsZWQgb25jZSBhIG5vZGUgaGFzIGNv
bXBsZXRlZCBjb2RlIGdlbmVyYXRpb24gYnV0IHByaW9yIHRvIHNldHRpbmcKICAgICAvLyBpdHMg
cmVzdWx0LCB0byBmcmVlIHVwIGl0cyBjaGlsZHJlbi4gKFRoaXMgbXVzdCBoYXBwZW4gcHJpb3Ig
dG8gc2V0dGluZwogICAgIC8vIHRoZSBub2RlcyByZXN1bHQsIHNpbmNlIHRoZSBub2RlIG1heSBo
YXZlIHRoZSBzYW1lIFZpcnR1YWxSZWdpc3RlciBhcwpAQCAtMTM4MywxNyArMTM3OCw2IEBAIHBy
b3RlY3RlZDoKIAogICAgIC8vIFRoZSBKSVQsIHdoaWxlIGFsc28gcHJvdmlkZXMgTWFjcm9Bc3Nl
bWJsZXIgZnVuY3Rpb25hbGl0eS4KICAgICBKSVRDb21waWxlciYgbV9qaXQ7Ci0gICAgLy8gVGhp
cyBmbGFnIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc3BlY3VsYXRpdmUgYW5kIG5vbi1zcGVjdWxh
dGl2ZQotICAgIC8vIGNvZGUgZ2VuZXJhdGlvbi4gVGhpcyBpcyBzaWduaWZpY2FudCB3aGVuIGZp
bGxpbmcgc3BpbGxlZCB2YWx1ZXMKLSAgICAvLyBmcm9tIHRoZSBSZWdpc3RlckZpbGUuIFdoZW4g
c3BpbGxpbmcgd2UgYXR0ZW1wdCB0byBzdG9yZSBpbmZvcm1hdGlvbgotICAgIC8vIGFzIHRvIHRo
ZSB0eXBlIG9mIGJveGVkIHZhbHVlIGJlaW5nIHN0b3JlZCAoaW50MzIsIGRvdWJsZSwgY2VsbCks
IGFuZAotICAgIC8vIHdoZW4gZmlsbGluZyBvbiB0aGUgc3BlY3VsYXRpdmUgcGF0aCB3ZSB3aWxs
IHJldHJpZXZlIHRoaXMgdHlwZSBpbmZvCi0gICAgLy8gd2hlcmUgYXZhaWxhYmxlLiBPbiB0aGUg
bm9uLXNwZWN1bGF0aXZlIHBhdGgsIGhvd2V2ZXIsIHdlIGNhbm5vdCByZWx5Ci0gICAgLy8gb24g
dGhlIHNwaWxsIGZvcm1hdCBpbmZvLCBzaW5jZSB0aGUgYSB2YWx1ZSBiZWluZyBsb2FkZWQgbWln
aHQgaGF2ZQotICAgIC8vIGJlZW4gc3BpbGxlZCBieSBlaXRoZXIgdGhlIHNwZWN1bGF0aXZlIG9y
IG5vbi1zcGVjdWxhdGl2ZSBwYXRocyAod2hlcmUKLSAgICAvLyB3ZSBlbnRlcmVkIHRoZSBub24t
c3BlY3VsYXRpdmUgcGF0aCBvbiBhbiBpbnRlcnZlbmluZyBiYWlsLW91dCksIGFuZAotICAgIC8v
IHRoZSB2YWx1ZSBtYXkgaGF2ZSBiZWVuIGJveGVkIGRpZmZlcmVudGx5IG9uIHRoZSB0d28gcGF0
aHMuCi0gICAgYm9vbCBtX2lzU3BlY3VsYXRpdmU7CiAgICAgLy8gVGhlIGN1cnJlbnQgbm9kZSBi
ZWluZyBnZW5lcmF0ZWQuCiAgICAgQmxvY2tJbmRleCBtX2Jsb2NrOwogICAgIE5vZGVJbmRleCBt
X2NvbXBpbGVJbmRleDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3Vs
YXRpdmVKSVQzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gOTY1NzEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC00ODIsNiArNDgyLDQ1IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVMb2dp
Y2FsTm90KE4KICNlbmRpZgogfQogCit2b2lkIFNwZWN1bGF0aXZlSklUOjplbWl0QnJhbmNoKE5v
ZGUmIG5vZGUpCit7CisgICAgLy8gRklYTUU6IEFkZCBmYXN0IGNhc2VzIGZvciBrbm93biBCb29s
ZWFuIQorICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOworICAg
IHZhbHVlLmZpbGwoKTsKKyAgICBHUFJSZWcgdmFsdWVUYWdHUFIgPSB2YWx1ZS50YWdHUFIoKTsK
KyAgICBHUFJSZWcgdmFsdWVQYXlsb2FkR1BSID0gdmFsdWUucGF5bG9hZEdQUigpOworCisgICAg
R1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0
LmdwcigpOworICAgIAorICAgIHVzZShub2RlLmNoaWxkMSgpKTsKKyAgICAKKyAgICBCbG9ja0lu
ZGV4IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQobm9k
ZS50YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOworICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBtX2pp
dC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRha2VuQnl0ZWNv
ZGVPZmZzZXQoKSk7CisKKyAgICBKSVRDb21waWxlcjo6SnVtcCBmYXN0UGF0aCA9IG1faml0LmJy
YW5jaDMyKEpJVENvbXBpbGVyOjpFcXVhbCwgdmFsdWVUYWdHUFIsIEpJVENvbXBpbGVyOjpUcnVz
dGVkSW1tMzIoSlNWYWx1ZTo6SW50MzJUYWcpKTsKKyAgICBKSVRDb21waWxlcjo6SnVtcCBzbG93
UGF0aCA9IG1faml0LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgdmFsdWVUYWdHUFIs
IEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6Qm9vbGVhblRhZykpOworCisgICAg
ZmFzdFBhdGgubGluaygmbV9qaXQpOworICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0MzIo
SklUQ29tcGlsZXI6Olplcm8sIHZhbHVlUGF5bG9hZEdQUiksIG5vdFRha2VuKTsKKyAgICBhZGRC
cmFuY2gobV9qaXQuanVtcCgpLCB0YWtlbik7CisKKyAgICBzbG93UGF0aC5saW5rKCZtX2ppdCk7
CisgICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKKyAgICBtX2ppdC5wdXNo
KHZhbHVlVGFnR1BSKTsKKyAgICBtX2ppdC5wdXNoKHZhbHVlUGF5bG9hZEdQUik7CisgICAgbV9q
aXQucHVzaChHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAgYXBwZW5kQ2FsbFdpdGhF
eGNlcHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7CisgICAgbV9qaXQubW92
ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICBzaWxlbnRGaWxsQWxs
UmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgCisgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFRl
c3Q4KEpJVENvbXBpbGVyOjpOb25aZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7CisgICAgaWYgKG5v
dFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCks
IG5vdFRha2VuKTsKKyAgICAKKyAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRy
ZW5DYWxsZWRFeHBsaWNpdGx5KTsKK30KKwogdm9pZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShO
b2RlJiBub2RlKQogewogICAgIE5vZGVUeXBlIG9wID0gbm9kZS5vcDsKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcAkocmV2aXNp
b24gOTY1NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklU
NjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01ODIsNiArNTgyLDcwIEBAIHZvaWQgU3BlY3VsYXRp
dmVKSVQ6OmNvbXBpbGVMb2dpY2FsTm90KE4KICAgICBqc1ZhbHVlUmVzdWx0KHJlc3VsdEdQUiwg
bV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVzZUNoaWxkcmVuQ2FsbGVkRXhw
bGljaXRseSk7CiB9CiAKK3ZvaWQgU3BlY3VsYXRpdmVKSVQ6OmVtaXRCcmFuY2goTm9kZSYgbm9k
ZSkKK3sKKyAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKKyAg
ICBHUFJSZWcgdmFsdWVHUFIgPSB2YWx1ZS5ncHIoKTsKKyAgICAKKyAgICBCbG9ja0luZGV4IHRh
a2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQobm9kZS50YWtl
bkJ5dGVjb2RlT2Zmc2V0KCkpOworICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBtX2ppdC5ncmFw
aCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRha2VuQnl0ZWNvZGVPZmZz
ZXQoKSk7CisgICAgCisgICAgaWYgKGlzS25vd25Cb29sZWFuKG5vZGUuY2hpbGQxKCkpKSB7Cisg
ICAgICAgIE1hY3JvQXNzZW1ibGVyOjpSZXN1bHRDb25kaXRpb24gY29uZGl0aW9uID0gTWFjcm9B
c3NlbWJsZXI6Ok5vblplcm87CisgICAgICAgIAorICAgICAgICBpZiAodGFrZW4gPT0gKG1fYmxv
Y2sgKyAxKSkgeworICAgICAgICAgICAgY29uZGl0aW9uID0gTWFjcm9Bc3NlbWJsZXI6Olplcm87
CisgICAgICAgICAgICBCbG9ja0luZGV4IHRtcCA9IHRha2VuOworICAgICAgICAgICAgdGFrZW4g
PSBub3RUYWtlbjsKKyAgICAgICAgICAgIG5vdFRha2VuID0gdG1wOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoVGVzdDMyKGNvbmRpdGlvbiwgdmFs
dWVHUFIsIFRydXN0ZWRJbW0zMih0cnVlKSksIHRha2VuKTsKKyAgICAgICAgaWYgKG5vdFRha2Vu
ICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCBu
b3RUYWtlbik7CisgICAgICAgIAorICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICAgICAg
R1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKKyAgICAgICAgCisgICAgICAgIGJvb2wg
cHJlZGljdEJvb2xlYW4gPSBpc0Jvb2xlYW5QcmVkaWN0aW9uKG1faml0LmdldFByZWRpY3Rpb24o
bm9kZS5jaGlsZDEoKSkpOworICAgIAorICAgICAgICBpZiAocHJlZGljdEJvb2xlYW4pIHsKKyAg
ICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFs
LCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29s
ZWFuKGZhbHNlKSkpKSwgbm90VGFrZW4pOworICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJy
YW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6
SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4odHJ1ZSkpKSksIHRha2VuKTsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHByZWRpY3RCb29sZWFuKSB7CisgICAgICAgICAg
ICBzcGVjdWxhdGlvbkNoZWNrKG1faml0Lmp1bXAoKSk7CisgICAgICAgICAgICB2YWx1ZS51c2Uo
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQ
dHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0
cihKU1ZhbHVlOjplbmNvZGUoanNOdW1iZXIoMCkpKSksIG5vdFRha2VuKTsKKyAgICAgICAgICAg
IGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkFib3ZlT3JFcXVhbCwg
dmFsdWVHUFIsIEdQUkluZm86OnRhZ1R5cGVOdW1iZXJSZWdpc3RlciksIHRha2VuKTsKKyAgICAK
KyAgICAgICAgICAgIGlmICghcHJlZGljdEJvb2xlYW4pIHsKKyAgICAgICAgICAgICAgICBhZGRC
cmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1h
Y3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbihmYWxzZSkpKSks
IG5vdFRha2VuKTsKKyAgICAgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1h
Y3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNW
YWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVlKSkpKSwgdGFrZW4pOworICAgICAgICAgICAgfQor
ICAgIAorICAgICAgICAgICAgdmFsdWUudXNlKCk7CisgICAgCisgICAgICAgICAgICBzaWxlbnRT
cGlsbEFsbFJlZ2lzdGVycyhyZXN1bHRHUFIpOworICAgICAgICAgICAgbV9qaXQubW92ZSh2YWx1
ZUdQUiwgR1BSSW5mbzo6YXJndW1lbnRHUFIxKTsKKyAgICAgICAgICAgIG1faml0Lm1vdmUoR1BS
SW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7CisgICAgICAg
ICAgICBhcHBlbmRDYWxsV2l0aEV4Y2VwdGlvbkNoZWNrKGRmZ0NvbnZlcnRKU1ZhbHVlVG9Cb29s
ZWFuKTsKKyAgICAgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIsIHJl
c3VsdEdQUik7CisgICAgICAgICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7
CisgICAgCisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoVGVzdDgoTWFjcm9Bc3Nl
bWJsZXI6Ok5vblplcm8sIHJlc3VsdEdQUiksIHRha2VuKTsKKyAgICAgICAgICAgIGlmIChub3RU
YWtlbiAhPSAobV9ibG9jayArIDEpKQorICAgICAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5q
dW1wKCksIG5vdFRha2VuKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbm9SZXN1bHQo
bV9jb21waWxlSW5kZXgsIFVzZUNoaWxkcmVuQ2FsbGVkRXhwbGljaXRseSk7CisgICAgfQorfQor
CiB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiB7CiAgICAgTm9kZVR5
cGUgb3AgPSBub2RlLm9wOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVj
dWxhdGl2ZUpJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
U3BlY3VsYXRpdmVKSVQuaAkocmV2aXNpb24gOTY1NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgJKHdvcmtpbmcgY29weSkKQEAgLTYwMCw2ICs2MDAs
NyBAQCBwcml2YXRlOgogICAgIHZvaWQgY29tcGlsZU9iamVjdEVxdWFsaXR5KE5vZGUmLCB2b2lk
KiB2cHRyKTsKICAgICB2b2lkIGNvbXBpbGVWYWx1ZUFkZChOb2RlJik7CiAgICAgdm9pZCBjb21w
aWxlTG9naWNhbE5vdChOb2RlJik7CisgICAgdm9pZCBlbWl0QnJhbmNoKE5vZGUmKTsKICAgICAK
ICAgICAvLyBJdCBpcyBhY2NlcHRhYmxlIHRvIGhhdmUgc3RydWN0dXJlIGJlIGVxdWFsIHRvIHNj
cmF0Y2gsIHNvIGxvbmcgYXMgeW91J3JlIGZpbmUKICAgICAvLyB3aXRoIHRoZSBzdHJ1Y3R1cmUg
R1BSIGJlaW5nIGNsb2JiZXJlZC4KQEAgLTk0Myw3ICs5NDQsNyBAQCBwcml2YXRlOgogfTsKIAog
aW5saW5lIFNwZWN1bGF0aXZlSklUOjpTcGVjdWxhdGl2ZUpJVChKSVRDb21waWxlciYgaml0KQot
ICAgIDogSklUQ29kZUdlbmVyYXRvcihqaXQsIHRydWUpCisgICAgOiBKSVRDb2RlR2VuZXJhdG9y
KGppdCkKICAgICAsIG1fY29tcGlsZU9rYXkodHJ1ZSkKICAgICAsIG1fYXJndW1lbnRzKGppdC5j
b2RlQmxvY2soKS0+bV9udW1QYXJhbWV0ZXJzKQogICAgICwgbV92YXJpYWJsZXMoaml0LmdyYXBo
KCkubV9sb2NhbFZhcnMpCg==
</data>
<flag name="review"
          id="106853"
          type_id="1"
          status="-"
          setter="oliver"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109676</attachid>
            <date>2011-10-04 13:50:51 -0700</date>
            <delta_ts>2011-10-04 14:41:42 -0700</delta_ts>
            <desc>the patch - address some of review</desc>
            <filename>betterjit_patch_2.diff</filename>
            <type>text/plain</type>
            <size>18042</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTY1NzMpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzMgQEAK
KzIwMTEtMTAtMDMgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBK
SVRDb2RlR2VuZXJhdG9yIHNob3VsZCBubyBsb25nZXIgaGF2ZSBjb2RlIHRoYXQgdHJpZXMgdG9v
IGhhcmQKKyAgICAgICAgdG8gYmUgYm90aCBzcGVjdWxhdGl2ZSBhbmQgbm9uLXNwZWN1bGF0aXZl
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02OTMyMQor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAKKyAgICAgICAg
UmVtb3ZlZCBtX2lzU3BlY3VsYXRpdmUgYW5kIHNwZWN1bGF0aW9uQ2hlY2soKSBmcm9tIEpJVENv
ZGVHZW5lcmF0b3IuCisgICAgICAgIFRoaXMgcmVxdWlyZWQgbW92aW5nIGVtaXRCcmFuY2goKSB0
byBTcGVjdWxhdGl2ZUpJVCwgc2luY2UgaXQgd2FzCisgICAgICAgIHRoZSBtYWluIHVzZXIgb2Yg
dGhhdCBmaWVsZCBhbmQgbWV0aG9kLiBPdGhlciB0aGFuIHRydmlhbCBjbGVhbi11cHMKKyAgICAg
ICAgaW4gZW1pdEJyYW5jaCgpLCB0aGUgY29kZSBpcyB1bmNoYW5nZWQgKGFuZCBzdGlsbCBoYXMg
c29tZSBkaXNwYXJpdHkKKyAgICAgICAgYmV0d2VlbiA2NCBhbmQgMzJfNjQsIGFuZCBzdGlsbCBs
YWNrcyBzb21lIG9idmlvdXMgb3B0aW1pemF0aW9ucykuCisKKyAgICAgICAgKiBkZmcvREZHSklU
Q29kZUdlbmVyYXRvci5jcHA6CisgICAgICAgICogZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IuaDoK
KyAgICAgICAgKEpTQzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpKSVRDb2RlR2VuZXJhdG9yKToK
KyAgICAgICAgKiBkZmcvREZHSklUQ29kZUdlbmVyYXRvcjMyXzY0LmNwcDoKKyAgICAgICAgKEpT
Qzo6REZHOjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsRG91YmxlKToKKyAgICAgICAgKEpTQzo6REZH
OjpKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSlNWYWx1ZSk6CisgICAgICAgICogZGZnL0RGR0pJVENv
ZGVHZW5lcmF0b3I2NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6
ZmlsbERvdWJsZSk6CisgICAgICAgIChKU0M6OkRGRzo6SklUQ29kZUdlbmVyYXRvcjo6ZmlsbEpT
VmFsdWUpOgorICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oOgorICAgICAgICAoSlND
OjpERkc6OlNwZWN1bGF0aXZlSklUOjpTcGVjdWxhdGl2ZUpJVCk6CisgICAgICAgICogZGZnL0RG
R1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwOgorICAgICAgICAoSlNDOjpERkc6OlNwZWN1bGF0aXZl
SklUOjplbWl0QnJhbmNoKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHA6
CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmVtaXRCcmFuY2gpOgorCiAyMDEx
LTEwLTAzICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAgREZHIHNo
b3VsZCBpbmxpbmUgQXJyYXkucHVzaCBhbmQgQXJyYXkucG9wCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0b3IzMl82NC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yMzJfNjQuY3BwCShy
ZXZpc2lvbiA5NjU3MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdl
bmVyYXRvcjMyXzY0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM2LDcgKzEzNiw3IEBAIEZQUlJl
ZyBKSVRDb2RlR2VuZXJhdG9yOjpmaWxsRG91YmxlKE5vZGUKICAgICAgICAgICAgIG1faml0LmVt
aXRMb2FkKG5vZGVJbmRleCwgdGFnLCBwYXlsb2FkKTsKICAgICAgICAgICAgIG1fZ3Bycy5yZXRh
aW4odGFnLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKICAgICAgICAgICAg
IG1fZ3Bycy5yZXRhaW4ocGF5bG9hZCwgdmlydHVhbFJlZ2lzdGVyLCBTcGlsbE9yZGVyU3BpbGxl
ZCk7Ci0gICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKHRhZywgcGF5bG9hZCwgbV9pc1NwZWN1
bGF0aXZlID8gc3BpbGxGb3JtYXQgOiBEYXRhRm9ybWF0SlMpOworICAgICAgICAgICAgaW5mby5m
aWxsSlNWYWx1ZSh0YWcsIHBheWxvYWQsIHNwaWxsRm9ybWF0KTsKICAgICAgICAgICAgIHVubG9j
ayh0YWcpOwogICAgICAgICAgICAgdW5sb2NrKHBheWxvYWQpOwogICAgICAgICB9CkBAIC0yNDIs
NyArMjQyLDcgQEAgYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjpmaWxsSlNWYWx1ZShOb2RlSQogICAg
ICAgICAgICAgbV9qaXQuZW1pdExvYWQobm9kZUluZGV4LCB0YWdHUFIsIHBheWxvYWRHUFIpOwog
ICAgICAgICAgICAgbV9ncHJzLnJldGFpbih0YWdHUFIsIHZpcnR1YWxSZWdpc3RlciwgU3BpbGxP
cmRlclNwaWxsZWQpOwogICAgICAgICAgICAgbV9ncHJzLnJldGFpbihwYXlsb2FkR1BSLCB2aXJ0
dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKLSAgICAgICAgICAgIGluZm8uZmlsbEpT
VmFsdWUodGFnR1BSLCBwYXlsb2FkR1BSLCBtX2lzU3BlY3VsYXRpdmUgPyBzcGlsbEZvcm1hdCA6
IERhdGFGb3JtYXRKUyk7CisgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKHRhZ0dQUiwgcGF5
bG9hZEdQUiwgc3BpbGxGb3JtYXQpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHRydWU7
CkBAIC0xNTE3LDQ1ICsxNTE3LDYgQEAgdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxh
dGl2ZU5vbgogICAgIGpzVmFsdWVSZXN1bHQocmVzdWx0VGFnR1BSLCByZXN1bHRQYXlsb2FkR1BS
LCBtX2NvbXBpbGVJbmRleCwgRGF0YUZvcm1hdEpTQm9vbGVhbiwgVXNlQ2hpbGRyZW5DYWxsZWRF
eHBsaWNpdGx5KTsKIH0KIAotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjplbWl0QnJhbmNoKE5vZGUm
IG5vZGUpCi17Ci0gICAgLy8gRklYTUU6IEFkZCBmYXN0IGNhc2VzIGZvciBrbm93biBCb29sZWFu
IQotICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwotICAgIHZh
bHVlLmZpbGwoKTsKLSAgICBHUFJSZWcgdmFsdWVUYWdHUFIgPSB2YWx1ZS50YWdHUFIoKTsKLSAg
ICBHUFJSZWcgdmFsdWVQYXlsb2FkR1BSID0gdmFsdWUucGF5bG9hZEdQUigpOwotCi0gICAgR1BS
VGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKLSAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0Lmdw
cigpOwotICAgIAotICAgIHVzZShub2RlLmNoaWxkMSgpKTsKLSAgICAKLSAgICBCbG9ja0luZGV4
IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQobm9kZS50
YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOwotICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBtX2ppdC5n
cmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRha2VuQnl0ZWNvZGVP
ZmZzZXQoKSk7Ci0KLSAgICBKSVRDb21waWxlcjo6SnVtcCBmYXN0UGF0aCA9IG1faml0LmJyYW5j
aDMyKEpJVENvbXBpbGVyOjpFcXVhbCwgdmFsdWVUYWdHUFIsIEpJVENvbXBpbGVyOjpUcnVzdGVk
SW1tMzIoSlNWYWx1ZTo6SW50MzJUYWcpKTsKLSAgICBKSVRDb21waWxlcjo6SnVtcCBzbG93UGF0
aCA9IG1faml0LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgdmFsdWVUYWdHUFIsIEpJ
VENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6Qm9vbGVhblRhZykpOwotCi0gICAgZmFz
dFBhdGgubGluaygmbV9qaXQpOwotICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hUZXN0MzIoSklU
Q29tcGlsZXI6Olplcm8sIHZhbHVlUGF5bG9hZEdQUiksIG5vdFRha2VuKTsKLSAgICBhZGRCcmFu
Y2gobV9qaXQuanVtcCgpLCB0YWtlbik7Ci0KLSAgICBzbG93UGF0aC5saW5rKCZtX2ppdCk7Ci0g
ICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKLSAgICBtX2ppdC5wdXNoKHZh
bHVlVGFnR1BSKTsKLSAgICBtX2ppdC5wdXNoKHZhbHVlUGF5bG9hZEdQUik7Ci0gICAgbV9qaXQu
cHVzaChHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rlcik7Ci0gICAgYXBwZW5kQ2FsbFdpdGhFeGNl
cHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7Ci0gICAgbV9qaXQubW92ZShH
UFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKLSAgICBzaWxlbnRGaWxsQWxsUmVn
aXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgCi0gICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFRlc3Q4
KEpJVENvbXBpbGVyOjpOb25aZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7Ci0gICAgaWYgKG5vdFRh
a2VuICE9IChtX2Jsb2NrICsgMSkpCi0gICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5v
dFRha2VuKTsKLSAgICAKLSAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRyZW5D
YWxsZWRFeHBsaWNpdGx5KTsKLX0KLQogdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjplbWl0Q2FsbChO
b2RlJiBub2RlKQogewogICAgIFBfREZHT3BlcmF0aW9uX0Ugc2xvd0NhbGxGdW5jdGlvbjsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvcjY0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvZGVHZW5lcmF0
b3I2NC5jcHAJKHJldmlzaW9uIDk2NTcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdKSVRDb2RlR2VuZXJhdG9yNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDgsNyArMTQ4LDcg
QEAgRlBSUmVnIEpJVENvZGVHZW5lcmF0b3I6OmZpbGxEb3VibGUoTm9kZQogICAgICAgICAgICAg
QVNTRVJUKHNwaWxsRm9ybWF0ICYgRGF0YUZvcm1hdEpTKTsKICAgICAgICAgICAgIG1fZ3Bycy5y
ZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIsIFNwaWxsT3JkZXJTcGlsbGVkKTsKICAgICAgICAg
ICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGlsZXI6OmFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVy
KSwgZ3ByKTsKLSAgICAgICAgICAgIGluZm8uZmlsbEpTVmFsdWUoZ3ByLCBtX2lzU3BlY3VsYXRp
dmUgPyBzcGlsbEZvcm1hdCA6IERhdGFGb3JtYXRKUyk7CisgICAgICAgICAgICBpbmZvLmZpbGxK
U1ZhbHVlKGdwciwgc3BpbGxGb3JtYXQpOwogICAgICAgICAgICAgdW5sb2NrKGdwcik7CiAgICAg
ICAgIH0KICAgICB9CkBAIC0yNjYsNyArMjY2LDcgQEAgR1BSUmVnIEpJVENvZGVHZW5lcmF0b3I6
OmZpbGxKU1ZhbHVlKE5vZAogICAgICAgICAgICAgQVNTRVJUKHNwaWxsRm9ybWF0ICYgRGF0YUZv
cm1hdEpTKTsKICAgICAgICAgICAgIG1fZ3Bycy5yZXRhaW4oZ3ByLCB2aXJ0dWFsUmVnaXN0ZXIs
IFNwaWxsT3JkZXJTcGlsbGVkKTsKICAgICAgICAgICAgIG1faml0LmxvYWRQdHIoSklUQ29tcGls
ZXI6OmFkZHJlc3NGb3IodmlydHVhbFJlZ2lzdGVyKSwgZ3ByKTsKLSAgICAgICAgICAgIGluZm8u
ZmlsbEpTVmFsdWUoZ3ByLCBtX2lzU3BlY3VsYXRpdmUgPyBzcGlsbEZvcm1hdCA6IERhdGFGb3Jt
YXRKUyk7CisgICAgICAgICAgICBpbmZvLmZpbGxKU1ZhbHVlKGdwciwgc3BpbGxGb3JtYXQpOwog
ICAgICAgICB9CiAgICAgICAgIHJldHVybiBncHI7CiAgICAgfQpAQCAtMTQ2MSw3MCArMTQ2MSw2
IEBAIHZvaWQgSklUQ29kZUdlbmVyYXRvcjo6bm9uU3BlY3VsYXRpdmVOb24KICAgICBqc1ZhbHVl
UmVzdWx0KHJlc3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVz
ZUNoaWxkcmVuQ2FsbGVkRXhwbGljaXRseSk7CiB9CiAKLXZvaWQgSklUQ29kZUdlbmVyYXRvcjo6
ZW1pdEJyYW5jaChOb2RlJiBub2RlKQotewotICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMs
IG5vZGUuY2hpbGQxKCkpOwotICAgIEdQUlJlZyB2YWx1ZUdQUiA9IHZhbHVlLmdwcigpOwotICAg
IAotICAgIEJsb2NrSW5kZXggdGFrZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRl
Y29kZU9mZnNldChub2RlLnRha2VuQnl0ZWNvZGVPZmZzZXQoKSk7Ci0gICAgQmxvY2tJbmRleCBu
b3RUYWtlbiA9IG1faml0LmdyYXBoKCkuYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KG5vZGUu
bm90VGFrZW5CeXRlY29kZU9mZnNldCgpKTsKLSAgICAKLSAgICBpZiAoaXNLbm93bkJvb2xlYW4o
bm9kZS5jaGlsZDEoKSkpIHsKLSAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OlJlc3VsdENvbmRpdGlv
biBjb25kaXRpb24gPSBNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybzsKLSAgICAgICAgCi0gICAgICAg
IGlmICh0YWtlbiA9PSAobV9ibG9jayArIDEpKSB7Ci0gICAgICAgICAgICBjb25kaXRpb24gPSBN
YWNyb0Fzc2VtYmxlcjo6WmVybzsKLSAgICAgICAgICAgIEJsb2NrSW5kZXggdG1wID0gdGFrZW47
Ci0gICAgICAgICAgICB0YWtlbiA9IG5vdFRha2VuOwotICAgICAgICAgICAgbm90VGFrZW4gPSB0
bXA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hU
ZXN0MzIoY29uZGl0aW9uLCB2YWx1ZUdQUiwgVHJ1c3RlZEltbTMyKHRydWUpKSwgdGFrZW4pOwot
ICAgICAgICBpZiAobm90VGFrZW4gIT0gKG1fYmxvY2sgKyAxKSkKLSAgICAgICAgICAgIGFkZEJy
YW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsKLSAgICAgICAgCi0gICAgICAgIG5vUmVzdWx0
KG1fY29tcGlsZUluZGV4KTsKLSAgICB9IGVsc2UgewotICAgICAgICBHUFJUZW1wb3JhcnkgcmVz
dWx0KHRoaXMpOwotICAgICAgICBHUFJSZWcgcmVzdWx0R1BSID0gcmVzdWx0LmdwcigpOwotICAg
ICAgICAKLSAgICAgICAgYm9vbCBwcmVkaWN0Qm9vbGVhbiA9IGlzQm9vbGVhblByZWRpY3Rpb24o
bV9qaXQuZ2V0UHJlZGljdGlvbihub2RlLmNoaWxkMSgpKSk7Ci0gICAgCi0gICAgICAgIGlmIChw
cmVkaWN0Qm9vbGVhbikgewotICAgICAgICAgICAgYWRkQnJhbmNoKG1faml0LmJyYW5jaFB0cihN
YWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fzc2VtYmxlcjo6SW1tUHRyKEpT
VmFsdWU6OmVuY29kZShqc0Jvb2xlYW4oZmFsc2UpKSkpLCBub3RUYWtlbik7Ci0gICAgICAgICAg
ICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVH
UFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbih0cnVl
KSkpKSwgdGFrZW4pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobV9pc1NwZWN1
bGF0aXZlICYmIHByZWRpY3RCb29sZWFuKSB7Ci0gICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNr
KG1faml0Lmp1bXAoKSk7Ci0gICAgICAgICAgICB2YWx1ZS51c2UoKTsKLSAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6
OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUo
anNOdW1iZXIoMCkpKSksIG5vdFRha2VuKTsKLSAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5i
cmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkFib3ZlT3JFcXVhbCwgdmFsdWVHUFIsIEdQUkluZm86
OnRhZ1R5cGVOdW1iZXJSZWdpc3RlciksIHRha2VuKTsKLSAgICAKLSAgICAgICAgICAgIGlmICgh
cHJlZGljdEJvb2xlYW4pIHsKLSAgICAgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNo
UHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1Q
dHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbihmYWxzZSkpKSksIG5vdFRha2VuKTsKLSAgICAg
ICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVh
bCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzQm9v
bGVhbih0cnVlKSkpKSwgdGFrZW4pOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAg
dmFsdWUudXNlKCk7Ci0gICAgCi0gICAgICAgICAgICBzaWxlbnRTcGlsbEFsbFJlZ2lzdGVycyhy
ZXN1bHRHUFIpOwotICAgICAgICAgICAgbV9qaXQubW92ZSh2YWx1ZUdQUiwgR1BSSW5mbzo6YXJn
dW1lbnRHUFIxKTsKLSAgICAgICAgICAgIG1faml0Lm1vdmUoR1BSSW5mbzo6Y2FsbEZyYW1lUmVn
aXN0ZXIsIEdQUkluZm86OmFyZ3VtZW50R1BSMCk7Ci0gICAgICAgICAgICBhcHBlbmRDYWxsV2l0
aEV4Y2VwdGlvbkNoZWNrKGRmZ0NvbnZlcnRKU1ZhbHVlVG9Cb29sZWFuKTsKLSAgICAgICAgICAg
IG1faml0Lm1vdmUoR1BSSW5mbzo6cmV0dXJuVmFsdWVHUFIsIHJlc3VsdEdQUik7Ci0gICAgICAg
ICAgICBzaWxlbnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7Ci0gICAgCi0gICAgICAgICAg
ICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoVGVzdDgoTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm8sIHJl
c3VsdEdQUiksIHRha2VuKTsKLSAgICAgICAgICAgIGlmIChub3RUYWtlbiAhPSAobV9ibG9jayAr
IDEpKQotICAgICAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5qdW1wKCksIG5vdFRha2VuKTsK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbm9SZXN1bHQobV9jb21waWxlSW5kZXgsIFVz
ZUNoaWxkcmVuQ2FsbGVkRXhwbGljaXRseSk7Ci0gICAgfQotfQotCiB2b2lkIEpJVENvZGVHZW5l
cmF0b3I6OmVtaXRDYWxsKE5vZGUmIG5vZGUpCiB7CiAgICAgUF9ERkdPcGVyYXRpb25fRSBzbG93
Q2FsbEZ1bmN0aW9uOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2Rl
R2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0pJVENvZGVHZW5lcmF0b3IuY3BwCShyZXZpc2lvbiA5NjU3MSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSklUQ29kZUdlbmVyYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3
NywxMiArMzc3LDYgQEAgYm9vbCBKSVRDb2RlR2VuZXJhdG9yOjpub25TcGVjdWxhdGl2ZVN0cgog
ICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBKSVRDb2RlR2VuZXJhdG9yOjpzcGVjdWxhdGlv
bkNoZWNrKE1hY3JvQXNzZW1ibGVyOjpKdW1wIGp1bXBUb0ZhaWwpCi17Ci0gICAgQVNTRVJUKG1f
aXNTcGVjdWxhdGl2ZSk7Ci0gICAgc3RhdGljX2Nhc3Q8U3BlY3VsYXRpdmVKSVQqPih0aGlzKS0+
c3BlY3VsYXRpb25DaGVjayhqdW1wVG9GYWlsKTsKLX0KLQogI2lmbmRlZiBOREVCVUcKIHN0YXRp
YyBjb25zdCBjaGFyKiBkYXRhRm9ybWF0U3RyaW5nKERhdGFGb3JtYXQgZm9ybWF0KQogewpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2RlR2VuZXJhdG9yLmgJ
KHJldmlzaW9uIDk2NTcxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb2Rl
R2VuZXJhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTIzMiw5ICsyMzIsOCBAQCBwdWJsaWM6CiAg
ICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgSklUQ29kZUdlbmVyYXRvcihKSVRDb21waWxlciYgaml0
LCBib29sIGlzU3BlY3VsYXRpdmUpCisgICAgSklUQ29kZUdlbmVyYXRvcihKSVRDb21waWxlciYg
aml0KQogICAgICAgICA6IG1faml0KGppdCkKLSAgICAgICAgLCBtX2lzU3BlY3VsYXRpdmUoaXNT
cGVjdWxhdGl2ZSkKICAgICAgICAgLCBtX2NvbXBpbGVJbmRleCgwKQogICAgICAgICAsIG1fZ2Vu
ZXJhdGlvbkluZm8obV9qaXQuY29kZUJsb2NrKCktPm1fbnVtQ2FsbGVlUmVnaXN0ZXJzKQogICAg
ICAgICAsIG1fYmxvY2tIZWFkcyhqaXQuZ3JhcGgoKS5tX2Jsb2Nrcy5zaXplKCkpCkBAIC03Nzgs
OCArNzc3LDYgQEAgcHJvdGVjdGVkOgogICAgIHZvaWQgbm9uU3BlY3VsYXRpdmVOb25QZWVwaG9s
ZVN0cmljdEVxKE5vZGUmLCBib29sIGludmVydCA9IGZhbHNlKTsKICAgICBib29sIG5vblNwZWN1
bGF0aXZlU3RyaWN0RXEoTm9kZSYsIGJvb2wgaW52ZXJ0ID0gZmFsc2UpOwogICAgIAotICAgIHZv
aWQgZW1pdEJyYW5jaChOb2RlJik7Ci0gICAgCiAgICAgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3Mg
YWRkcmVzc09mQ2FsbERhdGEoaW50IGlkeCkKICAgICB7CiAgICAgICAgIHJldHVybiBNYWNyb0Fz
c2VtYmxlcjo6QWRkcmVzcyhHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgKG1faml0LmNvZGVC
bG9jaygpLT5tX251bUNhbGxlZVJlZ2lzdGVycyArIGlkeCkgKiBzdGF0aWNfY2FzdDxpbnQ+KHNp
emVvZihSZWdpc3RlcikpKTsKQEAgLTc5OSw4ICs3OTYsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2
b2lkIGVtaXRDYWxsKE5vZGUmKTsKICAgICAKLSAgICB2b2lkIHNwZWN1bGF0aW9uQ2hlY2soTWFj
cm9Bc3NlbWJsZXI6Okp1bXAganVtcFRvRmFpbCk7Ci0KICAgICAvLyBDYWxsZWQgb25jZSBhIG5v
ZGUgaGFzIGNvbXBsZXRlZCBjb2RlIGdlbmVyYXRpb24gYnV0IHByaW9yIHRvIHNldHRpbmcKICAg
ICAvLyBpdHMgcmVzdWx0LCB0byBmcmVlIHVwIGl0cyBjaGlsZHJlbi4gKFRoaXMgbXVzdCBoYXBw
ZW4gcHJpb3IgdG8gc2V0dGluZwogICAgIC8vIHRoZSBub2RlcyByZXN1bHQsIHNpbmNlIHRoZSBu
b2RlIG1heSBoYXZlIHRoZSBzYW1lIFZpcnR1YWxSZWdpc3RlciBhcwpAQCAtMTM4MywxNyArMTM3
OCw2IEBAIHByb3RlY3RlZDoKIAogICAgIC8vIFRoZSBKSVQsIHdoaWxlIGFsc28gcHJvdmlkZXMg
TWFjcm9Bc3NlbWJsZXIgZnVuY3Rpb25hbGl0eS4KICAgICBKSVRDb21waWxlciYgbV9qaXQ7Ci0g
ICAgLy8gVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc3BlY3VsYXRpdmUgYW5kIG5v
bi1zcGVjdWxhdGl2ZQotICAgIC8vIGNvZGUgZ2VuZXJhdGlvbi4gVGhpcyBpcyBzaWduaWZpY2Fu
dCB3aGVuIGZpbGxpbmcgc3BpbGxlZCB2YWx1ZXMKLSAgICAvLyBmcm9tIHRoZSBSZWdpc3RlckZp
bGUuIFdoZW4gc3BpbGxpbmcgd2UgYXR0ZW1wdCB0byBzdG9yZSBpbmZvcm1hdGlvbgotICAgIC8v
IGFzIHRvIHRoZSB0eXBlIG9mIGJveGVkIHZhbHVlIGJlaW5nIHN0b3JlZCAoaW50MzIsIGRvdWJs
ZSwgY2VsbCksIGFuZAotICAgIC8vIHdoZW4gZmlsbGluZyBvbiB0aGUgc3BlY3VsYXRpdmUgcGF0
aCB3ZSB3aWxsIHJldHJpZXZlIHRoaXMgdHlwZSBpbmZvCi0gICAgLy8gd2hlcmUgYXZhaWxhYmxl
LiBPbiB0aGUgbm9uLXNwZWN1bGF0aXZlIHBhdGgsIGhvd2V2ZXIsIHdlIGNhbm5vdCByZWx5Ci0g
ICAgLy8gb24gdGhlIHNwaWxsIGZvcm1hdCBpbmZvLCBzaW5jZSB0aGUgYSB2YWx1ZSBiZWluZyBs
b2FkZWQgbWlnaHQgaGF2ZQotICAgIC8vIGJlZW4gc3BpbGxlZCBieSBlaXRoZXIgdGhlIHNwZWN1
bGF0aXZlIG9yIG5vbi1zcGVjdWxhdGl2ZSBwYXRocyAod2hlcmUKLSAgICAvLyB3ZSBlbnRlcmVk
IHRoZSBub24tc3BlY3VsYXRpdmUgcGF0aCBvbiBhbiBpbnRlcnZlbmluZyBiYWlsLW91dCksIGFu
ZAotICAgIC8vIHRoZSB2YWx1ZSBtYXkgaGF2ZSBiZWVuIGJveGVkIGRpZmZlcmVudGx5IG9uIHRo
ZSB0d28gcGF0aHMuCi0gICAgYm9vbCBtX2lzU3BlY3VsYXRpdmU7CiAgICAgLy8gVGhlIGN1cnJl
bnQgbm9kZSBiZWluZyBnZW5lcmF0ZWQuCiAgICAgQmxvY2tJbmRleCBtX2Jsb2NrOwogICAgIE5v
ZGVJbmRleCBtX2NvbXBpbGVJbmRleDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHU3BlY3VsYXRpdmVKSVQzMl82NC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAkocmV2aXNpb24gOTY1NzEpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00ODIsNiArNDgyLDQ1IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNv
bXBpbGVMb2dpY2FsTm90KE4KICNlbmRpZgogfQogCit2b2lkIFNwZWN1bGF0aXZlSklUOjplbWl0
QnJhbmNoKE5vZGUmIG5vZGUpCit7CisgICAgLy8gRklYTUU6IEFkZCBmYXN0IGNhc2VzIGZvciBr
bm93biBCb29sZWFuIQorICAgIEpTVmFsdWVPcGVyYW5kIHZhbHVlKHRoaXMsIG5vZGUuY2hpbGQx
KCkpOworICAgIHZhbHVlLmZpbGwoKTsKKyAgICBHUFJSZWcgdmFsdWVUYWdHUFIgPSB2YWx1ZS50
YWdHUFIoKTsKKyAgICBHUFJSZWcgdmFsdWVQYXlsb2FkR1BSID0gdmFsdWUucGF5bG9hZEdQUigp
OworCisgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsKKyAgICBHUFJSZWcgcmVzdWx0R1BS
ID0gcmVzdWx0LmdwcigpOworICAgIAorICAgIHVzZShub2RlLmNoaWxkMSgpKTsKKyAgICAKKyAg
ICBCbG9ja0luZGV4IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVP
ZmZzZXQobm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOworICAgIEJsb2NrSW5kZXggbm90VGFr
ZW4gPSBtX2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRh
a2VuQnl0ZWNvZGVPZmZzZXQoKSk7CisKKyAgICBKSVRDb21waWxlcjo6SnVtcCBmYXN0UGF0aCA9
IG1faml0LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpFcXVhbCwgdmFsdWVUYWdHUFIsIEpJVENvbXBp
bGVyOjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6SW50MzJUYWcpKTsKKyAgICBKSVRDb21waWxlcjo6
SnVtcCBzbG93UGF0aCA9IG1faml0LmJyYW5jaDMyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwgdmFs
dWVUYWdHUFIsIEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tMzIoSlNWYWx1ZTo6Qm9vbGVhblRhZykp
OworCisgICAgZmFzdFBhdGgubGluaygmbV9qaXQpOworICAgIGFkZEJyYW5jaChtX2ppdC5icmFu
Y2hUZXN0MzIoSklUQ29tcGlsZXI6Olplcm8sIHZhbHVlUGF5bG9hZEdQUiksIG5vdFRha2VuKTsK
KyAgICBhZGRCcmFuY2gobV9qaXQuanVtcCgpLCB0YWtlbik7CisKKyAgICBzbG93UGF0aC5saW5r
KCZtX2ppdCk7CisgICAgc2lsZW50U3BpbGxBbGxSZWdpc3RlcnMocmVzdWx0R1BSKTsKKyAgICBt
X2ppdC5wdXNoKHZhbHVlVGFnR1BSKTsKKyAgICBtX2ppdC5wdXNoKHZhbHVlUGF5bG9hZEdQUik7
CisgICAgbV9qaXQucHVzaChHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3Rlcik7CisgICAgYXBwZW5k
Q2FsbFdpdGhFeGNlcHRpb25DaGVjayhkZmdDb252ZXJ0SlNWYWx1ZVRvQm9vbGVhbik7CisgICAg
bV9qaXQubW92ZShHUFJJbmZvOjpyZXR1cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICBzaWxl
bnRGaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgCisgICAgYWRkQnJhbmNoKG1faml0
LmJyYW5jaFRlc3Q4KEpJVENvbXBpbGVyOjpOb25aZXJvLCByZXN1bHRHUFIpLCB0YWtlbik7Cisg
ICAgaWYgKG5vdFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgIGFkZEJyYW5jaChtX2pp
dC5qdW1wKCksIG5vdFRha2VuKTsKKyAgICAKKyAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCwg
VXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5KTsKK30KKwogdm9pZCBTcGVjdWxhdGl2ZUpJVDo6
Y29tcGlsZShOb2RlJiBub2RlKQogewogICAgIE5vZGVUeXBlIG9wID0gbm9kZS5vcDsKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNw
cAkocmV2aXNpb24gOTY1NzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1
bGF0aXZlSklUNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01ODIsNiArNTgyLDY2IEBAIHZvaWQg
U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVMb2dpY2FsTm90KE4KICAgICBqc1ZhbHVlUmVzdWx0KHJl
c3VsdEdQUiwgbV9jb21waWxlSW5kZXgsIERhdGFGb3JtYXRKU0Jvb2xlYW4sIFVzZUNoaWxkcmVu
Q2FsbGVkRXhwbGljaXRseSk7CiB9CiAKK3ZvaWQgU3BlY3VsYXRpdmVKSVQ6OmVtaXRCcmFuY2go
Tm9kZSYgbm9kZSkKK3sKKyAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxk
MSgpKTsKKyAgICBHUFJSZWcgdmFsdWVHUFIgPSB2YWx1ZS5ncHIoKTsKKyAgICAKKyAgICBCbG9j
a0luZGV4IHRha2VuID0gbV9qaXQuZ3JhcGgoKS5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQo
bm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0KCkpOworICAgIEJsb2NrSW5kZXggbm90VGFrZW4gPSBt
X2ppdC5ncmFwaCgpLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRha2VuQnl0
ZWNvZGVPZmZzZXQoKSk7CisgICAgCisgICAgaWYgKGlzS25vd25Cb29sZWFuKG5vZGUuY2hpbGQx
KCkpKSB7CisgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpSZXN1bHRDb25kaXRpb24gY29uZGl0aW9u
ID0gTWFjcm9Bc3NlbWJsZXI6Ok5vblplcm87CisgICAgICAgIAorICAgICAgICBpZiAodGFrZW4g
PT0gKG1fYmxvY2sgKyAxKSkgeworICAgICAgICAgICAgY29uZGl0aW9uID0gTWFjcm9Bc3NlbWJs
ZXI6Olplcm87CisgICAgICAgICAgICBCbG9ja0luZGV4IHRtcCA9IHRha2VuOworICAgICAgICAg
ICAgdGFrZW4gPSBub3RUYWtlbjsKKyAgICAgICAgICAgIG5vdFRha2VuID0gdG1wOworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoVGVzdDMyKGNvbmRp
dGlvbiwgdmFsdWVHUFIsIFRydXN0ZWRJbW0zMih0cnVlKSksIHRha2VuKTsKKyAgICAgICAgaWYg
KG5vdFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQu
anVtcCgpLCBub3RUYWtlbik7CisgICAgICAgIAorICAgICAgICBub1Jlc3VsdChtX2NvbXBpbGVJ
bmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgR1BSVGVtcG9yYXJ5IHJlc3VsdCh0aGlzKTsK
KyAgICAgICAgR1BSUmVnIHJlc3VsdEdQUiA9IHJlc3VsdC5ncHIoKTsKKyAgICAgICAgCisgICAg
ICAgIGJvb2wgcHJlZGljdEJvb2xlYW4gPSBpc0Jvb2xlYW5QcmVkaWN0aW9uKG1faml0LmdldFBy
ZWRpY3Rpb24obm9kZS5jaGlsZDEoKSkpOworICAgIAorICAgICAgICBpZiAocHJlZGljdEJvb2xl
YW4pIHsKKyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJs
ZXI6OkVxdWFsLCB2YWx1ZUdQUiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNv
ZGUoanNCb29sZWFuKGZhbHNlKSkpKSwgbm90VGFrZW4pOworICAgICAgICAgICAgYWRkQnJhbmNo
KG1faml0LmJyYW5jaFB0cihNYWNyb0Fzc2VtYmxlcjo6RXF1YWwsIHZhbHVlR1BSLCBNYWNyb0Fz
c2VtYmxlcjo6SW1tUHRyKEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4odHJ1ZSkpKSksIHRha2Vu
KTsKKworICAgICAgICAgICAgc3BlY3VsYXRpb25DaGVjayhtX2ppdC5qdW1wKCkpOworICAgICAg
ICAgICAgdmFsdWUudXNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRCcmFu
Y2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3Jv
QXNzZW1ibGVyOjpJbW1QdHIoSlNWYWx1ZTo6ZW5jb2RlKGpzTnVtYmVyKDApKSkpLCBub3RUYWtl
bik7CisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1hY3JvQXNzZW1ibGVy
OjpBYm92ZU9yRXF1YWwsIHZhbHVlR1BSLCBHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIp
LCB0YWtlbik7CisgICAgCisgICAgICAgICAgICBhZGRCcmFuY2gobV9qaXQuYnJhbmNoUHRyKE1h
Y3JvQXNzZW1ibGVyOjpFcXVhbCwgdmFsdWVHUFIsIE1hY3JvQXNzZW1ibGVyOjpJbW1QdHIoSlNW
YWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbihmYWxzZSkpKSksIG5vdFRha2VuKTsKKyAgICAgICAgICAg
IGFkZEJyYW5jaChtX2ppdC5icmFuY2hQdHIoTWFjcm9Bc3NlbWJsZXI6OkVxdWFsLCB2YWx1ZUdQ
UiwgTWFjcm9Bc3NlbWJsZXI6OkltbVB0cihKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKHRydWUp
KSkpLCB0YWtlbik7CisgICAgCisgICAgICAgICAgICB2YWx1ZS51c2UoKTsKKyAgICAKKyAgICAg
ICAgICAgIHNpbGVudFNwaWxsQWxsUmVnaXN0ZXJzKHJlc3VsdEdQUik7CisgICAgICAgICAgICBt
X2ppdC5tb3ZlKHZhbHVlR1BSLCBHUFJJbmZvOjphcmd1bWVudEdQUjEpOworICAgICAgICAgICAg
bV9qaXQubW92ZShHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgR1BSSW5mbzo6YXJndW1lbnRH
UFIwKTsKKyAgICAgICAgICAgIGFwcGVuZENhbGxXaXRoRXhjZXB0aW9uQ2hlY2soZGZnQ29udmVy
dEpTVmFsdWVUb0Jvb2xlYW4pOworICAgICAgICAgICAgbV9qaXQubW92ZShHUFJJbmZvOjpyZXR1
cm5WYWx1ZUdQUiwgcmVzdWx0R1BSKTsKKyAgICAgICAgICAgIHNpbGVudEZpbGxBbGxSZWdpc3Rl
cnMocmVzdWx0R1BSKTsKKyAgICAKKyAgICAgICAgICAgIGFkZEJyYW5jaChtX2ppdC5icmFuY2hU
ZXN0OChNYWNyb0Fzc2VtYmxlcjo6Tm9uWmVybywgcmVzdWx0R1BSKSwgdGFrZW4pOworICAgICAg
ICAgICAgaWYgKG5vdFRha2VuICE9IChtX2Jsb2NrICsgMSkpCisgICAgICAgICAgICAgICAgYWRk
QnJhbmNoKG1faml0Lmp1bXAoKSwgbm90VGFrZW4pOworICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICBub1Jlc3VsdChtX2NvbXBpbGVJbmRleCwgVXNlQ2hpbGRyZW5DYWxsZWRFeHBsaWNpdGx5
KTsKKyAgICB9Cit9CisKIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUoTm9kZSYgbm9kZSkK
IHsKICAgICBOb2RlVHlwZSBvcCA9IG5vZGUub3A7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGZnL0RGR1NwZWN1bGF0aXZlSklULmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVC5oCShyZXZpc2lvbiA5NjU3MSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQuaAkod29ya2luZyBjb3B5KQpA
QCAtNjAwLDYgKzYwMCw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBjb21waWxlT2JqZWN0RXF1YWxp
dHkoTm9kZSYsIHZvaWQqIHZwdHIpOwogICAgIHZvaWQgY29tcGlsZVZhbHVlQWRkKE5vZGUmKTsK
ICAgICB2b2lkIGNvbXBpbGVMb2dpY2FsTm90KE5vZGUmKTsKKyAgICB2b2lkIGVtaXRCcmFuY2go
Tm9kZSYpOwogICAgIAogICAgIC8vIEl0IGlzIGFjY2VwdGFibGUgdG8gaGF2ZSBzdHJ1Y3R1cmUg
YmUgZXF1YWwgdG8gc2NyYXRjaCwgc28gbG9uZyBhcyB5b3UncmUgZmluZQogICAgIC8vIHdpdGgg
dGhlIHN0cnVjdHVyZSBHUFIgYmVpbmcgY2xvYmJlcmVkLgpAQCAtOTQzLDcgKzk0NCw3IEBAIHBy
aXZhdGU6CiB9OwogCiBpbmxpbmUgU3BlY3VsYXRpdmVKSVQ6OlNwZWN1bGF0aXZlSklUKEpJVENv
bXBpbGVyJiBqaXQpCi0gICAgOiBKSVRDb2RlR2VuZXJhdG9yKGppdCwgdHJ1ZSkKKyAgICA6IEpJ
VENvZGVHZW5lcmF0b3Ioaml0KQogICAgICwgbV9jb21waWxlT2theSh0cnVlKQogICAgICwgbV9h
cmd1bWVudHMoaml0LmNvZGVCbG9jaygpLT5tX251bVBhcmFtZXRlcnMpCiAgICAgLCBtX3Zhcmlh
YmxlcyhqaXQuZ3JhcGgoKS5tX2xvY2FsVmFycykK
</data>
<flag name="review"
          id="106969"
          type_id="1"
          status="+"
          setter="barraclough"
    />
          </attachment>
      

    </bug>

</bugzilla>