<?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>150049</bug_id>
          
          <creation_ts>2015-10-12 14:45:50 -0700</creation_ts>
          <short_desc>Add a CGContextStateSaver and use it</short_desc>
          <delta_ts>2015-10-14 10:39:55 -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>New Bugs</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="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Simon Fraser (smfr)">simon.fraser</assigned_to>
          <cc>mmaxfield</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>thorton</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1132491</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2015-10-12 14:45:50 -0700</bug_when>
    <thetext>Add a CGContextStateSaver and use it</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132496</commentid>
    <comment_count>1</comment_count>
      <attachid>262924</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2015-10-12 14:51:18 -0700</bug_when>
    <thetext>Created attachment 262924
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132499</commentid>
    <comment_count>2</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-10-12 15:03:46 -0700</bug_when>
    <thetext>Why didn&apos;t you make GraphicsContextStateSaver use this internally?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132525</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2015-10-12 15:35:26 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Why didn&apos;t you make GraphicsContextStateSaver use this internally?

Because that saves GraphicsContext, not CGContextState.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132526</commentid>
    <comment_count>4</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-10-12 15:36:55 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; Why didn&apos;t you make GraphicsContextStateSaver use this internally?
&gt; 
&gt; Because that saves GraphicsContext, not CGContextState.

Surely saving a GraphicsContext involves saving CGContextState...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132527</commentid>
    <comment_count>5</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2015-10-12 15:37:09 -0700</bug_when>
    <thetext>https://trac.webkit.org/r190894</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132778</commentid>
    <comment_count>6</comment_count>
      <attachid>262924</attachid>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2015-10-13 09:23:22 -0700</bug_when>
    <thetext>Comment on attachment 262924
Patch

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

&gt; Source/WebCore/platform/graphics/cg/GraphicsContextCG.h:86
&gt; +};

Can&apos;t we write this class like this:

template &lt;class T, void (*fnSave)(T), void (*fnRestore)(T)&gt;
class ContextStateSaver
{
public:
    ContextStateSaver(T context, bool saveAndRestore = true)
        : m_context(context)
        , m_saveAndRestore(saveAndRestore)
    {
        if (m_saveAndRestore)
            fnSave(m_context);
    }

    ~ContextStateSaver()
    {
        if (m_saveAndRestore)
            fnRestore(m_context);
    }

    void save()
    {
        ASSERT(!m_saveAndRestore);
        fnRestore(m_context);
        m_saveAndRestore = true;
    }

    void restore()
    {
        ASSERT(m_saveAndRestore);
        fnRestore(m_context);
        m_saveAndRestore = false;
    }

private:
    T m_context;
    bool m_saveAndRestore;
};

typedef ContextStateSaver&lt;CGContextRef, CGContextSaveGState, CGContextRestoreGState&gt; CGContextStateSaver;

So if we want to do the same thing for any other port, we do not have to duplicate the code for the third time. Also GraphicsContextStateSaver can be a specialized case of this template, if we 

Implement these functions

    void GraphicsContextSaveGState(GraphicsContext&amp; context) { context.save(); }
    void GraphicsContextRestoreGState(GraphicsContext&amp; context) { context.restore(); }

And define 

    typedef ContextStateSaver&lt;GraphicsContext&amp;, GraphicsContextSaveGState, GraphicsContextRestoreGState&gt; GraphicsContextStateSaver;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132812</commentid>
    <comment_count>7</comment_count>
      <attachid>262924</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-10-13 11:11:04 -0700</bug_when>
    <thetext>Comment on attachment 262924
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/cg/GraphicsContextCG.h:86
&gt;&gt; +};
&gt; 
&gt; Can&apos;t we write this class like this:
&gt; 
&gt; template &lt;class T, void (*fnSave)(T), void (*fnRestore)(T)&gt;
&gt; class ContextStateSaver
&gt; {
&gt; public:
&gt;     ContextStateSaver(T context, bool saveAndRestore = true)
&gt;         : m_context(context)
&gt;         , m_saveAndRestore(saveAndRestore)
&gt;     {
&gt;         if (m_saveAndRestore)
&gt;             fnSave(m_context);
&gt;     }
&gt; 
&gt;     ~ContextStateSaver()
&gt;     {
&gt;         if (m_saveAndRestore)
&gt;             fnRestore(m_context);
&gt;     }
&gt; 
&gt;     void save()
&gt;     {
&gt;         ASSERT(!m_saveAndRestore);
&gt;         fnRestore(m_context);
&gt;         m_saveAndRestore = true;
&gt;     }
&gt; 
&gt;     void restore()
&gt;     {
&gt;         ASSERT(m_saveAndRestore);
&gt;         fnRestore(m_context);
&gt;         m_saveAndRestore = false;
&gt;     }
&gt; 
&gt; private:
&gt;     T m_context;
&gt;     bool m_saveAndRestore;
&gt; };
&gt; 
&gt; typedef ContextStateSaver&lt;CGContextRef, CGContextSaveGState, CGContextRestoreGState&gt; CGContextStateSaver;
&gt; 
&gt; So if we want to do the same thing for any other port, we do not have to duplicate the code for the third time. Also GraphicsContextStateSaver can be a specialized case of this template, if we 
&gt; 
&gt; Implement these functions
&gt; 
&gt;     void GraphicsContextSaveGState(GraphicsContext&amp; context) { context.save(); }
&gt;     void GraphicsContextRestoreGState(GraphicsContext&amp; context) { context.restore(); }
&gt; 
&gt; And define 
&gt; 
&gt;     typedef ContextStateSaver&lt;GraphicsContext&amp;, GraphicsContextSaveGState, GraphicsContextRestoreGState&gt; GraphicsContextStateSaver;

I think that currently this template stuff is more harm than good. However, if we add a single more class of this form, I would agree with Said.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132816</commentid>
    <comment_count>8</comment_count>
      <attachid>262924</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2015-10-13 11:17:01 -0700</bug_when>
    <thetext>Comment on attachment 262924
Patch

I agree with Myles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1133139</commentid>
    <comment_count>9</comment_count>
      <attachid>262924</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-10-14 09:39:41 -0700</bug_when>
    <thetext>Comment on attachment 262924
Patch

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

A couple thoughts about refinement.

&gt; Source/WebCore/platform/graphics/cg/GraphicsContextCG.h:53
&gt; +class CGContextStateSaver {

Nothing currently makes this class non-movable and non-copyable, and it should be. Could use the non-copyable macro or some other technique.

&gt; Source/WebCore/platform/graphics/cg/GraphicsContextCG.h:55
&gt; +    CGContextStateSaver(CGContextRef context, bool saveAndRestore = true)

Should mark constructor this explicit.

I don’t think using a boolean to tell the thing whether to save or not is a clear design. Can we do better?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1133146</commentid>
    <comment_count>10</comment_count>
      <attachid>262924</attachid>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2015-10-14 09:53:40 -0700</bug_when>
    <thetext>Comment on attachment 262924
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/cg/GraphicsContextCG.h:55
&gt;&gt; +    CGContextStateSaver(CGContextRef context, bool saveAndRestore = true)
&gt; 
&gt; Should mark constructor this explicit.
&gt; 
&gt; I don’t think using a boolean to tell the thing whether to save or not is a clear design. Can we do better?

I would suggest removing the boolean saveAndRestore from the constructor argument list but keeping m_saveAndRestore and initialize it always with true. I can&apos;t think of any scenario that I will do: CGContextStateSaver saver(context, false) and after that I call saver.save(). So I would suggest also removing the function save() from this class but keeping the restore() function.  The constructor will always save the context state and the destructor will restore it unless restore() was called before.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1133171</commentid>
    <comment_count>11</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2015-10-14 10:39:55 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Comment on attachment 262924 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=262924&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/platform/graphics/cg/GraphicsContextCG.h:55
&gt; &gt;&gt; +    CGContextStateSaver(CGContextRef context, bool saveAndRestore = true)
&gt; &gt; 
&gt; &gt; Should mark constructor this explicit.

Will fix.

&gt; &gt; I don’t think using a boolean to tell the thing whether to save or not is a clear design. Can we do better?

This actually happens a lot:

    bool drawOwnShadow = !isAcceleratedContext() &amp;&amp; hasBlurredShadow() &amp;&amp; !m_state.shadowsIgnoreTransforms; // Don&apos;t use ShadowBlur for canvas yet.
    CGContextStateSaver stateSaver(context, drawOwnShadow);
    if (drawOwnShadow) {

I did start with an enum argument, but that made these constructors all more ugly.

&gt; I would suggest removing the boolean saveAndRestore from the constructor
&gt; argument list but keeping m_saveAndRestore and initialize it always with
&gt; true. I can&apos;t think of any scenario that I will do: CGContextStateSaver
&gt; saver(context, false) and after that I call saver.save(). So I would suggest
&gt; also removing the function save() from this class but keeping the restore()
&gt; function.  The constructor will always save the context state and the
&gt; destructor will restore it unless restore() was called before.

That sounds reasonable.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>262924</attachid>
            <date>2015-10-12 14:51:18 -0700</date>
            <delta_ts>2015-10-13 11:17:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-150049-20151012145043.patch</filename>
            <type>text/plain</type>
            <size>13395</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTkwODU5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2JiYzVjYjYyMDhmNjBi
YjY1YzBmYTViOTFlNzIxZDhkODkzNzVmYi4uNTgzYWY4ZjIzNDk5NTUxN2I4ZjdhYTRlY2YwMTVi
ZGNmODhiOTEyNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5IEBACisyMDE1LTEwLTEyICBTaW1v
biBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBwbGUuY29tPgorCisgICAgICAgIEFkZCBhIENHQ29u
dGV4dFN0YXRlU2F2ZXIgYW5kIHVzZSBpdAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTUwMDQ5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGEgc3RhY2stYmFzZWQgZ3JhcGhpY3Mgc3RhdGUgc2F2ZS9y
ZXN0b3JlIGNsYXNzIGZvciBDR0NvbnRleHQsCisgICAgICAgIGxpa2UgdGhlIG9uZSB3ZSBoYXZl
IGZvciBHcmFwaGljc0NvbnRleHQsIGFuZCB1c2UgaXQgaW4gR3JhcGhpY3NDb250ZXh0Q0cuCisg
ICAgICAgIAorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dENH
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd05hdGl2ZUltYWdl
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmUpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3Sm9pbmVkTGluZXMpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpmaWxsUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpmaWxsUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnBs
YXRmb3JtRmlsbFJvdW5kZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZmlsbFJlY3RXaXRoUm91bmRlZEhvbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpzdHJva2VSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFw
aGljc0NvbnRleHRDRy5oOgorICAgICAgICAoV2ViQ29yZTo6Q0dDb250ZXh0U3RhdGVTYXZlcjo6
Q0dDb250ZXh0U3RhdGVTYXZlcik6CisgICAgICAgIChXZWJDb3JlOjpDR0NvbnRleHRTdGF0ZVNh
dmVyOjp+Q0dDb250ZXh0U3RhdGVTYXZlcik6CisgICAgICAgIChXZWJDb3JlOjpDR0NvbnRleHRT
dGF0ZVNhdmVyOjpzYXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkNHQ29udGV4dFN0YXRlU2F2ZXI6
OnJlc3RvcmUpOgorCiAyMDE1LTEwLTA5ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBs
ZS5jb20+CiAKICAgICAgICAgRG9uJ3QgYWxsb3cgcGx1Zy1pbnMgdG8gb3ZlcnJpZGUgaW1hZ2Ug
dHlwZXMgZm9yIDxlbWJlZD4gZWxlbWVudHMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dENHLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dENHLmNwcAppbmRleCBjNTI2ZDU0
ZTY4NTEyZDRiMmZhYTY3OGZhNDYzNjViZTQ5YzI2NTgxLi5kMWYyNzBkZWEyZTE5NTYwNGQzODI3
NmUxNmY4NGQ4MmJkYTliN2YxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0Q0cuY3BwCkBAIC0xNTQsNyArMTU0LDcg
QEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdOYXRpdmVJbWFnZShQYXNzTmF0aXZlSW1hZ2VQ
dHIgaW1hZ2VQdHIsIGNvbnN0IEZsb2F0U2kKICAgICAgICAgcmV0dXJuOwogCiAgICAgQ0dDb250
ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBDR0NvbnRleHRTYXZlR1N0
YXRlKGNvbnRleHQpOworICAgIENHQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihjb250ZXh0
KTsKIAogI2lmIFBMQVRGT1JNKElPUykKICAgICAvLyBBbnRpLWFsaWFzaW5nIGlzIG9uIGJ5IGRl
ZmF1bHQgb24gdGhlIGlQaG9uZS4gTmVlZCB0byB0dXJuIGl0IG9mZiB3aGVuIGRyYXdpbmcgaW1h
Z2VzLgpAQCAtMjQxLDggKzI0MSw2IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TmF0aXZl
SW1hZ2UoUGFzc05hdGl2ZUltYWdlUHRyIGltYWdlUHRyLCBjb25zdCBGbG9hdFNpCiAKICAgICAv
LyBEcmF3IHRoZSBpbWFnZS4KICAgICBDR0NvbnRleHREcmF3SW1hZ2UoY29udGV4dCwgYWRqdXN0
ZWREZXN0UmVjdCwgaW1hZ2UuZ2V0KCkpOwotCi0gICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShj
b250ZXh0KTsKIH0KIAogLy8gRHJhd3MgYSBmaWxsZWQgcmVjdGFuZ2xlIHdpdGggYSBzdHJva2Vk
IGJvcmRlci4KQEAgLTI5MiwxMiArMjkwLDEzIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZShjb25zdCBGbG9hdFBvaW50JiBwb2ludDEsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50CiAg
ICAgICAgIHJldHVybjsKIAogICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0KCk7CisKICAgICBTdHJva2VTdHlsZSBzdHJva2VTdHlsZSA9IHRoaXMtPnN0cm9rZVN0eWxl
KCk7CiAgICAgZmxvYXQgY29ybmVyV2lkdGggPSAwOwogICAgIGJvb2wgZHJhd3NEYXNoZWRMaW5l
ID0gc3Ryb2tlU3R5bGUgPT0gRG90dGVkU3Ryb2tlIHx8IHN0cm9rZVN0eWxlID09IERhc2hlZFN0
cm9rZTsKIAorICAgIENHQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihjb250ZXh0LCBkcmF3
c0Rhc2hlZExpbmUpOwogICAgIGlmIChkcmF3c0Rhc2hlZExpbmUpIHsKLSAgICAgICAgQ0dDb250
ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKICAgICAgICAgLy8gRmlndXJlIG91dCBlbmQgcG9pbnRz
IHRvIGVuc3VyZSB3ZSBhbHdheXMgcGFpbnQgY29ybmVycy4KICAgICAgICAgY29ybmVyV2lkdGgg
PSBzdHJva2VTdHlsZSA9PSBEb3R0ZWRTdHJva2UgPyB0aGlja25lc3MgOiBzdGQ6Om1pbigyICog
dGhpY2tuZXNzLCBzdGQ6Om1heCh0aGlja25lc3MsIHN0cm9rZVdpZHRoIC8gMykpOwogICAgICAg
ICBzZXRDR0ZpbGxDb2xvcihjb250ZXh0LCBzdHJva2VDb2xvcigpLCBzdHJva2VDb2xvclNwYWNl
KCkpOwpAQCAtMzExLDEwICszMTAsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmUo
Y29uc3QgRmxvYXRQb2ludCYgcG9pbnQxLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludAogICAgICAg
ICBzdHJva2VXaWR0aCAtPSAyICogY29ybmVyV2lkdGg7CiAgICAgICAgIGZsb2F0IHBhdHRlcm5X
aWR0aCA9IHN0cm9rZVN0eWxlID09IERvdHRlZFN0cm9rZSA/IHRoaWNrbmVzcyA6IHN0ZDo6bWlu
KDMgKiB0aGlja25lc3MsIHN0ZDo6bWF4KHRoaWNrbmVzcywgc3Ryb2tlV2lkdGggLyAzKSk7CiAg
ICAgICAgIC8vIENoZWNrIGlmIGNvcm5lciBkcmF3aW5nIHN1ZmZpY2llbnRseSBjb3ZlcnMgdGhl
IGxpbmUuCi0gICAgICAgIGlmIChzdHJva2VXaWR0aCA8PSBwYXR0ZXJuV2lkdGggKyAxKSB7Ci0g
ICAgICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworICAgICAgICBpZiAo
c3Ryb2tlV2lkdGggPD0gcGF0dGVybldpZHRoICsgMSkKICAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQogCiAgICAgICAgIC8vIFBhdHRlcm4gc3RhcnRzIHdpdGggZnVsbCBmaWxsIGFuZCBl
bmRzIHdpdGggdGhlIGVtcHR5IGZpbGwuCiAgICAgICAgIC8vIDEuIExldCdzIHN0YXJ0IHdpdGgg
dGhlIGVtcHR5IHBoYXNlIGFmdGVyIHRoZSBjb3JuZXIuCkBAIC0zNjIsOCArMzU5LDYgQEAgdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50MSwgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQKICAgICBDR0NvbnRleHRNb3ZlVG9Qb2ludChjb250ZXh0LCBw
MS54KCksIHAxLnkoKSk7CiAgICAgQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoY29udGV4dCwgcDIu
eCgpLCBwMi55KCkpOwogICAgIENHQ29udGV4dFN0cm9rZVBhdGgoY29udGV4dCk7Ci0gICAgaWYg
KGRyYXdzRGFzaGVkTGluZSkKLSAgICAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0
KTsKICAgICBpZiAoc2hvdWxkQW50aWFsaWFzKCkpCiAgICAgICAgIENHQ29udGV4dFNldFNob3Vs
ZEFudGlhbGlhcyhjb250ZXh0LCB0cnVlKTsKIH0KQEAgLTM3NywyNCArMzcyLDE4IEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpkcmF3Sm9pbmVkTGluZXMoQ0dQb2ludCBwb2ludHNbXSwgdW5zaWdu
ZWQgY291bnQsIGJvb2wgYW50CiAgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNv
bnRleHQoKTsKICAgICBmbG9hdCB3aWR0aCA9IENHQ29udGV4dEdldExpbmVXaWR0aChjb250ZXh0
KTsKIAotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisgICAgQ0dDb250ZXh0U3Rh
dGVTYXZlciBzdGF0ZVNhdmVyKGNvbnRleHQpOwogICAgIAogICAgIENHQ29udGV4dFNldFNob3Vs
ZEFudGlhbGlhcyhjb250ZXh0LCBhbnRpYWxpYXMpOwotCiAgICAgQ0dDb250ZXh0U2V0TGluZVdp
ZHRoKGNvbnRleHQsIHdpZHRoIDwgMSA/IDEgOiB3aWR0aCk7Ci0KICAgICBDR0NvbnRleHRCZWdp
blBhdGgoY29udGV4dCk7Ci0gICAgCiAgICAgQ0dDb250ZXh0U2V0TGluZUNhcChjb250ZXh0LCBs
aW5lQ2FwKTsKLSAgICAKICAgICBDR0NvbnRleHRNb3ZlVG9Qb2ludChjb250ZXh0LCBwb2ludHNb
MF0ueCwgcG9pbnRzWzBdLnkpOwogICAgIAogICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBj
b3VudDsgKytpKQogICAgICAgICBDR0NvbnRleHRBZGRMaW5lVG9Qb2ludChjb250ZXh0LCBwb2lu
dHNbaV0ueCwgcG9pbnRzW2ldLnkpOwogCiAgICAgQ0dDb250ZXh0U3Ryb2tlUGF0aChjb250ZXh0
KTsKLQotICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7CiB9CiAjZW5kaWYKIApA
QCAtNTg4LDcgKzU3Nyw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUGF0aChjb25zdCBQ
YXRoJiBwYXRoKQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ0dDb250ZXh0QmVnaW5Q
YXRoKGNvbnRleHQpOwogICAgICAgICAgICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBwYXRo
LnBsYXRmb3JtUGF0aCgpKTsKLSAgICAgICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4
dCk7CisgICAgICAgICAgICBDR0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4dCk7
CiAgICAgICAgICAgICBDR0NvbnRleHRDb25jYXRDVE0oY29udGV4dCwgbV9zdGF0ZS5maWxsR3Jh
ZGllbnQtPmdyYWRpZW50U3BhY2VUcmFuc2Zvcm0oKSk7CiAKICAgICAgICAgICAgIGlmIChmaWxs
UnVsZSgpID09IFJVTEVfRVZFTk9ERCkKQEAgLTU5Nyw3ICs1ODYsNiBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZmlsbFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKICAgICAgICAgICAgICAgICBDR0Nv
bnRleHRDbGlwKGNvbnRleHQpOwogCiAgICAgICAgICAgICBtX3N0YXRlLmZpbGxHcmFkaWVudC0+
cGFpbnQodGhpcyk7Ci0gICAgICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQp
OwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuOwpAQCAtNjU0LDEyICs2NDIsMTEgQEAgdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoY29uc3QgUGF0aCYgcGF0aCkKICAgICAgICAg
ICAgIENHQ29udGV4dERyYXdMYXllckluUmVjdChjb250ZXh0LCBDR1JlY3RNYWtlKGRlc3RpbmF0
aW9uWCwgZGVzdGluYXRpb25ZLCBhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCksIGxheWVy
KTsKICAgICAgICAgICAgIENHTGF5ZXJSZWxlYXNlKGxheWVyKTsKICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisgICAgICAgICAgICBD
R0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4dCk7CiAgICAgICAgICAgICBDR0Nv
bnRleHRSZXBsYWNlUGF0aFdpdGhTdHJva2VkUGF0aChjb250ZXh0KTsKICAgICAgICAgICAgIENH
Q29udGV4dENsaXAoY29udGV4dCk7CiAgICAgICAgICAgICBDR0NvbnRleHRDb25jYXRDVE0oY29u
dGV4dCwgbV9zdGF0ZS5zdHJva2VHcmFkaWVudC0+Z3JhZGllbnRTcGFjZVRyYW5zZm9ybSgpKTsK
ICAgICAgICAgICAgIG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQtPnBhaW50KHRoaXMpOwotICAgICAg
ICAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKICAgICAgICAgfQogICAgICAg
ICByZXR1cm47CiAgICAgfQpAQCAtNjc3LDcgKzY2NCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0
OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCiAgICAgQ0dDb250ZXh0UmVmIGNvbnRl
eHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKIAogICAgIGlmIChtX3N0YXRlLmZpbGxHcmFkaWVudCkg
ewotICAgICAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworICAgICAgICBDR0NvbnRl
eHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4dCk7CiAgICAgICAgIGlmIChoYXNTaGFkb3co
KSkgewogICAgICAgICAgICAgRmxvYXRTaXplIGxheWVyU2l6ZSA9IGdldENUTSgpLm1hcFNpemUo
cmVjdC5zaXplKCkpOwogCkBAIC02OTgsNyArNjg1LDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKICAgICAgICAgICAgIENHQ29udGV4dENv
bmNhdENUTShjb250ZXh0LCBtX3N0YXRlLmZpbGxHcmFkaWVudC0+Z3JhZGllbnRTcGFjZVRyYW5z
Zm9ybSgpKTsKICAgICAgICAgICAgIG1fc3RhdGUuZmlsbEdyYWRpZW50LT5wYWludCh0aGlzKTsK
ICAgICAgICAgfQotICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwogICAg
ICAgICByZXR1cm47CiAgICAgfQogCkBAIC03MDYsOSArNjkyLDkgQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKICAgICAgICAgYXBwbHlGaWxs
UGF0dGVybigpOwogCiAgICAgYm9vbCBkcmF3T3duU2hhZG93ID0gIWlzQWNjZWxlcmF0ZWRDb250
ZXh0KCkgJiYgaGFzQmx1cnJlZFNoYWRvdygpICYmICFtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFu
c2Zvcm1zOyAvLyBEb24ndCB1c2UgU2hhZG93Qmx1ciBmb3IgY2FudmFzIHlldC4KKyAgICBDR0Nv
bnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4dCwgZHJhd093blNoYWRvdyk7CiAgICAg
aWYgKGRyYXdPd25TaGFkb3cpIHsKICAgICAgICAgLy8gVHVybiBvZmYgQ0cgc2hhZG93cy4KLSAg
ICAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKICAgICAgICAgQ0dDb250ZXh0U2V0
U2hhZG93V2l0aENvbG9yKHBsYXRmb3JtQ29udGV4dCgpLCBDR1NpemVaZXJvLCAwLCAwKTsKIAog
ICAgICAgICBTaGFkb3dCbHVyIGNvbnRleHRTaGFkb3cobV9zdGF0ZSk7CkBAIC03MTYsOSArNzAy
LDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCkKICAgICB9CiAKICAgICBDR0NvbnRleHRGaWxsUmVjdChjb250ZXh0LCByZWN0KTsKLQotICAg
IGlmIChkcmF3T3duU2hhZG93KQotICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRl
eHQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0
JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKQEAgLTcz
NCw5ICs3MTcsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRS
ZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IsIENvbG9yUwogICAgICAgICBzZXRDR0ZpbGxD
b2xvcihjb250ZXh0LCBjb2xvciwgY29sb3JTcGFjZSk7CiAKICAgICBib29sIGRyYXdPd25TaGFk
b3cgPSAhaXNBY2NlbGVyYXRlZENvbnRleHQoKSAmJiBoYXNCbHVycmVkU2hhZG93KCkgJiYgIW1f
c3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7IC8vIERvbid0IHVzZSBTaGFkb3dCbHVyIGZv
ciBjYW52YXMgeWV0LgorICAgIENHQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcihjb250ZXh0
LCBkcmF3T3duU2hhZG93KTsKICAgICBpZiAoZHJhd093blNoYWRvdykgewogICAgICAgICAvLyBU
dXJuIG9mZiBDRyBzaGFkb3dzLgotICAgICAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQp
OwogICAgICAgICBDR0NvbnRleHRTZXRTaGFkb3dXaXRoQ29sb3IocGxhdGZvcm1Db250ZXh0KCks
IENHU2l6ZVplcm8sIDAsIDApOwogCiAgICAgICAgIFNoYWRvd0JsdXIgY29udGV4dFNoYWRvdyht
X3N0YXRlKTsKQEAgLTc0Niw3ICs3MjksNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJl
Y3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IsIENvbG9yUwogICAg
IENHQ29udGV4dEZpbGxSZWN0KGNvbnRleHQsIHJlY3QpOwogICAgIAogICAgIGlmIChkcmF3T3du
U2hhZG93KQotICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworICAgICAg
ICBzdGF0ZVNhdmVyLnJlc3RvcmUoKTsKIAogICAgIGlmIChvbGRGaWxsQ29sb3IgIT0gY29sb3Ig
fHwgb2xkQ29sb3JTcGFjZSAhPSBjb2xvclNwYWNlKQogICAgICAgICBzZXRDR0ZpbGxDb2xvcihj
b250ZXh0LCBvbGRGaWxsQ29sb3IsIG9sZENvbG9yU3BhY2UpOwpAQCAtNzY1LDkgKzc0OCw5IEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUZpbGxSb3VuZGVkUmVjdChjb25zdCBGbG9h
dFJvdW5kZWRSZWN0JiByZWN0LCBjb25zCiAgICAgICAgIHNldENHRmlsbENvbG9yKGNvbnRleHQs
IGNvbG9yLCBjb2xvclNwYWNlKTsKIAogICAgIGJvb2wgZHJhd093blNoYWRvdyA9ICFpc0FjY2Vs
ZXJhdGVkQ29udGV4dCgpICYmIGhhc0JsdXJyZWRTaGFkb3coKSAmJiAhbV9zdGF0ZS5zaGFkb3dz
SWdub3JlVHJhbnNmb3JtczsgLy8gRG9uJ3QgdXNlIFNoYWRvd0JsdXIgZm9yIGNhbnZhcyB5ZXQu
CisgICAgQ0dDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKGNvbnRleHQsIGRyYXdPd25TaGFk
b3cpOwogICAgIGlmIChkcmF3T3duU2hhZG93KSB7CiAgICAgICAgIC8vIFR1cm4gb2ZmIENHIHNo
YWRvd3MuCi0gICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CiAgICAgICAgIENH
Q29udGV4dFNldFNoYWRvd1dpdGhDb2xvcihwbGF0Zm9ybUNvbnRleHQoKSwgQ0dTaXplWmVybywg
MCwgMCk7CiAKICAgICAgICAgU2hhZG93Qmx1ciBjb250ZXh0U2hhZG93KG1fc3RhdGUpOwpAQCAt
Nzg4LDcgKzc3MSw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9ybUZpbGxSb3VuZGVk
UmVjdChjb25zdCBGbG9hdFJvdW5kZWRSZWN0JiByZWN0LCBjb25zCiAgICAgfQogCiAgICAgaWYg
KGRyYXdPd25TaGFkb3cpCi0gICAgICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7
CisgICAgICAgIHN0YXRlU2F2ZXIucmVzdG9yZSgpOwogCiAgICAgaWYgKG9sZEZpbGxDb2xvciAh
PSBjb2xvciB8fCBvbGRDb2xvclNwYWNlICE9IGNvbG9yU3BhY2UpCiAgICAgICAgIHNldENHRmls
bENvbG9yKGNvbnRleHQsIG9sZEZpbGxDb2xvciwgb2xkQ29sb3JTcGFjZSk7CkBAIC04MTgsOSAr
ODAxLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0V2l0aFJvdW5kZWRIb2xlKGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgRmxvYXQKIAogICAgIC8vIGZpbGxSZWN0V2l0aFJv
dW5kZWRIb2xlKCkgYXNzdW1lcyB0aGF0IHRoZSBlZGdlcyBvZiByZWN0IGFyZSBjbGlwcGVkIG91
dCwgc28gd2Ugb25seSBjYXJlIGFib3V0IHNoYWRvd3MgY2FzdCBhcm91bmQgaW5zaWRlIHRoZSBo
b2xlLgogICAgIGJvb2wgZHJhd093blNoYWRvdyA9ICFpc0FjY2VsZXJhdGVkQ29udGV4dCgpICYm
IGhhc0JsdXJyZWRTaGFkb3coKSAmJiAhbV9zdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtczsK
KyAgICBDR0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4dCwgZHJhd093blNoYWRv
dyk7CiAgICAgaWYgKGRyYXdPd25TaGFkb3cpIHsKICAgICAgICAgLy8gVHVybiBvZmYgQ0cgc2hh
ZG93cy4KLSAgICAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKICAgICAgICAgQ0dD
b250ZXh0U2V0U2hhZG93V2l0aENvbG9yKHBsYXRmb3JtQ29udGV4dCgpLCBDR1NpemVaZXJvLCAw
LCAwKTsKIAogICAgICAgICBTaGFkb3dCbHVyIGNvbnRleHRTaGFkb3cobV9zdGF0ZSk7CkBAIC04
MzAsNyArODEzLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0V2l0aFJvdW5kZWRI
b2xlKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgRmxvYXQKICAgICBmaWxsUGF0aChwYXRo
KTsKIAogICAgIGlmIChkcmF3T3duU2hhZG93KQotICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0
YXRlKGNvbnRleHQpOworICAgICAgICBzdGF0ZVNhdmVyLnJlc3RvcmUoKTsKICAgICAKICAgICBz
ZXRGaWxsUnVsZShvbGRGaWxsUnVsZSk7CiAgICAgc2V0RmlsbENvbG9yKG9sZEZpbGxDb2xvciwg
b2xkRmlsbENvbG9yU3BhY2UpOwpAQCAtMTA0NiwxNCArMTAyOSwxMyBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IGxpbmVXaWR0
aCkKICAgICAgICAgICAgIENHQ29udGV4dERyYXdMYXllckluUmVjdChjb250ZXh0LCBDR1JlY3RN
YWtlKGRlc3RpbmF0aW9uWCwgZGVzdGluYXRpb25ZLCBhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhl
aWdodCksIGxheWVyKTsKICAgICAgICAgICAgIENHTGF5ZXJSZWxlYXNlKGxheWVyKTsKICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Cisg
ICAgICAgICAgICBDR0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4dCk7CiAgICAg
ICAgICAgICBzZXRTdHJva2VUaGlja25lc3MobGluZVdpZHRoKTsKICAgICAgICAgICAgIENHQ29u
dGV4dEFkZFJlY3QoY29udGV4dCwgcmVjdCk7CiAgICAgICAgICAgICBDR0NvbnRleHRSZXBsYWNl
UGF0aFdpdGhTdHJva2VkUGF0aChjb250ZXh0KTsKICAgICAgICAgICAgIENHQ29udGV4dENsaXAo
Y29udGV4dCk7CiAgICAgICAgICAgICBDR0NvbnRleHRDb25jYXRDVE0oY29udGV4dCwgbV9zdGF0
ZS5zdHJva2VHcmFkaWVudC0+Z3JhZGllbnRTcGFjZVRyYW5zZm9ybSgpKTsKICAgICAgICAgICAg
IG1fc3RhdGUuc3Ryb2tlR3JhZGllbnQtPnBhaW50KHRoaXMpOwotICAgICAgICAgICAgQ0dDb250
ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAg
ICAgfQpAQCAtMTA2NiwxMyArMTA0OCwxMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tl
UmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IGxpbmVXaWR0aCkKICAgICAvLyBUaGUg
Y29udmVuaWVuY2UgZnVuY3Rpb25zIGN1cnJlbnRseSAoaW4gYXQgbGVhc3QgT1NYIDEwLjkuNCkg
ZmFpbCB0bwogICAgIC8vIGFwcGx5IHNvbWUgYXR0cmlidXRlcyBvZiB0aGUgZ3JhcGhpY3Mgc3Rh
dGUgaW4gY2VydGFpbiBjYXNlcwogICAgIC8vIChhcyBpZGVudGlmaWVkIGluIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzI5NDgpCi0gICAgQ0dDb250ZXh0U2F2ZUdT
dGF0ZShjb250ZXh0KTsKKyAgICBDR0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4
dCk7CiAgICAgc2V0U3Ryb2tlVGhpY2tuZXNzKGxpbmVXaWR0aCk7CiAKICAgICBDR0NvbnRleHRB
ZGRSZWN0KGNvbnRleHQsIHJlY3QpOwogICAgIENHQ29udGV4dFN0cm9rZVBhdGgoY29udGV4dCk7
Ci0KLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGNhcCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dENHLmggYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5oCmluZGV4IDE3
OWE2ZjNmMjdjOTQ3NmFhNjU5MzMxNmZlZTc1YTA5YTE1ODgzMTMuLjdjZTczNzYyZWEyNmEyZDNl
YjE0MTZkMzA3MmFhOTczMTYzZjVjMmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dENHLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0Q0cuaApAQCAtNTAsNiArNTAsNDEg
QEAgc3RhdGljIGlubGluZSBDR0NvbG9yU3BhY2VSZWYgY2FjaGVkQ0dDb2xvclNwYWNlKENvbG9y
U3BhY2UgY29sb3JTcGFjZSkKICAgICByZXR1cm4gZGV2aWNlUkdCQ29sb3JTcGFjZVJlZigpOwog
fQogCitjbGFzcyBDR0NvbnRleHRTdGF0ZVNhdmVyIHsKK3B1YmxpYzoKKyAgICBDR0NvbnRleHRT
dGF0ZVNhdmVyKENHQ29udGV4dFJlZiBjb250ZXh0LCBib29sIHNhdmVBbmRSZXN0b3JlID0gdHJ1
ZSkKKyAgICAgICAgOiBtX2NvbnRleHQoY29udGV4dCkKKyAgICAgICAgLCBtX3NhdmVBbmRSZXN0
b3JlKHNhdmVBbmRSZXN0b3JlKQorICAgIHsKKyAgICAgICAgaWYgKG1fc2F2ZUFuZFJlc3RvcmUp
CisgICAgICAgICAgICBDR0NvbnRleHRTYXZlR1N0YXRlKG1fY29udGV4dCk7CisgICAgfQorICAg
IAorICAgIH5DR0NvbnRleHRTdGF0ZVNhdmVyKCkKKyAgICB7CisgICAgICAgIGlmIChtX3NhdmVB
bmRSZXN0b3JlKQorICAgICAgICAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShtX2NvbnRleHQp
OworICAgIH0KKyAgICAKKyAgICB2b2lkIHNhdmUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFt
X3NhdmVBbmRSZXN0b3JlKTsKKyAgICAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShtX2NvbnRleHQp
OworICAgICAgICBtX3NhdmVBbmRSZXN0b3JlID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHJl
c3RvcmUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc2F2ZUFuZFJlc3RvcmUpOworICAgICAg
ICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKG1fY29udGV4dCk7CisgICAgICAgIG1fc2F2ZUFuZFJl
c3RvcmUgPSBmYWxzZTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIENHQ29udGV4dFJlZiBt
X2NvbnRleHQ7CisgICAgYm9vbCBtX3NhdmVBbmRSZXN0b3JlOworfTsKKwogfQogCiAjZW5kaWYK
</data>
<flag name="review"
          id="288107"
          type_id="1"
          status="+"
          setter="thorton"
    />
    <flag name="commit-queue"
          id="288192"
          type_id="3"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>