<?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>51424</bug_id>
          
          <creation_ts>2010-12-21 14:55:50 -0800</creation_ts>
          <short_desc>Add WebKitClient::createAudioDevice() for Chromium port of web audio API</short_desc>
          <delta_ts>2011-01-05 17:19:45 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</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>0</everconfirmed>
          <reporter name="Chris Rogers">crogers</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>kbr</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>325214</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-21 14:55:50 -0800</bug_when>
    <thetext>Add WebKitClient::createAudioDevice() for Chromium port of web audio API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325221</commentid>
    <comment_count>1</comment_count>
      <attachid>77154</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-21 15:04:07 -0800</bug_when>
    <thetext>Created attachment 77154
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325222</commentid>
    <comment_count>2</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-21 15:07:34 -0800</bug_when>
    <thetext>Darin, does the callback typedef in WebAudioDevice need to have the WEBKIT_API prefix?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325223</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-21 15:07:39 -0800</bug_when>
    <thetext>Attachment 77154 did not build on chromium:
Build output: http://queues.webkit.org/results/7252090</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325233</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-21 15:29:16 -0800</bug_when>
    <thetext>The Chromium build error I&apos;ll fix by landing AudioBusChromium in another patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325242</commentid>
    <comment_count>5</comment_count>
      <attachid>77154</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-12-21 15:46:24 -0800</bug_when>
    <thetext>Comment on attachment 77154
Patch

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

&gt; WebKit/chromium/public/WebAudioDevice.h:45
&gt; +    typedef void (*RenderCallback)(std::vector&lt;float*&gt;&amp; audioData, size_t numberOfFrames, void* userData);

note: we do not use STL types in the WebKit API.  please use WebVector, or just use a raw float* here.  do you need the callee to allocate the audioData buffer, or will it be preallocated to the maximum size by the caller?  if it will be preallocated, then passing a raw float* would seem fine.

&gt; WebKit/chromium/public/WebKitClient.h:282
&gt; +    // Audio --------------------------------------------------------------
&gt; +    virtual WebAudioDevice* createAudioDevice(size_t bufferSize, unsigned numberOfChannels, double sampleRate, WebAudioDevice::RenderCallback, void* userData) { return 0; }

nit: add a new line below the section header.

The C++ way of passing user data to a function pointer is to define an interface
that folks can subclass.  Why not do that here?

class WebAudioRenderCallback {
public:
    virtual void renderFrames(float* audioData, size_t numberOfFrames) = 0;
protected:
    virtual ~WebAudioRenderCallback() {}
};

or you could also do this as an inner class:

class WebAudioDevice {
public:
    class RenderCallback {
    public:
        ...
    };
};

however the downside to it being an inner class is that you force WebKitClient.h
to also #include WebAudioDevice.h.  it would be nice to avoid that.

&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:40
&gt; +using namespace std;

please avoid using the &quot;std&quot; namespace for container types in webkit code.

&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:41
&gt; +using WebKit::webKitClient;

it is more commonplace to just do &quot;using namespace WebKit&quot; in WebKit code.

&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:102
&gt; +void AudioDestinationChromium::renderDispatch(vector&lt;float*&gt;&amp; audioData, size_t numberOfFrames, void* userData)

if you define an interface for the render callback function, then you would
not need to implement this thunk function yourself.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325252</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-21 16:04:53 -0800</bug_when>
    <thetext>Attachment 77154 did not build on chromium:
Build output: http://queues.webkit.org/results/7275108</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325263</commentid>
    <comment_count>7</comment_count>
      <attachid>77154</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-21 16:36:09 -0800</bug_when>
    <thetext>Comment on attachment 77154
Patch

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

&gt;&gt; WebKit/chromium/public/WebAudioDevice.h:45
&gt;&gt; +    typedef void (*RenderCallback)(std::vector&lt;float*&gt;&amp; audioData, size_t numberOfFrames, void* userData);
&gt; 
&gt; note: we do not use STL types in the WebKit API.  please use WebVector, or just use a raw float* here.  do you need the callee to allocate the audioData buffer, or will it be preallocated to the maximum size by the caller?  if it will be preallocated, then passing a raw float* would seem fine.

FIXED: I switched over to WebVector.  I can&apos;t use raw float* since it&apos;s an array of pointers to float (planar non-interleaved)

&gt;&gt; WebKit/chromium/public/WebKitClient.h:282
&gt;&gt; +    virtual WebAudioDevice* createAudioDevice(size_t bufferSize, unsigned numberOfChannels, double sampleRate, WebAudioDevice::RenderCallback, void* userData) { return 0; }
&gt; 
&gt; nit: add a new line below the section header.
&gt; 
&gt; The C++ way of passing user data to a function pointer is to define an interface
&gt; that folks can subclass.  Why not do that here?
&gt; 
&gt; class WebAudioRenderCallback {
&gt; public:
&gt;     virtual void renderFrames(float* audioData, size_t numberOfFrames) = 0;
&gt; protected:
&gt;     virtual ~WebAudioRenderCallback() {}
&gt; };
&gt; 
&gt; or you could also do this as an inner class:
&gt; 
&gt; class WebAudioDevice {
&gt; public:
&gt;     class RenderCallback {
&gt;     public:
&gt;         ...
&gt;     };
&gt; };
&gt; 
&gt; however the downside to it being an inner class is that you force WebKitClient.h
&gt; to also #include WebAudioDevice.h.  it would be nice to avoid that.

FIXED: added the new line and changed this to use an inner class as you suggest instead of old-fashioned callback

&gt;&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:40
&gt;&gt; +using namespace std;
&gt; 
&gt; please avoid using the &quot;std&quot; namespace for container types in webkit code.

FIXED

&gt;&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:41
&gt;&gt; +using WebKit::webKitClient;
&gt; 
&gt; it is more commonplace to just do &quot;using namespace WebKit&quot; in WebKit code.

FIXED

&gt;&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:102
&gt;&gt; +void AudioDestinationChromium::renderDispatch(vector&lt;float*&gt;&amp; audioData, size_t numberOfFrames, void* userData)
&gt; 
&gt; if you define an interface for the render callback function, then you would
&gt; not need to implement this thunk function yourself.

FIXED</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325265</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-12-21 16:41:44 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt;&gt; WebKit/chromium/public/WebAudioDevice.h:45
&gt; &gt;&gt; +    typedef void (*RenderCallback)(std::vector&lt;float*&gt;&amp; audioData, size_t numberOfFrames, void* userData);
&gt; &gt; 
&gt; &gt; note: we do not use STL types in the WebKit API.  please use WebVector, or just use a raw float* here.  do you need the callee to allocate the audioData buffer, or will it be preallocated to the maximum size by the caller?  if it will be preallocated, then passing a raw float* would seem fine.
&gt; 
&gt; FIXED: I switched over to WebVector.  I can&apos;t use raw float* since it&apos;s an array of pointers to float (planar non-interleaved)

oh, right!  what about float** then?  aren&apos;t you concerned about the overhead of copying the buffers that a WebVector imposes?


&gt; &gt; however the downside to it being an inner class is that you force WebKitClient.h
&gt; &gt; to also #include WebAudioDevice.h.  it would be nice to avoid that.
&gt; 
&gt; FIXED: added the new line and changed this to use an inner class as you suggest instead of old-fashioned callback

i also suggested not using inner classes since it forces a #include.  any thoughts
on that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325267</commentid>
    <comment_count>9</comment_count>
      <attachid>77165</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-21 16:44:14 -0800</bug_when>
    <thetext>Created attachment 77165
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325268</commentid>
    <comment_count>10</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-12-21 16:49:38 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt; &gt;&gt; WebKit/chromium/public/WebAudioDevice.h:45
&gt; &gt; &gt;&gt; +    typedef void (*RenderCallback)(std::vector&lt;float*&gt;&amp; audioData, size_t numberOfFrames, void* userData);
&gt; &gt; &gt; 
&gt; &gt; &gt; note: we do not use STL types in the WebKit API.  please use WebVector, or just use a raw float* here.  do you need the callee to allocate the audioData buffer, or will it be preallocated to the maximum size by the caller?  if it will be preallocated, then passing a raw float* would seem fine.
&gt; &gt; 
&gt; &gt; FIXED: I switched over to WebVector.  I can&apos;t use raw float* since it&apos;s an array of pointers to float (planar non-interleaved)
&gt; 
&gt; oh, right!  what about float** then?  aren&apos;t you concerned about the overhead of copying the buffers that a WebVector imposes?

The only overhead is copying the pointers, but not the actual PCM data.  But, if you really don&apos;t like WebVector, then we can switch to float**.
WebVector just seems a little safer, since we can check its size...



&gt; 
&gt; &gt; &gt; however the downside to it being an inner class is that you force WebKitClient.h
&gt; &gt; &gt; to also #include WebAudioDevice.h.  it would be nice to avoid that.
&gt; &gt; 
&gt; &gt; FIXED: added the new line and changed this to use an inner class as you suggest instead of old-fashioned callback
&gt; 
&gt; i also suggested not using inner classes since it forces a #include.  any thoughts
&gt; on that?

It&apos;s up to you.  I like the inner class since it seems cleaner, but if you feel the extra include is too big a build-time penalty then I can change it...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325270</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-21 16:51:23 -0800</bug_when>
    <thetext>Attachment 77165 did not build on chromium:
Build output: http://queues.webkit.org/results/7255096</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329843</commentid>
    <comment_count>12</comment_count>
      <attachid>77165</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2011-01-05 15:54:08 -0800</bug_when>
    <thetext>Comment on attachment 77165
Patch

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

&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:47
&gt; +const unsigned CallbackBufferSize = 2048;

I&apos;m pretty sure the preferred style for constants is to use variableNaming style.

&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:105
&gt; +    if (!isNumberOfChannelsGood)

nit: instead of repeating the expression, use ASSERT_NOT_REACHED if the branch is taken.

&gt; WebKit/chromium/src/AudioDestinationChromium.cpp:110
&gt; +    if (!isBufferSizeGood)

ditto</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329912</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2011-01-05 17:19:45 -0800</bug_when>
    <thetext>Committed r75118: &lt;http://trac.webkit.org/changeset/75118&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>77154</attachid>
            <date>2010-12-21 15:04:07 -0800</date>
            <delta_ts>2010-12-21 16:44:11 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51424-20101221150406.patch</filename>
            <type>text/plain</type>
            <size>15931</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3NDQyOCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMTAtMTItMjEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgV2ViS2l0Q2xpZW50OjpjcmVhdGVBdWRpb0RldmljZSgpIGZvciBDaHJvbWl1bSBwb3J0IG9m
IHdlYiBhdWRpbyBBUEkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTUxNDI0CisKKyAgICAgICAgTm8gbmV3IHRlc3RzIHNpbmNlIGF1ZGlvIEFQSSBpcyBu
b3QgeWV0IGltcGxlbWVudGVkLgorCisgICAgICAgICogV2ViQ29yZS5neXAvV2ViQ29yZS5neXA6
CisgICAgICAgICogV2ViQ29yZS5neXBpOgorCiAyMDEwLTEyLTIxICBKaWFuIExpICA8amlhbmxp
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6
IFdlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXBp
CShyZXZpc2lvbiA3NDQyMSkKKysrIFdlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkp
CkBAIC0yNDM1LDYgKzI0MzUsNyBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2F1ZGlvL1JldmVy
YklucHV0QnVmZmVyLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0
aC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcCcsCisgICAg
ICAgICAgICAncGxhdGZvcm0vYXVkaW8vY2hyb21pdW0vQXVkaW9CdXNDaHJvbWl1bS5jcHAnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2F1ZGlvL21hYy9BdWRpb0J1c01hYy5tbScsCiAgICAgICAg
ICAgICAncGxhdGZvcm0vYXVkaW8vbWFjL0F1ZGlvRGVzdGluYXRpb25NYWMuaCcsCiAgICAgICAg
ICAgICAncGxhdGZvcm0vYXVkaW8vbWFjL0F1ZGlvRGVzdGluYXRpb25NYWMuY3BwJywKSW5kZXg6
IFdlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9X
ZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAkocmV2aXNpb24gNzQ0MjEpCisrKyBXZWJDb3JlL1dlYkNv
cmUuZ3lwL1dlYkNvcmUuZ3lwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTQ1LDExICsxMTQ1LDkgQEAK
ICAgICAgICAgICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS8oZ3JhcGhpY3MvKT9tYWMvW14vXSpG
b250W14vXSpcXC4oY3BwfG1tPykkJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0W14vXSpcXC4oY3BwfGgpJCddLAogCi0gICAgICAg
ICAgICAjIE5lY2Vzc2FyeSBmb3Igd2ViIGF1ZGlvIEFQSSBicmluZ3VwIG9uIENocm9tZS4KLSAg
ICAgICAgICAgICMgVGhleSB3aWxsIGxhdGVyIGJlIHJlcGxhY2VkIHdpdGggY2hyb21pdW0tc3Bl
Y2lmaWMgY29kZS4KKyAgICAgICAgICAgICMgQXVkaW9CdXNNYWMgaXMgbmVjZXNzYXJ5IGZvciB3
ZWIgYXVkaW8gQVBJIGJyaW5ndXAgb24gQ2hyb21lLgorICAgICAgICAgICAgIyBJdCB3aWxsIGxh
dGVyIGJlIHJlcGxhY2VkIHdpdGggY2hyb21pdW0tc3BlY2lmaWMgY29kZS4KICAgICAgICAgICAg
IFsnaW5jbHVkZScsICdwbGF0Zm9ybS9hdWRpby9tYWMvQXVkaW9CdXNNYWNcXC5tbSQnXSwKLSAg
ICAgICAgICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS9hdWRpby9tYWMvQXVkaW9EZXN0aW5hdGlv
bk1hY1xcLmNwcCQnXSwKLSAgICAgICAgICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS9hdWRpby9t
YWMvQXVkaW9GaWxlUmVhZGVyTWFjXFwuY3BwJCddLAogICAgICAgICAgICAgWydpbmNsdWRlJywg
J3BsYXRmb3JtL2F1ZGlvL21hYy9GRlRGcmFtZU1hY1xcLmNwcCQnXSwKIAogICAgICAgICAgICAg
IyBDaGVycnktcGljayBzb21lIGZpbGVzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgYnkgYnJvYWRl
ciByZWdleHBzLgpJbmRleDogV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiA3NDQyOCkKKysrIFdlYktpdC9j
aHJvbWl1bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyOCBAQAorMjAxMC0x
Mi0yMSAgQ2hyaXMgUm9nZXJzICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBXZWJLaXRDbGllbnQ6OmNyZWF0
ZUF1ZGlvRGV2aWNlKCkgZm9yIENocm9taXVtIHBvcnQgb2Ygd2ViIGF1ZGlvIEFQSQorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTE0MjQKKworICAgICAg
ICAqIFdlYktpdC5neXA6CisgICAgICAgICogcHVibGljL1dlYkF1ZGlvRGV2aWNlLmg6IEFkZGVk
LgorICAgICAgICAoV2ViS2l0OjpXZWJBdWRpb0RldmljZTo6fldlYkF1ZGlvRGV2aWNlKToKKyAg
ICAgICAgKiBwdWJsaWMvV2ViS2l0Q2xpZW50Lmg6CisgICAgICAgIChXZWJLaXQ6OldlYktpdENs
aWVudDo6Y3JlYXRlQXVkaW9EZXZpY2UpOgorICAgICAgICAqIHNyYy9BdWRpb0Rlc3RpbmF0aW9u
Q2hyb21pdW0uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb246
OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkF1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0
aW9uQ2hyb21pdW06On5BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0pOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpzdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnN0b3ApOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9E
ZXN0aW5hdGlvbjo6aGFyZHdhcmVTYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlv
RGVzdGluYXRpb25DaHJvbWl1bTo6cmVuZGVyRGlzcGF0Y2gpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpyZW5kZXIpOgorICAgICAgICAqIHNyYy9BdWRpb0Rl
c3RpbmF0aW9uQ2hyb21pdW0uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3Rp
bmF0aW9uQ2hyb21pdW06OmlzUGxheWluZyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3Rp
bmF0aW9uQ2hyb21pdW06OnNhbXBsZVJhdGUpOgorCiAyMDEwLTEyLTIwICBBbmRyZWkgUG9wZXNj
dSAgPGFuZHJlaXBAZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBKZXJlbXkgT3Js
b3cuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkocmV2aXNpb24gNzQ0MjEpCisrKyBXZWJLaXQvY2hyb21p
dW0vV2ViS2l0Lmd5cAkod29ya2luZyBjb3B5KQpAQCAtMTEwLDYgKzExMCw3IEBACiAgICAgICAg
ICAgICAgICAgJ3B1YmxpYy9XZWJBcHBsaWNhdGlvbkNhY2hlSG9zdENsaWVudC5oJywKICAgICAg
ICAgICAgICAgICAncHVibGljL1dlYkF0dHJpYnV0ZS5oJywKICAgICAgICAgICAgICAgICAncHVi
bGljL1dlYkF1ZGlvQnVzLmgnLAorICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViQXVkaW9EZXZp
Y2UuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJCaW5kaW5ncy5oJywKICAgICAgICAg
ICAgICAgICAncHVibGljL1dlYkJsb2JEYXRhLmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMv
V2ViQmxvYlJlZ2lzdHJ5LmgnLApAQCAtMzAzLDYgKzMwNCw4IEBACiAgICAgICAgICAgICAgICAg
J3NyYy9Bc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5oJywKICAgICAgICAgICAgICAgICAnc3JjL0Fz
eW5jRmlsZVdyaXRlckNocm9taXVtLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Bc3luY0Zp
bGVXcml0ZXJDaHJvbWl1bS5oJywKKyAgICAgICAgICAgICAgICAnc3JjL0F1ZGlvRGVzdGluYXRp
b25DaHJvbWl1bS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvQXVkaW9EZXN0aW5hdGlvbkNo
cm9taXVtLmgnLAogICAgICAgICAgICAgICAgICdzcmMvQXV0b0ZpbGxQb3B1cE1lbnVDbGllbnQu
Y3BwJywKICAgICAgICAgICAgICAgICAnc3JjL0F1dG9GaWxsUG9wdXBNZW51Q2xpZW50LmgnLAog
ICAgICAgICAgICAgICAgICdzcmMvQmFja0ZvcndhcmRMaXN0Q2xpZW50SW1wbC5jcHAnLApJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJBdWRpb0RldmljZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViQXVkaW9EZXZpY2UuaAkocmV2aXNpb24gMCkKKysr
IFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViQXVkaW9EZXZpY2UuaAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5h
bWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAq
ICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisg
KiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgV2ViQXVkaW9EZXZpY2VfaAorI2RlZmluZSBXZWJBdWRp
b0RldmljZV9oCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCisv
LyBBYnN0cmFjdCBpbnRlcmZhY2UgdG8gdGhlIENocm9taXVtIGF1ZGlvIHN5c3RlbS4KKworY2xh
c3MgV2ViQXVkaW9EZXZpY2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfldlYkF1ZGlvRGV2aWNl
KCkgeyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCB2b2lk
IHN0b3AoKSA9IDA7CisKKyAgICB0eXBlZGVmIHZvaWQgKCpSZW5kZXJDYWxsYmFjaykoc3RkOjp2
ZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMsIHZvaWQqIHVz
ZXJEYXRhKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gV2ViQXVk
aW9EZXZpY2VfaApJbmRleDogV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJLaXRDbGllbnQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYktpdENsaWVudC5oCShyZXZp
c2lvbiA3NDQyMSkKKysrIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViS2l0Q2xpZW50LmgJKHdv
cmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgV2ViS2l0Q2xpZW50X2gKIAog
I2luY2x1ZGUgIldlYkF1ZGlvQnVzLmgiCisjaW5jbHVkZSAiV2ViQXVkaW9EZXZpY2UuaCIKICNp
bmNsdWRlICJXZWJDb21tb24uaCIKICNpbmNsdWRlICJXZWJEYXRhLmgiCiAjaW5jbHVkZSAiV2Vi
TG9jYWxpemVkU3RyaW5nLmgiCkBAIC0yNzcsNiArMjc4LDkgQEAgcHVibGljOgogICAgIC8vIFJl
dHVybnMgbmV3bHkgYWxsb2NhdGVkIFdlYkdyYXBoaWNzQ29udGV4dDNEIGluc3RhbmNlLgogICAg
IHZpcnR1YWwgV2ViR3JhcGhpY3NDb250ZXh0M0QqIGNyZWF0ZUdyYXBoaWNzQ29udGV4dDNEKCkg
eyByZXR1cm4gMDsgfQogCisgICAgLy8gQXVkaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2aXJ0dWFsIFdlYkF1ZGlv
RGV2aWNlKiBjcmVhdGVBdWRpb0RldmljZShzaXplX3QgYnVmZmVyU2l6ZSwgdW5zaWduZWQgbnVt
YmVyT2ZDaGFubmVscywgZG91YmxlIHNhbXBsZVJhdGUsIFdlYkF1ZGlvRGV2aWNlOjpSZW5kZXJD
YWxsYmFjaywgdm9pZCogdXNlckRhdGEpIHsgcmV0dXJuIDA7IH0KKwogICAgIC8vIEZpbGVTeXN0
ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQogCiAgICAgLy8gTXVzdCByZXR1cm4gbm9uLW51bGwuCkluZGV4OiBXZWJLaXQvY2hyb21p
dW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQor
KysgV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5l
aXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUg
bmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVO
QUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0uaCIK
KworI2luY2x1ZGUgIkF1ZGlvU291cmNlUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJXZWJBdWRpb0Rl
dmljZS5oIgorI2luY2x1ZGUgIldlYktpdC5oIgorI2luY2x1ZGUgIldlYktpdENsaWVudC5oIgor
Cit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgV2ViS2l0Ojp3ZWJLaXRDbGllbnQ7CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQnVmZmVyIHNpemUgdGhhdCB0aGUgQ2hyb21pdW0gYXVk
aW8gc3lzdGVtIHdpbGwgY2FsbCB1cyBiYWNrIHdpdGguCisvLyBUaGlzIHZhbHVlIG1heSBuZWVk
IHRvIGJlIHR1bmVkIGJhc2VkIG9uIHRoZSBPUy4KKy8vIEZJWE1FOiBJdCBtYXkgYmUgcG9zc2li
bGUgdG8gcmVkdWNlIHRoaXMgdmFsdWUgb25jZSByZWFsLXRpbWUgdGhyZWFkcworLy8gYW5kIG90
aGVyIENocm9taXVtIGF1ZGlvIGltcHJvdmVtZW50cyBhcmUgbWFkZS4KK2NvbnN0IHVuc2lnbmVk
IENhbGxiYWNrQnVmZmVyU2l6ZSA9IDIwNDg7CisKKy8vIEJ1ZmZlciBzaXplIGF0IHdoaWNoIHRo
ZSB3ZWIgYXVkaW8gZW5naW5lIHdpbGwgcmVuZGVyLgorY29uc3QgdW5zaWduZWQgUmVuZGVyQnVm
ZmVyU2l6ZSA9IDEyODsKKworY29uc3QgdW5zaWduZWQgUmVuZGVyQ291bnRQZXJDYWxsYmFjayA9
IENhbGxiYWNrQnVmZmVyU2l6ZSAvIFJlbmRlckJ1ZmZlclNpemU7CisKKy8vIEZJWE1FOiBhZGQg
c3VwcG9ydCBmb3IgbXVsdGktY2hhbm5lbC4KK2NvbnN0IHVuc2lnbmVkIE51bWJlck9mQ2hhbm5l
bHMgPSAyOworCisvLyBGYWN0b3J5IG1ldGhvZDogQ2hyb21pdW0taW1wbGVtZW50YXRpb24KK1Bh
c3NPd25QdHI8QXVkaW9EZXN0aW5hdGlvbj4gQXVkaW9EZXN0aW5hdGlvbjo6Y3JlYXRlKEF1ZGlv
U291cmNlUHJvdmlkZXImIHByb3ZpZGVyLCBkb3VibGUgc2FtcGxlUmF0ZSkKK3sKKyAgICByZXR1
cm4gYWRvcHRQdHIobmV3IEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bShwcm92aWRlciwgc2FtcGxl
UmF0ZSkpOworfQorCitBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OkF1ZGlvRGVzdGluYXRpb25D
aHJvbWl1bShBdWRpb1NvdXJjZVByb3ZpZGVyJiBwcm92aWRlciwgZG91YmxlIHNhbXBsZVJhdGUp
CisgICAgOiBtX3Byb3ZpZGVyKHByb3ZpZGVyKQorICAgICwgbV9yZW5kZXJCdXMoTnVtYmVyT2ZD
aGFubmVscywgUmVuZGVyQnVmZmVyU2l6ZSwgZmFsc2UpCisgICAgLCBtX3NhbXBsZVJhdGUoc2Ft
cGxlUmF0ZSkKKyAgICAsIG1faXNQbGF5aW5nKGZhbHNlKQoreworICAgIG1fYXVkaW9EZXZpY2Ug
PSBhZG9wdFB0cih3ZWJLaXRDbGllbnQoKS0+Y3JlYXRlQXVkaW9EZXZpY2UoQ2FsbGJhY2tCdWZm
ZXJTaXplLCBOdW1iZXJPZkNoYW5uZWxzLCBzYW1wbGVSYXRlLCAmcmVuZGVyRGlzcGF0Y2gsIHRo
aXMpKTsKKyAgICBBU1NFUlQobV9hdWRpb0RldmljZS5nZXQoKSk7Cit9CisKK0F1ZGlvRGVzdGlu
YXRpb25DaHJvbWl1bTo6fkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSgpCit7CisgICAgc3RvcCgp
OworfQorCit2b2lkIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6c3RhcnQoKQoreworICAgIGlm
ICghbV9pc1BsYXlpbmcgJiYgbV9hdWRpb0RldmljZS5nZXQoKSkgeworICAgICAgICBtX2F1ZGlv
RGV2aWNlLT5zdGFydCgpOworICAgICAgICBtX2lzUGxheWluZyA9IHRydWU7CisgICAgfQorfQor
Cit2b2lkIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6c3RvcCgpCit7CisgICAgaWYgKG1faXNQ
bGF5aW5nICYmIG1fYXVkaW9EZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgbV9hdWRpb0RldmljZS0+
c3RvcCgpOworICAgICAgICBtX2lzUGxheWluZyA9IGZhbHNlOworICAgIH0KK30KKworZG91Ymxl
IEF1ZGlvRGVzdGluYXRpb246OmhhcmR3YXJlU2FtcGxlUmF0ZSgpCit7CisgICAgLy8gRklYTUU6
IGltcGxlbWVudCB0aGlzIHByb3Blcmx5IGZvciBDaHJvbWl1bS4KKyAgICByZXR1cm4gNDQxMDAu
MDsKK30KKwordm9pZCBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJlbmRlckRpc3BhdGNoKHZl
Y3RvcjxmbG9hdCo+JiBhdWRpb0RhdGEsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgdm9pZCogdXNl
ckRhdGEpCit7CisgICAgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtKiBkZXN0aW5hdGlvbiA9IHN0
YXRpY19jYXN0PEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bSo+KHVzZXJEYXRhKTsKKyAgICBBU1NF
UlQoZGVzdGluYXRpb24pOworICAgIGlmIChkZXN0aW5hdGlvbikKKyAgICAgICAgZGVzdGluYXRp
b24tPnJlbmRlcihhdWRpb0RhdGEsIG51bWJlck9mRnJhbWVzKTsKK30KKworLy8gUHVsbHMgb24g
b3VyIHByb3ZpZGVyIHRvIGdldCB0aGUgcmVuZGVyZWQgYXVkaW8gc3RyZWFtLgordm9pZCBBdWRp
b0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJlbmRlcih2ZWN0b3I8ZmxvYXQqPiYgYXVkaW9EYXRhLCBz
aXplX3QgbnVtYmVyT2ZGcmFtZXMpCit7CisgICAgYm9vbCBpc051bWJlck9mQ2hhbm5lbHNHb29k
ID0gYXVkaW9EYXRhLnNpemUoKSA9PSBOdW1iZXJPZkNoYW5uZWxzOworICAgIEFTU0VSVChpc051
bWJlck9mQ2hhbm5lbHNHb29kKTsKKyAgICBpZiAoIWlzTnVtYmVyT2ZDaGFubmVsc0dvb2QpCisg
ICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgYm9vbCBpc0J1ZmZlclNpemVHb29kID0gbnVt
YmVyT2ZGcmFtZXMgPT0gQ2FsbGJhY2tCdWZmZXJTaXplOworICAgIEFTU0VSVChpc0J1ZmZlclNp
emVHb29kKTsKKyAgICBpZiAoIWlzQnVmZmVyU2l6ZUdvb2QpCisgICAgICAgIHJldHVybjsKKwor
ICAgIC8vIFNwbGl0IHVwIHRoZSBjYWxsYmFjayBidWZmZXIgaW50byBzbWFsbGVyIGNodW5rcyB3
aGljaCB3ZSdsbCByZW5kZXIgb25lIGFmdGVyIHRoZSBvdGhlci4KKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgUmVuZGVyQ291bnRQZXJDYWxsYmFjazsgKytpKSB7CisgICAgICAgIG1fcmVu
ZGVyQnVzLnNldENoYW5uZWxNZW1vcnkoMCwgYXVkaW9EYXRhWzBdICsgaSAqIFJlbmRlckJ1ZmZl
clNpemUsIFJlbmRlckJ1ZmZlclNpemUpOworICAgICAgICBtX3JlbmRlckJ1cy5zZXRDaGFubmVs
TWVtb3J5KDEsIGF1ZGlvRGF0YVsxXSArIGkgKiBSZW5kZXJCdWZmZXJTaXplLCBSZW5kZXJCdWZm
ZXJTaXplKTsKKyAgICAgICAgbV9wcm92aWRlci5wcm92aWRlSW5wdXQoJm1fcmVuZGVyQnVzLCBS
ZW5kZXJCdWZmZXJTaXplKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
I2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0F1
ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hy
b21pdW0vc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBv
ZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAg
IGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW1faAorI2RlZmluZSBB
dWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW1faAorCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKyNpbmNs
dWRlICJBdWRpb0Rlc3RpbmF0aW9uLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2Ug
V2ViS2l0IHsgY2xhc3MgV2ViQXVkaW9EZXZpY2U7IH0KKworbmFtZXNwYWNlIFdlYkNvcmUgeyAK
KworLy8gQW4gQXVkaW9EZXN0aW5hdGlvbiB1c2luZyBDaHJvbWl1bSdzIGF1ZGlvIHN5c3RlbQor
CitjbGFzcyBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0gOiBwdWJsaWMgQXVkaW9EZXN0aW5hdGlv
biB7CitwdWJsaWM6CisgICAgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtKEF1ZGlvU291cmNlUHJv
dmlkZXImLCBkb3VibGUgc2FtcGxlUmF0ZSk7CisgICAgdmlydHVhbCB+QXVkaW9EZXN0aW5hdGlv
bkNocm9taXVtKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc3RvcCgpOworICAgIGJvb2wgaXNQbGF5aW5nKCkgeyByZXR1cm4gbV9pc1BsYXlpbmc7IH0K
KworICAgIGRvdWJsZSBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbV9zYW1wbGVSYXRlOyB9
CisKKyAgICBzdGF0aWMgdm9pZCByZW5kZXJEaXNwYXRjaChzdGQ6OnZlY3RvcjxmbG9hdCo+JiBh
dWRpb0RhdGEsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgdm9pZCogdXNlckRhdGEpOworICAgIHZv
aWQgcmVuZGVyKHN0ZDo6dmVjdG9yPGZsb2F0Kj4mIGF1ZGlvRGF0YSwgc2l6ZV90IG51bWJlck9m
RnJhbWVzKTsKKworcHJpdmF0ZToKKyAgICBBdWRpb1NvdXJjZVByb3ZpZGVyJiBtX3Byb3ZpZGVy
OworICAgIEF1ZGlvQnVzIG1fcmVuZGVyQnVzOworICAgIGRvdWJsZSBtX3NhbXBsZVJhdGU7Cisg
ICAgYm9vbCBtX2lzUGxheWluZzsKKyAgICBPd25QdHI8V2ViS2l0OjpXZWJBdWRpb0RldmljZT4g
bV9hdWRpb0RldmljZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>77165</attachid>
            <date>2010-12-21 16:44:14 -0800</date>
            <delta_ts>2011-01-05 15:54:08 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51424-20101221164413.patch</filename>
            <type>text/plain</type>
            <size>15671</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3NDQzNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMTAtMTItMjEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgV2ViS2l0Q2xpZW50OjpjcmVhdGVBdWRpb0RldmljZSgpIGZvciBDaHJvbWl1bSBwb3J0IG9m
IHdlYiBhdWRpbyBBUEkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTUxNDI0CisKKyAgICAgICAgTm8gbmV3IHRlc3RzIHNpbmNlIGF1ZGlvIEFQSSBpcyBu
b3QgeWV0IGltcGxlbWVudGVkLgorCisgICAgICAgICogV2ViQ29yZS5neXAvV2ViQ29yZS5neXA6
CisgICAgICAgICogV2ViQ29yZS5neXBpOgorCiAyMDEwLTEyLTIxICBDaHJpcyBSb2dlcnMgIDxj
cm9nZXJzQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSdXNzZWxs
LgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJD
b3JlLmd5cGkJKHJldmlzaW9uIDc0NDM2KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtp
bmcgY29weSkKQEAgLTI0MzUsNiArMjQzNSw3IEBACiAgICAgICAgICAgICAncGxhdGZvcm0vYXVk
aW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9hdWRpby9W
ZWN0b3JNYXRoLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3Bw
JywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9hdWRpby9jaHJvbWl1bS9BdWRpb0J1c0Nocm9taXVt
LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vYXVkaW8vbWFjL0F1ZGlvQnVzTWFjLm1tJywK
ICAgICAgICAgICAgICdwbGF0Zm9ybS9hdWRpby9tYWMvQXVkaW9EZXN0aW5hdGlvbk1hYy5oJywK
ICAgICAgICAgICAgICdwbGF0Zm9ybS9hdWRpby9tYWMvQXVkaW9EZXN0aW5hdGlvbk1hYy5jcHAn
LApJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwCShyZXZpc2lvbiA3NDQzNikKKysrIFdlYkNv
cmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHdvcmtpbmcgY29weSkKQEAgLTExNDUsMTEgKzEx
NDUsOSBAQAogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtLyhncmFwaGljcy8pP21h
Yy9bXi9dKkZvbnRbXi9dKlxcLihjcHB8bW0/KSQnXSwKICAgICAgICAgICAgIFsnaW5jbHVkZScs
ICdwbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRbXi9dKlxcLihjcHB8aCkkJ10sCiAK
LSAgICAgICAgICAgICMgTmVjZXNzYXJ5IGZvciB3ZWIgYXVkaW8gQVBJIGJyaW5ndXAgb24gQ2hy
b21lLgotICAgICAgICAgICAgIyBUaGV5IHdpbGwgbGF0ZXIgYmUgcmVwbGFjZWQgd2l0aCBjaHJv
bWl1bS1zcGVjaWZpYyBjb2RlLgorICAgICAgICAgICAgIyBBdWRpb0J1c01hYyBpcyBuZWNlc3Nh
cnkgZm9yIHdlYiBhdWRpbyBBUEkgYnJpbmd1cCBvbiBDaHJvbWUuCisgICAgICAgICAgICAjIEl0
IHdpbGwgbGF0ZXIgYmUgcmVwbGFjZWQgd2l0aCBjaHJvbWl1bS1zcGVjaWZpYyBjb2RlLgogICAg
ICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2F1ZGlvL21hYy9BdWRpb0J1c01hY1xcLm1t
JCddLAotICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2F1ZGlvL21hYy9BdWRpb0Rl
c3RpbmF0aW9uTWFjXFwuY3BwJCddLAotICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3Jt
L2F1ZGlvL21hYy9BdWRpb0ZpbGVSZWFkZXJNYWNcXC5jcHAkJ10sCiAgICAgICAgICAgICBbJ2lu
Y2x1ZGUnLCAncGxhdGZvcm0vYXVkaW8vbWFjL0ZGVEZyYW1lTWFjXFwuY3BwJCddLAogCiAgICAg
ICAgICAgICAjIENoZXJyeS1waWNrIHNvbWUgZmlsZXMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBi
eSBicm9hZGVyIHJlZ2V4cHMuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc0NDM2KQorKysg
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBA
CisyMDEwLTEyLTIxICBDaHJpcyBSb2dlcnMgIDxjcm9nZXJzQGdvb2dsZS5jb20+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIFdlYktpdENsaWVu
dDo6Y3JlYXRlQXVkaW9EZXZpY2UoKSBmb3IgQ2hyb21pdW0gcG9ydCBvZiB3ZWIgYXVkaW8gQVBJ
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MTQyNAor
CisgICAgICAgICogV2ViS2l0Lmd5cDoKKyAgICAgICAgKiBwdWJsaWMvV2ViQXVkaW9EZXZpY2Uu
aDogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OldlYkF1ZGlvRGV2aWNlOjpSZW5kZXJDYWxsYmFj
azo6flJlbmRlckNhbGxiYWNrKToKKyAgICAgICAgKFdlYktpdDo6V2ViQXVkaW9EZXZpY2U6On5X
ZWJBdWRpb0RldmljZSk6CisgICAgICAgICogcHVibGljL1dlYktpdENsaWVudC5oOgorICAgICAg
ICAoV2ViS2l0OjpXZWJLaXRDbGllbnQ6OmNyZWF0ZUF1ZGlvRGV2aWNlKToKKyAgICAgICAgKiBz
cmMvQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb0Rlc3RpbmF0aW9uOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0
aW5hdGlvbkNocm9taXVtOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0pOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjp+QXVkaW9EZXN0aW5hdGlvbkNocm9taXVt
KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6c3RhcnQpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpzdG9wKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb246OmhhcmR3YXJlU2FtcGxlUmF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW06OnJlbmRlcik6CisgICAgICAg
ICogc3JjL0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6aXNQbGF5aW5nKToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bTo6c2FtcGxlUmF0ZSk6CisKIDIwMTAtMTItMjAg
IEFuZHJlaSBQb3Blc2N1ICA8YW5kcmVpcEBnb29nbGUuY29tPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IEplcmVteSBPcmxvdy4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCShyZXZpc2lvbiA3NDQzNikKKysr
IFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTAsNiArMTEw
LDcgQEAKICAgICAgICAgICAgICAgICAncHVibGljL1dlYkFwcGxpY2F0aW9uQ2FjaGVIb3N0Q2xp
ZW50LmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViQXR0cmlidXRlLmgnLAogICAgICAg
ICAgICAgICAgICdwdWJsaWMvV2ViQXVkaW9CdXMuaCcsCisgICAgICAgICAgICAgICAgJ3B1Ymxp
Yy9XZWJBdWRpb0RldmljZS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYkJpbmRpbmdz
LmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViQmxvYkRhdGEuaCcsCiAgICAgICAgICAg
ICAgICAgJ3B1YmxpYy9XZWJCbG9iUmVnaXN0cnkuaCcsCkBAIC0zMDMsNiArMzA0LDggQEAKICAg
ICAgICAgICAgICAgICAnc3JjL0FzeW5jRmlsZVN5c3RlbUNocm9taXVtLmgnLAogICAgICAgICAg
ICAgICAgICdzcmMvQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwJywKICAgICAgICAgICAgICAg
ICAnc3JjL0FzeW5jRmlsZVdyaXRlckNocm9taXVtLmgnLAorICAgICAgICAgICAgICAgICdzcmMv
QXVkaW9EZXN0aW5hdGlvbkNocm9taXVtLmNwcCcsCisgICAgICAgICAgICAgICAgJ3NyYy9BdWRp
b0Rlc3RpbmF0aW9uQ2hyb21pdW0uaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9BdXRvRmlsbFBv
cHVwTWVudUNsaWVudC5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvQXV0b0ZpbGxQb3B1cE1l
bnVDbGllbnQuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9CYWNrRm9yd2FyZExpc3RDbGllbnRJ
bXBsLmNwcCcsCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYkF1ZGlvRGV2aWNlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJBdWRpb0RldmljZS5oCShy
ZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJBdWRpb0RldmljZS5oCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBXZWJBdWRpb0RldmljZV9oCisj
ZGVmaW5lIFdlYkF1ZGlvRGV2aWNlX2gKKworI2luY2x1ZGUgIldlYlZlY3Rvci5oIgorCituYW1l
c3BhY2UgV2ViS2l0IHsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHRvIHRoZSBDaHJvbWl1bSBh
dWRpbyBzeXN0ZW0uCisKK2NsYXNzIFdlYkF1ZGlvRGV2aWNlIHsKK3B1YmxpYzoKKyAgICBjbGFz
cyBSZW5kZXJDYWxsYmFjayB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVu
ZGVyKFdlYlZlY3RvcjxmbG9hdCo+JiBhdWRpb0RhdGEsIHNpemVfdCBudW1iZXJPZkZyYW1lcykg
PSAwOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdmlydHVhbCB+UmVuZGVyQ2FsbGJhY2soKSB7
IH0KKyAgICB9OworICAKKyAgICB2aXJ0dWFsIH5XZWJBdWRpb0RldmljZSgpIHsgfQorCisgICAg
dmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvLyBXZWJBdWRpb0RldmljZV9o
CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYktpdENsaWVudC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViS2l0Q2xpZW50LmgJKHJldmlzaW9uIDc0NDM2
KQorKysgV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJLaXRDbGllbnQuaAkod29ya2luZyBjb3B5
KQpAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBXZWJLaXRDbGllbnRfaAogCiAjaW5jbHVkZSAi
V2ViQXVkaW9CdXMuaCIKKyNpbmNsdWRlICJXZWJBdWRpb0RldmljZS5oIgogI2luY2x1ZGUgIldl
YkNvbW1vbi5oIgogI2luY2x1ZGUgIldlYkRhdGEuaCIKICNpbmNsdWRlICJXZWJMb2NhbGl6ZWRT
dHJpbmcuaCIKQEAgLTI3Nyw2ICsyNzgsMTAgQEAgcHVibGljOgogICAgIC8vIFJldHVybnMgbmV3
bHkgYWxsb2NhdGVkIFdlYkdyYXBoaWNzQ29udGV4dDNEIGluc3RhbmNlLgogICAgIHZpcnR1YWwg
V2ViR3JhcGhpY3NDb250ZXh0M0QqIGNyZWF0ZUdyYXBoaWNzQ29udGV4dDNEKCkgeyByZXR1cm4g
MDsgfQogCisgICAgLy8gQXVkaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHZpcnR1YWwgV2ViQXVkaW9EZXZpY2Uq
IGNyZWF0ZUF1ZGlvRGV2aWNlKHNpemVfdCBidWZmZXJTaXplLCB1bnNpZ25lZCBudW1iZXJPZkNo
YW5uZWxzLCBkb3VibGUgc2FtcGxlUmF0ZSwgV2ViQXVkaW9EZXZpY2U6OlJlbmRlckNhbGxiYWNr
KikgeyByZXR1cm4gMDsgfQorCiAgICAgLy8gRmlsZVN5c3RlbSAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICAvLyBNdXN0IHJl
dHVybiBub24tbnVsbC4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlv
bkNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0F1ZGlvRGVz
dGluYXRpb25DaHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3Jj
L0F1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTIz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBs
ZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdFQl9BVURJTykKKworI2lu
Y2x1ZGUgIkF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bS5oIgorCisjaW5jbHVkZSAiQXVkaW9Tb3Vy
Y2VQcm92aWRlci5oIgorI2luY2x1ZGUgIldlYktpdC5oIgorI2luY2x1ZGUgIldlYktpdENsaWVu
dC5oIgorCit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
Ky8vIEJ1ZmZlciBzaXplIHRoYXQgdGhlIENocm9taXVtIGF1ZGlvIHN5c3RlbSB3aWxsIGNhbGwg
dXMgYmFjayB3aXRoLgorLy8gVGhpcyB2YWx1ZSBtYXkgbmVlZCB0byBiZSB0dW5lZCBiYXNlZCBv
biB0aGUgT1MuCisvLyBGSVhNRTogSXQgbWF5IGJlIHBvc3NpYmxlIHRvIHJlZHVjZSB0aGlzIHZh
bHVlIG9uY2UgcmVhbC10aW1lIHRocmVhZHMKKy8vIGFuZCBvdGhlciBDaHJvbWl1bSBhdWRpbyBp
bXByb3ZlbWVudHMgYXJlIG1hZGUuCitjb25zdCB1bnNpZ25lZCBDYWxsYmFja0J1ZmZlclNpemUg
PSAyMDQ4OworCisvLyBCdWZmZXIgc2l6ZSBhdCB3aGljaCB0aGUgd2ViIGF1ZGlvIGVuZ2luZSB3
aWxsIHJlbmRlci4KK2NvbnN0IHVuc2lnbmVkIFJlbmRlckJ1ZmZlclNpemUgPSAxMjg7CisKK2Nv
bnN0IHVuc2lnbmVkIFJlbmRlckNvdW50UGVyQ2FsbGJhY2sgPSBDYWxsYmFja0J1ZmZlclNpemUg
LyBSZW5kZXJCdWZmZXJTaXplOworCisvLyBGSVhNRTogYWRkIHN1cHBvcnQgZm9yIG11bHRpLWNo
YW5uZWwuCitjb25zdCB1bnNpZ25lZCBOdW1iZXJPZkNoYW5uZWxzID0gMjsKKworLy8gRmFjdG9y
eSBtZXRob2Q6IENocm9taXVtLWltcGxlbWVudGF0aW9uCitQYXNzT3duUHRyPEF1ZGlvRGVzdGlu
YXRpb24+IEF1ZGlvRGVzdGluYXRpb246OmNyZWF0ZShBdWRpb1NvdXJjZVByb3ZpZGVyJiBwcm92
aWRlciwgZG91YmxlIHNhbXBsZVJhdGUpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBBdWRp
b0Rlc3RpbmF0aW9uQ2hyb21pdW0ocHJvdmlkZXIsIHNhbXBsZVJhdGUpKTsKK30KKworQXVkaW9E
ZXN0aW5hdGlvbkNocm9taXVtOjpBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0oQXVkaW9Tb3VyY2VQ
cm92aWRlciYgcHJvdmlkZXIsIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgIDogbV9wcm92aWRlcihw
cm92aWRlcikKKyAgICAsIG1fcmVuZGVyQnVzKE51bWJlck9mQ2hhbm5lbHMsIFJlbmRlckJ1ZmZl
clNpemUsIGZhbHNlKQorICAgICwgbV9zYW1wbGVSYXRlKHNhbXBsZVJhdGUpCisgICAgLCBtX2lz
UGxheWluZyhmYWxzZSkKK3sKKyAgICBtX2F1ZGlvRGV2aWNlID0gYWRvcHRQdHIod2ViS2l0Q2xp
ZW50KCktPmNyZWF0ZUF1ZGlvRGV2aWNlKENhbGxiYWNrQnVmZmVyU2l6ZSwgTnVtYmVyT2ZDaGFu
bmVscywgc2FtcGxlUmF0ZSwgdGhpcykpOworICAgIEFTU0VSVChtX2F1ZGlvRGV2aWNlLmdldCgp
KTsKK30KKworQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjp+QXVkaW9EZXN0aW5hdGlvbkNocm9t
aXVtKCkKK3sKKyAgICBzdG9wKCk7Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVt
OjpzdGFydCgpCit7CisgICAgaWYgKCFtX2lzUGxheWluZyAmJiBtX2F1ZGlvRGV2aWNlLmdldCgp
KSB7CisgICAgICAgIG1fYXVkaW9EZXZpY2UtPnN0YXJ0KCk7CisgICAgICAgIG1faXNQbGF5aW5n
ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbkNocm9taXVtOjpzdG9w
KCkKK3sKKyAgICBpZiAobV9pc1BsYXlpbmcgJiYgbV9hdWRpb0RldmljZS5nZXQoKSkgeworICAg
ICAgICBtX2F1ZGlvRGV2aWNlLT5zdG9wKCk7CisgICAgICAgIG1faXNQbGF5aW5nID0gZmFsc2U7
CisgICAgfQorfQorCitkb3VibGUgQXVkaW9EZXN0aW5hdGlvbjo6aGFyZHdhcmVTYW1wbGVSYXRl
KCkKK3sKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50IHRoaXMgcHJvcGVybHkgZm9yIENocm9taXVt
LgorICAgIHJldHVybiA0NDEwMC4wOworfQorCisvLyBQdWxscyBvbiBvdXIgcHJvdmlkZXIgdG8g
Z2V0IHRoZSByZW5kZXJlZCBhdWRpbyBzdHJlYW0uCit2b2lkIEF1ZGlvRGVzdGluYXRpb25DaHJv
bWl1bTo6cmVuZGVyKFdlYlZlY3RvcjxmbG9hdCo+JiBhdWRpb0RhdGEsIHNpemVfdCBudW1iZXJP
ZkZyYW1lcykKK3sKKyAgICBib29sIGlzTnVtYmVyT2ZDaGFubmVsc0dvb2QgPSBhdWRpb0RhdGEu
c2l6ZSgpID09IE51bWJlck9mQ2hhbm5lbHM7CisgICAgQVNTRVJUKGlzTnVtYmVyT2ZDaGFubmVs
c0dvb2QpOworICAgIGlmICghaXNOdW1iZXJPZkNoYW5uZWxzR29vZCkKKyAgICAgICAgcmV0dXJu
OworICAgICAgICAKKyAgICBib29sIGlzQnVmZmVyU2l6ZUdvb2QgPSBudW1iZXJPZkZyYW1lcyA9
PSBDYWxsYmFja0J1ZmZlclNpemU7CisgICAgQVNTRVJUKGlzQnVmZmVyU2l6ZUdvb2QpOworICAg
IGlmICghaXNCdWZmZXJTaXplR29vZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gU3BsaXQg
dXAgdGhlIGNhbGxiYWNrIGJ1ZmZlciBpbnRvIHNtYWxsZXIgY2h1bmtzIHdoaWNoIHdlJ2xsIHJl
bmRlciBvbmUgYWZ0ZXIgdGhlIG90aGVyLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBS
ZW5kZXJDb3VudFBlckNhbGxiYWNrOyArK2kpIHsKKyAgICAgICAgbV9yZW5kZXJCdXMuc2V0Q2hh
bm5lbE1lbW9yeSgwLCBhdWRpb0RhdGFbMF0gKyBpICogUmVuZGVyQnVmZmVyU2l6ZSwgUmVuZGVy
QnVmZmVyU2l6ZSk7CisgICAgICAgIG1fcmVuZGVyQnVzLnNldENoYW5uZWxNZW1vcnkoMSwgYXVk
aW9EYXRhWzFdICsgaSAqIFJlbmRlckJ1ZmZlclNpemUsIFJlbmRlckJ1ZmZlclNpemUpOworICAg
ICAgICBtX3Byb3ZpZGVyLnByb3ZpZGVJbnB1dCgmbV9yZW5kZXJCdXMsIFJlbmRlckJ1ZmZlclNp
emUpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5B
QkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXVkaW9EZXN0aW5hdGlv
bkNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9BdWRpb0Rlc3Rp
bmF0aW9uQ2hyb21pdW0uaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvQXVk
aW9EZXN0aW5hdGlvbkNocm9taXVtLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIEF1ZGlvRGVzdGluYXRpb25DaHJvbWl1bV9oCisjZGVmaW5lIEF1ZGlvRGVzdGluYXRp
b25DaHJvbWl1bV9oCisKKyNpbmNsdWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvRGVz
dGluYXRpb24uaCIKKyNpbmNsdWRlICJXZWJBdWRpb0RldmljZS5oIgorI2luY2x1ZGUgIldlYlZl
Y3Rvci5oIgorCituYW1lc3BhY2UgV2ViS2l0IHsgY2xhc3MgV2ViQXVkaW9EZXZpY2U7IH0KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeyAKKworLy8gQW4gQXVkaW9EZXN0aW5hdGlvbiB1c2luZyBDaHJv
bWl1bSdzIGF1ZGlvIHN5c3RlbQorCitjbGFzcyBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0gOiBw
dWJsaWMgQXVkaW9EZXN0aW5hdGlvbiwgcHVibGljIFdlYktpdDo6V2ViQXVkaW9EZXZpY2U6OlJl
bmRlckNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW0oQXVk
aW9Tb3VyY2VQcm92aWRlciYsIGRvdWJsZSBzYW1wbGVSYXRlKTsKKyAgICB2aXJ0dWFsIH5BdWRp
b0Rlc3RpbmF0aW9uQ2hyb21pdW0oKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAg
IHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgYm9vbCBpc1BsYXlpbmcoKSB7IHJldHVybiBtX2lz
UGxheWluZzsgfQorCisgICAgZG91YmxlIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtX3Nh
bXBsZVJhdGU7IH0KKworICAgIC8vIFdlYktpdDo6V2ViQXVkaW9EZXZpY2U6OlJlbmRlckNhbGxi
YWNrCisgICAgdmlydHVhbCB2b2lkIHJlbmRlcihXZWJLaXQ6OldlYlZlY3RvcjxmbG9hdCo+JiBh
dWRpb0RhdGEsIHNpemVfdCBudW1iZXJPZkZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9T
b3VyY2VQcm92aWRlciYgbV9wcm92aWRlcjsKKyAgICBBdWRpb0J1cyBtX3JlbmRlckJ1czsKKyAg
ICBkb3VibGUgbV9zYW1wbGVSYXRlOworICAgIGJvb2wgbV9pc1BsYXlpbmc7CisgICAgT3duUHRy
PFdlYktpdDo6V2ViQXVkaW9EZXZpY2U+IG1fYXVkaW9EZXZpY2U7Cit9OworCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBBdWRpb0Rlc3RpbmF0aW9uQ2hyb21pdW1faAo=
</data>
<flag name="review"
          id="68215"
          type_id="1"
          status="+"
          setter="fishd"
    />
    <flag name="commit-queue"
          id="69308"
          type_id="3"
          status="-"
          setter="fishd"
    />
          </attachment>
      

    </bug>

</bugzilla>