<?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>45864</bug_id>
          
          <creation_ts>2010-09-15 18:55:56 -0700</creation_ts>
          <short_desc>Add HRTFElevation files</short_desc>
          <delta_ts>2010-09-22 01:46:14 -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>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>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>jamesr</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>279899</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 18:55:56 -0700</bug_when>
    <thetext>Add HRTFElevation files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279900</commentid>
    <comment_count>1</comment_count>
      <attachid>67759</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-15 18:57:16 -0700</bug_when>
    <thetext>Created attachment 67759
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280302</commentid>
    <comment_count>2</comment_count>
      <attachid>67759</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-16 13:24:32 -0700</bug_when>
    <thetext>Comment on attachment 67759
Patch

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

&gt; WebCore/platform/audio/HRTFElevation.cpp:57
&gt; +    bool checkX = x &gt;= 0.0 &amp;&amp; x &lt; 1.0;
&gt; +    ASSERT(checkX);
&gt; +    if (!checkX)
&gt; +        x = 0.0;

What&apos;s wrong with x == 1.0?

&gt; WebCore/platform/audio/HRTFElevation.cpp:122
&gt; +    snprintf(filePath, sizeof(filePath), &quot;%s/IRC_%s_C_R0195_T%03d_P%03d.aif&quot;, hrirSubDirectory, subjectName, azimuth, positiveElevation);

Yuck :(.  What&apos;s the plan for improving this?

&gt; WebCore/platform/audio/HRTFElevation.cpp:266
&gt; +    HRTFKernelList&amp; kernelListL = *this-&gt;kernelListL();
&gt; +    HRTFKernelList&amp; kernelListR = *this-&gt;kernelListR();

I think it&apos;d be clearer to just use m_kernelListL/m_kernelListR in the rest of this function.

&gt; WebCore/platform/audio/HRTFElevation.h:43
&gt; +class HRTFElevation {

If this is intended to be stored in an OwnPtr it should probably inherit from Noncopyable.

&gt; WebCore/platform/audio/HRTFElevation.h:48
&gt; +    static PassOwnPtr&lt;HRTFElevation&gt; createForSubject(const char* subjectName, int elevation, double sampleRate);

WebCore typically uses String for strings, not const char*.  What does subjectName mean here?

&gt; WebCore/platform/audio/HRTFElevation.h:63
&gt; +    void getKernelsFromAzimuth(double azimuthBlend, unsigned azimuthIndex, HRTFKernel* &amp;kernelL, HRTFKernel* &amp;kernelR, double&amp; frameDelayL, double&amp; frameDelayR);

Pointers to references?

&gt; WebCore/platform/audio/HRTFElevation.h:75
&gt; +    // Spacing, in degrees, between every azimuth loaded from resource.
&gt; +    static unsigned azimuthSpacing() { return 15; }
&gt; +    
&gt; +    // Number of azimuths loaded from resource.
&gt; +    static unsigned numberOfRawAzimuths() { return 360 / azimuthSpacing(); }
&gt; +
&gt; +    // Interpolates by this factor to get the total number of azimuths from every azimuth loaded from resource.
&gt; +    static unsigned interpolationFactor() { return 8; }    
&gt; +    
&gt; +    // Total number of azimuths after interpolation.
&gt; +    static unsigned numberOfTotalAzimuths() { return numberOfRawAzimuths() * interpolationFactor(); }

Why are these static functions instead of constants?

&gt; WebCore/platform/audio/HRTFElevation.h:78
&gt; +    // Given two HRTFKernels, and an interpolation factor x: 0 -&gt; 1, returns an interpolated HRTFKernel.
&gt; +    static PassRefPtr&lt;HRTFKernel&gt; createInterpolatedKernel(HRTFKernel* kernel1, HRTFKernel* kernel2, double x);

Why is this function part of HRTFElevation and not HRTFKernel?

&gt; WebCore/platform/audio/HRTFElevation.h:92
&gt; +    // For testing / development.  Not compiled / linked in normal usage.
&gt; +    void writeHRIRFiles(const char* subjectName);

Should this be behind #ifndef NDEBUG then?  When do we plan to remove these?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280463</commentid>
    <comment_count>3</comment_count>
      <attachid>67863</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 17:12:56 -0700</bug_when>
    <thetext>Created attachment 67863
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280466</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 17:14:45 -0700</bug_when>
    <thetext>&gt; WebCore/platform/audio/HRTFElevation.cpp:57
&gt; +    bool checkX = x &gt;= 0.0 &amp;&amp; x &lt; 1.0;
&gt; +    ASSERT(checkX);
&gt; +    if (!checkX)
&gt; +        x = 0.0;

What&apos;s wrong with x == 1.0?

CHANGED: now clipping x to range 0 -&gt; 1
An alternative would be to simply return 0 here.





&gt; WebCore/platform/audio/HRTFElevation.cpp:122
&gt; +    snprintf(filePath, sizeof(filePath), &quot;%s/IRC_%s_C_R0195_T%03d_P%03d.aif&quot;, hrirSubDirectory, subjectName, azimuth, positiveElevation);

Yuck :(.  What&apos;s the plan for improving this?


Yeah, I know... For sandboxing reasons I understand that Chrome can&apos;t read directly from the file system (and probably WebKit2 will have a similar problem).
The long-term goal is to create an audio-file resource abstraction.  In a sandboxed implementation it could get the file data into the renderer process via shared memory.
Even once the code is changed to use this abstraction I suspect there will still be a similar type of snprintf (or equivalent) in order to construct the audio resource name.

Migrating to this resource abstraction must happen before it will be able to run in sandboxed Chrome, so there&apos;s little chance of this falling through the cracks.
In the meantime, during bringup of this code in WebKit trunk, it&apos;s essential to have this simpler code working in order to exercise and test that all of the other parts of the code
are working correctly.

I&apos;ll put a FIXME here to describe this situation.  But much of this code will still remain the same here since the createBusFromAudioFile() function I&apos;m
currently using can access this abstraction.





&gt; WebCore/platform/audio/HRTFElevation.cpp:266
&gt; +    HRTFKernelList&amp; kernelListL = *this-&gt;kernelListL();
&gt; +    HRTFKernelList&amp; kernelListR = *this-&gt;kernelListR();

I think it&apos;d be clearer to just use m_kernelListL/m_kernelListR in the rest of this function.

AGREED - CHANGED




&gt; WebCore/platform/audio/HRTFElevation.h:43
&gt; +class HRTFElevation {

If this is intended to be stored in an OwnPtr it should probably inherit from Noncopyable.

FIXED






&gt; WebCore/platform/audio/HRTFElevation.h:48
&gt; +    static PassOwnPtr&lt;HRTFElevation&gt; createForSubject(const char* subjectName, int elevation, double sampleRate);

WebCore typically uses String for strings, not const char*.  What does subjectName mean here?


NOT YET ADDRESSED - will fix in next patch




&gt; WebCore/platform/audio/HRTFElevation.h:63
&gt; +    void getKernelsFromAzimuth(double azimuthBlend, unsigned azimuthIndex, HRTFKernel* &amp;kernelL, HRTFKernel* &amp;kernelR, double&amp; frameDelayL, double&amp; frameDelayR);

Pointers to references?

I&apos;m returning two HRTFKernel* pointers.  Would you prefer HRTFKernel** ??




&gt; WebCore/platform/audio/HRTFElevation.h:75
&gt; +    // Spacing, in degrees, between every azimuth loaded from resource.
&gt; +    static unsigned azimuthSpacing() { return 15; }
&gt; +    
&gt; +    // Number of azimuths loaded from resource.
&gt; +    static unsigned numberOfRawAzimuths() { return 360 / azimuthSpacing(); }
&gt; +
&gt; +    // Interpolates by this factor to get the total number of azimuths from every azimuth loaded from resource.
&gt; +    static unsigned interpolationFactor() { return 8; }    
&gt; +    
&gt; +    // Total number of azimuths after interpolation.
&gt; +    static unsigned numberOfTotalAzimuths() { return numberOfRawAzimuths() * interpolationFactor(); }

Why are these static functions instead of constants?

FIXED





&gt; WebCore/platform/audio/HRTFElevation.h:78
&gt; +    // Given two HRTFKernels, and an interpolation factor x: 0 -&gt; 1, returns an interpolated HRTFKernel.
&gt; +    static PassRefPtr&lt;HRTFKernel&gt; createInterpolatedKernel(HRTFKernel* kernel1, HRTFKernel* kernel2, double x);

Why is this function part of HRTFElevation and not HRTFKernel?

FIXED: MOVED TO HRTFKernel




&gt; WebCore/platform/audio/HRTFElevation.h:92
&gt; +    // For testing / development.  Not compiled / linked in normal usage.
&gt; +    void writeHRIRFiles(const char* subjectName);

Should this be behind #ifndef NDEBUG then?  When do we plan to remove these?


FIXED: REMOVED this since it&apos;s best to have this be a separate standalone function (in a separate file in my audio branch) operating on HRTFElevation rather than complicate the
header file.  This is never used when running in the browser environment normally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280469</commentid>
    <comment_count>5</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-09-16 17:20:58 -0700</bug_when>
    <thetext>&gt; &gt; WebCore/platform/audio/HRTFElevation.cpp:122
&gt; &gt; +    snprintf(filePath, sizeof(filePath), &quot;%s/IRC_%s_C_R0195_T%03d_P%03d.aif&quot;, hrirSubDirectory, subjectName, azimuth, positiveElevation);
&gt; 
&gt; Yuck :(.  What&apos;s the plan for improving this?
&gt; 
&gt; 
&gt; Yeah, I know... For sandboxing reasons I understand that Chrome can&apos;t read directly from the file system (and probably WebKit2 will have a similar problem).
&gt; The long-term goal is to create an audio-file resource abstraction.  In a sandboxed implementation it could get the file data into the renderer process via shared memory.
&gt; Even once the code is changed to use this abstraction I suspect there will still be a similar type of snprintf (or equivalent) in order to construct the audio resource name.
&gt; 
&gt; Migrating to this resource abstraction must happen before it will be able to run in sandboxed Chrome, so there&apos;s little chance of this falling through the cracks.
&gt; In the meantime, during bringup of this code in WebKit trunk, it&apos;s essential to have this simpler code working in order to exercise and test that all of the other parts of the code
&gt; are working correctly.
&gt; 
&gt; I&apos;ll put a FIXME here to describe this situation.  But much of this code will still remain the same here since the createBusFromAudioFile() function I&apos;m
&gt; currently using can access this abstraction.

This worries me. Any new access to the filesystem could potentially open a huge security hole. I think you need to disable this feature until the issue is resolved.

Do you expect browser vendors to ship a bunch of new resource files? If so, where are they?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280473</commentid>
    <comment_count>6</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 17:37:51 -0700</bug_when>
    <thetext>Hi Simon, yes in order to do spatialized panning, a key feature of this audio API, we need to have access to the spatialization files.  Currently they&apos;re a little over 1Mb, but I&apos;m confident that I can reduce them down to less than 500Kb total.  You can see them in the audio branch here:

https://svn.webkit.org/repository/webkit/branches/audio/WebCore/webaudio/AudioSpatialization/IRC_Composite/

I definitely understand your concern.  The HRTFElevation.cpp file is enabled with

#if ENABLE(WEB_AUDIO)

And I understand that WEB_AUDIO will not be enabled until we have proper layout tests, and this file reading issue is resolved.


But, in the meantime it&apos;s very important for me to be able to verify that the audio engine code still works as I&apos;m landing patches into trunk from my branch.  In the course of addressing reviewers comments for my many patches, I have to make lots of re-factorings and code cleanup fixes and I need to verify that each change I make still works with all the rest of the code.  That&apos;s why it&apos;s important to me to be able to have this intermediate stage (before WEB_AUDIO is enabled) where I can directly read these spatialization files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280477</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-09-16 17:48:03 -0700</bug_when>
    <thetext>Why not load these files via remote URLs like everything else?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280486</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 18:06:21 -0700</bug_when>
    <thetext>We don&apos;t do that for other things in the browser like standard fonts for rendering a web page.  I view these resources to be in the same category.  It&apos;s not as if there are many different sets of these spatialization files.  They&apos;re quite hard to generate and require lots of specialized post-processing, so I don&apos;t envision anybody using any other than the standard dataset that we provide.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280491</commentid>
    <comment_count>9</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-09-16 18:15:29 -0700</bug_when>
    <thetext>We use file urls to load images etc. from the WebKit bundle, so I think we should do the same with these.

Also, a blocking read on the main thread is very undesirable.

FWIW, I guess they&apos;d ship with WebKit, not with the browser.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280494</commentid>
    <comment_count>10</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-09-16 18:21:17 -0700</bug_when>
    <thetext>See Image::loadPlatformResource() for an example of how we load local resources.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280500</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-16 18:30:14 -0700</bug_when>
    <thetext>Ok, loading from file URLs seems like a good solution for Safari&apos;s implementation of the abstraction layer.  Chrome might do it a little bit differently (maybe with shared memory).  I&apos;ll have a look at Image::loadPlatformResource()

Also I agree about the blocking reads on the main thread.  I&apos;m planning on loading and processing these files on a separate thread.  The separate thread part will be part of the patch for HRTFDatabase which I&apos;ll post soon.

Thanks for your help, Simon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280842</commentid>
    <comment_count>12</comment_count>
      <attachid>67947</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-17 14:01:18 -0700</bug_when>
    <thetext>Created attachment 67947
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280844</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-17 14:05:52 -0700</bug_when>
    <thetext>James, I think I&apos;ve addressed your comments except for &quot;Pointers to references?&quot; and am waiting for your opinion on how you would like it changed.

Otherwise, I&apos;ve created an abstraction function called createBusFromAudioFileResource(const String&amp;),
which given an audio resource name will return the AudioBus for its PCM data.  This removes a lot of the ugliness from this part of my previous patch.

Also, I&apos;m still calling fprintf(stderr, ...) in a few places.  Can you recommend which appropriate LOG() function I should use?

Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281821</commentid>
    <comment_count>14</comment_count>
      <attachid>67947</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-20 14:37:28 -0700</bug_when>
    <thetext>Comment on attachment 67947
Patch

Some comments.  It looks like this file doesn&apos;t actually handle the resource loading itself, that&apos;s over in AudioBus.

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

&gt; WebCore/platform/audio/HRTFElevation.cpp:54
&gt; +    RefPtr&lt;HRTFKernel&gt; l1;

&quot;l1&quot; as in ell-one looks almost identical to 11 as in eleven in the code review tool&apos;s font.  Can you please rename these variables to something more descriptive?

&gt; WebCore/platform/audio/HRTFElevation.cpp:90
&gt; +    String resourceName = String::format(&quot;IRC_%s/IRC_%s_C_R0195_T%03d_P%03d.aif&quot;, subjectName.utf8().data(), subjectName.utf8().data(), azimuth, positiveElevation);

Going from UTF16 -&gt; UTF8 here in the formatting is unfortunate.  I think it&apos;d be better to format the numerical values (azimuth, positiveElevation) to Strings using String::number() and then append the strings together using operator+ or .append() or a StringBuilder.

I bring it up because I&apos;m not sure how format()&apos;s %s operator handles arbitrary UTF8 data.

Another approach would be to let the AudioBus class handle formatting a resource name, since it appears that it&apos;s responsible for doing the resource load.

&gt; WebCore/platform/audio/HRTFElevation.cpp:97
&gt; +        fprintf(stderr, &quot;Cannot read HRIR impulse response: %s\n&quot;, resourceName.utf8().data());
&gt; +        exit(-1);

I think you want ASSERT() here and an early-return in release builds.  That will crash in debug builds.

&gt; WebCore/platform/audio/HRTFElevation.cpp:198
&gt; +    bool checkX = x &gt;= 0.0 &amp;&amp; x &lt; 1.0;
&gt; +    ASSERT(checkX);
&gt; +    x = max(0.0, x);
&gt; +    x = min(1.0, x);

nit: this could all be one expression.  Additionally, if passing an out-of-bounds value is an error by the caller and causes an ASSERT() failure then you could assume that x is always in bounds in release builds and not clamp it.

&gt; WebCore/platform/audio/HRTFElevation.cpp:217
&gt; +    double angle1 = hrtfElevation1-&gt;elevationAngle();
&gt; +    double angle2 = hrtfElevation2-&gt;elevationAngle();
&gt; +    double angle = (1.0 - x) * angle1 + x * angle2;

These locals don&apos;t seem to add very much here.

&gt; WebCore/platform/audio/HRTFElevation.cpp:241
&gt; +    kernelL = (*m_kernelListL)[azimuthIndex].get();
&gt; +    kernelR = (*m_kernelListR)[azimuthIndex].get();

You can also do m_kernelListL-&gt;at(azimuthIndex) here and other places if you think that&apos;s prettier.

&gt; WebCore/platform/audio/HRTFElevation.h:67
&gt; +    void getKernelsFromAzimuth(double azimuthBlend, unsigned azimuthIndex, HRTFKernel* &amp;kernelL, HRTFKernel* &amp;kernelR, double&amp; frameDelayL, double&amp; frameDelayR);

Ah, I see.  These are two references to pointers to HRTFKernels and are being used as out parameters.  Whole lotta out params here.

&gt; WebCore/platform/audio/HRTFElevation.h:79
&gt; +    // Spacing, in degrees, between every azimuth loaded from resource.
&gt; +    static const unsigned AzimuthSpacing = 15;
&gt; +    
&gt; +    // Number of azimuths loaded from resource.
&gt; +    static const unsigned NumberOfRawAzimuths = 360 / AzimuthSpacing;
&gt; +
&gt; +    // Interpolates by this factor to get the total number of azimuths from every azimuth loaded from resource.
&gt; +    static const unsigned InterpolationFactor = 8;
&gt; +    
&gt; +    // Total number of azimuths after interpolation.
&gt; +    static const unsigned NumberOfTotalAzimuths = NumberOfRawAzimuths * InterpolationFactor;

I believe the all need storage declared in the .cpp.  You could also put the actual values in the .cpp to make the interface boundary a bit stronger.

&gt; WebCore/platform/audio/HRTFElevation.h:98
&gt; +    HRTFElevation()
&gt; +        : m_kernelListL(0)
&gt; +        , m_kernelListR(0)
&gt; +        , m_elevationAngle(0)
&gt; +        , m_sampleRate(44100.0)
&gt; +    {
&gt; +    }

Looks like this constructor is unused, can it be removed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282620</commentid>
    <comment_count>15</comment_count>
      <attachid>68303</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 16:27:57 -0700</bug_when>
    <thetext>Created attachment 68303
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282623</commentid>
    <comment_count>16</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-21 16:29:38 -0700</bug_when>
    <thetext>James, I think I&apos;ve addressed all of your comments.  I&apos;ve simplified the string formatting down as we discussed offline and added a comment there.

Thanks for your help!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282627</commentid>
    <comment_count>17</comment_count>
      <attachid>68303</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-21 16:31:24 -0700</bug_when>
    <thetext>Comment on attachment 68303
Patch

R=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282837</commentid>
    <comment_count>18</comment_count>
      <attachid>68303</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-22 01:46:08 -0700</bug_when>
    <thetext>Comment on attachment 68303
Patch

Clearing flags on attachment: 68303

Committed r68029: &lt;http://trac.webkit.org/changeset/68029&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282838</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-22 01:46:14 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67759</attachid>
            <date>2010-09-15 18:57:16 -0700</date>
            <delta_ts>2010-09-16 17:12:52 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45864-20100915185715.patch</filename>
            <type>text/plain</type>
            <size>20715</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzU5NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzEgQEAKKzIwMTAtMDktMTUgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURkVsZXZhdGlvbiBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NDU4NjQKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8g
QVBJIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9I
UlRGRWxldmF0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9u
OjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZh
dGlvbjo6Y2FsY3VsYXRlU3ltbWV0cmljS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6Y2FsY3VsYXRlS2VybmVsc0ZvckF6aW11dGhF
bGV2YXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6Y3JlYXRlRm9yU3Vi
amVjdCk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpjcmVhdGVCeUludGVycG9s
YXRpbmdTbGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6Z2V0S2VybmVs
c0Zyb21BemltdXRoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9IUlRGRWxldmF0aW9uLmg6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6a2VybmVsTGlzdEwpOgor
ICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6a2VybmVsTGlzdFIpOgorICAgICAgICAo
V2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6ZWxldmF0aW9uQW5nbGUpOgorICAgICAgICAoV2ViQ29y
ZTo6SFJURkVsZXZhdGlvbjo6bnVtYmVyT2ZBemltdXRocyk6CisgICAgICAgIChXZWJDb3JlOjpI
UlRGRWxldmF0aW9uOjpzYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRp
b246OmF6aW11dGhTcGFjaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246Om51
bWJlck9mUmF3QXppbXV0aHMpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6aW50
ZXJwb2xhdGlvbkZhY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpudW1i
ZXJPZlRvdGFsQXppbXV0aHMpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6SFJU
RkVsZXZhdGlvbik6CisKIDIwMTAtMDktMTUgIFNpbW9uIEZyYXNlciAgPHNpbW9uLmZyYXNlckBh
cHBsZS5jb20+CiAKICAgICAgICAgRml4IGNocm9taXVtIGJ1aWxkLgpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9hdWRpby9IUlRGRWxldmF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9hdWRpby9IUlRGRWxldmF0aW9uLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwy
OTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisj
aW5jbHVkZSAiSFJURkVsZXZhdGlvbi5oIgorCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKyNpbmNs
dWRlICJBdWRpb0ZpbGVSZWFkZXIuaCIKKyNpbmNsdWRlICJBdWRpb1Jlc291cmNlcy5oIgorI2lu
Y2x1ZGUgIkJpcXVhZC5oIgorI2luY2x1ZGUgIkZGVEZyYW1lLmgiCisjaW5jbHVkZSAiSFJURlBh
bm5lci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEludGVycG9sYXRl
cyB0d28ga2VybmVscyB3aXRoIHg6IDAgLT4gMSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorUGFz
c1JlZlB0cjxIUlRGS2VybmVsPiBIUlRGRWxldmF0aW9uOjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJu
ZWwoSFJURktlcm5lbCoga2VybmVsMSwgSFJURktlcm5lbCoga2VybmVsMiwgZG91YmxlIHgpCit7
CisgICAgQVNTRVJUKGtlcm5lbDEgJiYga2VybmVsMik7CisgICAgaWYgKCFrZXJuZWwxIHx8ICFr
ZXJuZWwyKQorICAgICAgICByZXR1cm4gMDsKKyAKKyAgICBib29sIGNoZWNrWCA9IHggPj0gMC4w
ICYmIHggPCAxLjA7CisgICAgQVNTRVJUKGNoZWNrWCk7CisgICAgaWYgKCFjaGVja1gpCisgICAg
ICAgIHggPSAwLjA7CisgICAgCisgICAgZG91YmxlIHNhbXBsZVJhdGUxID0ga2VybmVsMS0+c2Ft
cGxlUmF0ZSgpOworICAgIGRvdWJsZSBzYW1wbGVSYXRlMiA9IGtlcm5lbDItPnNhbXBsZVJhdGUo
KTsKKyAgICBBU1NFUlQoc2FtcGxlUmF0ZTEgPT0gc2FtcGxlUmF0ZTIpOworICAgIGlmIChzYW1w
bGVSYXRlMSAhPSBzYW1wbGVSYXRlMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgZG91
YmxlIGZyYW1lRGVsYXkgPSAoMS4wIC0geCkgKiBrZXJuZWwxLT5mcmFtZURlbGF5KCkgKyB4ICog
a2VybmVsMi0+ZnJhbWVEZWxheSgpOworICAgIAorICAgIE93blB0cjxGRlRGcmFtZT4gaW50ZXJw
b2xhdGVkRnJhbWUgPSBGRlRGcmFtZTo6Y3JlYXRlSW50ZXJwb2xhdGVkRnJhbWUoKmtlcm5lbDEt
PmZmdEZyYW1lKCksICprZXJuZWwyLT5mZnRGcmFtZSgpLCB4KTsKKyAgICByZXR1cm4gSFJURktl
cm5lbDo6Y3JlYXRlKGludGVycG9sYXRlZEZyYW1lLnJlbGVhc2UoKSwgZnJhbWVEZWxheSwgc2Ft
cGxlUmF0ZTEpOworfQorCisvLyBUYWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIHN5bW1ldHJ5IGFuZCBj
cmVhdGVzIGEgY29tcG9zaXRlIHZlcnNpb24gb2YgdGhlIHR3byBtZWFzdXJlZCB2ZXJzaW9ucy4g
IEZvciBleGFtcGxlLCB3ZSBoYXZlIGJvdGggYXppbXV0aCAzMCBhbmQgLTMwIGRlZ3JlZXMKKy8v
IHdoZXJlIHRoZSByb2xlcyBvZiBsZWZ0IGFuZCByaWdodCBlYXJzIGFyZSByZXZlcnNlZCB3aXRo
IHJlc3BlY3QgdG8gZWFjaCBvdGhlci4KK3ZvaWQgSFJURkVsZXZhdGlvbjo6Y2FsY3VsYXRlU3lt
bWV0cmljS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24oaW50IGF6aW11dGgsIGludCBlbGV2YXRp
b24sIGRvdWJsZSBzYW1wbGVSYXRlLCBjb25zdCBjaGFyKiBzdWJqZWN0TmFtZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UmVmUHRyPEhSVEZLZXJuZWw+JiBrZXJuZWxMLCBSZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbFIp
Cit7CisgICAgUmVmUHRyPEhSVEZLZXJuZWw+IGwxOworICAgIFJlZlB0cjxIUlRGS2VybmVsPiBy
MTsKKyAgICBjYWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihhemltdXRoLCBlbGV2
YXRpb24sIHNhbXBsZVJhdGUsIHN1YmplY3ROYW1lLCBsMSwgcjEpOworCisgICAgLy8gQW5kIHN5
bW1ldHJpYyB2ZXJzaW9uCisgICAgaW50IHN5bW1ldHJpY0F6aW11dGggPSAhYXppbXV0aCA/IDAg
OiAzNjAgLSBhemltdXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBSZWZQdHI8SFJURktlcm5lbD4gbDI7CisgICAg
UmVmUHRyPEhSVEZLZXJuZWw+IHIyOworICAgIGNhbGN1bGF0ZUtlcm5lbHNGb3JBemltdXRoRWxl
dmF0aW9uKHN5bW1ldHJpY0F6aW11dGgsIGVsZXZhdGlvbiwgc2FtcGxlUmF0ZSwgc3ViamVjdE5h
bWUsIGwyLCByMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8vIE5vdGljZSBM
L1IgcmV2ZXJzYWwgaW4gc3ltbWV0cmljIHZlcnNpb24uCisgICAga2VybmVsTCA9IGNyZWF0ZUlu
dGVycG9sYXRlZEtlcm5lbChsMS5nZXQoKSwgcjIuZ2V0KCksIDAuNSk7CisgICAga2VybmVsUiA9
IGNyZWF0ZUludGVycG9sYXRlZEtlcm5lbChyMS5nZXQoKSwgbDIuZ2V0KCksIDAuNSk7Cit9CisK
K3ZvaWQgSFJURkVsZXZhdGlvbjo6Y2FsY3VsYXRlS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24o
aW50IGF6aW11dGgsIGludCBlbGV2YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRlLCBjb25zdCBjaGFy
KiBzdWJqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgUmVmUHRyPEhSVEZLZXJuZWw+JiBrZXJuZWxMLCBSZWZQdHI8SFJURktl
cm5lbD4mIGtlcm5lbFIpCit7CisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBhemltdXRoIGFyZSAw
IC0+IDM0NSBpbiAxNSBkZWdyZWUgaW5jcmVtZW50cy4KKyAgICAvLyBWYWxpZCB2YWx1ZXMgZm9y
IGVsZXZhdGlvbiBhcmUgLTQ1IC0+ICs5MCBpbiAxNSBkZWdyZWUgaW5jcmVtZW50cy4KKworICAg
IGJvb2wgaXNBemltdXRoR29vZCA9IGF6aW11dGggPj0gMCAmJiBhemltdXRoIDw9IDM0NSAmJiAo
YXppbXV0aCAvIDE1KSAqIDE1ID09IGF6aW11dGg7CisgICAgQVNTRVJUKGlzQXppbXV0aEdvb2Qp
OworICAgIGlmICghaXNBemltdXRoR29vZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9vbCBp
c0VsZXZhdGlvbkdvb2QgPSBlbGV2YXRpb24gPj0gLTQ1ICYmIGVsZXZhdGlvbiA8PSA5MCAmJiAo
ZWxldmF0aW9uIC8gMTUpICogMTUgPT0gZWxldmF0aW9uOworICAgIEFTU0VSVChpc0VsZXZhdGlv
bkdvb2QpOworICAgIGlmICghaXNFbGV2YXRpb25Hb29kKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBjaGFyKiByZXNvdXJjZVBhdGggPSBnZXRBdWRpb1NwYXRpYWxpemF0aW9uUmVzb3Vy
Y2VQYXRoKCk7CisgICAgICAgICAgICAKKyAgICBjaGFyIGhyaXJTdWJEaXJlY3RvcnlbMTAyNF07
CisgICAgaWYgKHJlc291cmNlUGF0aCkKKyAgICAgICAgc25wcmludGYoaHJpclN1YkRpcmVjdG9y
eSwgc2l6ZW9mKGhyaXJTdWJEaXJlY3RvcnkpLCAiJXMvSVJDXyVzIiwgcmVzb3VyY2VQYXRoLCBz
dWJqZWN0TmFtZSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIEZJWE1FIC0gbmVlZCBiZXR0ZXIg
ZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJIUklSIHJlc291cmNlIGRp
cmVjdG9yeSBub3QgZm91bmQhXG4iKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgfQorICAgIAor
ICAgIGludCBwb3NpdGl2ZUVsZXZhdGlvbiA9IGVsZXZhdGlvbiA8IDAgPyBlbGV2YXRpb24gKyAz
NjAgOiBlbGV2YXRpb247CisgICAgCisgICAgY2hhciBmaWxlUGF0aFsxMDI0XTsKKyAgICBzbnBy
aW50ZihmaWxlUGF0aCwgc2l6ZW9mKGZpbGVQYXRoKSwgIiVzL0lSQ18lc19DX1IwMTk1X1QlMDNk
X1AlMDNkLmFpZiIsIGhyaXJTdWJEaXJlY3RvcnksIHN1YmplY3ROYW1lLCBhemltdXRoLCBwb3Np
dGl2ZUVsZXZhdGlvbik7CisgICAgCisgICAgT3duUHRyPEF1ZGlvQnVzPiBpbXB1bHNlUmVzcG9u
c2UoY3JlYXRlQnVzRnJvbUF1ZGlvRmlsZShmaWxlUGF0aCwgZmFsc2UsIHNhbXBsZVJhdGUpKTsK
KyAgICBpZiAoIWltcHVsc2VSZXNwb25zZS5nZXQoKSkgeworICAgICAgICAvLyBGSVhNRSAtIG5l
ZWQgYmV0dGVyIGVycm9yIHJlY292ZXJ5CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90
IHJlYWQgSFJJUiBpbXB1bHNlIHJlc3BvbnNlOiAlc1xuIiwgZmlsZVBhdGgpOworICAgICAgICBl
eGl0KC0xKTsKKyAgICB9CisgICAgCisgICAgc2l6ZV90IHJlc3BvbnNlTGVuZ3RoID0gaW1wdWxz
ZVJlc3BvbnNlLT5sZW5ndGgoKTsKKworICAgIC8vIENoZWNrIG51bWJlciBvZiBjaGFubmVscyBh
bmQgbGVuZ3RoLiAgRm9yIG5vdyB0aGVzZSBhcmUgZml4ZWQgYW5kIGtub3duLgorICAgIGlmIChy
ZXNwb25zZUxlbmd0aCAhPSA1MTIgfHwgaW1wdWxzZVJlc3BvbnNlLT5udW1iZXJPZkNoYW5uZWxz
KCkgIT0gMikgeworICAgICAgICAvLyBGSVhNRSAtIG5lZWQgYmV0dGVyIGVycm9yIHJlY292ZXJ5
CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSFJJUiBpbXB1bHNlIHJlc3BvbnNlIGZpbGVzIGFy
ZSBub3Qgc3RlcmVvIGFuZCBsZW5ndGggNTEyIVxuIik7CisgICAgICAgIGV4aXQoLTEpOworICAg
IH0KKyAgICAKKyAgICBmbG9hdCogbGVmdEVhckltcHVsc2VSZXNwb25zZSA9IGltcHVsc2VSZXNw
b25zZS0+Y2hhbm5lbEJ5VHlwZShBdWRpb0J1czo6Q2hhbm5lbExlZnQpLT5kYXRhKCk7CisgICAg
ZmxvYXQqIHJpZ2h0RWFySW1wdWxzZVJlc3BvbnNlID0gaW1wdWxzZVJlc3BvbnNlLT5jaGFubmVs
QnlUeXBlKEF1ZGlvQnVzOjpDaGFubmVsUmlnaHQpLT5kYXRhKCk7CisKKyAgICAvLyBOb3RlIHRo
YXQgZGVwZW5kaW5nIG9uIHRoZSBmZnRTaXplIHJldHVybmVkIGJ5IHRoZSBwYW5uZXIsIHdlIG1h
eSBiZSB0cnVuY2F0aW5nIHRoZSBpbXB1bHNlIHJlc3BvbnNlIHdlIGp1c3QgbG9hZGVkIGluLgor
ICAgIGNvbnN0IHNpemVfdCBmZnRTaXplID0gSFJURlBhbm5lcjo6ZmZ0U2l6ZUZvclNhbXBsZVJh
dGUoc2FtcGxlUmF0ZSk7CisgICAga2VybmVsTCA9IEhSVEZLZXJuZWw6OmNyZWF0ZShsZWZ0RWFy
SW1wdWxzZVJlc3BvbnNlLCByZXNwb25zZUxlbmd0aCwgZmZ0U2l6ZSwgc2FtcGxlUmF0ZSwgdHJ1
ZSk7CisgICAga2VybmVsUiA9IEhSVEZLZXJuZWw6OmNyZWF0ZShyaWdodEVhckltcHVsc2VSZXNw
b25zZSwgcmVzcG9uc2VMZW5ndGgsIGZmdFNpemUsIHNhbXBsZVJhdGUsIHRydWUpOworfQorCisv
LyBUaGUgcmFuZ2Ugb2YgZWxldmF0aW9ucyBmb3IgdGhlIElSQ0FNIGltcHVsc2UgcmVzcG9uc2Vz
IHZhcmllcyBkZXBlbmRpbmcgb24gYXppbXV0aCwgYnV0IHRoZSBtaW5pbXVtIGVsZXZhdGlvbiBh
cHBlYXJzIHRvIGFsd2F5cyBiZSAtNDUuCisvLworLy8gSGVyZSdzIGhvdyBpdCBnb2VzOgorc3Rh
dGljIGludCBtYXhFbGV2YXRpb25zW10gPSB7CisgICAgICAgIC8vICBBemltdXRoCisgICAgICAg
IC8vCisgICAgOTAsIC8vIDAgIAorICAgIDQ1LCAvLyAxNSAKKyAgICA2MCwgLy8gMzAgCisgICAg
NDUsIC8vIDQ1IAorICAgIDc1LCAvLyA2MCAKKyAgICA0NSwgLy8gNzUgCisgICAgNjAsIC8vIDkw
IAorICAgIDQ1LCAvLyAxMDUgCisgICAgNzUsIC8vIDEyMCAKKyAgICA0NSwgLy8gMTM1IAorICAg
IDYwLCAvLyAxNTAgCisgICAgNDUsIC8vIDE2NSAKKyAgICA3NSwgLy8gMTgwIAorICAgIDQ1LCAv
LyAxOTUgCisgICAgNjAsIC8vIDIxMCAKKyAgICA0NSwgLy8gMjI1IAorICAgIDc1LCAvLyAyNDAg
CisgICAgNDUsIC8vIDI1NSAKKyAgICA2MCwgLy8gMjcwIAorICAgIDQ1LCAvLyAyODUgCisgICAg
NzUsIC8vIDMwMCAKKyAgICA0NSwgLy8gMzE1IAorICAgIDYwLCAvLyAzMzAgCisgICAgNDUgLy8g
IDM0NSAKK307CisKK1Bhc3NPd25QdHI8SFJURkVsZXZhdGlvbj4gSFJURkVsZXZhdGlvbjo6Y3Jl
YXRlRm9yU3ViamVjdChjb25zdCBjaGFyKiBzdWJqZWN0TmFtZSwgaW50IGVsZXZhdGlvbiwgZG91
YmxlIHNhbXBsZVJhdGUpCit7CisgICAgQVNTRVJUKHN1YmplY3ROYW1lKTsKKyAgICBpZiAoIXN1
YmplY3ROYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisgICAgYm9vbCBpc0VsZXZh
dGlvbkdvb2QgPSBlbGV2YXRpb24gPj0gLTQ1ICYmIGVsZXZhdGlvbiA8PSA5MCAmJiAoZWxldmF0
aW9uIC8gMTUpICogMTUgPT0gZWxldmF0aW9uOworICAgIEFTU0VSVChpc0VsZXZhdGlvbkdvb2Qp
OworICAgIGlmICghaXNFbGV2YXRpb25Hb29kKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
CisgICAgT3duUHRyPEhSVEZLZXJuZWxMaXN0PiBrZXJuZWxMaXN0TCA9IGFkb3B0UHRyKG5ldyBI
UlRGS2VybmVsTGlzdChudW1iZXJPZlRvdGFsQXppbXV0aHMoKSkpOworICAgIE93blB0cjxIUlRG
S2VybmVsTGlzdD4ga2VybmVsTGlzdFIgPSBhZG9wdFB0cihuZXcgSFJURktlcm5lbExpc3QobnVt
YmVyT2ZUb3RhbEF6aW11dGhzKCkpKTsKKworICAgIC8vIExvYWQgY29udm9sdXRpb24ga2VybmVs
cyBmcm9tIEhSVEYgZmlsZXMuCisgICAgaW50IGludGVycG9sYXRlZEluZGV4ID0gMDsKKyAgICBm
b3IgKHVuc2lnbmVkIHJhd0luZGV4ID0gMDsgcmF3SW5kZXggPCBudW1iZXJPZlJhd0F6aW11dGhz
KCk7ICsrcmF3SW5kZXgpIHsKKyAgICAgICAgLy8gRG9uJ3QgbGV0IGVsZXZhdGlvbiBleGNlZWQg
bWF4aW11bSBmb3IgdGhpcyBhemltdXRoLgorICAgICAgICBpbnQgbWF4RWxldmF0aW9uID0gbWF4
RWxldmF0aW9uc1tyYXdJbmRleF07CisgICAgICAgIGludCBhY3R1YWxFbGV2YXRpb24gPSBzdGQ6
Om1pbihlbGV2YXRpb24sIG1heEVsZXZhdGlvbik7CisKKyAgICAgICAgY2FsY3VsYXRlS2VybmVs
c0ZvckF6aW11dGhFbGV2YXRpb24ocmF3SW5kZXggKiBhemltdXRoU3BhY2luZygpLCBhY3R1YWxF
bGV2YXRpb24sIHNhbXBsZVJhdGUsIHN1YmplY3ROYW1lLCAoKmtlcm5lbExpc3RMKVtpbnRlcnBv
bGF0ZWRJbmRleF0sICgqa2VybmVsTGlzdFIpW2ludGVycG9sYXRlZEluZGV4XSk7CisKKyAgICAg
ICAgaW50ZXJwb2xhdGVkSW5kZXggKz0gaW50ZXJwb2xhdGlvbkZhY3RvcigpOworICAgIH0KKwor
ICAgIC8vIE5vdyBnbyBiYWNrIGFuZCBpbnRlcnBvbGF0ZSBpbnRlcm1lZGlhdGUgYXppbXV0aCB2
YWx1ZXMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bWJlck9mVG90YWxBemltdXRo
cygpOyBpICs9IGludGVycG9sYXRpb25GYWN0b3IoKSkgeworICAgICAgICBpbnQgaiA9IChpICsg
aW50ZXJwb2xhdGlvbkZhY3RvcigpKSAlIG51bWJlck9mVG90YWxBemltdXRocygpOworCisgICAg
ICAgIC8vIENyZWF0ZSB0aGUgaW50ZXJwb2xhdGVkIGNvbnZvbHV0aW9uIGtlcm5lbHMgYW5kIGRl
bGF5cy4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBqaiA9IDE7IGpqIDwgaW50ZXJwb2xhdGlvbkZh
Y3RvcigpOyArK2pqKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IGRvdWJsZShqaikgLyBkb3Vi
bGUoaW50ZXJwb2xhdGlvbkZhY3RvcigpKTsgLy8gaW50ZXJwb2xhdGUgZnJvbSAwIC0+IDEKKwor
ICAgICAgICAgICAgKCprZXJuZWxMaXN0TClbaSArIGpqXSA9IGNyZWF0ZUludGVycG9sYXRlZEtl
cm5lbCgoKmtlcm5lbExpc3RMKVtpXS5nZXQoKSwgKCprZXJuZWxMaXN0TClbal0uZ2V0KCksIHgp
OworICAgICAgICAgICAgKCprZXJuZWxMaXN0UilbaSArIGpqXSA9IGNyZWF0ZUludGVycG9sYXRl
ZEtlcm5lbCgoKmtlcm5lbExpc3RSKVtpXS5nZXQoKSwgKCprZXJuZWxMaXN0Uilbal0uZ2V0KCks
IHgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIE93blB0cjxIUlRGRWxldmF0aW9uPiBo
cnRmRWxldmF0aW9uID0gYWRvcHRQdHIobmV3IEhSVEZFbGV2YXRpb24oa2VybmVsTGlzdEwucmVs
ZWFzZSgpLCBrZXJuZWxMaXN0Ui5yZWxlYXNlKCksIGVsZXZhdGlvbiwgc2FtcGxlUmF0ZSkpOwor
ICAgIHJldHVybiBocnRmRWxldmF0aW9uLnJlbGVhc2UoKTsKK30KKworUGFzc093blB0cjxIUlRG
RWxldmF0aW9uPiBIUlRGRWxldmF0aW9uOjpjcmVhdGVCeUludGVycG9sYXRpbmdTbGljZXMoSFJU
RkVsZXZhdGlvbiogaHJ0ZkVsZXZhdGlvbjEsIEhSVEZFbGV2YXRpb24qIGhydGZFbGV2YXRpb24y
LCBkb3VibGUgeCwgZG91YmxlIHNhbXBsZVJhdGUpCit7CisgICAgQVNTRVJUKGhydGZFbGV2YXRp
b24xICYmIGhydGZFbGV2YXRpb24yKTsKKyAgICBpZiAoIWhydGZFbGV2YXRpb24xIHx8ICFocnRm
RWxldmF0aW9uMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIAorICAgIGJvb2wgY2hlY2tY
ID0geCA+PSAwLjAgJiYgeCA8IDEuMDsKKyAgICBBU1NFUlQoY2hlY2tYKTsKKyAgICBpZiAoIWNo
ZWNrWCkKKyAgICAgICAgeCA9IDAuMDsKKyAgICAKKyAgICBPd25QdHI8SFJURktlcm5lbExpc3Q+
IGtlcm5lbExpc3RMID0gYWRvcHRQdHIobmV3IEhSVEZLZXJuZWxMaXN0KG51bWJlck9mVG90YWxB
emltdXRocygpKSk7CisgICAgT3duUHRyPEhSVEZLZXJuZWxMaXN0PiBrZXJuZWxMaXN0UiA9IGFk
b3B0UHRyKG5ldyBIUlRGS2VybmVsTGlzdChudW1iZXJPZlRvdGFsQXppbXV0aHMoKSkpOworCisg
ICAgSFJURktlcm5lbExpc3QqIGtlcm5lbExpc3RMMSA9IGhydGZFbGV2YXRpb24xLT5rZXJuZWxM
aXN0TCgpOworICAgIEhSVEZLZXJuZWxMaXN0KiBrZXJuZWxMaXN0UjEgPSBocnRmRWxldmF0aW9u
MS0+a2VybmVsTGlzdFIoKTsKKyAgICBIUlRGS2VybmVsTGlzdCoga2VybmVsTGlzdEwyID0gaHJ0
ZkVsZXZhdGlvbjItPmtlcm5lbExpc3RMKCk7CisgICAgSFJURktlcm5lbExpc3QqIGtlcm5lbExp
c3RSMiA9IGhydGZFbGV2YXRpb24yLT5rZXJuZWxMaXN0UigpOworICAgIAorICAgIC8vIEludGVy
cG9sYXRlIGtlcm5lbHMgb2YgY29ycmVzcG9uZGluZyBhemltdXRocyBvZiB0aGUgdHdvIGVsZXZh
dGlvbnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bWJlck9mVG90YWxBemltdXRo
cygpOyArK2kpIHsKKyAgICAgICAgKCprZXJuZWxMaXN0TClbaV0gPSBjcmVhdGVJbnRlcnBvbGF0
ZWRLZXJuZWwoKCprZXJuZWxMaXN0TDEpW2ldLmdldCgpLCAoKmtlcm5lbExpc3RMMilbaV0uZ2V0
KCksIHgpOworICAgICAgICAoKmtlcm5lbExpc3RSKVtpXSA9IGNyZWF0ZUludGVycG9sYXRlZEtl
cm5lbCgoKmtlcm5lbExpc3RSMSlbaV0uZ2V0KCksICgqa2VybmVsTGlzdFIyKVtpXS5nZXQoKSwg
eCk7CisgICAgfQorCisgICAgLy8gSW50ZXJwb2xhdGUgZWxldmF0aW9uIGFuZ2xlLgorICAgIGRv
dWJsZSBhbmdsZTEgPSBocnRmRWxldmF0aW9uMS0+ZWxldmF0aW9uQW5nbGUoKTsKKyAgICBkb3Vi
bGUgYW5nbGUyID0gaHJ0ZkVsZXZhdGlvbjItPmVsZXZhdGlvbkFuZ2xlKCk7CisgICAgZG91Ymxl
IGFuZ2xlID0gKDEuMCAtIHgpICogYW5nbGUxICsgeCAqIGFuZ2xlMjsKKyAgICAKKyAgICBPd25Q
dHI8SFJURkVsZXZhdGlvbj4gaHJ0ZkVsZXZhdGlvbiA9IGFkb3B0UHRyKG5ldyBIUlRGRWxldmF0
aW9uKGtlcm5lbExpc3RMLnJlbGVhc2UoKSwga2VybmVsTGlzdFIucmVsZWFzZSgpLCBhbmdsZSwg
c2FtcGxlUmF0ZSkpOworICAgIHJldHVybiBocnRmRWxldmF0aW9uLnJlbGVhc2UoKTsgIAorfQor
Cit2b2lkIEhSVEZFbGV2YXRpb246OmdldEtlcm5lbHNGcm9tQXppbXV0aChkb3VibGUgYXppbXV0
aEJsZW5kLCB1bnNpZ25lZCBhemltdXRoSW5kZXgsIEhSVEZLZXJuZWwqICZrZXJuZWxMLCBIUlRG
S2VybmVsKiAma2VybmVsUiwgZG91YmxlJiBmcmFtZURlbGF5TCwgZG91YmxlJiBmcmFtZURlbGF5
UikKK3sKKyAgICBib29sIGNoZWNrQXppbXV0aEJsZW5kID0gYXppbXV0aEJsZW5kID49IDAuMCAm
JiBhemltdXRoQmxlbmQgPCAxLjA7CisgICAgQVNTRVJUKGNoZWNrQXppbXV0aEJsZW5kKTsKKyAg
ICBpZiAoIWNoZWNrQXppbXV0aEJsZW5kKQorICAgICAgICBhemltdXRoQmxlbmQgPSAwLjA7Cisg
ICAgCisgICAgSFJURktlcm5lbExpc3QmIGtlcm5lbExpc3RMID0gKnRoaXMtPmtlcm5lbExpc3RM
KCk7CisgICAgSFJURktlcm5lbExpc3QmIGtlcm5lbExpc3RSID0gKnRoaXMtPmtlcm5lbExpc3RS
KCk7CisgICAgdW5zaWduZWQgbnVtS2VybmVscyA9IGtlcm5lbExpc3RMLnNpemUoKTsKKworICAg
IGJvb2wgaXNJbmRleEdvb2QgPSBhemltdXRoSW5kZXggPCBudW1LZXJuZWxzOworICAgIEFTU0VS
VChpc0luZGV4R29vZCk7CisgICAgaWYgKCFpc0luZGV4R29vZCkgeworICAgICAgICBrZXJuZWxM
ID0gMDsKKyAgICAgICAga2VybmVsUiA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
CisgICAga2VybmVsTCA9IGtlcm5lbExpc3RMW2F6aW11dGhJbmRleF0uZ2V0KCk7CisgICAga2Vy
bmVsUiA9IGtlcm5lbExpc3RSW2F6aW11dGhJbmRleF0uZ2V0KCk7CisgICAgZnJhbWVEZWxheUwg
PSBrZXJuZWxMaXN0TFthemltdXRoSW5kZXhdLT5mcmFtZURlbGF5KCk7CisgICAgZnJhbWVEZWxh
eVIgPSBrZXJuZWxMaXN0UlthemltdXRoSW5kZXhdLT5mcmFtZURlbGF5KCk7CisKKyAgICBpbnQg
YXppbXV0aEluZGV4MiA9IChhemltdXRoSW5kZXggKyAxKSAlIG51bUtlcm5lbHM7CisgICAgZG91
YmxlIGZyYW1lRGVsYXkyTCA9IGtlcm5lbExpc3RMW2F6aW11dGhJbmRleDJdLT5mcmFtZURlbGF5
KCk7CisgICAgZG91YmxlIGZyYW1lRGVsYXkyUiA9IGtlcm5lbExpc3RSW2F6aW11dGhJbmRleDJd
LT5mcmFtZURlbGF5KCk7CisKKyAgICAvLyBMaW5lYXJseSBpbnRlcnBvbGF0ZSBkZWxheXMuCisg
ICAgZnJhbWVEZWxheUwgPSAoMS4wIC0gYXppbXV0aEJsZW5kKSAqIGZyYW1lRGVsYXlMICsgYXpp
bXV0aEJsZW5kICogZnJhbWVEZWxheTJMOworICAgIGZyYW1lRGVsYXlSID0gKDEuMCAtIGF6aW11
dGhCbGVuZCkgKiBmcmFtZURlbGF5UiArIGF6aW11dGhCbGVuZCAqIGZyYW1lRGVsYXkyUjsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkVsZXZhdGlvbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkVsZXZhdGlvbi5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRWxldmF0aW9uLmgJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBIUlRGRWxldmF0aW9uX2gKKyNkZWZpbmUgSFJURkVs
ZXZhdGlvbl9oCisKKyNpbmNsdWRlICJIUlRGS2VybmVsLmgiCisjaW5jbHVkZSA8d3RmL093blB0
ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQ
dHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBIUlRGRWxldmF0aW9uIGNvbnRhaW5zIGFs
bCBvZiB0aGUgSFJURktlcm5lbHMgKG9uZSBsZWZ0IGVhciBhbmQgb25lIHJpZ2h0IGVhciBwZXIg
YXppbXV0aCBhbmdsZSkgZm9yIGEgcGFydGljdWxhciBlbGV2YXRpb24uCisKK2NsYXNzIEhSVEZF
bGV2YXRpb24geworcHVibGljOgorICAgIC8vIExvYWRzIGFuZCByZXR1cm5zIGFuIEhSVEZFbGV2
YXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgZWxldmF0aW9uIGZyb20gYnJvd3NlciByZXNv
dXJjZXMuCisgICAgLy8gSW50ZXJwb2xhdGVkIGF6aW11dGhzIHdpbGwgYmUgZ2VuZXJhdGVkIGJh
c2VkIG9uIGludGVycG9sYXRpb25GYWN0b3IoKS4KKyAgICAvLyBWYWxpZCB2YWx1ZXMgZm9yIGVs
ZXZhdGlvbiBhcmUgLTQ1IC0+ICs5MCBpbiAxNSBkZWdyZWUgaW5jcmVtZW50cy4KKyAgICBzdGF0
aWMgUGFzc093blB0cjxIUlRGRWxldmF0aW9uPiBjcmVhdGVGb3JTdWJqZWN0KGNvbnN0IGNoYXIq
IHN1YmplY3ROYW1lLCBpbnQgZWxldmF0aW9uLCBkb3VibGUgc2FtcGxlUmF0ZSk7CisKKyAgICAv
LyBHaXZlbiB0d28gSFJURkVsZXZhdGlvbnMsIGFuZCBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciB4
OiAwIC0+IDEsIHJldHVybnMgYW4gaW50ZXJwb2xhdGVkIEhSVEZFbGV2YXRpb24uCisgICAgc3Rh
dGljIFBhc3NPd25QdHI8SFJURkVsZXZhdGlvbj4gY3JlYXRlQnlJbnRlcnBvbGF0aW5nU2xpY2Vz
KEhSVEZFbGV2YXRpb24qIGhydGZFbGV2YXRpb24xLCBIUlRGRWxldmF0aW9uKiBocnRmRWxldmF0
aW9uMiwgZG91YmxlIHgsIGRvdWJsZSBzYW1wbGVSYXRlKTsKKworICAgIC8vIFJldHVybnMgdGhl
IGxpc3Qgb2YgbGVmdCBvciByaWdodCBlYXIgSFJURktlcm5lbHMgZm9yIGFsbCB0aGUgYXppbXV0
aHMgZ29pbmcgZnJvbSAwIHRvIDM2MCBkZWdyZWVzLgorICAgIEhSVEZLZXJuZWxMaXN0KiBrZXJu
ZWxMaXN0TCgpIHsgcmV0dXJuIG1fa2VybmVsTGlzdEwuZ2V0KCk7IH0KKyAgICBIUlRGS2VybmVs
TGlzdCoga2VybmVsTGlzdFIoKSB7IHJldHVybiBtX2tlcm5lbExpc3RSLmdldCgpOyB9CisKKyAg
ICBkb3VibGUgZWxldmF0aW9uQW5nbGUoKSBjb25zdCB7IHJldHVybiBtX2VsZXZhdGlvbkFuZ2xl
OyB9CisgICAgdW5zaWduZWQgbnVtYmVyT2ZBemltdXRocygpIHsgcmV0dXJuIG51bWJlck9mVG90
YWxBemltdXRocygpOyB9CisgICAgZG91YmxlIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBt
X3NhbXBsZVJhdGU7IH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIHRoZSBsZWZ0IGFuZCByaWdodCBr
ZXJuZWxzIGZvciB0aGUgZ2l2ZW4gYXppbXV0aCBpbmRleC4KKyAgICAvLyBUaGUgaW50ZXJwb2xh
dGVkIGRlbGF5cyBiYXNlZCBvbiBhemltdXRoQmxlbmQ6IDAgLT4gMSBhcmUgcmV0dXJuZWQgaW4g
ZnJhbWVEZWxheUwgYW5kIGZyYW1lRGVsYXlSLgorICAgIHZvaWQgZ2V0S2VybmVsc0Zyb21Bemlt
dXRoKGRvdWJsZSBhemltdXRoQmxlbmQsIHVuc2lnbmVkIGF6aW11dGhJbmRleCwgSFJURktlcm5l
bCogJmtlcm5lbEwsIEhSVEZLZXJuZWwqICZrZXJuZWxSLCBkb3VibGUmIGZyYW1lRGVsYXlMLCBk
b3VibGUmIGZyYW1lRGVsYXlSKTsKKyAgICAKKyAgICAvLyBTcGFjaW5nLCBpbiBkZWdyZWVzLCBi
ZXR3ZWVuIGV2ZXJ5IGF6aW11dGggbG9hZGVkIGZyb20gcmVzb3VyY2UuCisgICAgc3RhdGljIHVu
c2lnbmVkIGF6aW11dGhTcGFjaW5nKCkgeyByZXR1cm4gMTU7IH0KKyAgICAKKyAgICAvLyBOdW1i
ZXIgb2YgYXppbXV0aHMgbG9hZGVkIGZyb20gcmVzb3VyY2UuCisgICAgc3RhdGljIHVuc2lnbmVk
IG51bWJlck9mUmF3QXppbXV0aHMoKSB7IHJldHVybiAzNjAgLyBhemltdXRoU3BhY2luZygpOyB9
CisKKyAgICAvLyBJbnRlcnBvbGF0ZXMgYnkgdGhpcyBmYWN0b3IgdG8gZ2V0IHRoZSB0b3RhbCBu
dW1iZXIgb2YgYXppbXV0aHMgZnJvbSBldmVyeSBhemltdXRoIGxvYWRlZCBmcm9tIHJlc291cmNl
LgorICAgIHN0YXRpYyB1bnNpZ25lZCBpbnRlcnBvbGF0aW9uRmFjdG9yKCkgeyByZXR1cm4gODsg
fSAgICAKKyAgICAKKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgYXppbXV0aHMgYWZ0ZXIgaW50ZXJw
b2xhdGlvbi4KKyAgICBzdGF0aWMgdW5zaWduZWQgbnVtYmVyT2ZUb3RhbEF6aW11dGhzKCkgeyBy
ZXR1cm4gbnVtYmVyT2ZSYXdBemltdXRocygpICogaW50ZXJwb2xhdGlvbkZhY3RvcigpOyB9CisK
KyAgICAvLyBHaXZlbiB0d28gSFJURktlcm5lbHMsIGFuZCBhbiBpbnRlcnBvbGF0aW9uIGZhY3Rv
ciB4OiAwIC0+IDEsIHJldHVybnMgYW4gaW50ZXJwb2xhdGVkIEhSVEZLZXJuZWwuCisgICAgc3Rh
dGljIFBhc3NSZWZQdHI8SFJURktlcm5lbD4gY3JlYXRlSW50ZXJwb2xhdGVkS2VybmVsKEhSVEZL
ZXJuZWwqIGtlcm5lbDEsIEhSVEZLZXJuZWwqIGtlcm5lbDIsIGRvdWJsZSB4KTsKKyAgCisgICAg
Ly8gR2l2ZW4gYSBzcGVjaWZpYyBhemltdXRoIGFuZCBlbGV2YXRpb24gYW5nbGUsIHJldHVybnMg
dGhlIGxlZnQgYW5kIHJpZ2h0IEhSVEZLZXJuZWwuCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBh
emltdXRoIGFyZSAwIC0+IDM0NSBpbiAxNSBkZWdyZWUgaW5jcmVtZW50cy4KKyAgICAvLyBWYWxp
ZCB2YWx1ZXMgZm9yIGVsZXZhdGlvbiBhcmUgLTQ1IC0+ICs5MCBpbiAxNSBkZWdyZWUgaW5jcmVt
ZW50cy4KKyAgICBzdGF0aWMgdm9pZCBjYWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlv
bihpbnQgYXppbXV0aCwgaW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJhdGUsIGNvbnN0IGNo
YXIqIHN1YmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsTCwgUmVmUHRyPEhSVEZLZXJu
ZWw+JiBrZXJuZWxSKTsKKworICAgIC8vIEdpdmVuIGEgc3BlY2lmaWMgYXppbXV0aCBhbmQgZWxl
dmF0aW9uIGFuZ2xlLCByZXR1cm5zIHRoZSBsZWZ0IGFuZCByaWdodCBIUlRGS2VybmVsIGluIGtl
cm5lbEwgYW5kIGtlcm5lbFIuCisgICAgLy8gVGhpcyBtZXRob2QgYXZlcmFnZXMgdGhlIG1lYXN1
cmVkIHJlc3BvbnNlIHVzaW5nIHN5bW1ldHJ5IG9mIGF6aW11dGggKGZvciBleGFtcGxlIGJ5IGF2
ZXJhZ2luZyB0aGUgLTMwLjAgYW5kICszMC4wIGF6aW11dGggcmVzcG9uc2VzKS4KKyAgICBzdGF0
aWMgdm9pZCBjYWxjdWxhdGVTeW1tZXRyaWNLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihpbnQg
YXppbXV0aCwgaW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJhdGUsIGNvbnN0IGNoYXIqIHN1
YmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsTCwgUmVmUHRyPEhSVEZL
ZXJuZWw+JiBrZXJuZWxSKTsKKworICAgIC8vIEZvciB0ZXN0aW5nIC8gZGV2ZWxvcG1lbnQuICBO
b3QgY29tcGlsZWQgLyBsaW5rZWQgaW4gbm9ybWFsIHVzYWdlLgorICAgIHZvaWQgd3JpdGVIUklS
RmlsZXMoY29uc3QgY2hhciogc3ViamVjdE5hbWUpOworCitwcml2YXRlOgorICAgIC8vIEZvciB0
ZXN0aW5nIC8gZGV2ZWxvcG1lbnQuICBOb3QgY29tcGlsZWQgLyBsaW5rZWQgaW4gbm9ybWFsIHVz
YWdlLgorICAgIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZUNvbXBvc2l0ZUhSVEYoZG91YmxlIGF6aW11
dGgsIGludCBlbGV2YXRpb24sIGludCBhY3R1YWxFbGV2YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmUHRyPEhSVEZLZXJu
ZWw+JiBrZXJuZWxMLCBSZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbFIpOworICAgIAorICAgIEhS
VEZFbGV2YXRpb24oKQorICAgICAgICA6IG1fa2VybmVsTGlzdEwoMCkKKyAgICAgICAgLCBtX2tl
cm5lbExpc3RSKDApCisgICAgICAgICwgbV9lbGV2YXRpb25BbmdsZSgwKQorICAgICAgICAsIG1f
c2FtcGxlUmF0ZSg0NDEwMC4wKQorICAgIHsKKyAgICB9CisKKyAgICBIUlRGRWxldmF0aW9uKFBh
c3NPd25QdHI8SFJURktlcm5lbExpc3Q+IGtlcm5lbExpc3RMLCBQYXNzT3duUHRyPEhSVEZLZXJu
ZWxMaXN0PiBrZXJuZWxMaXN0UiwgaW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJhdGUpCisg
ICAgICAgIDogbV9rZXJuZWxMaXN0TChrZXJuZWxMaXN0TCkKKyAgICAgICAgLCBtX2tlcm5lbExp
c3RSKGtlcm5lbExpc3RSKQorICAgICAgICAsIG1fZWxldmF0aW9uQW5nbGUoZWxldmF0aW9uKQor
ICAgICAgICAsIG1fc2FtcGxlUmF0ZShzYW1wbGVSYXRlKQorICAgIHsKKyAgICB9CisKKyAgICBP
d25QdHI8SFJURktlcm5lbExpc3Q+IG1fa2VybmVsTGlzdEw7CisgICAgT3duUHRyPEhSVEZLZXJu
ZWxMaXN0PiBtX2tlcm5lbExpc3RSOworICAgIGRvdWJsZSBtX2VsZXZhdGlvbkFuZ2xlOworICAg
IGRvdWJsZSBtX3NhbXBsZVJhdGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBIUlRGRWxldmF0aW9uX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67863</attachid>
            <date>2010-09-16 17:12:56 -0700</date>
            <delta_ts>2010-09-17 14:01:15 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45864-20100916171254.patch</filename>
            <type>text/plain</type>
            <size>19425</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzY3OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMTYgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURkVsZXZhdGlvbiBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NDU4NjQKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgamF2YXNj
cmlwdCBBUEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHBsYXRmb3JtL2F1
ZGlvL0hSVEZFbGV2YXRpb24uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2
YXRpb246OmNhbGN1bGF0ZVN5bW1ldHJpY0tlcm5lbHNGb3JBemltdXRoRWxldmF0aW9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246OmNhbGN1bGF0ZUtlcm5lbHNGb3JBemltdXRo
RWxldmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246OmNyZWF0ZUZvclN1
YmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6Y3JlYXRlQnlJbnRlcnBv
bGF0aW5nU2xpY2VzKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246OmdldEtlcm5l
bHNGcm9tQXppbXV0aCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vSFJURkVsZXZhdGlvbi5o
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246Omtlcm5lbExpc3RMKToK
KyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246Omtlcm5lbExpc3RSKToKKyAgICAgICAg
KFdlYkNvcmU6OkhSVEZFbGV2YXRpb246OmVsZXZhdGlvbkFuZ2xlKToKKyAgICAgICAgKFdlYkNv
cmU6OkhSVEZFbGV2YXRpb246Om51bWJlck9mQXppbXV0aHMpOgorICAgICAgICAoV2ViQ29yZTo6
SFJURkVsZXZhdGlvbjo6c2FtcGxlUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0
aW9uOjpIUlRGRWxldmF0aW9uKToKKwogMjAxMC0wOS0xNiAgQW5kcmVhcyBLbGluZyAgPGFuZHJl
YXMua2xpbmdAbm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFyaXlhIEhpZGF5YXQu
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkVsZXZhdGlvbi5jcHAJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJM
RShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJIUlRGRWxldmF0aW9uLmgiCisKKyNpbmNsdWRlICJB
dWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvRmlsZVJlYWRlci5oIgorI2luY2x1ZGUgIkF1ZGlv
UmVzb3VyY2VzLmgiCisjaW5jbHVkZSAiQmlxdWFkLmgiCisjaW5jbHVkZSAiRkZURnJhbWUuaCIK
KyNpbmNsdWRlICJIUlRGUGFubmVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUg
PG1hdGguaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7
CisgCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRha2VzIGFkdmFudGFnZSBvZiB0aGUgc3lt
bWV0cnkgYW5kIGNyZWF0ZXMgYSBjb21wb3NpdGUgdmVyc2lvbiBvZiB0aGUgdHdvIG1lYXN1cmVk
IHZlcnNpb25zLiAgRm9yIGV4YW1wbGUsIHdlIGhhdmUgYm90aCBhemltdXRoIDMwIGFuZCAtMzAg
ZGVncmVlcworLy8gd2hlcmUgdGhlIHJvbGVzIG9mIGxlZnQgYW5kIHJpZ2h0IGVhcnMgYXJlIHJl
dmVyc2VkIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLgordm9pZCBIUlRGRWxldmF0aW9uOjpj
YWxjdWxhdGVTeW1tZXRyaWNLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihpbnQgYXppbXV0aCwg
aW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJhdGUsIGNvbnN0IGNoYXIqIHN1YmplY3ROYW1l
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBSZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbEwsIFJlZlB0cjxIUlRGS2VybmVs
PiYga2VybmVsUikKK3sKKyAgICBSZWZQdHI8SFJURktlcm5lbD4gbDE7CisgICAgUmVmUHRyPEhS
VEZLZXJuZWw+IHIxOworICAgIGNhbGN1bGF0ZUtlcm5lbHNGb3JBemltdXRoRWxldmF0aW9uKGF6
aW11dGgsIGVsZXZhdGlvbiwgc2FtcGxlUmF0ZSwgc3ViamVjdE5hbWUsIGwxLCByMSk7CisKKyAg
ICAvLyBBbmQgc3ltbWV0cmljIHZlcnNpb24KKyAgICBpbnQgc3ltbWV0cmljQXppbXV0aCA9ICFh
emltdXRoID8gMCA6IDM2MCAtIGF6aW11dGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIFJlZlB0cjxIUlRGS2VybmVs
PiBsMjsKKyAgICBSZWZQdHI8SFJURktlcm5lbD4gcjI7CisgICAgY2FsY3VsYXRlS2VybmVsc0Zv
ckF6aW11dGhFbGV2YXRpb24oc3ltbWV0cmljQXppbXV0aCwgZWxldmF0aW9uLCBzYW1wbGVSYXRl
LCBzdWJqZWN0TmFtZSwgbDIsIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAg
Ly8gTm90aWNlIEwvUiByZXZlcnNhbCBpbiBzeW1tZXRyaWMgdmVyc2lvbi4KKyAgICBrZXJuZWxM
ID0gSFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2VybmVsKGwxLmdldCgpLCByMi5nZXQo
KSwgMC41KTsKKyAgICBrZXJuZWxSID0gSFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2Vy
bmVsKHIxLmdldCgpLCBsMi5nZXQoKSwgMC41KTsKK30KKwordm9pZCBIUlRGRWxldmF0aW9uOjpj
YWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihpbnQgYXppbXV0aCwgaW50IGVsZXZh
dGlvbiwgZG91YmxlIHNhbXBsZVJhdGUsIGNvbnN0IGNoYXIqIHN1YmplY3ROYW1lLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZQdHI8
SFJURktlcm5lbD4mIGtlcm5lbEwsIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsUikKK3sKKyAg
ICAvLyBWYWxpZCB2YWx1ZXMgZm9yIGF6aW11dGggYXJlIDAgLT4gMzQ1IGluIDE1IGRlZ3JlZSBp
bmNyZW1lbnRzLgorICAgIC8vIFZhbGlkIHZhbHVlcyBmb3IgZWxldmF0aW9uIGFyZSAtNDUgLT4g
KzkwIGluIDE1IGRlZ3JlZSBpbmNyZW1lbnRzLgorCisgICAgYm9vbCBpc0F6aW11dGhHb29kID0g
YXppbXV0aCA+PSAwICYmIGF6aW11dGggPD0gMzQ1ICYmIChhemltdXRoIC8gMTUpICogMTUgPT0g
YXppbXV0aDsKKyAgICBBU1NFUlQoaXNBemltdXRoR29vZCk7CisgICAgaWYgKCFpc0F6aW11dGhH
b29kKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIGlzRWxldmF0aW9uR29vZCA9IGVsZXZh
dGlvbiA+PSAtNDUgJiYgZWxldmF0aW9uIDw9IDkwICYmIChlbGV2YXRpb24gLyAxNSkgKiAxNSA9
PSBlbGV2YXRpb247CisgICAgQVNTRVJUKGlzRWxldmF0aW9uR29vZCk7CisgICAgaWYgKCFpc0Vs
ZXZhdGlvbkdvb2QpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZJWE1FOiBUaGUgZm9sbG93
aW5nIGNvZGUgYXNzdW1lcyBhY2Nlc3MgdG8gdGhlIGZpbGUgc3lzdGVtLiAgVGhlIGxvbmctdGVy
bSBzdHJhdGVneSBpcyB0byBjcmVhdGUgYW4gYXVkaW8gZmlsZSByZXNvdXJjZQorICAgIC8vIGFi
c3RyYWN0aW9uIGxheWVyLCB3aGVyZSB0aGUgcmVuZGVyZXIgY29kZSByZXF1ZXN0cyBhIHBhcnRp
Y3VsYXIgYXVkaW8gZmlsZSByZXNvdXJjZSBhbmQgaXQgd2lsbCBiZSBkZWxpdmVyZWQKKyAgICAv
LyAocG90ZW50aWFsbHkgdmlhIHNoYXJlZCBtZW1vcnkgaW4gYSBzYW5kYm94ZWQgaW1wbGVtZW50
YXRpb24pLiAgT25jZSB0aGUgYXVkaW8gZmlsZSByZXNvdXJjZSBhYnN0cmFjdGlvbiBsYXllciBp
cyBpbiBwbGFjZSwKKyAgICAvLyB0aGVuIHRoZSBjb2RlIGRlYWxpbmcgd2l0aCBmaWxlIHN5c3Rl
bSBwYXRocyBjYW4gYmUgcmVtb3ZlZCwgYnV0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIGFjdHVh
bCBmaWxlbmFtZSB3aWxsIHByb2JhYmx5IHN0aWxsIGJlCisgICAgLy8gbmVjZXNzYXJ5LgorICAg
IGNvbnN0IGNoYXIqIHJlc291cmNlUGF0aCA9IGdldEF1ZGlvU3BhdGlhbGl6YXRpb25SZXNvdXJj
ZVBhdGgoKTsKKyAgICAgICAgICAgIAorICAgIGNoYXIgaHJpclN1YkRpcmVjdG9yeVsxMDI0XTsK
KyAgICBpZiAocmVzb3VyY2VQYXRoKQorICAgICAgICBzbnByaW50ZihocmlyU3ViRGlyZWN0b3J5
LCBzaXplb2YoaHJpclN1YkRpcmVjdG9yeSksICIlcy9JUkNfJXMiLCByZXNvdXJjZVBhdGgsIHN1
YmplY3ROYW1lKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gRklYTUUgLSBuZWVkIGJldHRlciBl
cnJvciByZWNvdmVyeQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkhSSVIgcmVzb3VyY2UgZGly
ZWN0b3J5IG5vdCBmb3VuZCFcbiIpOworICAgICAgICBleGl0KC0xKTsKKyAgICB9CisgICAgCisg
ICAgaW50IHBvc2l0aXZlRWxldmF0aW9uID0gZWxldmF0aW9uIDwgMCA/IGVsZXZhdGlvbiArIDM2
MCA6IGVsZXZhdGlvbjsKKyAgICAKKyAgICBjaGFyIGZpbGVQYXRoWzEwMjRdOworICAgIHNucHJp
bnRmKGZpbGVQYXRoLCBzaXplb2YoZmlsZVBhdGgpLCAiJXMvSVJDXyVzX0NfUjAxOTVfVCUwM2Rf
UCUwM2QuYWlmIiwgaHJpclN1YkRpcmVjdG9yeSwgc3ViamVjdE5hbWUsIGF6aW11dGgsIHBvc2l0
aXZlRWxldmF0aW9uKTsKKyAgICAKKyAgICBPd25QdHI8QXVkaW9CdXM+IGltcHVsc2VSZXNwb25z
ZShjcmVhdGVCdXNGcm9tQXVkaW9GaWxlKGZpbGVQYXRoLCBmYWxzZSwgc2FtcGxlUmF0ZSkpOwor
ICAgIGlmICghaW1wdWxzZVJlc3BvbnNlLmdldCgpKSB7CisgICAgICAgIC8vIEZJWE1FIC0gbmVl
ZCBiZXR0ZXIgZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qg
cmVhZCBIUklSIGltcHVsc2UgcmVzcG9uc2U6ICVzXG4iLCBmaWxlUGF0aCk7CisgICAgICAgIGV4
aXQoLTEpOworICAgIH0KKyAgICAKKyAgICBzaXplX3QgcmVzcG9uc2VMZW5ndGggPSBpbXB1bHNl
UmVzcG9uc2UtPmxlbmd0aCgpOworCisgICAgLy8gQ2hlY2sgbnVtYmVyIG9mIGNoYW5uZWxzIGFu
ZCBsZW5ndGguICBGb3Igbm93IHRoZXNlIGFyZSBmaXhlZCBhbmQga25vd24uCisgICAgaWYgKHJl
c3BvbnNlTGVuZ3RoICE9IDUxMiB8fCBpbXB1bHNlUmVzcG9uc2UtPm51bWJlck9mQ2hhbm5lbHMo
KSAhPSAyKSB7CisgICAgICAgIC8vIEZJWE1FIC0gbmVlZCBiZXR0ZXIgZXJyb3IgcmVjb3ZlcnkK
KyAgICAgICAgZnByaW50ZihzdGRlcnIsICJIUklSIGltcHVsc2UgcmVzcG9uc2UgZmlsZXMgYXJl
IG5vdCBzdGVyZW8gYW5kIGxlbmd0aCA1MTIhXG4iKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAg
fQorICAgIAorICAgIEF1ZGlvQ2hhbm5lbCogbGVmdEVhckltcHVsc2VSZXNwb25zZSA9IGltcHVs
c2VSZXNwb25zZS0+Y2hhbm5lbEJ5VHlwZShBdWRpb0J1czo6Q2hhbm5lbExlZnQpOworICAgIEF1
ZGlvQ2hhbm5lbCogcmlnaHRFYXJJbXB1bHNlUmVzcG9uc2UgPSBpbXB1bHNlUmVzcG9uc2UtPmNo
YW5uZWxCeVR5cGUoQXVkaW9CdXM6OkNoYW5uZWxSaWdodCk7CisKKyAgICAvLyBOb3RlIHRoYXQg
ZGVwZW5kaW5nIG9uIHRoZSBmZnRTaXplIHJldHVybmVkIGJ5IHRoZSBwYW5uZXIsIHdlIG1heSBi
ZSB0cnVuY2F0aW5nIHRoZSBpbXB1bHNlIHJlc3BvbnNlIHdlIGp1c3QgbG9hZGVkIGluLgorICAg
IGNvbnN0IHNpemVfdCBmZnRTaXplID0gSFJURlBhbm5lcjo6ZmZ0U2l6ZUZvclNhbXBsZVJhdGUo
c2FtcGxlUmF0ZSk7CisgICAga2VybmVsTCA9IEhSVEZLZXJuZWw6OmNyZWF0ZShsZWZ0RWFySW1w
dWxzZVJlc3BvbnNlLCBmZnRTaXplLCBzYW1wbGVSYXRlLCB0cnVlKTsKKyAgICBrZXJuZWxSID0g
SFJURktlcm5lbDo6Y3JlYXRlKHJpZ2h0RWFySW1wdWxzZVJlc3BvbnNlLCBmZnRTaXplLCBzYW1w
bGVSYXRlLCB0cnVlKTsKK30KKworLy8gVGhlIHJhbmdlIG9mIGVsZXZhdGlvbnMgZm9yIHRoZSBJ
UkNBTSBpbXB1bHNlIHJlc3BvbnNlcyB2YXJpZXMgZGVwZW5kaW5nIG9uIGF6aW11dGgsIGJ1dCB0
aGUgbWluaW11bSBlbGV2YXRpb24gYXBwZWFycyB0byBhbHdheXMgYmUgLTQ1LgorLy8KKy8vIEhl
cmUncyBob3cgaXQgZ29lczoKK3N0YXRpYyBpbnQgbWF4RWxldmF0aW9uc1tdID0geworICAgICAg
ICAvLyAgQXppbXV0aAorICAgICAgICAvLworICAgIDkwLCAvLyAwICAKKyAgICA0NSwgLy8gMTUg
CisgICAgNjAsIC8vIDMwIAorICAgIDQ1LCAvLyA0NSAKKyAgICA3NSwgLy8gNjAgCisgICAgNDUs
IC8vIDc1IAorICAgIDYwLCAvLyA5MCAKKyAgICA0NSwgLy8gMTA1IAorICAgIDc1LCAvLyAxMjAg
CisgICAgNDUsIC8vIDEzNSAKKyAgICA2MCwgLy8gMTUwIAorICAgIDQ1LCAvLyAxNjUgCisgICAg
NzUsIC8vIDE4MCAKKyAgICA0NSwgLy8gMTk1IAorICAgIDYwLCAvLyAyMTAgCisgICAgNDUsIC8v
IDIyNSAKKyAgICA3NSwgLy8gMjQwIAorICAgIDQ1LCAvLyAyNTUgCisgICAgNjAsIC8vIDI3MCAK
KyAgICA0NSwgLy8gMjg1IAorICAgIDc1LCAvLyAzMDAgCisgICAgNDUsIC8vIDMxNSAKKyAgICA2
MCwgLy8gMzMwIAorICAgIDQ1IC8vICAzNDUgCit9OworCitQYXNzT3duUHRyPEhSVEZFbGV2YXRp
b24+IEhSVEZFbGV2YXRpb246OmNyZWF0ZUZvclN1YmplY3QoY29uc3QgY2hhciogc3ViamVjdE5h
bWUsIGludCBlbGV2YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRlKQoreworICAgIEFTU0VSVChzdWJq
ZWN0TmFtZSk7CisgICAgaWYgKCFzdWJqZWN0TmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIAorICAgIGJvb2wgaXNFbGV2YXRpb25Hb29kID0gZWxldmF0aW9uID49IC00NSAmJiBlbGV2
YXRpb24gPD0gOTAgJiYgKGVsZXZhdGlvbiAvIDE1KSAqIDE1ID09IGVsZXZhdGlvbjsKKyAgICBB
U1NFUlQoaXNFbGV2YXRpb25Hb29kKTsKKyAgICBpZiAoIWlzRWxldmF0aW9uR29vZCkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIAorICAgIE93blB0cjxIUlRGS2VybmVsTGlzdD4ga2VybmVs
TGlzdEwgPSBhZG9wdFB0cihuZXcgSFJURktlcm5lbExpc3QoTnVtYmVyT2ZUb3RhbEF6aW11dGhz
KSk7CisgICAgT3duUHRyPEhSVEZLZXJuZWxMaXN0PiBrZXJuZWxMaXN0UiA9IGFkb3B0UHRyKG5l
dyBIUlRGS2VybmVsTGlzdChOdW1iZXJPZlRvdGFsQXppbXV0aHMpKTsKKworICAgIC8vIExvYWQg
Y29udm9sdXRpb24ga2VybmVscyBmcm9tIEhSVEYgZmlsZXMuCisgICAgaW50IGludGVycG9sYXRl
ZEluZGV4ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIHJhd0luZGV4ID0gMDsgcmF3SW5kZXggPCBO
dW1iZXJPZlJhd0F6aW11dGhzOyArK3Jhd0luZGV4KSB7CisgICAgICAgIC8vIERvbid0IGxldCBl
bGV2YXRpb24gZXhjZWVkIG1heGltdW0gZm9yIHRoaXMgYXppbXV0aC4KKyAgICAgICAgaW50IG1h
eEVsZXZhdGlvbiA9IG1heEVsZXZhdGlvbnNbcmF3SW5kZXhdOworICAgICAgICBpbnQgYWN0dWFs
RWxldmF0aW9uID0gbWluKGVsZXZhdGlvbiwgbWF4RWxldmF0aW9uKTsKKworICAgICAgICBjYWxj
dWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihyYXdJbmRleCAqIEF6aW11dGhTcGFjaW5n
LCBhY3R1YWxFbGV2YXRpb24sIHNhbXBsZVJhdGUsIHN1YmplY3ROYW1lLCAoKmtlcm5lbExpc3RM
KVtpbnRlcnBvbGF0ZWRJbmRleF0sICgqa2VybmVsTGlzdFIpW2ludGVycG9sYXRlZEluZGV4XSk7
CisKKyAgICAgICAgaW50ZXJwb2xhdGVkSW5kZXggKz0gSW50ZXJwb2xhdGlvbkZhY3RvcjsKKyAg
ICB9CisKKyAgICAvLyBOb3cgZ28gYmFjayBhbmQgaW50ZXJwb2xhdGUgaW50ZXJtZWRpYXRlIGF6
aW11dGggdmFsdWVzLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1iZXJPZlRvdGFs
QXppbXV0aHM7IGkgKz0gSW50ZXJwb2xhdGlvbkZhY3RvcikgeworICAgICAgICBpbnQgaiA9IChp
ICsgSW50ZXJwb2xhdGlvbkZhY3RvcikgJSBOdW1iZXJPZlRvdGFsQXppbXV0aHM7CisKKyAgICAg
ICAgLy8gQ3JlYXRlIHRoZSBpbnRlcnBvbGF0ZWQgY29udm9sdXRpb24ga2VybmVscyBhbmQgZGVs
YXlzLgorICAgICAgICBmb3IgKHVuc2lnbmVkIGpqID0gMTsgamogPCBJbnRlcnBvbGF0aW9uRmFj
dG9yOyArK2pqKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IGRvdWJsZShqaikgLyBkb3VibGUo
SW50ZXJwb2xhdGlvbkZhY3Rvcik7IC8vIGludGVycG9sYXRlIGZyb20gMCAtPiAxCisKKyAgICAg
ICAgICAgICgqa2VybmVsTGlzdEwpW2kgKyBqal0gPSBIUlRGS2VybmVsOjpjcmVhdGVJbnRlcnBv
bGF0ZWRLZXJuZWwoKCprZXJuZWxMaXN0TClbaV0uZ2V0KCksICgqa2VybmVsTGlzdEwpW2pdLmdl
dCgpLCB4KTsKKyAgICAgICAgICAgICgqa2VybmVsTGlzdFIpW2kgKyBqal0gPSBIUlRGS2VybmVs
OjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwoKCprZXJuZWxMaXN0UilbaV0uZ2V0KCksICgqa2Vy
bmVsTGlzdFIpW2pdLmdldCgpLCB4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBPd25Q
dHI8SFJURkVsZXZhdGlvbj4gaHJ0ZkVsZXZhdGlvbiA9IGFkb3B0UHRyKG5ldyBIUlRGRWxldmF0
aW9uKGtlcm5lbExpc3RMLnJlbGVhc2UoKSwga2VybmVsTGlzdFIucmVsZWFzZSgpLCBlbGV2YXRp
b24sIHNhbXBsZVJhdGUpKTsKKyAgICByZXR1cm4gaHJ0ZkVsZXZhdGlvbi5yZWxlYXNlKCk7Cit9
CisKK1Bhc3NPd25QdHI8SFJURkVsZXZhdGlvbj4gSFJURkVsZXZhdGlvbjo6Y3JlYXRlQnlJbnRl
cnBvbGF0aW5nU2xpY2VzKEhSVEZFbGV2YXRpb24qIGhydGZFbGV2YXRpb24xLCBIUlRGRWxldmF0
aW9uKiBocnRmRWxldmF0aW9uMiwgZG91YmxlIHgsIGRvdWJsZSBzYW1wbGVSYXRlKQoreworICAg
IEFTU0VSVChocnRmRWxldmF0aW9uMSAmJiBocnRmRWxldmF0aW9uMik7CisgICAgaWYgKCFocnRm
RWxldmF0aW9uMSB8fCAhaHJ0ZkVsZXZhdGlvbjIpCisgICAgICAgIHJldHVybiAwOworICAgICAg
ICAKKyAgICBib29sIGNoZWNrWCA9IHggPj0gMC4wICYmIHggPCAxLjA7CisgICAgQVNTRVJUKGNo
ZWNrWCk7CisgICAgeCA9IG1heCgwLjAsIHgpOworICAgIHggPSBtaW4oMS4wLCB4KTsKKyAgICAK
KyAgICBPd25QdHI8SFJURktlcm5lbExpc3Q+IGtlcm5lbExpc3RMID0gYWRvcHRQdHIobmV3IEhS
VEZLZXJuZWxMaXN0KE51bWJlck9mVG90YWxBemltdXRocykpOworICAgIE93blB0cjxIUlRGS2Vy
bmVsTGlzdD4ga2VybmVsTGlzdFIgPSBhZG9wdFB0cihuZXcgSFJURktlcm5lbExpc3QoTnVtYmVy
T2ZUb3RhbEF6aW11dGhzKSk7CisKKyAgICBIUlRGS2VybmVsTGlzdCoga2VybmVsTGlzdEwxID0g
aHJ0ZkVsZXZhdGlvbjEtPmtlcm5lbExpc3RMKCk7CisgICAgSFJURktlcm5lbExpc3QqIGtlcm5l
bExpc3RSMSA9IGhydGZFbGV2YXRpb24xLT5rZXJuZWxMaXN0UigpOworICAgIEhSVEZLZXJuZWxM
aXN0KiBrZXJuZWxMaXN0TDIgPSBocnRmRWxldmF0aW9uMi0+a2VybmVsTGlzdEwoKTsKKyAgICBI
UlRGS2VybmVsTGlzdCoga2VybmVsTGlzdFIyID0gaHJ0ZkVsZXZhdGlvbjItPmtlcm5lbExpc3RS
KCk7CisgICAgCisgICAgLy8gSW50ZXJwb2xhdGUga2VybmVscyBvZiBjb3JyZXNwb25kaW5nIGF6
aW11dGhzIG9mIHRoZSB0d28gZWxldmF0aW9ucy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgTnVtYmVyT2ZUb3RhbEF6aW11dGhzOyArK2kpIHsKKyAgICAgICAgKCprZXJuZWxMaXN0TClb
aV0gPSBIUlRGS2VybmVsOjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwoKCprZXJuZWxMaXN0TDEp
W2ldLmdldCgpLCAoKmtlcm5lbExpc3RMMilbaV0uZ2V0KCksIHgpOworICAgICAgICAoKmtlcm5l
bExpc3RSKVtpXSA9IEhSVEZLZXJuZWw6OmNyZWF0ZUludGVycG9sYXRlZEtlcm5lbCgoKmtlcm5l
bExpc3RSMSlbaV0uZ2V0KCksICgqa2VybmVsTGlzdFIyKVtpXS5nZXQoKSwgeCk7CisgICAgfQor
CisgICAgLy8gSW50ZXJwb2xhdGUgZWxldmF0aW9uIGFuZ2xlLgorICAgIGRvdWJsZSBhbmdsZTEg
PSBocnRmRWxldmF0aW9uMS0+ZWxldmF0aW9uQW5nbGUoKTsKKyAgICBkb3VibGUgYW5nbGUyID0g
aHJ0ZkVsZXZhdGlvbjItPmVsZXZhdGlvbkFuZ2xlKCk7CisgICAgZG91YmxlIGFuZ2xlID0gKDEu
MCAtIHgpICogYW5nbGUxICsgeCAqIGFuZ2xlMjsKKyAgICAKKyAgICBPd25QdHI8SFJURkVsZXZh
dGlvbj4gaHJ0ZkVsZXZhdGlvbiA9IGFkb3B0UHRyKG5ldyBIUlRGRWxldmF0aW9uKGtlcm5lbExp
c3RMLnJlbGVhc2UoKSwga2VybmVsTGlzdFIucmVsZWFzZSgpLCBhbmdsZSwgc2FtcGxlUmF0ZSkp
OworICAgIHJldHVybiBocnRmRWxldmF0aW9uLnJlbGVhc2UoKTsgIAorfQorCit2b2lkIEhSVEZF
bGV2YXRpb246OmdldEtlcm5lbHNGcm9tQXppbXV0aChkb3VibGUgYXppbXV0aEJsZW5kLCB1bnNp
Z25lZCBhemltdXRoSW5kZXgsIEhSVEZLZXJuZWwqICZrZXJuZWxMLCBIUlRGS2VybmVsKiAma2Vy
bmVsUiwgZG91YmxlJiBmcmFtZURlbGF5TCwgZG91YmxlJiBmcmFtZURlbGF5UikKK3sKKyAgICBi
b29sIGNoZWNrQXppbXV0aEJsZW5kID0gYXppbXV0aEJsZW5kID49IDAuMCAmJiBhemltdXRoQmxl
bmQgPCAxLjA7CisgICAgQVNTRVJUKGNoZWNrQXppbXV0aEJsZW5kKTsKKyAgICBpZiAoIWNoZWNr
QXppbXV0aEJsZW5kKQorICAgICAgICBhemltdXRoQmxlbmQgPSAwLjA7CisgICAgCisgICAgdW5z
aWduZWQgbnVtS2VybmVscyA9IG1fa2VybmVsTGlzdEwtPnNpemUoKTsKKworICAgIGJvb2wgaXNJ
bmRleEdvb2QgPSBhemltdXRoSW5kZXggPCBudW1LZXJuZWxzOworICAgIEFTU0VSVChpc0luZGV4
R29vZCk7CisgICAgaWYgKCFpc0luZGV4R29vZCkgeworICAgICAgICBrZXJuZWxMID0gMDsKKyAg
ICAgICAga2VybmVsUiA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAga2Vy
bmVsTCA9ICgqbV9rZXJuZWxMaXN0TClbYXppbXV0aEluZGV4XS5nZXQoKTsKKyAgICBrZXJuZWxS
ID0gKCptX2tlcm5lbExpc3RSKVthemltdXRoSW5kZXhdLmdldCgpOworICAgIGZyYW1lRGVsYXlM
ID0gKCptX2tlcm5lbExpc3RMKVthemltdXRoSW5kZXhdLT5mcmFtZURlbGF5KCk7CisgICAgZnJh
bWVEZWxheVIgPSAoKm1fa2VybmVsTGlzdFIpW2F6aW11dGhJbmRleF0tPmZyYW1lRGVsYXkoKTsK
KworICAgIGludCBhemltdXRoSW5kZXgyID0gKGF6aW11dGhJbmRleCArIDEpICUgbnVtS2VybmVs
czsKKyAgICBkb3VibGUgZnJhbWVEZWxheTJMID0gKCptX2tlcm5lbExpc3RMKVthemltdXRoSW5k
ZXgyXS0+ZnJhbWVEZWxheSgpOworICAgIGRvdWJsZSBmcmFtZURlbGF5MlIgPSAoKm1fa2VybmVs
TGlzdFIpW2F6aW11dGhJbmRleDJdLT5mcmFtZURlbGF5KCk7CisKKyAgICAvLyBMaW5lYXJseSBp
bnRlcnBvbGF0ZSBkZWxheXMuCisgICAgZnJhbWVEZWxheUwgPSAoMS4wIC0gYXppbXV0aEJsZW5k
KSAqIGZyYW1lRGVsYXlMICsgYXppbXV0aEJsZW5kICogZnJhbWVEZWxheTJMOworICAgIGZyYW1l
RGVsYXlSID0gKDEuMCAtIGF6aW11dGhCbGVuZCkgKiBmcmFtZURlbGF5UiArIGF6aW11dGhCbGVu
ZCAqIGZyYW1lRGVsYXkyUjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkVs
ZXZhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkVsZXZh
dGlvbi5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9IUlRGRWxldmF0
aW9uLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxl
Iikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBIUlRGRWxldmF0
aW9uX2gKKyNkZWZpbmUgSFJURkVsZXZhdGlvbl9oCisKKyNpbmNsdWRlICJIUlRGS2VybmVsLmgi
CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgor
I2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4K
KyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBIUlRGRWxldmF0aW9uIGNvbnRhaW5zIGFsbCBvZiB0
aGUgSFJURktlcm5lbHMgKG9uZSBsZWZ0IGVhciBhbmQgb25lIHJpZ2h0IGVhciBwZXIgYXppbXV0
aCBhbmdsZSkgZm9yIGEgcGFydGljdWxhciBlbGV2YXRpb24uCisKK2NsYXNzIEhSVEZFbGV2YXRp
b24gOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIC8vIExvYWRzIGFuZCByZXR1
cm5zIGFuIEhSVEZFbGV2YXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgZWxldmF0aW9uIGZy
b20gYnJvd3NlciByZXNvdXJjZXMuCisgICAgLy8gSW50ZXJwb2xhdGVkIGF6aW11dGhzIHdpbGwg
YmUgZ2VuZXJhdGVkIGJhc2VkIG9uIEludGVycG9sYXRpb25GYWN0b3IuCisgICAgLy8gVmFsaWQg
dmFsdWVzIGZvciBlbGV2YXRpb24gYXJlIC00NSAtPiArOTAgaW4gMTUgZGVncmVlIGluY3JlbWVu
dHMuCisgICAgc3RhdGljIFBhc3NPd25QdHI8SFJURkVsZXZhdGlvbj4gY3JlYXRlRm9yU3ViamVj
dChjb25zdCBjaGFyKiBzdWJqZWN0TmFtZSwgaW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJh
dGUpOworCisgICAgLy8gR2l2ZW4gdHdvIEhSVEZFbGV2YXRpb25zLCBhbmQgYW4gaW50ZXJwb2xh
dGlvbiBmYWN0b3IgeDogMCAtPiAxLCByZXR1cm5zIGFuIGludGVycG9sYXRlZCBIUlRGRWxldmF0
aW9uLgorICAgIHN0YXRpYyBQYXNzT3duUHRyPEhSVEZFbGV2YXRpb24+IGNyZWF0ZUJ5SW50ZXJw
b2xhdGluZ1NsaWNlcyhIUlRGRWxldmF0aW9uKiBocnRmRWxldmF0aW9uMSwgSFJURkVsZXZhdGlv
biogaHJ0ZkVsZXZhdGlvbjIsIGRvdWJsZSB4LCBkb3VibGUgc2FtcGxlUmF0ZSk7CisKKyAgICAv
LyBSZXR1cm5zIHRoZSBsaXN0IG9mIGxlZnQgb3IgcmlnaHQgZWFyIEhSVEZLZXJuZWxzIGZvciBh
bGwgdGhlIGF6aW11dGhzIGdvaW5nIGZyb20gMCB0byAzNjAgZGVncmVlcy4KKyAgICBIUlRGS2Vy
bmVsTGlzdCoga2VybmVsTGlzdEwoKSB7IHJldHVybiBtX2tlcm5lbExpc3RMLmdldCgpOyB9Cisg
ICAgSFJURktlcm5lbExpc3QqIGtlcm5lbExpc3RSKCkgeyByZXR1cm4gbV9rZXJuZWxMaXN0Ui5n
ZXQoKTsgfQorCisgICAgZG91YmxlIGVsZXZhdGlvbkFuZ2xlKCkgY29uc3QgeyByZXR1cm4gbV9l
bGV2YXRpb25BbmdsZTsgfQorICAgIHVuc2lnbmVkIG51bWJlck9mQXppbXV0aHMoKSB7IHJldHVy
biBOdW1iZXJPZlRvdGFsQXppbXV0aHM7IH0KKyAgICBkb3VibGUgc2FtcGxlUmF0ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc2FtcGxlUmF0ZTsgfQorICAgIAorICAgIC8vIFJldHVybnMgdGhlIGxlZnQg
YW5kIHJpZ2h0IGtlcm5lbHMgZm9yIHRoZSBnaXZlbiBhemltdXRoIGluZGV4LgorICAgIC8vIFRo
ZSBpbnRlcnBvbGF0ZWQgZGVsYXlzIGJhc2VkIG9uIGF6aW11dGhCbGVuZDogMCAtPiAxIGFyZSBy
ZXR1cm5lZCBpbiBmcmFtZURlbGF5TCBhbmQgZnJhbWVEZWxheVIuCisgICAgdm9pZCBnZXRLZXJu
ZWxzRnJvbUF6aW11dGgoZG91YmxlIGF6aW11dGhCbGVuZCwgdW5zaWduZWQgYXppbXV0aEluZGV4
LCBIUlRGS2VybmVsKiAma2VybmVsTCwgSFJURktlcm5lbCogJmtlcm5lbFIsIGRvdWJsZSYgZnJh
bWVEZWxheUwsIGRvdWJsZSYgZnJhbWVEZWxheVIpOworICAgIAorICAgIC8vIFNwYWNpbmcsIGlu
IGRlZ3JlZXMsIGJldHdlZW4gZXZlcnkgYXppbXV0aCBsb2FkZWQgZnJvbSByZXNvdXJjZS4KKyAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQXppbXV0aFNwYWNpbmcgPSAxNTsKKyAgICAKKyAgICAv
LyBOdW1iZXIgb2YgYXppbXV0aHMgbG9hZGVkIGZyb20gcmVzb3VyY2UuCisgICAgc3RhdGljIGNv
bnN0IHVuc2lnbmVkIE51bWJlck9mUmF3QXppbXV0aHMgPSAzNjAgLyBBemltdXRoU3BhY2luZzsK
KworICAgIC8vIEludGVycG9sYXRlcyBieSB0aGlzIGZhY3RvciB0byBnZXQgdGhlIHRvdGFsIG51
bWJlciBvZiBhemltdXRocyBmcm9tIGV2ZXJ5IGF6aW11dGggbG9hZGVkIGZyb20gcmVzb3VyY2Uu
CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEludGVycG9sYXRpb25GYWN0b3IgPSA4OworICAg
IAorICAgIC8vIFRvdGFsIG51bWJlciBvZiBhemltdXRocyBhZnRlciBpbnRlcnBvbGF0aW9uLgor
ICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBOdW1iZXJPZlRvdGFsQXppbXV0aHMgPSBOdW1iZXJP
ZlJhd0F6aW11dGhzICogSW50ZXJwb2xhdGlvbkZhY3RvcjsKKworICAgIC8vIEdpdmVuIGEgc3Bl
Y2lmaWMgYXppbXV0aCBhbmQgZWxldmF0aW9uIGFuZ2xlLCByZXR1cm5zIHRoZSBsZWZ0IGFuZCBy
aWdodCBIUlRGS2VybmVsLgorICAgIC8vIFZhbGlkIHZhbHVlcyBmb3IgYXppbXV0aCBhcmUgMCAt
PiAzNDUgaW4gMTUgZGVncmVlIGluY3JlbWVudHMuCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBl
bGV2YXRpb24gYXJlIC00NSAtPiArOTAgaW4gMTUgZGVncmVlIGluY3JlbWVudHMuCisgICAgc3Rh
dGljIHZvaWQgY2FsY3VsYXRlS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24oaW50IGF6aW11dGgs
IGludCBlbGV2YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRlLCBjb25zdCBjaGFyKiBzdWJqZWN0TmFt
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBS
ZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbEwsIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsUik7
CisKKyAgICAvLyBHaXZlbiBhIHNwZWNpZmljIGF6aW11dGggYW5kIGVsZXZhdGlvbiBhbmdsZSwg
cmV0dXJucyB0aGUgbGVmdCBhbmQgcmlnaHQgSFJURktlcm5lbCBpbiBrZXJuZWxMIGFuZCBrZXJu
ZWxSLgorICAgIC8vIFRoaXMgbWV0aG9kIGF2ZXJhZ2VzIHRoZSBtZWFzdXJlZCByZXNwb25zZSB1
c2luZyBzeW1tZXRyeSBvZiBhemltdXRoIChmb3IgZXhhbXBsZSBieSBhdmVyYWdpbmcgdGhlIC0z
MC4wIGFuZCArMzAuMCBhemltdXRoIHJlc3BvbnNlcykuCisgICAgc3RhdGljIHZvaWQgY2FsY3Vs
YXRlU3ltbWV0cmljS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24oaW50IGF6aW11dGgsIGludCBl
bGV2YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRlLCBjb25zdCBjaGFyKiBzdWJqZWN0TmFtZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBSZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbEwsIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVs
Uik7Citwcml2YXRlOgorICAgIEhSVEZFbGV2YXRpb24oKQorICAgICAgICA6IG1fa2VybmVsTGlz
dEwoMCkKKyAgICAgICAgLCBtX2tlcm5lbExpc3RSKDApCisgICAgICAgICwgbV9lbGV2YXRpb25B
bmdsZSgwKQorICAgICAgICAsIG1fc2FtcGxlUmF0ZSg0NDEwMC4wKQorICAgIHsKKyAgICB9CisK
KyAgICBIUlRGRWxldmF0aW9uKFBhc3NPd25QdHI8SFJURktlcm5lbExpc3Q+IGtlcm5lbExpc3RM
LCBQYXNzT3duUHRyPEhSVEZLZXJuZWxMaXN0PiBrZXJuZWxMaXN0UiwgaW50IGVsZXZhdGlvbiwg
ZG91YmxlIHNhbXBsZVJhdGUpCisgICAgICAgIDogbV9rZXJuZWxMaXN0TChrZXJuZWxMaXN0TCkK
KyAgICAgICAgLCBtX2tlcm5lbExpc3RSKGtlcm5lbExpc3RSKQorICAgICAgICAsIG1fZWxldmF0
aW9uQW5nbGUoZWxldmF0aW9uKQorICAgICAgICAsIG1fc2FtcGxlUmF0ZShzYW1wbGVSYXRlKQor
ICAgIHsKKyAgICB9CisKKyAgICBPd25QdHI8SFJURktlcm5lbExpc3Q+IG1fa2VybmVsTGlzdEw7
CisgICAgT3duUHRyPEhSVEZLZXJuZWxMaXN0PiBtX2tlcm5lbExpc3RSOworICAgIGRvdWJsZSBt
X2VsZXZhdGlvbkFuZ2xlOworICAgIGRvdWJsZSBtX3NhbXBsZVJhdGU7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBIUlRGRWxldmF0aW9uX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67947</attachid>
            <date>2010-09-17 14:01:18 -0700</date>
            <delta_ts>2010-09-21 16:27:53 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45864-20100917140117.patch</filename>
            <type>text/plain</type>
            <size>18971</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzc0NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMTcgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURkVsZXZhdGlvbiBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NDU4NjQKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8g
QVBJIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9I
UlRGRWxldmF0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9u
OjpjYWxjdWxhdGVTeW1tZXRyaWNLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpjYWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZh
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpjcmVhdGVGb3JTdWJqZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246OmNyZWF0ZUJ5SW50ZXJwb2xhdGlu
Z1NsaWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpnZXRLZXJuZWxzRnJv
bUF6aW11dGgpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uaDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjprZXJuZWxMaXN0TCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjprZXJuZWxMaXN0Uik6CisgICAgICAgIChXZWJD
b3JlOjpIUlRGRWxldmF0aW9uOjplbGV2YXRpb25BbmdsZSk6CisgICAgICAgIChXZWJDb3JlOjpI
UlRGRWxldmF0aW9uOjpudW1iZXJPZkF6aW11dGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZF
bGV2YXRpb246OnNhbXBsZVJhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6
SFJURkVsZXZhdGlvbik6CisKIDIwMTAtMDktMTcgIEx1Y2FzIERlIE1hcmNoaSAgPGx1Y2FzLmRl
bWFyY2hpQHByb2Z1c2lvbi5tb2JpPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIGJ1aWxkIGZpeC4g
QWRkIGZpbGVzIG1pc3NlZCBpbiByNjc3MDQuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlv
L0hSVEZFbGV2YXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
SFJURkVsZXZhdGlvbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlv
L0hSVEZFbGV2YXRpb24uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIs
IEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAg
ICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJIUlRG
RWxldmF0aW9uLmgiCisKKyNpbmNsdWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvRmls
ZVJlYWRlci5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzb3VyY2VzLmgiCisjaW5jbHVkZSAiQmlxdWFk
LmgiCisjaW5jbHVkZSAiRkZURnJhbWUuaCIKKyNpbmNsdWRlICJIUlRGUGFubmVyLmgiCisjaW5j
bHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisgCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8v
IFRha2VzIGFkdmFudGFnZSBvZiB0aGUgc3ltbWV0cnkgYW5kIGNyZWF0ZXMgYSBjb21wb3NpdGUg
dmVyc2lvbiBvZiB0aGUgdHdvIG1lYXN1cmVkIHZlcnNpb25zLiAgRm9yIGV4YW1wbGUsIHdlIGhh
dmUgYm90aCBhemltdXRoIDMwIGFuZCAtMzAgZGVncmVlcworLy8gd2hlcmUgdGhlIHJvbGVzIG9m
IGxlZnQgYW5kIHJpZ2h0IGVhcnMgYXJlIHJldmVyc2VkIHdpdGggcmVzcGVjdCB0byBlYWNoIG90
aGVyLgordm9pZCBIUlRGRWxldmF0aW9uOjpjYWxjdWxhdGVTeW1tZXRyaWNLZXJuZWxzRm9yQXpp
bXV0aEVsZXZhdGlvbihpbnQgYXppbXV0aCwgaW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJh
dGUsIGNvbnN0IFN0cmluZyYgc3ViamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxIUlRGS2VybmVs
PiYga2VybmVsTCwgUmVmUHRyPEhSVEZLZXJuZWw+JiBrZXJuZWxSKQoreworICAgIFJlZlB0cjxI
UlRGS2VybmVsPiBsMTsKKyAgICBSZWZQdHI8SFJURktlcm5lbD4gcjE7CisgICAgY2FsY3VsYXRl
S2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24oYXppbXV0aCwgZWxldmF0aW9uLCBzYW1wbGVSYXRl
LCBzdWJqZWN0TmFtZSwgbDEsIHIxKTsKKworICAgIC8vIEFuZCBzeW1tZXRyaWMgdmVyc2lvbgor
ICAgIGludCBzeW1tZXRyaWNBemltdXRoID0gIWF6aW11dGggPyAwIDogMzYwIC0gYXppbXV0aDsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCisgICAgUmVmUHRyPEhSVEZLZXJuZWw+IGwyOworICAgIFJlZlB0cjxIUlRGS2VybmVs
PiByMjsKKyAgICBjYWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihzeW1tZXRyaWNB
emltdXRoLCBlbGV2YXRpb24sIHNhbXBsZVJhdGUsIHN1YmplY3ROYW1lLCBsMiwgcjIpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvLyBOb3RpY2UgTC9SIHJldmVyc2FsIGluIHN5
bW1ldHJpYyB2ZXJzaW9uLgorICAgIGtlcm5lbEwgPSBIUlRGS2VybmVsOjpjcmVhdGVJbnRlcnBv
bGF0ZWRLZXJuZWwobDEuZ2V0KCksIHIyLmdldCgpLCAwLjUpOworICAgIGtlcm5lbFIgPSBIUlRG
S2VybmVsOjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwocjEuZ2V0KCksIGwyLmdldCgpLCAwLjUp
OworfQorCit2b2lkIEhSVEZFbGV2YXRpb246OmNhbGN1bGF0ZUtlcm5lbHNGb3JBemltdXRoRWxl
dmF0aW9uKGludCBhemltdXRoLCBpbnQgZWxldmF0aW9uLCBkb3VibGUgc2FtcGxlUmF0ZSwgY29u
c3QgU3RyaW5nJiBzdWJqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgUmVmUHRyPEhSVEZLZXJuZWw+JiBrZXJuZWxMLCBSZWZQ
dHI8SFJURktlcm5lbD4mIGtlcm5lbFIpCit7CisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBhemlt
dXRoIGFyZSAwIC0+IDM0NSBpbiAxNSBkZWdyZWUgaW5jcmVtZW50cy4KKyAgICAvLyBWYWxpZCB2
YWx1ZXMgZm9yIGVsZXZhdGlvbiBhcmUgLTQ1IC0+ICs5MCBpbiAxNSBkZWdyZWUgaW5jcmVtZW50
cy4KKworICAgIGJvb2wgaXNBemltdXRoR29vZCA9IGF6aW11dGggPj0gMCAmJiBhemltdXRoIDw9
IDM0NSAmJiAoYXppbXV0aCAvIDE1KSAqIDE1ID09IGF6aW11dGg7CisgICAgQVNTRVJUKGlzQXpp
bXV0aEdvb2QpOworICAgIGlmICghaXNBemltdXRoR29vZCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgYm9vbCBpc0VsZXZhdGlvbkdvb2QgPSBlbGV2YXRpb24gPj0gLTQ1ICYmIGVsZXZhdGlvbiA8
PSA5MCAmJiAoZWxldmF0aW9uIC8gMTUpICogMTUgPT0gZWxldmF0aW9uOworICAgIEFTU0VSVChp
c0VsZXZhdGlvbkdvb2QpOworICAgIGlmICghaXNFbGV2YXRpb25Hb29kKQorICAgICAgICByZXR1
cm47CisgICAgCisgICAgLy8gQ29uc3RydWN0IHRoZSByZXNvdXJjZSBuYW1lIGZyb20gdGhlIHN1
YmplY3QgbmFtZSwgYXppbXV0aCwgYW5kIGVsZXZhdGlvbiwgZm9yIGV4YW1wbGU6CisgICAgLy8g
IklSQ19Db21wb3NpdGUvSVJDX0NvbXBvc2l0ZV9DX1IwMTk1X1QwMTVfUDAwMC5haWYiCisgICAg
Ly8gVGhlIHN1YmRpcmVjdG9yeSBuYW1lIGluIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IGlzIG9m
IHRoZSBmb3JtICJJUkNfIiArIHN1YmplY3ROYW1lLgorICAgIGludCBwb3NpdGl2ZUVsZXZhdGlv
biA9IGVsZXZhdGlvbiA8IDAgPyBlbGV2YXRpb24gKyAzNjAgOiBlbGV2YXRpb247CisgICAgU3Ry
aW5nIHJlc291cmNlTmFtZSA9IFN0cmluZzo6Zm9ybWF0KCJJUkNfJXMvSVJDXyVzX0NfUjAxOTVf
VCUwM2RfUCUwM2QuYWlmIiwgc3ViamVjdE5hbWUudXRmOCgpLmRhdGEoKSwgc3ViamVjdE5hbWUu
dXRmOCgpLmRhdGEoKSwgYXppbXV0aCwgcG9zaXRpdmVFbGV2YXRpb24pOworCisgICAgT3duUHRy
PEF1ZGlvQnVzPiBpbXB1bHNlUmVzcG9uc2UoY3JlYXRlQnVzRnJvbUF1ZGlvRmlsZVJlc291cmNl
KHJlc291cmNlTmFtZSwgc2FtcGxlUmF0ZSkpOworCisgICAgaWYgKCFpbXB1bHNlUmVzcG9uc2Uu
Z2V0KCkpIHsKKyAgICAgICAgLy8gRklYTUUgLSBuZWVkIGJldHRlciBlcnJvciByZWNvdmVyeQor
ICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCByZWFkIEhSSVIgaW1wdWxzZSByZXNwb25z
ZTogJXNcbiIsIHJlc291cmNlTmFtZS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgZXhpdCgtMSk7
CisgICAgfQorICAgIAorICAgIHNpemVfdCByZXNwb25zZUxlbmd0aCA9IGltcHVsc2VSZXNwb25z
ZS0+bGVuZ3RoKCk7CisKKyAgICAvLyBDaGVjayBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGxlbmd0
aC4gIEZvciBub3cgdGhlc2UgYXJlIGZpeGVkIGFuZCBrbm93bi4KKyAgICBpZiAocmVzcG9uc2VM
ZW5ndGggIT0gNTEyIHx8IGltcHVsc2VSZXNwb25zZS0+bnVtYmVyT2ZDaGFubmVscygpICE9IDIp
IHsKKyAgICAgICAgLy8gRklYTUUgLSBuZWVkIGJldHRlciBlcnJvciByZWNvdmVyeQorICAgICAg
ICBmcHJpbnRmKHN0ZGVyciwgIkhSSVIgaW1wdWxzZSByZXNwb25zZSBmaWxlcyBhcmUgbm90IHN0
ZXJlbyBhbmQgbGVuZ3RoIDUxMiFcbiIpOworICAgICAgICBleGl0KC0xKTsKKyAgICB9CisgICAg
CisgICAgQXVkaW9DaGFubmVsKiBsZWZ0RWFySW1wdWxzZVJlc3BvbnNlID0gaW1wdWxzZVJlc3Bv
bnNlLT5jaGFubmVsQnlUeXBlKEF1ZGlvQnVzOjpDaGFubmVsTGVmdCk7CisgICAgQXVkaW9DaGFu
bmVsKiByaWdodEVhckltcHVsc2VSZXNwb25zZSA9IGltcHVsc2VSZXNwb25zZS0+Y2hhbm5lbEJ5
VHlwZShBdWRpb0J1czo6Q2hhbm5lbFJpZ2h0KTsKKworICAgIC8vIE5vdGUgdGhhdCBkZXBlbmRp
bmcgb24gdGhlIGZmdFNpemUgcmV0dXJuZWQgYnkgdGhlIHBhbm5lciwgd2UgbWF5IGJlIHRydW5j
YXRpbmcgdGhlIGltcHVsc2UgcmVzcG9uc2Ugd2UganVzdCBsb2FkZWQgaW4uCisgICAgY29uc3Qg
c2l6ZV90IGZmdFNpemUgPSBIUlRGUGFubmVyOjpmZnRTaXplRm9yU2FtcGxlUmF0ZShzYW1wbGVS
YXRlKTsKKyAgICBrZXJuZWxMID0gSFJURktlcm5lbDo6Y3JlYXRlKGxlZnRFYXJJbXB1bHNlUmVz
cG9uc2UsIGZmdFNpemUsIHNhbXBsZVJhdGUsIHRydWUpOworICAgIGtlcm5lbFIgPSBIUlRGS2Vy
bmVsOjpjcmVhdGUocmlnaHRFYXJJbXB1bHNlUmVzcG9uc2UsIGZmdFNpemUsIHNhbXBsZVJhdGUs
IHRydWUpOworfQorCisvLyBUaGUgcmFuZ2Ugb2YgZWxldmF0aW9ucyBmb3IgdGhlIElSQ0FNIGlt
cHVsc2UgcmVzcG9uc2VzIHZhcmllcyBkZXBlbmRpbmcgb24gYXppbXV0aCwgYnV0IHRoZSBtaW5p
bXVtIGVsZXZhdGlvbiBhcHBlYXJzIHRvIGFsd2F5cyBiZSAtNDUuCisvLworLy8gSGVyZSdzIGhv
dyBpdCBnb2VzOgorc3RhdGljIGludCBtYXhFbGV2YXRpb25zW10gPSB7CisgICAgICAgIC8vICBB
emltdXRoCisgICAgICAgIC8vCisgICAgOTAsIC8vIDAgIAorICAgIDQ1LCAvLyAxNSAKKyAgICA2
MCwgLy8gMzAgCisgICAgNDUsIC8vIDQ1IAorICAgIDc1LCAvLyA2MCAKKyAgICA0NSwgLy8gNzUg
CisgICAgNjAsIC8vIDkwIAorICAgIDQ1LCAvLyAxMDUgCisgICAgNzUsIC8vIDEyMCAKKyAgICA0
NSwgLy8gMTM1IAorICAgIDYwLCAvLyAxNTAgCisgICAgNDUsIC8vIDE2NSAKKyAgICA3NSwgLy8g
MTgwIAorICAgIDQ1LCAvLyAxOTUgCisgICAgNjAsIC8vIDIxMCAKKyAgICA0NSwgLy8gMjI1IAor
ICAgIDc1LCAvLyAyNDAgCisgICAgNDUsIC8vIDI1NSAKKyAgICA2MCwgLy8gMjcwIAorICAgIDQ1
LCAvLyAyODUgCisgICAgNzUsIC8vIDMwMCAKKyAgICA0NSwgLy8gMzE1IAorICAgIDYwLCAvLyAz
MzAgCisgICAgNDUgLy8gIDM0NSAKK307CisKK1Bhc3NPd25QdHI8SFJURkVsZXZhdGlvbj4gSFJU
RkVsZXZhdGlvbjo6Y3JlYXRlRm9yU3ViamVjdChjb25zdCBTdHJpbmcmIHN1YmplY3ROYW1lLCBp
bnQgZWxldmF0aW9uLCBkb3VibGUgc2FtcGxlUmF0ZSkKK3sKKyAgICBib29sIGlzRWxldmF0aW9u
R29vZCA9IGVsZXZhdGlvbiA+PSAtNDUgJiYgZWxldmF0aW9uIDw9IDkwICYmIChlbGV2YXRpb24g
LyAxNSkgKiAxNSA9PSBlbGV2YXRpb247CisgICAgQVNTRVJUKGlzRWxldmF0aW9uR29vZCk7Cisg
ICAgaWYgKCFpc0VsZXZhdGlvbkdvb2QpCisgICAgICAgIHJldHVybiAwOworICAgICAgICAKKyAg
ICBPd25QdHI8SFJURktlcm5lbExpc3Q+IGtlcm5lbExpc3RMID0gYWRvcHRQdHIobmV3IEhSVEZL
ZXJuZWxMaXN0KE51bWJlck9mVG90YWxBemltdXRocykpOworICAgIE93blB0cjxIUlRGS2VybmVs
TGlzdD4ga2VybmVsTGlzdFIgPSBhZG9wdFB0cihuZXcgSFJURktlcm5lbExpc3QoTnVtYmVyT2ZU
b3RhbEF6aW11dGhzKSk7CisKKyAgICAvLyBMb2FkIGNvbnZvbHV0aW9uIGtlcm5lbHMgZnJvbSBI
UlRGIGZpbGVzLgorICAgIGludCBpbnRlcnBvbGF0ZWRJbmRleCA9IDA7CisgICAgZm9yICh1bnNp
Z25lZCByYXdJbmRleCA9IDA7IHJhd0luZGV4IDwgTnVtYmVyT2ZSYXdBemltdXRoczsgKytyYXdJ
bmRleCkgeworICAgICAgICAvLyBEb24ndCBsZXQgZWxldmF0aW9uIGV4Y2VlZCBtYXhpbXVtIGZv
ciB0aGlzIGF6aW11dGguCisgICAgICAgIGludCBtYXhFbGV2YXRpb24gPSBtYXhFbGV2YXRpb25z
W3Jhd0luZGV4XTsKKyAgICAgICAgaW50IGFjdHVhbEVsZXZhdGlvbiA9IG1pbihlbGV2YXRpb24s
IG1heEVsZXZhdGlvbik7CisKKyAgICAgICAgY2FsY3VsYXRlS2VybmVsc0ZvckF6aW11dGhFbGV2
YXRpb24ocmF3SW5kZXggKiBBemltdXRoU3BhY2luZywgYWN0dWFsRWxldmF0aW9uLCBzYW1wbGVS
YXRlLCBzdWJqZWN0TmFtZSwgKCprZXJuZWxMaXN0TClbaW50ZXJwb2xhdGVkSW5kZXhdLCAoKmtl
cm5lbExpc3RSKVtpbnRlcnBvbGF0ZWRJbmRleF0pOworCisgICAgICAgIGludGVycG9sYXRlZElu
ZGV4ICs9IEludGVycG9sYXRpb25GYWN0b3I7CisgICAgfQorCisgICAgLy8gTm93IGdvIGJhY2sg
YW5kIGludGVycG9sYXRlIGludGVybWVkaWF0ZSBhemltdXRoIHZhbHVlcy4KKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgTnVtYmVyT2ZUb3RhbEF6aW11dGhzOyBpICs9IEludGVycG9sYXRp
b25GYWN0b3IpIHsKKyAgICAgICAgaW50IGogPSAoaSArIEludGVycG9sYXRpb25GYWN0b3IpICUg
TnVtYmVyT2ZUb3RhbEF6aW11dGhzOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgaW50ZXJwb2xh
dGVkIGNvbnZvbHV0aW9uIGtlcm5lbHMgYW5kIGRlbGF5cy4KKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBqaiA9IDE7IGpqIDwgSW50ZXJwb2xhdGlvbkZhY3RvcjsgKytqaikgeworICAgICAgICAgICAg
ZG91YmxlIHggPSBkb3VibGUoamopIC8gZG91YmxlKEludGVycG9sYXRpb25GYWN0b3IpOyAvLyBp
bnRlcnBvbGF0ZSBmcm9tIDAgLT4gMQorCisgICAgICAgICAgICAoKmtlcm5lbExpc3RMKVtpICsg
ampdID0gSFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2VybmVsKCgqa2VybmVsTGlzdEwp
W2ldLmdldCgpLCAoKmtlcm5lbExpc3RMKVtqXS5nZXQoKSwgeCk7CisgICAgICAgICAgICAoKmtl
cm5lbExpc3RSKVtpICsgampdID0gSFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2VybmVs
KCgqa2VybmVsTGlzdFIpW2ldLmdldCgpLCAoKmtlcm5lbExpc3RSKVtqXS5nZXQoKSwgeCk7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgCisgICAgT3duUHRyPEhSVEZFbGV2YXRpb24+IGhydGZFbGV2
YXRpb24gPSBhZG9wdFB0cihuZXcgSFJURkVsZXZhdGlvbihrZXJuZWxMaXN0TC5yZWxlYXNlKCks
IGtlcm5lbExpc3RSLnJlbGVhc2UoKSwgZWxldmF0aW9uLCBzYW1wbGVSYXRlKSk7CisgICAgcmV0
dXJuIGhydGZFbGV2YXRpb24ucmVsZWFzZSgpOworfQorCitQYXNzT3duUHRyPEhSVEZFbGV2YXRp
b24+IEhSVEZFbGV2YXRpb246OmNyZWF0ZUJ5SW50ZXJwb2xhdGluZ1NsaWNlcyhIUlRGRWxldmF0
aW9uKiBocnRmRWxldmF0aW9uMSwgSFJURkVsZXZhdGlvbiogaHJ0ZkVsZXZhdGlvbjIsIGRvdWJs
ZSB4LCBkb3VibGUgc2FtcGxlUmF0ZSkKK3sKKyAgICBBU1NFUlQoaHJ0ZkVsZXZhdGlvbjEgJiYg
aHJ0ZkVsZXZhdGlvbjIpOworICAgIGlmICghaHJ0ZkVsZXZhdGlvbjEgfHwgIWhydGZFbGV2YXRp
b24yKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisgICAgYm9vbCBjaGVja1ggPSB4ID49
IDAuMCAmJiB4IDwgMS4wOworICAgIEFTU0VSVChjaGVja1gpOworICAgIHggPSBtYXgoMC4wLCB4
KTsKKyAgICB4ID0gbWluKDEuMCwgeCk7CisgICAgCisgICAgT3duUHRyPEhSVEZLZXJuZWxMaXN0
PiBrZXJuZWxMaXN0TCA9IGFkb3B0UHRyKG5ldyBIUlRGS2VybmVsTGlzdChOdW1iZXJPZlRvdGFs
QXppbXV0aHMpKTsKKyAgICBPd25QdHI8SFJURktlcm5lbExpc3Q+IGtlcm5lbExpc3RSID0gYWRv
cHRQdHIobmV3IEhSVEZLZXJuZWxMaXN0KE51bWJlck9mVG90YWxBemltdXRocykpOworCisgICAg
SFJURktlcm5lbExpc3QqIGtlcm5lbExpc3RMMSA9IGhydGZFbGV2YXRpb24xLT5rZXJuZWxMaXN0
TCgpOworICAgIEhSVEZLZXJuZWxMaXN0KiBrZXJuZWxMaXN0UjEgPSBocnRmRWxldmF0aW9uMS0+
a2VybmVsTGlzdFIoKTsKKyAgICBIUlRGS2VybmVsTGlzdCoga2VybmVsTGlzdEwyID0gaHJ0ZkVs
ZXZhdGlvbjItPmtlcm5lbExpc3RMKCk7CisgICAgSFJURktlcm5lbExpc3QqIGtlcm5lbExpc3RS
MiA9IGhydGZFbGV2YXRpb24yLT5rZXJuZWxMaXN0UigpOworICAgIAorICAgIC8vIEludGVycG9s
YXRlIGtlcm5lbHMgb2YgY29ycmVzcG9uZGluZyBhemltdXRocyBvZiB0aGUgdHdvIGVsZXZhdGlv
bnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bWJlck9mVG90YWxBemltdXRoczsg
KytpKSB7CisgICAgICAgICgqa2VybmVsTGlzdEwpW2ldID0gSFJURktlcm5lbDo6Y3JlYXRlSW50
ZXJwb2xhdGVkS2VybmVsKCgqa2VybmVsTGlzdEwxKVtpXS5nZXQoKSwgKCprZXJuZWxMaXN0TDIp
W2ldLmdldCgpLCB4KTsKKyAgICAgICAgKCprZXJuZWxMaXN0UilbaV0gPSBIUlRGS2VybmVsOjpj
cmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwoKCprZXJuZWxMaXN0UjEpW2ldLmdldCgpLCAoKmtlcm5l
bExpc3RSMilbaV0uZ2V0KCksIHgpOworICAgIH0KKworICAgIC8vIEludGVycG9sYXRlIGVsZXZh
dGlvbiBhbmdsZS4KKyAgICBkb3VibGUgYW5nbGUxID0gaHJ0ZkVsZXZhdGlvbjEtPmVsZXZhdGlv
bkFuZ2xlKCk7CisgICAgZG91YmxlIGFuZ2xlMiA9IGhydGZFbGV2YXRpb24yLT5lbGV2YXRpb25B
bmdsZSgpOworICAgIGRvdWJsZSBhbmdsZSA9ICgxLjAgLSB4KSAqIGFuZ2xlMSArIHggKiBhbmds
ZTI7CisgICAgCisgICAgT3duUHRyPEhSVEZFbGV2YXRpb24+IGhydGZFbGV2YXRpb24gPSBhZG9w
dFB0cihuZXcgSFJURkVsZXZhdGlvbihrZXJuZWxMaXN0TC5yZWxlYXNlKCksIGtlcm5lbExpc3RS
LnJlbGVhc2UoKSwgYW5nbGUsIHNhbXBsZVJhdGUpKTsKKyAgICByZXR1cm4gaHJ0ZkVsZXZhdGlv
bi5yZWxlYXNlKCk7ICAKK30KKwordm9pZCBIUlRGRWxldmF0aW9uOjpnZXRLZXJuZWxzRnJvbUF6
aW11dGgoZG91YmxlIGF6aW11dGhCbGVuZCwgdW5zaWduZWQgYXppbXV0aEluZGV4LCBIUlRGS2Vy
bmVsKiAma2VybmVsTCwgSFJURktlcm5lbCogJmtlcm5lbFIsIGRvdWJsZSYgZnJhbWVEZWxheUws
IGRvdWJsZSYgZnJhbWVEZWxheVIpCit7CisgICAgYm9vbCBjaGVja0F6aW11dGhCbGVuZCA9IGF6
aW11dGhCbGVuZCA+PSAwLjAgJiYgYXppbXV0aEJsZW5kIDwgMS4wOworICAgIEFTU0VSVChjaGVj
a0F6aW11dGhCbGVuZCk7CisgICAgaWYgKCFjaGVja0F6aW11dGhCbGVuZCkKKyAgICAgICAgYXpp
bXV0aEJsZW5kID0gMC4wOworICAgIAorICAgIHVuc2lnbmVkIG51bUtlcm5lbHMgPSBtX2tlcm5l
bExpc3RMLT5zaXplKCk7CisKKyAgICBib29sIGlzSW5kZXhHb29kID0gYXppbXV0aEluZGV4IDwg
bnVtS2VybmVsczsKKyAgICBBU1NFUlQoaXNJbmRleEdvb2QpOworICAgIGlmICghaXNJbmRleEdv
b2QpIHsKKyAgICAgICAga2VybmVsTCA9IDA7CisgICAgICAgIGtlcm5lbFIgPSAwOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIGtlcm5lbEwgPSAoKm1fa2VybmVsTGlzdEwpW2F6
aW11dGhJbmRleF0uZ2V0KCk7CisgICAga2VybmVsUiA9ICgqbV9rZXJuZWxMaXN0UilbYXppbXV0
aEluZGV4XS5nZXQoKTsKKyAgICBmcmFtZURlbGF5TCA9ICgqbV9rZXJuZWxMaXN0TClbYXppbXV0
aEluZGV4XS0+ZnJhbWVEZWxheSgpOworICAgIGZyYW1lRGVsYXlSID0gKCptX2tlcm5lbExpc3RS
KVthemltdXRoSW5kZXhdLT5mcmFtZURlbGF5KCk7CisKKyAgICBpbnQgYXppbXV0aEluZGV4MiA9
IChhemltdXRoSW5kZXggKyAxKSAlIG51bUtlcm5lbHM7CisgICAgZG91YmxlIGZyYW1lRGVsYXky
TCA9ICgqbV9rZXJuZWxMaXN0TClbYXppbXV0aEluZGV4Ml0tPmZyYW1lRGVsYXkoKTsKKyAgICBk
b3VibGUgZnJhbWVEZWxheTJSID0gKCptX2tlcm5lbExpc3RSKVthemltdXRoSW5kZXgyXS0+ZnJh
bWVEZWxheSgpOworCisgICAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgZGVsYXlzLgorICAgIGZy
YW1lRGVsYXlMID0gKDEuMCAtIGF6aW11dGhCbGVuZCkgKiBmcmFtZURlbGF5TCArIGF6aW11dGhC
bGVuZCAqIGZyYW1lRGVsYXkyTDsKKyAgICBmcmFtZURlbGF5UiA9ICgxLjAgLSBhemltdXRoQmxl
bmQpICogZnJhbWVEZWxheVIgKyBhemltdXRoQmxlbmQgKiBmcmFtZURlbGF5MlI7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uaAkocmV2aXNpb24gMCkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkVsZXZhdGlvbi5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgSFJURkVsZXZhdGlvbl9oCisjZGVmaW5lIEhSVEZFbGV2YXRp
b25faAorCisjaW5jbHVkZSAiSFJURktlcm5lbC5oIgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJs
ZS5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5o
PgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQu
aD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5o
PgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKKy8vIEhSVEZFbGV2YXRpb24gY29udGFpbnMgYWxsIG9mIHRoZSBIUlRGS2VybmVscyAob25l
IGxlZnQgZWFyIGFuZCBvbmUgcmlnaHQgZWFyIHBlciBhemltdXRoIGFuZ2xlKSBmb3IgYSBwYXJ0
aWN1bGFyIGVsZXZhdGlvbi4KKworY2xhc3MgSFJURkVsZXZhdGlvbiA6IHB1YmxpYyBOb25jb3B5
YWJsZSB7CitwdWJsaWM6CisgICAgLy8gTG9hZHMgYW5kIHJldHVybnMgYW4gSFJURkVsZXZhdGlv
biB3aXRoIHRoZSBnaXZlbiBIUlRGIGRhdGFiYXNlIHN1YmplY3QgbmFtZSBhbmQgZWxldmF0aW9u
IGZyb20gYnJvd3NlciAob3IgV2ViS2l0LmZyYW1ld29yaykgcmVzb3VyY2VzLgorICAgIC8vIE5v
cm1hbGx5LCB0aGVyZSB3aWxsIG9ubHkgYmUgYSBzaW5nbGUgSFJURiBkYXRhYmFzZSBzZXQsIGJ1
dCB0aGlzIEFQSSBzdXBwb3J0cyB0aGUgcG9zc2liaWxpdHkgb2YgbXVsdGlwbGUgb25lcyB3aXRo
IGRpZmZlcmVudCBuYW1lcy4KKyAgICAvLyBJbnRlcnBvbGF0ZWQgYXppbXV0aHMgd2lsbCBiZSBn
ZW5lcmF0ZWQgYmFzZWQgb24gSW50ZXJwb2xhdGlvbkZhY3Rvci4KKyAgICAvLyBWYWxpZCB2YWx1
ZXMgZm9yIGVsZXZhdGlvbiBhcmUgLTQ1IC0+ICs5MCBpbiAxNSBkZWdyZWUgaW5jcmVtZW50cy4K
KyAgICBzdGF0aWMgUGFzc093blB0cjxIUlRGRWxldmF0aW9uPiBjcmVhdGVGb3JTdWJqZWN0KGNv
bnN0IFN0cmluZyYgc3ViamVjdE5hbWUsIGludCBlbGV2YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRl
KTsKKworICAgIC8vIEdpdmVuIHR3byBIUlRGRWxldmF0aW9ucywgYW5kIGFuIGludGVycG9sYXRp
b24gZmFjdG9yIHg6IDAgLT4gMSwgcmV0dXJucyBhbiBpbnRlcnBvbGF0ZWQgSFJURkVsZXZhdGlv
bi4KKyAgICBzdGF0aWMgUGFzc093blB0cjxIUlRGRWxldmF0aW9uPiBjcmVhdGVCeUludGVycG9s
YXRpbmdTbGljZXMoSFJURkVsZXZhdGlvbiogaHJ0ZkVsZXZhdGlvbjEsIEhSVEZFbGV2YXRpb24q
IGhydGZFbGV2YXRpb24yLCBkb3VibGUgeCwgZG91YmxlIHNhbXBsZVJhdGUpOworCisgICAgLy8g
UmV0dXJucyB0aGUgbGlzdCBvZiBsZWZ0IG9yIHJpZ2h0IGVhciBIUlRGS2VybmVscyBmb3IgYWxs
IHRoZSBhemltdXRocyBnb2luZyBmcm9tIDAgdG8gMzYwIGRlZ3JlZXMuCisgICAgSFJURktlcm5l
bExpc3QqIGtlcm5lbExpc3RMKCkgeyByZXR1cm4gbV9rZXJuZWxMaXN0TC5nZXQoKTsgfQorICAg
IEhSVEZLZXJuZWxMaXN0KiBrZXJuZWxMaXN0UigpIHsgcmV0dXJuIG1fa2VybmVsTGlzdFIuZ2V0
KCk7IH0KKworICAgIGRvdWJsZSBlbGV2YXRpb25BbmdsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWxl
dmF0aW9uQW5nbGU7IH0KKyAgICB1bnNpZ25lZCBudW1iZXJPZkF6aW11dGhzKCkgeyByZXR1cm4g
TnVtYmVyT2ZUb3RhbEF6aW11dGhzOyB9CisgICAgZG91YmxlIHNhbXBsZVJhdGUoKSBjb25zdCB7
IHJldHVybiBtX3NhbXBsZVJhdGU7IH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIHRoZSBsZWZ0IGFu
ZCByaWdodCBrZXJuZWxzIGZvciB0aGUgZ2l2ZW4gYXppbXV0aCBpbmRleC4KKyAgICAvLyBUaGUg
aW50ZXJwb2xhdGVkIGRlbGF5cyBiYXNlZCBvbiBhemltdXRoQmxlbmQ6IDAgLT4gMSBhcmUgcmV0
dXJuZWQgaW4gZnJhbWVEZWxheUwgYW5kIGZyYW1lRGVsYXlSLgorICAgIHZvaWQgZ2V0S2VybmVs
c0Zyb21BemltdXRoKGRvdWJsZSBhemltdXRoQmxlbmQsIHVuc2lnbmVkIGF6aW11dGhJbmRleCwg
SFJURktlcm5lbCogJmtlcm5lbEwsIEhSVEZLZXJuZWwqICZrZXJuZWxSLCBkb3VibGUmIGZyYW1l
RGVsYXlMLCBkb3VibGUmIGZyYW1lRGVsYXlSKTsKKyAgICAKKyAgICAvLyBTcGFjaW5nLCBpbiBk
ZWdyZWVzLCBiZXR3ZWVuIGV2ZXJ5IGF6aW11dGggbG9hZGVkIGZyb20gcmVzb3VyY2UuCisgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIEF6aW11dGhTcGFjaW5nID0gMTU7CisgICAgCisgICAgLy8g
TnVtYmVyIG9mIGF6aW11dGhzIGxvYWRlZCBmcm9tIHJlc291cmNlLgorICAgIHN0YXRpYyBjb25z
dCB1bnNpZ25lZCBOdW1iZXJPZlJhd0F6aW11dGhzID0gMzYwIC8gQXppbXV0aFNwYWNpbmc7CisK
KyAgICAvLyBJbnRlcnBvbGF0ZXMgYnkgdGhpcyBmYWN0b3IgdG8gZ2V0IHRoZSB0b3RhbCBudW1i
ZXIgb2YgYXppbXV0aHMgZnJvbSBldmVyeSBhemltdXRoIGxvYWRlZCBmcm9tIHJlc291cmNlLgor
ICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJbnRlcnBvbGF0aW9uRmFjdG9yID0gODsKKyAgICAK
KyAgICAvLyBUb3RhbCBudW1iZXIgb2YgYXppbXV0aHMgYWZ0ZXIgaW50ZXJwb2xhdGlvbi4KKyAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtYmVyT2ZUb3RhbEF6aW11dGhzID0gTnVtYmVyT2ZS
YXdBemltdXRocyAqIEludGVycG9sYXRpb25GYWN0b3I7CisKKyAgICAvLyBHaXZlbiBhIHNwZWNp
ZmljIGF6aW11dGggYW5kIGVsZXZhdGlvbiBhbmdsZSwgcmV0dXJucyB0aGUgbGVmdCBhbmQgcmln
aHQgSFJURktlcm5lbC4KKyAgICAvLyBWYWxpZCB2YWx1ZXMgZm9yIGF6aW11dGggYXJlIDAgLT4g
MzQ1IGluIDE1IGRlZ3JlZSBpbmNyZW1lbnRzLgorICAgIC8vIFZhbGlkIHZhbHVlcyBmb3IgZWxl
dmF0aW9uIGFyZSAtNDUgLT4gKzkwIGluIDE1IGRlZ3JlZSBpbmNyZW1lbnRzLgorICAgIHN0YXRp
YyB2b2lkIGNhbGN1bGF0ZUtlcm5lbHNGb3JBemltdXRoRWxldmF0aW9uKGludCBhemltdXRoLCBp
bnQgZWxldmF0aW9uLCBkb3VibGUgc2FtcGxlUmF0ZSwgY29uc3QgU3RyaW5nJiBzdWJqZWN0TmFt
ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBS
ZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbEwsIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsUik7
CisKKyAgICAvLyBHaXZlbiBhIHNwZWNpZmljIGF6aW11dGggYW5kIGVsZXZhdGlvbiBhbmdsZSwg
cmV0dXJucyB0aGUgbGVmdCBhbmQgcmlnaHQgSFJURktlcm5lbCBpbiBrZXJuZWxMIGFuZCBrZXJu
ZWxSLgorICAgIC8vIFRoaXMgbWV0aG9kIGF2ZXJhZ2VzIHRoZSBtZWFzdXJlZCByZXNwb25zZSB1
c2luZyBzeW1tZXRyeSBvZiBhemltdXRoIChmb3IgZXhhbXBsZSBieSBhdmVyYWdpbmcgdGhlIC0z
MC4wIGFuZCArMzAuMCBhemltdXRoIHJlc3BvbnNlcykuCisgICAgc3RhdGljIHZvaWQgY2FsY3Vs
YXRlU3ltbWV0cmljS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24oaW50IGF6aW11dGgsIGludCBl
bGV2YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRlLCBjb25zdCBTdHJpbmcmIHN1YmplY3ROYW1lLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsTCwgUmVmUHRyPEhSVEZLZXJuZWw+JiBrZXJu
ZWxSKTsKK3ByaXZhdGU6CisgICAgSFJURkVsZXZhdGlvbigpCisgICAgICAgIDogbV9rZXJuZWxM
aXN0TCgwKQorICAgICAgICAsIG1fa2VybmVsTGlzdFIoMCkKKyAgICAgICAgLCBtX2VsZXZhdGlv
bkFuZ2xlKDApCisgICAgICAgICwgbV9zYW1wbGVSYXRlKDQ0MTAwLjApCisgICAgeworICAgIH0K
KworICAgIEhSVEZFbGV2YXRpb24oUGFzc093blB0cjxIUlRGS2VybmVsTGlzdD4ga2VybmVsTGlz
dEwsIFBhc3NPd25QdHI8SFJURktlcm5lbExpc3Q+IGtlcm5lbExpc3RSLCBpbnQgZWxldmF0aW9u
LCBkb3VibGUgc2FtcGxlUmF0ZSkKKyAgICAgICAgOiBtX2tlcm5lbExpc3RMKGtlcm5lbExpc3RM
KQorICAgICAgICAsIG1fa2VybmVsTGlzdFIoa2VybmVsTGlzdFIpCisgICAgICAgICwgbV9lbGV2
YXRpb25BbmdsZShlbGV2YXRpb24pCisgICAgICAgICwgbV9zYW1wbGVSYXRlKHNhbXBsZVJhdGUp
CisgICAgeworICAgIH0KKworICAgIE93blB0cjxIUlRGS2VybmVsTGlzdD4gbV9rZXJuZWxMaXN0
TDsKKyAgICBPd25QdHI8SFJURktlcm5lbExpc3Q+IG1fa2VybmVsTGlzdFI7CisgICAgZG91Ymxl
IG1fZWxldmF0aW9uQW5nbGU7CisgICAgZG91YmxlIG1fc2FtcGxlUmF0ZTsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEhSVEZFbGV2YXRpb25faAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68303</attachid>
            <date>2010-09-21 16:27:57 -0700</date>
            <delta_ts>2010-09-22 01:46:08 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45864-20100921162756.patch</filename>
            <type>text/plain</type>
            <size>19124</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Nzk5MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjYgQEAKKzIwMTAtMDktMjEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgSFJURkVsZXZhdGlvbiBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NDU4NjQKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVkaW8g
QVBJIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9I
UlRGRWxldmF0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9u
OjpjYWxjdWxhdGVTeW1tZXRyaWNLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpjYWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZh
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpjcmVhdGVGb3JTdWJqZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZFbGV2YXRpb246OmNyZWF0ZUJ5SW50ZXJwb2xhdGlu
Z1NsaWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjpnZXRLZXJuZWxzRnJv
bUF6aW11dGgpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uaDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjprZXJuZWxMaXN0TCk6CisgICAg
ICAgIChXZWJDb3JlOjpIUlRGRWxldmF0aW9uOjprZXJuZWxMaXN0Uik6CisgICAgICAgIChXZWJD
b3JlOjpIUlRGRWxldmF0aW9uOjplbGV2YXRpb25BbmdsZSk6CisgICAgICAgIChXZWJDb3JlOjpI
UlRGRWxldmF0aW9uOjpudW1iZXJPZkF6aW11dGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkhSVEZF
bGV2YXRpb246OnNhbXBsZVJhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFJURkVsZXZhdGlvbjo6
SFJURkVsZXZhdGlvbik6CisKIDIwMTAtMDktMjEgIFJvYmVydCBIb2dhbiAgPHJvYmVydEB3ZWJr
aXQub3JnPgogCiAgICAgICAgIFJ1YmJlci1zdGFtcGVkIGJ5IEFyaXlhIEhpZGF5YXQuCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vSFJURkVsZXZhdGlvbi5jcHAJKHJldmlzaW9uIDApCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL0hSVEZFbGV2YXRpb24uY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhl
IG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJf
QVVESU8pCisKKyNpbmNsdWRlICJIUlRGRWxldmF0aW9uLmgiCisKKyNpbmNsdWRlICJBdWRpb0J1
cy5oIgorI2luY2x1ZGUgIkF1ZGlvRmlsZVJlYWRlci5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzb3Vy
Y2VzLmgiCisjaW5jbHVkZSAiQmlxdWFkLmgiCisjaW5jbHVkZSAiRkZURnJhbWUuaCIKKyNpbmNs
dWRlICJIUlRGUGFubmVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hdGgu
aD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisgCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NvbnN0IHVuc2lnbmVkIEhSVEZFbGV2YXRpb246OkF6aW11
dGhTcGFjaW5nID0gMTU7Citjb25zdCB1bnNpZ25lZCBIUlRGRWxldmF0aW9uOjpOdW1iZXJPZlJh
d0F6aW11dGhzID0gMzYwIC8gQXppbXV0aFNwYWNpbmc7Citjb25zdCB1bnNpZ25lZCBIUlRGRWxl
dmF0aW9uOjpJbnRlcnBvbGF0aW9uRmFjdG9yID0gODsKK2NvbnN0IHVuc2lnbmVkIEhSVEZFbGV2
YXRpb246Ok51bWJlck9mVG90YWxBemltdXRocyA9IE51bWJlck9mUmF3QXppbXV0aHMgKiBJbnRl
cnBvbGF0aW9uRmFjdG9yOworCisvLyBUYWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIHN5bW1ldHJ5IGFu
ZCBjcmVhdGVzIGEgY29tcG9zaXRlIHZlcnNpb24gb2YgdGhlIHR3byBtZWFzdXJlZCB2ZXJzaW9u
cy4gIEZvciBleGFtcGxlLCB3ZSBoYXZlIGJvdGggYXppbXV0aCAzMCBhbmQgLTMwIGRlZ3JlZXMK
Ky8vIHdoZXJlIHRoZSByb2xlcyBvZiBsZWZ0IGFuZCByaWdodCBlYXJzIGFyZSByZXZlcnNlZCB3
aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlci4KK2Jvb2wgSFJURkVsZXZhdGlvbjo6Y2FsY3VsYXRl
U3ltbWV0cmljS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24oaW50IGF6aW11dGgsIGludCBlbGV2
YXRpb24sIGRvdWJsZSBzYW1wbGVSYXRlLCBjb25zdCBTdHJpbmcmIHN1YmplY3ROYW1lLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBSZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbEwsIFJlZlB0cjxIUlRGS2VybmVsPiYga2Vy
bmVsUikKK3sKKyAgICBSZWZQdHI8SFJURktlcm5lbD4ga2VybmVsTDE7CisgICAgUmVmUHRyPEhS
VEZLZXJuZWw+IGtlcm5lbFIxOworICAgIGJvb2wgc3VjY2VzcyA9IGNhbGN1bGF0ZUtlcm5lbHNG
b3JBemltdXRoRWxldmF0aW9uKGF6aW11dGgsIGVsZXZhdGlvbiwgc2FtcGxlUmF0ZSwgc3ViamVj
dE5hbWUsIGtlcm5lbEwxLCBrZXJuZWxSMSk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgIC8vIEFuZCBzeW1tZXRyaWMgdmVyc2lvbgorICAg
IGludCBzeW1tZXRyaWNBemltdXRoID0gIWF6aW11dGggPyAwIDogMzYwIC0gYXppbXV0aDsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCisgICAgUmVmUHRyPEhSVEZLZXJuZWw+IGtlcm5lbEwyOworICAgIFJlZlB0cjxIUlRGS2Vy
bmVsPiBrZXJuZWxSMjsKKyAgICBzdWNjZXNzID0gY2FsY3VsYXRlS2VybmVsc0ZvckF6aW11dGhF
bGV2YXRpb24oc3ltbWV0cmljQXppbXV0aCwgZWxldmF0aW9uLCBzYW1wbGVSYXRlLCBzdWJqZWN0
TmFtZSwga2VybmVsTDIsIGtlcm5lbFIyKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgLy8gTm90aWNlIEwvUiByZXZlcnNhbCBpbiBzeW1t
ZXRyaWMgdmVyc2lvbi4KKyAgICBrZXJuZWxMID0gSFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xh
dGVkS2VybmVsKGtlcm5lbEwxLmdldCgpLCBrZXJuZWxSMi5nZXQoKSwgMC41KTsKKyAgICBrZXJu
ZWxSID0gSFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2VybmVsKGtlcm5lbFIxLmdldCgp
LCBrZXJuZWxMMi5nZXQoKSwgMC41KTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBIUlRGRWxldmF0aW9uOjpjYWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihpbnQg
YXppbXV0aCwgaW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJhdGUsIGNvbnN0IFN0cmluZyYg
c3ViamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsTCwgUmVmUHRyPEhSVEZLZXJu
ZWw+JiBrZXJuZWxSKQoreworICAgIC8vIFZhbGlkIHZhbHVlcyBmb3IgYXppbXV0aCBhcmUgMCAt
PiAzNDUgaW4gMTUgZGVncmVlIGluY3JlbWVudHMuCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBl
bGV2YXRpb24gYXJlIC00NSAtPiArOTAgaW4gMTUgZGVncmVlIGluY3JlbWVudHMuCisKKyAgICBi
b29sIGlzQXppbXV0aEdvb2QgPSBhemltdXRoID49IDAgJiYgYXppbXV0aCA8PSAzNDUgJiYgKGF6
aW11dGggLyAxNSkgKiAxNSA9PSBhemltdXRoOworICAgIEFTU0VSVChpc0F6aW11dGhHb29kKTsK
KyAgICBpZiAoIWlzQXppbXV0aEdvb2QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJv
b2wgaXNFbGV2YXRpb25Hb29kID0gZWxldmF0aW9uID49IC00NSAmJiBlbGV2YXRpb24gPD0gOTAg
JiYgKGVsZXZhdGlvbiAvIDE1KSAqIDE1ID09IGVsZXZhdGlvbjsKKyAgICBBU1NFUlQoaXNFbGV2
YXRpb25Hb29kKTsKKyAgICBpZiAoIWlzRWxldmF0aW9uR29vZCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIAorICAgIC8vIENvbnN0cnVjdCB0aGUgcmVzb3VyY2UgbmFtZSBmcm9tIHRoZSBz
dWJqZWN0IG5hbWUsIGF6aW11dGgsIGFuZCBlbGV2YXRpb24sIGZvciBleGFtcGxlOgorICAgIC8v
ICJJUkNfQ29tcG9zaXRlX0NfUjAxOTVfVDAxNV9QMDAwIgorICAgIC8vIE5vdGU6IHRoZSBwYXNz
ZWQgaW4gc3ViamVjdE5hbWUgaXMgbm90IGEgc3RyaW5nIHBhc3NlZCBpbiB2aWEgSmF2YVNjcmlw
dCBvciB0aGUgd2ViLgorICAgIC8vIEl0J3MgcGFzc2VkIGluIGFzIGFuIGludGVybmFsIEFTQ0lJ
IGlkZW50aWZpZXIgYW5kIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAgICBpbnQgcG9z
aXRpdmVFbGV2YXRpb24gPSBlbGV2YXRpb24gPCAwID8gZWxldmF0aW9uICsgMzYwIDogZWxldmF0
aW9uOworICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSBTdHJpbmc6OmZvcm1hdCgiSVJDXyVzX0Nf
UjAxOTVfVCUwM2RfUCUwM2QiLCBzdWJqZWN0TmFtZS51dGY4KCkuZGF0YSgpLCBhemltdXRoLCBw
b3NpdGl2ZUVsZXZhdGlvbik7CisKKyAgICBPd25QdHI8QXVkaW9CdXM+IGltcHVsc2VSZXNwb25z
ZShjcmVhdGVCdXNGcm9tQXVkaW9GaWxlUmVzb3VyY2UocmVzb3VyY2VOYW1lLCBzYW1wbGVSYXRl
KSk7CisKKyAgICBBU1NFUlQoaW1wdWxzZVJlc3BvbnNlLmdldCgpKTsKKyAgICBpZiAoIWltcHVs
c2VSZXNwb25zZS5nZXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIHNpemVf
dCByZXNwb25zZUxlbmd0aCA9IGltcHVsc2VSZXNwb25zZS0+bGVuZ3RoKCk7CisKKyAgICAvLyBD
aGVjayBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGxlbmd0aC4gIEZvciBub3cgdGhlc2UgYXJlIGZp
eGVkIGFuZCBrbm93bi4KKyAgICBib29sIGlzQnVzR29vZCA9IHJlc3BvbnNlTGVuZ3RoID09IDUx
MiAmJiBpbXB1bHNlUmVzcG9uc2UtPm51bWJlck9mQ2hhbm5lbHMoKSA9PSAyOworICAgIEFTU0VS
VChpc0J1c0dvb2QpOworICAgIGlmICghaXNCdXNHb29kKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgCisgICAgQXVkaW9DaGFubmVsKiBsZWZ0RWFySW1wdWxzZVJlc3BvbnNlID0gaW1wdWxz
ZVJlc3BvbnNlLT5jaGFubmVsQnlUeXBlKEF1ZGlvQnVzOjpDaGFubmVsTGVmdCk7CisgICAgQXVk
aW9DaGFubmVsKiByaWdodEVhckltcHVsc2VSZXNwb25zZSA9IGltcHVsc2VSZXNwb25zZS0+Y2hh
bm5lbEJ5VHlwZShBdWRpb0J1czo6Q2hhbm5lbFJpZ2h0KTsKKworICAgIC8vIE5vdGUgdGhhdCBk
ZXBlbmRpbmcgb24gdGhlIGZmdFNpemUgcmV0dXJuZWQgYnkgdGhlIHBhbm5lciwgd2UgbWF5IGJl
IHRydW5jYXRpbmcgdGhlIGltcHVsc2UgcmVzcG9uc2Ugd2UganVzdCBsb2FkZWQgaW4uCisgICAg
Y29uc3Qgc2l6ZV90IGZmdFNpemUgPSBIUlRGUGFubmVyOjpmZnRTaXplRm9yU2FtcGxlUmF0ZShz
YW1wbGVSYXRlKTsKKyAgICBrZXJuZWxMID0gSFJURktlcm5lbDo6Y3JlYXRlKGxlZnRFYXJJbXB1
bHNlUmVzcG9uc2UsIGZmdFNpemUsIHNhbXBsZVJhdGUsIHRydWUpOworICAgIGtlcm5lbFIgPSBI
UlRGS2VybmVsOjpjcmVhdGUocmlnaHRFYXJJbXB1bHNlUmVzcG9uc2UsIGZmdFNpemUsIHNhbXBs
ZVJhdGUsIHRydWUpOworICAgIAorICAgIHJldHVybiB0cnVlOworfQorCisvLyBUaGUgcmFuZ2Ug
b2YgZWxldmF0aW9ucyBmb3IgdGhlIElSQ0FNIGltcHVsc2UgcmVzcG9uc2VzIHZhcmllcyBkZXBl
bmRpbmcgb24gYXppbXV0aCwgYnV0IHRoZSBtaW5pbXVtIGVsZXZhdGlvbiBhcHBlYXJzIHRvIGFs
d2F5cyBiZSAtNDUuCisvLworLy8gSGVyZSdzIGhvdyBpdCBnb2VzOgorc3RhdGljIGludCBtYXhF
bGV2YXRpb25zW10gPSB7CisgICAgICAgIC8vICBBemltdXRoCisgICAgICAgIC8vCisgICAgOTAs
IC8vIDAgIAorICAgIDQ1LCAvLyAxNSAKKyAgICA2MCwgLy8gMzAgCisgICAgNDUsIC8vIDQ1IAor
ICAgIDc1LCAvLyA2MCAKKyAgICA0NSwgLy8gNzUgCisgICAgNjAsIC8vIDkwIAorICAgIDQ1LCAv
LyAxMDUgCisgICAgNzUsIC8vIDEyMCAKKyAgICA0NSwgLy8gMTM1IAorICAgIDYwLCAvLyAxNTAg
CisgICAgNDUsIC8vIDE2NSAKKyAgICA3NSwgLy8gMTgwIAorICAgIDQ1LCAvLyAxOTUgCisgICAg
NjAsIC8vIDIxMCAKKyAgICA0NSwgLy8gMjI1IAorICAgIDc1LCAvLyAyNDAgCisgICAgNDUsIC8v
IDI1NSAKKyAgICA2MCwgLy8gMjcwIAorICAgIDQ1LCAvLyAyODUgCisgICAgNzUsIC8vIDMwMCAK
KyAgICA0NSwgLy8gMzE1IAorICAgIDYwLCAvLyAzMzAgCisgICAgNDUgLy8gIDM0NSAKK307CisK
K1Bhc3NPd25QdHI8SFJURkVsZXZhdGlvbj4gSFJURkVsZXZhdGlvbjo6Y3JlYXRlRm9yU3ViamVj
dChjb25zdCBTdHJpbmcmIHN1YmplY3ROYW1lLCBpbnQgZWxldmF0aW9uLCBkb3VibGUgc2FtcGxl
UmF0ZSkKK3sKKyAgICBib29sIGlzRWxldmF0aW9uR29vZCA9IGVsZXZhdGlvbiA+PSAtNDUgJiYg
ZWxldmF0aW9uIDw9IDkwICYmIChlbGV2YXRpb24gLyAxNSkgKiAxNSA9PSBlbGV2YXRpb247Cisg
ICAgQVNTRVJUKGlzRWxldmF0aW9uR29vZCk7CisgICAgaWYgKCFpc0VsZXZhdGlvbkdvb2QpCisg
ICAgICAgIHJldHVybiAwOworICAgICAgICAKKyAgICBPd25QdHI8SFJURktlcm5lbExpc3Q+IGtl
cm5lbExpc3RMID0gYWRvcHRQdHIobmV3IEhSVEZLZXJuZWxMaXN0KE51bWJlck9mVG90YWxBemlt
dXRocykpOworICAgIE93blB0cjxIUlRGS2VybmVsTGlzdD4ga2VybmVsTGlzdFIgPSBhZG9wdFB0
cihuZXcgSFJURktlcm5lbExpc3QoTnVtYmVyT2ZUb3RhbEF6aW11dGhzKSk7CisKKyAgICAvLyBM
b2FkIGNvbnZvbHV0aW9uIGtlcm5lbHMgZnJvbSBIUlRGIGZpbGVzLgorICAgIGludCBpbnRlcnBv
bGF0ZWRJbmRleCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCByYXdJbmRleCA9IDA7IHJhd0luZGV4
IDwgTnVtYmVyT2ZSYXdBemltdXRoczsgKytyYXdJbmRleCkgeworICAgICAgICAvLyBEb24ndCBs
ZXQgZWxldmF0aW9uIGV4Y2VlZCBtYXhpbXVtIGZvciB0aGlzIGF6aW11dGguCisgICAgICAgIGlu
dCBtYXhFbGV2YXRpb24gPSBtYXhFbGV2YXRpb25zW3Jhd0luZGV4XTsKKyAgICAgICAgaW50IGFj
dHVhbEVsZXZhdGlvbiA9IG1pbihlbGV2YXRpb24sIG1heEVsZXZhdGlvbik7CisKKyAgICAgICAg
Ym9vbCBzdWNjZXNzID0gY2FsY3VsYXRlS2VybmVsc0ZvckF6aW11dGhFbGV2YXRpb24ocmF3SW5k
ZXggKiBBemltdXRoU3BhY2luZywgYWN0dWFsRWxldmF0aW9uLCBzYW1wbGVSYXRlLCBzdWJqZWN0
TmFtZSwga2VybmVsTGlzdEwtPmF0KGludGVycG9sYXRlZEluZGV4KSwga2VybmVsTGlzdFItPmF0
KGludGVycG9sYXRlZEluZGV4KSk7CisgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICAgICAgCisgICAgICAgIGludGVycG9sYXRlZEluZGV4ICs9IElu
dGVycG9sYXRpb25GYWN0b3I7CisgICAgfQorCisgICAgLy8gTm93IGdvIGJhY2sgYW5kIGludGVy
cG9sYXRlIGludGVybWVkaWF0ZSBhemltdXRoIHZhbHVlcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgTnVtYmVyT2ZUb3RhbEF6aW11dGhzOyBpICs9IEludGVycG9sYXRpb25GYWN0b3Ip
IHsKKyAgICAgICAgaW50IGogPSAoaSArIEludGVycG9sYXRpb25GYWN0b3IpICUgTnVtYmVyT2ZU
b3RhbEF6aW11dGhzOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgaW50ZXJwb2xhdGVkIGNvbnZv
bHV0aW9uIGtlcm5lbHMgYW5kIGRlbGF5cy4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBqaiA9IDE7
IGpqIDwgSW50ZXJwb2xhdGlvbkZhY3RvcjsgKytqaikgeworICAgICAgICAgICAgZG91YmxlIHgg
PSBkb3VibGUoamopIC8gZG91YmxlKEludGVycG9sYXRpb25GYWN0b3IpOyAvLyBpbnRlcnBvbGF0
ZSBmcm9tIDAgLT4gMQorCisgICAgICAgICAgICAoKmtlcm5lbExpc3RMKVtpICsgampdID0gSFJU
Rktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVkS2VybmVsKGtlcm5lbExpc3RMLT5hdChpKS5nZXQo
KSwga2VybmVsTGlzdEwtPmF0KGopLmdldCgpLCB4KTsKKyAgICAgICAgICAgICgqa2VybmVsTGlz
dFIpW2kgKyBqal0gPSBIUlRGS2VybmVsOjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwoa2VybmVs
TGlzdFItPmF0KGkpLmdldCgpLCBrZXJuZWxMaXN0Ui0+YXQoaikuZ2V0KCksIHgpOworICAgICAg
ICB9CisgICAgfQorICAgIAorICAgIE93blB0cjxIUlRGRWxldmF0aW9uPiBocnRmRWxldmF0aW9u
ID0gYWRvcHRQdHIobmV3IEhSVEZFbGV2YXRpb24oa2VybmVsTGlzdEwucmVsZWFzZSgpLCBrZXJu
ZWxMaXN0Ui5yZWxlYXNlKCksIGVsZXZhdGlvbiwgc2FtcGxlUmF0ZSkpOworICAgIHJldHVybiBo
cnRmRWxldmF0aW9uLnJlbGVhc2UoKTsKK30KKworUGFzc093blB0cjxIUlRGRWxldmF0aW9uPiBI
UlRGRWxldmF0aW9uOjpjcmVhdGVCeUludGVycG9sYXRpbmdTbGljZXMoSFJURkVsZXZhdGlvbiog
aHJ0ZkVsZXZhdGlvbjEsIEhSVEZFbGV2YXRpb24qIGhydGZFbGV2YXRpb24yLCBkb3VibGUgeCwg
ZG91YmxlIHNhbXBsZVJhdGUpCit7CisgICAgQVNTRVJUKGhydGZFbGV2YXRpb24xICYmIGhydGZF
bGV2YXRpb24yKTsKKyAgICBpZiAoIWhydGZFbGV2YXRpb24xIHx8ICFocnRmRWxldmF0aW9uMikK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIAorICAgIEFTU0VSVCh4ID49IDAuMCAmJiB4IDwg
MS4wKTsKKyAgICAKKyAgICBPd25QdHI8SFJURktlcm5lbExpc3Q+IGtlcm5lbExpc3RMID0gYWRv
cHRQdHIobmV3IEhSVEZLZXJuZWxMaXN0KE51bWJlck9mVG90YWxBemltdXRocykpOworICAgIE93
blB0cjxIUlRGS2VybmVsTGlzdD4ga2VybmVsTGlzdFIgPSBhZG9wdFB0cihuZXcgSFJURktlcm5l
bExpc3QoTnVtYmVyT2ZUb3RhbEF6aW11dGhzKSk7CisKKyAgICBIUlRGS2VybmVsTGlzdCoga2Vy
bmVsTGlzdEwxID0gaHJ0ZkVsZXZhdGlvbjEtPmtlcm5lbExpc3RMKCk7CisgICAgSFJURktlcm5l
bExpc3QqIGtlcm5lbExpc3RSMSA9IGhydGZFbGV2YXRpb24xLT5rZXJuZWxMaXN0UigpOworICAg
IEhSVEZLZXJuZWxMaXN0KiBrZXJuZWxMaXN0TDIgPSBocnRmRWxldmF0aW9uMi0+a2VybmVsTGlz
dEwoKTsKKyAgICBIUlRGS2VybmVsTGlzdCoga2VybmVsTGlzdFIyID0gaHJ0ZkVsZXZhdGlvbjIt
Pmtlcm5lbExpc3RSKCk7CisgICAgCisgICAgLy8gSW50ZXJwb2xhdGUga2VybmVscyBvZiBjb3Jy
ZXNwb25kaW5nIGF6aW11dGhzIG9mIHRoZSB0d28gZWxldmF0aW9ucy4KKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgTnVtYmVyT2ZUb3RhbEF6aW11dGhzOyArK2kpIHsKKyAgICAgICAgKCpr
ZXJuZWxMaXN0TClbaV0gPSBIUlRGS2VybmVsOjpjcmVhdGVJbnRlcnBvbGF0ZWRLZXJuZWwoa2Vy
bmVsTGlzdEwxLT5hdChpKS5nZXQoKSwga2VybmVsTGlzdEwyLT5hdChpKS5nZXQoKSwgeCk7Cisg
ICAgICAgICgqa2VybmVsTGlzdFIpW2ldID0gSFJURktlcm5lbDo6Y3JlYXRlSW50ZXJwb2xhdGVk
S2VybmVsKGtlcm5lbExpc3RSMS0+YXQoaSkuZ2V0KCksIGtlcm5lbExpc3RSMi0+YXQoaSkuZ2V0
KCksIHgpOworICAgIH0KKworICAgIC8vIEludGVycG9sYXRlIGVsZXZhdGlvbiBhbmdsZS4KKyAg
ICBkb3VibGUgYW5nbGUgPSAoMS4wIC0geCkgKiBocnRmRWxldmF0aW9uMS0+ZWxldmF0aW9uQW5n
bGUoKSArIHggKiBocnRmRWxldmF0aW9uMi0+ZWxldmF0aW9uQW5nbGUoKTsKKyAgICAKKyAgICBP
d25QdHI8SFJURkVsZXZhdGlvbj4gaHJ0ZkVsZXZhdGlvbiA9IGFkb3B0UHRyKG5ldyBIUlRGRWxl
dmF0aW9uKGtlcm5lbExpc3RMLnJlbGVhc2UoKSwga2VybmVsTGlzdFIucmVsZWFzZSgpLCBhbmds
ZSwgc2FtcGxlUmF0ZSkpOworICAgIHJldHVybiBocnRmRWxldmF0aW9uLnJlbGVhc2UoKTsgIAor
fQorCit2b2lkIEhSVEZFbGV2YXRpb246OmdldEtlcm5lbHNGcm9tQXppbXV0aChkb3VibGUgYXpp
bXV0aEJsZW5kLCB1bnNpZ25lZCBhemltdXRoSW5kZXgsIEhSVEZLZXJuZWwqICZrZXJuZWxMLCBI
UlRGS2VybmVsKiAma2VybmVsUiwgZG91YmxlJiBmcmFtZURlbGF5TCwgZG91YmxlJiBmcmFtZURl
bGF5UikKK3sKKyAgICBib29sIGNoZWNrQXppbXV0aEJsZW5kID0gYXppbXV0aEJsZW5kID49IDAu
MCAmJiBhemltdXRoQmxlbmQgPCAxLjA7CisgICAgQVNTRVJUKGNoZWNrQXppbXV0aEJsZW5kKTsK
KyAgICBpZiAoIWNoZWNrQXppbXV0aEJsZW5kKQorICAgICAgICBhemltdXRoQmxlbmQgPSAwLjA7
CisgICAgCisgICAgdW5zaWduZWQgbnVtS2VybmVscyA9IG1fa2VybmVsTGlzdEwtPnNpemUoKTsK
KworICAgIGJvb2wgaXNJbmRleEdvb2QgPSBhemltdXRoSW5kZXggPCBudW1LZXJuZWxzOworICAg
IEFTU0VSVChpc0luZGV4R29vZCk7CisgICAgaWYgKCFpc0luZGV4R29vZCkgeworICAgICAgICBr
ZXJuZWxMID0gMDsKKyAgICAgICAga2VybmVsUiA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisgICAgCisgICAgLy8gUmV0dXJuIHRoZSBsZWZ0IGFuZCByaWdodCBrZXJuZWxzLgorICAgIGtl
cm5lbEwgPSBtX2tlcm5lbExpc3RMLT5hdChhemltdXRoSW5kZXgpLmdldCgpOworICAgIGtlcm5l
bFIgPSBtX2tlcm5lbExpc3RSLT5hdChhemltdXRoSW5kZXgpLmdldCgpOworCisgICAgZnJhbWVE
ZWxheUwgPSBtX2tlcm5lbExpc3RMLT5hdChhemltdXRoSW5kZXgpLT5mcmFtZURlbGF5KCk7Cisg
ICAgZnJhbWVEZWxheVIgPSBtX2tlcm5lbExpc3RSLT5hdChhemltdXRoSW5kZXgpLT5mcmFtZURl
bGF5KCk7CisKKyAgICBpbnQgYXppbXV0aEluZGV4MiA9IChhemltdXRoSW5kZXggKyAxKSAlIG51
bUtlcm5lbHM7CisgICAgZG91YmxlIGZyYW1lRGVsYXkyTCA9IG1fa2VybmVsTGlzdEwtPmF0KGF6
aW11dGhJbmRleDIpLT5mcmFtZURlbGF5KCk7CisgICAgZG91YmxlIGZyYW1lRGVsYXkyUiA9IG1f
a2VybmVsTGlzdFItPmF0KGF6aW11dGhJbmRleDIpLT5mcmFtZURlbGF5KCk7CisKKyAgICAvLyBM
aW5lYXJseSBpbnRlcnBvbGF0ZSBkZWxheXMuCisgICAgZnJhbWVEZWxheUwgPSAoMS4wIC0gYXpp
bXV0aEJsZW5kKSAqIGZyYW1lRGVsYXlMICsgYXppbXV0aEJsZW5kICogZnJhbWVEZWxheTJMOwor
ICAgIGZyYW1lRGVsYXlSID0gKDEuMCAtIGF6aW11dGhCbGVuZCkgKiBmcmFtZURlbGF5UiArIGF6
aW11dGhCbGVuZCAqIGZyYW1lRGVsYXkyUjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vSFJURkVsZXZhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
SFJURkVsZXZhdGlvbi5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9I
UlRGRWxldmF0aW9uLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5j
LiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBm
cm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBI
UlRGRWxldmF0aW9uX2gKKyNkZWZpbmUgSFJURkVsZXZhdGlvbl9oCisKKyNpbmNsdWRlICJIUlRG
S2VybmVsLmgiCisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL093
blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NS
ZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQ
dHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQv
V1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gSFJURkVsZXZhdGlvbiBj
b250YWlucyBhbGwgb2YgdGhlIEhSVEZLZXJuZWxzIChvbmUgbGVmdCBlYXIgYW5kIG9uZSByaWdo
dCBlYXIgcGVyIGF6aW11dGggYW5nbGUpIGZvciBhIHBhcnRpY3VsYXIgZWxldmF0aW9uLgorCitj
bGFzcyBIUlRGRWxldmF0aW9uIDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICAv
LyBMb2FkcyBhbmQgcmV0dXJucyBhbiBIUlRGRWxldmF0aW9uIHdpdGggdGhlIGdpdmVuIEhSVEYg
ZGF0YWJhc2Ugc3ViamVjdCBuYW1lIGFuZCBlbGV2YXRpb24gZnJvbSBicm93c2VyIChvciBXZWJL
aXQuZnJhbWV3b3JrKSByZXNvdXJjZXMuCisgICAgLy8gTm9ybWFsbHksIHRoZXJlIHdpbGwgb25s
eSBiZSBhIHNpbmdsZSBIUlRGIGRhdGFiYXNlIHNldCwgYnV0IHRoaXMgQVBJIHN1cHBvcnRzIHRo
ZSBwb3NzaWJpbGl0eSBvZiBtdWx0aXBsZSBvbmVzIHdpdGggZGlmZmVyZW50IG5hbWVzLgorICAg
IC8vIEludGVycG9sYXRlZCBhemltdXRocyB3aWxsIGJlIGdlbmVyYXRlZCBiYXNlZCBvbiBJbnRl
cnBvbGF0aW9uRmFjdG9yLgorICAgIC8vIFZhbGlkIHZhbHVlcyBmb3IgZWxldmF0aW9uIGFyZSAt
NDUgLT4gKzkwIGluIDE1IGRlZ3JlZSBpbmNyZW1lbnRzLgorICAgIHN0YXRpYyBQYXNzT3duUHRy
PEhSVEZFbGV2YXRpb24+IGNyZWF0ZUZvclN1YmplY3QoY29uc3QgU3RyaW5nJiBzdWJqZWN0TmFt
ZSwgaW50IGVsZXZhdGlvbiwgZG91YmxlIHNhbXBsZVJhdGUpOworCisgICAgLy8gR2l2ZW4gdHdv
IEhSVEZFbGV2YXRpb25zLCBhbmQgYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IgeDogMCAtPiAxLCBy
ZXR1cm5zIGFuIGludGVycG9sYXRlZCBIUlRGRWxldmF0aW9uLgorICAgIHN0YXRpYyBQYXNzT3du
UHRyPEhSVEZFbGV2YXRpb24+IGNyZWF0ZUJ5SW50ZXJwb2xhdGluZ1NsaWNlcyhIUlRGRWxldmF0
aW9uKiBocnRmRWxldmF0aW9uMSwgSFJURkVsZXZhdGlvbiogaHJ0ZkVsZXZhdGlvbjIsIGRvdWJs
ZSB4LCBkb3VibGUgc2FtcGxlUmF0ZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGxl
ZnQgb3IgcmlnaHQgZWFyIEhSVEZLZXJuZWxzIGZvciBhbGwgdGhlIGF6aW11dGhzIGdvaW5nIGZy
b20gMCB0byAzNjAgZGVncmVlcy4KKyAgICBIUlRGS2VybmVsTGlzdCoga2VybmVsTGlzdEwoKSB7
IHJldHVybiBtX2tlcm5lbExpc3RMLmdldCgpOyB9CisgICAgSFJURktlcm5lbExpc3QqIGtlcm5l
bExpc3RSKCkgeyByZXR1cm4gbV9rZXJuZWxMaXN0Ui5nZXQoKTsgfQorCisgICAgZG91YmxlIGVs
ZXZhdGlvbkFuZ2xlKCkgY29uc3QgeyByZXR1cm4gbV9lbGV2YXRpb25BbmdsZTsgfQorICAgIHVu
c2lnbmVkIG51bWJlck9mQXppbXV0aHMoKSB7IHJldHVybiBOdW1iZXJPZlRvdGFsQXppbXV0aHM7
IH0KKyAgICBkb3VibGUgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtcGxlUmF0ZTsg
fQorICAgIAorICAgIC8vIFJldHVybnMgdGhlIGxlZnQgYW5kIHJpZ2h0IGtlcm5lbHMgZm9yIHRo
ZSBnaXZlbiBhemltdXRoIGluZGV4LgorICAgIC8vIFRoZSBpbnRlcnBvbGF0ZWQgZGVsYXlzIGJh
c2VkIG9uIGF6aW11dGhCbGVuZDogMCAtPiAxIGFyZSByZXR1cm5lZCBpbiBmcmFtZURlbGF5TCBh
bmQgZnJhbWVEZWxheVIuCisgICAgdm9pZCBnZXRLZXJuZWxzRnJvbUF6aW11dGgoZG91YmxlIGF6
aW11dGhCbGVuZCwgdW5zaWduZWQgYXppbXV0aEluZGV4LCBIUlRGS2VybmVsKiAma2VybmVsTCwg
SFJURktlcm5lbCogJmtlcm5lbFIsIGRvdWJsZSYgZnJhbWVEZWxheUwsIGRvdWJsZSYgZnJhbWVE
ZWxheVIpOworICAgIAorICAgIC8vIFNwYWNpbmcsIGluIGRlZ3JlZXMsIGJldHdlZW4gZXZlcnkg
YXppbXV0aCBsb2FkZWQgZnJvbSByZXNvdXJjZS4KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQg
QXppbXV0aFNwYWNpbmc7CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGF6aW11dGhzIGxvYWRlZCBm
cm9tIHJlc291cmNlLgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBOdW1iZXJPZlJhd0F6aW11
dGhzOworCisgICAgLy8gSW50ZXJwb2xhdGVzIGJ5IHRoaXMgZmFjdG9yIHRvIGdldCB0aGUgdG90
YWwgbnVtYmVyIG9mIGF6aW11dGhzIGZyb20gZXZlcnkgYXppbXV0aCBsb2FkZWQgZnJvbSByZXNv
dXJjZS4KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW50ZXJwb2xhdGlvbkZhY3RvcjsKKyAg
ICAKKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgYXppbXV0aHMgYWZ0ZXIgaW50ZXJwb2xhdGlvbi4K
KyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtYmVyT2ZUb3RhbEF6aW11dGhzOworCisgICAg
Ly8gR2l2ZW4gYSBzcGVjaWZpYyBhemltdXRoIGFuZCBlbGV2YXRpb24gYW5nbGUsIHJldHVybnMg
dGhlIGxlZnQgYW5kIHJpZ2h0IEhSVEZLZXJuZWwuCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBh
emltdXRoIGFyZSAwIC0+IDM0NSBpbiAxNSBkZWdyZWUgaW5jcmVtZW50cy4KKyAgICAvLyBWYWxp
ZCB2YWx1ZXMgZm9yIGVsZXZhdGlvbiBhcmUgLTQ1IC0+ICs5MCBpbiAxNSBkZWdyZWUgaW5jcmVt
ZW50cy4KKyAgICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKyAgICBzdGF0aWMgYm9vbCBj
YWxjdWxhdGVLZXJuZWxzRm9yQXppbXV0aEVsZXZhdGlvbihpbnQgYXppbXV0aCwgaW50IGVsZXZh
dGlvbiwgZG91YmxlIHNhbXBsZVJhdGUsIGNvbnN0IFN0cmluZyYgc3ViamVjdE5hbWUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmUHRyPEhS
VEZLZXJuZWw+JiBrZXJuZWxMLCBSZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbFIpOworCisgICAg
Ly8gR2l2ZW4gYSBzcGVjaWZpYyBhemltdXRoIGFuZCBlbGV2YXRpb24gYW5nbGUsIHJldHVybnMg
dGhlIGxlZnQgYW5kIHJpZ2h0IEhSVEZLZXJuZWwgaW4ga2VybmVsTCBhbmQga2VybmVsUi4KKyAg
ICAvLyBUaGlzIG1ldGhvZCBhdmVyYWdlcyB0aGUgbWVhc3VyZWQgcmVzcG9uc2UgdXNpbmcgc3lt
bWV0cnkgb2YgYXppbXV0aCAoZm9yIGV4YW1wbGUgYnkgYXZlcmFnaW5nIHRoZSAtMzAuMCBhbmQg
KzMwLjAgYXppbXV0aCByZXNwb25zZXMpLgorICAgIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNz
LgorICAgIHN0YXRpYyBib29sIGNhbGN1bGF0ZVN5bW1ldHJpY0tlcm5lbHNGb3JBemltdXRoRWxl
dmF0aW9uKGludCBhemltdXRoLCBpbnQgZWxldmF0aW9uLCBkb3VibGUgc2FtcGxlUmF0ZSwgY29u
c3QgU3RyaW5nJiBzdWJqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZQdHI8SFJURktlcm5lbD4mIGtlcm5lbEws
IFJlZlB0cjxIUlRGS2VybmVsPiYga2VybmVsUik7Citwcml2YXRlOgorICAgIEhSVEZFbGV2YXRp
b24oUGFzc093blB0cjxIUlRGS2VybmVsTGlzdD4ga2VybmVsTGlzdEwsIFBhc3NPd25QdHI8SFJU
Rktlcm5lbExpc3Q+IGtlcm5lbExpc3RSLCBpbnQgZWxldmF0aW9uLCBkb3VibGUgc2FtcGxlUmF0
ZSkKKyAgICAgICAgOiBtX2tlcm5lbExpc3RMKGtlcm5lbExpc3RMKQorICAgICAgICAsIG1fa2Vy
bmVsTGlzdFIoa2VybmVsTGlzdFIpCisgICAgICAgICwgbV9lbGV2YXRpb25BbmdsZShlbGV2YXRp
b24pCisgICAgICAgICwgbV9zYW1wbGVSYXRlKHNhbXBsZVJhdGUpCisgICAgeworICAgIH0KKwor
ICAgIE93blB0cjxIUlRGS2VybmVsTGlzdD4gbV9rZXJuZWxMaXN0TDsKKyAgICBPd25QdHI8SFJU
Rktlcm5lbExpc3Q+IG1fa2VybmVsTGlzdFI7CisgICAgZG91YmxlIG1fZWxldmF0aW9uQW5nbGU7
CisgICAgZG91YmxlIG1fc2FtcGxlUmF0ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIEhSVEZFbGV2YXRpb25faAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>