<?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>39724</bug_id>
          
          <creation_ts>2010-05-26 04:02:53 -0700</creation_ts>
          <short_desc>[Qt] navigator.geolocation support for qt port</short_desc>
          <delta_ts>2010-06-29 12:44:25 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>39357</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Mahesh Kulkarni">maheshk</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>hausmann</cc>
    
    <cc>jayakishore.thunga</cc>
    
    <cc>kenneth</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>ossy</cc>
    
    <cc>rohini.ananth</cc>
    
    <cc>yael</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>230657</commentid>
    <comment_count>0</comment_count>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-05-26 04:02:53 -0700</bug_when>
    <thetext>Porting navigator.geolocation using QtMobility location service. 

http://dev.w3.org/geo/api/spec-source.html

ps: proposed changes to implement this to follow after this</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>230707</commentid>
    <comment_count>1</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-05-26 07:42:22 -0700</bug_when>
    <thetext>This is also tracked by http://bugreports.qt.nokia.com/browse/QTWEBKIT-115</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>230708</commentid>
    <comment_count>2</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-05-26 07:44:21 -0700</bug_when>
    <thetext>Not QuickTime related :-) Changing to Qt</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233695</commentid>
    <comment_count>3</comment_count>
      <attachid>57751</attachid>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-06-03 04:25:02 -0700</bug_when>
    <thetext>Created attachment 57751
proposed solution

Proposed fix,

1) uses qtmobility location service
2) qtmobility location service only support GPS tracking
3) QtgeolocationServicePrivate.h is introduced to hack around qtmobility incomplete signal&apos;s signature using QtMobility namespace. This would be deleted once fix is available 
4) Geolocation for  will be enabled if mobility.prf is available in QTMAKESPEC path. Any other way to check specific to location service? 

Please review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233696</commentid>
    <comment_count>4</comment_count>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-06-03 04:29:02 -0700</bug_when>
    <thetext>Please note that I&apos;m still doing layout/complete testing on symbian/maemo. Patch attached is to get first hand comments. 

Adding Laszlo, Yael to CC list.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233734</commentid>
    <comment_count>5</comment_count>
      <attachid>57751</attachid>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-03 06:27:36 -0700</bug_when>
    <thetext>Comment on attachment 57751
proposed solution

&gt; Index: JavaScriptCore/wtf/Platform.h
&gt; ===================================================================
&gt; --- JavaScriptCore/wtf/Platform.h	(revision 60618)
&gt; +++ JavaScriptCore/wtf/Platform.h	(working copy)
&gt; @@ -616,6 +616,10 @@
&gt;  #define WTF_PLATFORM_CF 1
&gt;  #endif
&gt;  
&gt; +#if PLATFORM(QT)
&gt; +#define ENABLE_GEOLOCATION 1
&gt; +#endif
&gt; +

This change enables GEOLOCATION unconditionally for QtWebKit. This might be a leftover from development, I do not think we should have this change committed to trunk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233839</commentid>
    <comment_count>6</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-06-03 11:13:42 -0700</bug_when>
    <thetext>It should be nice if this actually compiled on the Qt bot :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233844</commentid>
    <comment_count>7</comment_count>
      <attachid>57751</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-06-03 11:21:28 -0700</bug_when>
    <thetext>Comment on attachment 57751
proposed solution

WebCore/platform/qt/GeolocationServiceQt.cpp:43
 +      :m_parent(parent)
need a space after :

WebCore/platform/qt/GeolocationServiceQt.cpp:53
 +      if (gpsPos.isValid()) {
Would be better to say:

if (!gpsPos.isValid()) {
    ...
    return;
}

Then you avoid all that identation

WebCore/platform/qt/GeolocationServiceQt.cpp:61
 +                              gpsPos.attribute(QGeoPositionInfo::HorizontalAccuracy):0.0;
wrong coding style, please check the coding style guide

WebCore/platform/qt/GeolocationServiceQt.cpp:64
 +          double altitudeAccuracy = providesAltitudeAccuracy?gpsPos.attribute(QGeoPositionInfo::VerticalAccuracy):0.0;
please add spaces around the ? and the :

WebCore/platform/qt/GeolocationServiceQt.cpp:67
 +          double heading = providesHeading?gpsPos.attribute(QGeoPositionInfo::Direction):0.0;
here as well

WebCore/platform/qt/GeolocationServiceQt.cpp:70
 +          double speed = providesSpeed?gpsPos.attribute(QGeoPositionInfo::GroundSpeed):0.0;
and here

WebCore/platform/qt/GeolocationServiceQt.cpp:92
 +      m_location = QGeoPositionInfoSource::createDefaultSource(m_p);
m_p is a terrible variable name, in Qt we ALWAYS use d for the private, but then again when implementing WebCore classes we never use privates as there is no binary compatibility promise. Why do you need the private at all?

WebCore/platform/qt/GeolocationServiceQt.cpp:96
 +                  m_p, SLOT(positionUpdated(QGeoPositionInfo)));
The inner of the if spans two lines (one logically) so it needs braces. Again please read teh coding style guide.

WebCore/platform/qt/GeolocationServiceQt.cpp:98
 +          m_lastError = PositionError::create(PositionError::POSITION_UNAVAILABLE, &quot;GPS device not found&quot;);
How do we deal with translation here? Simon?

WebCore/platform/qt/GeolocationServiceQtPrivate.h:43
 +  class GeolocationServiceQtPrivate : public QObject {
Given the comment, the name *Private is probably not the best. You need to come up with a better name

WebCore/platform/qt/GeolocationServiceQtPrivate.h:48
 +  public slots:
please add a new line before &apos;public slots&apos;. Also you cannot use &apos;slots&apos; as the user might use Boost, thus please use &apos;public Q_SLOTS&apos; instead

WebCore/platform/qt/GeolocationServiceQtPrivate.h:50
 +      void positionUpdated(const QGeoPositionInfo &amp;);
no space needed before &amp;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233931</commentid>
    <comment_count>8</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-03 14:38:33 -0700</bug_when>
    <thetext>According to http://doc.qt.nokia.com/qtmobility-1.0/index.html#platform-compatability Location API is supported (as a tier 2 platform) on desktop platforms as well. 

Ossy what do you think about installing these modules on the buildbot (Linux and Win) ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234070</commentid>
    <comment_count>9</comment_count>
      <attachid>57846</attachid>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-06-03 23:27:11 -0700</bug_when>
    <thetext>Created attachment 57846
proposed solution

(In reply to comment #7)

Thanks Kenneth and Laszlo for your review comments. 


&gt; (From update of attachment 57751 [details])
&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:43
&gt;  +      :m_parent(parent)
&gt; need a space after :
&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:53
&gt;  +      if (gpsPos.isValid()) {
&gt; Would be better to say:
&gt; 
&gt; if (!gpsPos.isValid()) {
&gt;     ...
&gt;     return;
&gt; }
&gt; 
&gt; Then you avoid all that identation

Done

&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:61
&gt;  +                              gpsPos.attribute(QGeoPositionInfo::HorizontalAccuracy):0.0;
&gt; wrong coding style, please check the coding style guide
&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:64
&gt;  +          double altitudeAccuracy = providesAltitudeAccuracy?gpsPos.attribute(QGeoPositionInfo::VerticalAccuracy):0.0;
&gt; please add spaces around the ? and the :
&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:67
&gt;  +          double heading = providesHeading?gpsPos.attribute(QGeoPositionInfo::Direction):0.0;
&gt; here as well
&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:70
&gt;  +          double speed = providesSpeed?gpsPos.attribute(QGeoPositionInfo::GroundSpeed):0.0;
&gt; and here
&gt; 

Done


&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:92
&gt;  +      m_location = QGeoPositionInfoSource::createDefaultSource(m_p);
&gt; m_p is a terrible variable name, in Qt we ALWAYS use d for the private, but then again when implementing WebCore classes we never use privates as there is no binary compatibility promise. Why do you need the private at all?
&gt; 

this member is removed, read further for reason

&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:96
&gt;  +                  m_p, SLOT(positionUpdated(QGeoPositionInfo)));
&gt; The inner of the if spans two lines (one logically) so it needs braces. Again please read teh coding style guide.
&gt; 

Done.

&gt; WebCore/platform/qt/GeolocationServiceQt.cpp:98
&gt;  +          m_lastError = PositionError::create(PositionError::POSITION_UNAVAILABLE, &quot;GPS device not found&quot;);
&gt; How do we deal with translation here? Simon?

I just introduced a tr() to it for now. Actually geolocation common code takes care of all error messages given back to JS, m_lasterror is filled with this error message only for a special use case where updatePostion is called with a invalid GeoPostion value.

&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQtPrivate.h:43
&gt;  +  class GeolocationServiceQtPrivate : public QObject {
&gt; Given the comment, the name *Private is probably not the best. You need to come up with a better name
&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQtPrivate.h:48
&gt;  +  public slots:
&gt; please add a new line before &apos;public slots&apos;. Also you cannot use &apos;slots&apos; as the user might use Boost, thus please use &apos;public Q_SLOTS&apos; instead
&gt; 
&gt; WebCore/platform/qt/GeolocationServiceQtPrivate.h:50
&gt;  +      void positionUpdated(const QGeoPositionInfo &amp;);
&gt; no space needed before &amp;

private class is just to define a slot which connects to qtmobility signal. Because the signal is not defined with QtMobility (not fully qualified signal) I need to use &quot;using namespace&quot; in header file as work around until mobility fixes the issue. Patch has been sent for the same to mobility team as well. 

New patch has no GeoLocationQtServicePrivate.h file. geolocationserviceQt.h it self has &quot;using namespace&quot; instead. Which will be reverted as per webkit coding guidelines once the mobility fix is available.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234159</commentid>
    <comment_count>10</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2010-06-04 04:46:05 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; According to http://doc.qt.nokia.com/qtmobility-1.0/index.html#platform-compatability Location API is supported (as a tier 2 platform) on desktop platforms as well. 
&gt; 
&gt; Ossy what do you think about installing these modules on the buildbot (Linux and Win) ?

Good idea. I played with it, but I have some build problem. I can continue it next week.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234180</commentid>
    <comment_count>11</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-04 06:04:58 -0700</bug_when>
    <thetext>What about using WebCore/platform/mock/GeolocationServiceMock.cpp for the layout testing?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>234183</commentid>
    <comment_count>12</comment_count>
      <attachid>57846</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-04 06:11:22 -0700</bug_when>
    <thetext>Comment on attachment 57846
proposed solution

WebCore/WebCore.pri:113
 +      exists($$[QMAKE_MKSPECS]/features/mobility.prf) {
I think we should fix the mobility detection separately first. The last comment in bug #39357 points out a new way of detecting the availability of Qt Mobility and its individual modules.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>235077</commentid>
    <comment_count>13</comment_count>
      <attachid>57846</attachid>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-07 18:00:23 -0700</bug_when>
    <thetext>Comment on attachment 57846
proposed solution

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 60655)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,27 @@
&gt; +2010-06-04  Mahesh Kulkarni  &lt;mahesh.kulkarni@nokia.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        [Qt] navigator.geolocation support for qt port
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=39724
&gt; +
&gt; +        Added support for navigator.geolocation in qtwebkit using qtmobility location service
&gt; +
&gt; +        Test: No new cases added. Ran existing geolocation test cases.

Have you actually run and _pass_ all the fast/dom/Geolocation and fast/dom/Window/window-properties-geolocation.html ?

If so perhaps you should mention that you not only run but also _passed_ the tests. Also please mention the platform where you passed them (e.g. Linux) and also mention the reason why you have not removed these tests from the Skipped list (perhaps because the buildbot does not have support for QtMobility. 

&gt; Index: WebCore/WebCore.pri
&gt; ===================================================================
&gt; --- WebCore/WebCore.pri	(revision 60618)
&gt; +++ WebCore/WebCore.pri	(working copy)
&gt; @@ -109,6 +109,12 @@ greaterThan(QT_MINOR_VERSION, 5) {
&gt;      else:DEFINES += ENABLE_XSLT=0
&gt;  }
&gt;  
&gt; +!CONFIG(QTDIR_build):!contains(DEFINES, ENABLE_GEOLOCATION=.) {
&gt; +    exists($$[QMAKE_MKSPECS]/features/mobility.prf) {
&gt; +       DEFINES += ENABLE_GEOLOCATION=1
&gt; +    }
&gt; +}
&gt; +

As discussed this is not a reliable way to detect if Geolocation QtMobility API is supported. This should be replaced with contains(MOBILITY_CONFIG, location).

&gt;  contains(DEFINES, ENABLE_QT_BEARER=1) {
&gt; -    HEADERS += \
&gt; -        platform/network/qt/NetworkStateNotifierPrivate.h
&gt; -
&gt; -    SOURCES += \
&gt; -        platform/network/qt/NetworkStateNotifierQt.cpp
&gt; -
&gt; +    message(&quot;bearer exists&quot;)
&gt; +    HEADERS += platform/network/qt/NetworkStateNotifierPrivate.h
&gt; +    SOURCES += platform/network/qt/NetworkStateNotifierQt.cpp
&gt;      CONFIG += mobility
&gt;      MOBILITY += bearer
&gt;  }

This is unrelated change and I prefer to keep it as it was as that makes it easier to add new files to the list (and make patches more readable). Please remove this change.

&gt;  contains(DEFINES, ENABLE_SVG=1) {
&gt;      SOURCES += \
&gt;  # TODO: this-one-is-not-auto-added! FIXME! tmp/SVGElementFactory.cpp \
&gt; Index: WebCore/platform/qt/GeolocationServiceQt.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/qt/GeolocationServiceQt.cpp	(revision 0)
&gt; +++ WebCore/platform/qt/GeolocationServiceQt.cpp	(revision 0)
&gt; @@ -0,0 +1,111 @@

[...]

&gt; +    if (m_location)
&gt; +        connect(m_location, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo)));
&gt; +    else
&gt; +        m_lastError = PositionError::create(PositionError::POSITION_UNAVAILABLE, tr(&quot;GPS device not found&quot;));

The platform independent WebKit code is using &quot;Failed to start Geolocation service&quot; error message (see Geolocation.cpp). Perhaps we should do the same here. I particularly dislike GPS in the error message as GPS is not the only location provider that QtMobility supports (I hope).

&gt; +void GeolocationServiceQt::positionUpdated(const QGeoPositionInfo &amp;gpsPos)

As noted above GPS is not the only source for location data. Can we use a more generic variable name - perhaps geoPos.

&gt; Index: WebCore/platform/qt/GeolocationServiceQt.h
&gt; ===================================================================
&gt; --- WebCore/platform/qt/GeolocationServiceQt.h	(revision 0)
&gt; +++ WebCore/platform/qt/GeolocationServiceQt.h	(revision 0)
&gt; +// FIXME: Remove usage of &quot;usinb namespace&quot; in a header file.

Misspelled using. 

&gt; +// There is bug in qtMobility signal names are not full qualified when used with namespace
&gt; +// QtMobility namespace in slots throws up error and its required to be fixed in qtmobility.

Maybe mention the QtMobility version - is it v1.0 ? 

&gt; +// nmea simulation will read static positions from a log file

This is only relevant for Symbian; does not have much value in WebKit code I think. 

&gt; Index: WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
&gt; ===================================================================
&gt; --- WebKit/qt/tests/qwebpage/tst_qwebpage.cpp	(revision 60618)
&gt; +++ WebKit/qt/tests/qwebpage/tst_qwebpage.cpp	(working copy)
&gt; @@ -77,6 +77,7 @@ private slots:
&gt;  

[...]

&gt;  void tst_QWebPage::infiniteLoopJS()
&gt;  {
&gt;      JSTestPage* newPage = new JSTestPage(m_view);
&gt;      m_view-&gt;setPage(newPage);
&gt; -    m_view-&gt;setHtml(QString(&quot;&lt;html&gt;&lt;bodytest&lt;/body&gt;&lt;/html&gt;&quot;), QUrl());
&gt; +    m_view-&gt;setHtml(QString(&quot;&lt;html&gt;&lt;body&gt;test&lt;/body&gt;&lt;/html&gt;&quot;), QUrl());

Unrelated change, please remove.

&gt;      m_view-&gt;page()-&gt;mainFrame()-&gt;evaluateJavaScript(&quot;var run = true;var a = 1;while(run){a++;}&quot;);
&gt; +    delete newPage;

This looks like a good change but you should really have a separate patch for this.

This is really close for r+. Hope you find some time to address this minor issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>235207</commentid>
    <comment_count>14</comment_count>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-06-08 04:32:10 -0700</bug_when>
    <thetext>Thanks Laszlo for review comments. 

&gt; Have you actually run and _pass_ all the fast/dom/Geolocation and fast/dom/Window/window-properties-geolocation.html ?
&gt; 
&gt; If so perhaps you should mention that you not only run but also _passed_ the tests. Also please mention the platform where you passed them (e.g. Linux) and also mention the reason why you have not removed these tests from the Skipped list (perhaps because the buildbot does not have support for QtMobility. 


I forgot to update my comment a day before that I&apos;m working on Geolocation layout test cases using GeolocationServiceMock and will upload a new patch soon with the results. 

&gt; 
&gt; &gt; Index: WebCore/WebCore.pri
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/WebCore.pri	(revision 60618)
&gt; &gt; +++ WebCore/WebCore.pri	(working copy)
&gt; &gt; @@ -109,6 +109,12 @@ greaterThan(QT_MINOR_VERSION, 5) {
&gt; &gt;      else:DEFINES += ENABLE_XSLT=0
&gt; &gt;  }
&gt; &gt;  
&gt; &gt; +!CONFIG(QTDIR_build):!contains(DEFINES, ENABLE_GEOLOCATION=.) {
&gt; &gt; +    exists($$[QMAKE_MKSPECS]/features/mobility.prf) {
&gt; &gt; +       DEFINES += ENABLE_GEOLOCATION=1
&gt; &gt; +    }
&gt; &gt; +}
&gt; &gt; +
&gt; 
&gt; As discussed this is not a reliable way to detect if Geolocation QtMobility API is supported. This should be replaced with contains(MOBILITY_CONFIG, location).

I have included this changes. 

&gt; 
&gt; &gt;  contains(DEFINES, ENABLE_QT_BEARER=1) {
&gt; &gt; -    HEADERS += \
&gt; &gt; -        platform/network/qt/NetworkStateNotifierPrivate.h
&gt; &gt; -
&gt; &gt; -    SOURCES += \
&gt; &gt; -        platform/network/qt/NetworkStateNotifierQt.cpp
&gt; &gt; -
&gt; &gt; +    message(&quot;bearer exists&quot;)
&gt; &gt; +    HEADERS += platform/network/qt/NetworkStateNotifierPrivate.h
&gt; &gt; +    SOURCES += platform/network/qt/NetworkStateNotifierQt.cpp
&gt; &gt;      CONFIG += mobility
&gt; &gt;      MOBILITY += bearer
&gt; &gt;  }
&gt; 
&gt; This is unrelated change and I prefer to keep it as it was as that makes it easier to add new files to the list (and make patches more readable). Please remove this change.


Bearer changes are checked in as separate bug. I have removed this as well. 


&gt; 
&gt; &gt;  contains(DEFINES, ENABLE_SVG=1) {
&gt; &gt;      SOURCES += \
&gt; &gt;  # TODO: this-one-is-not-auto-added! FIXME! tmp/SVGElementFactory.cpp \
&gt; &gt; Index: WebCore/platform/qt/GeolocationServiceQt.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/platform/qt/GeolocationServiceQt.cpp	(revision 0)
&gt; &gt; +++ WebCore/platform/qt/GeolocationServiceQt.cpp	(revision 0)
&gt; &gt; @@ -0,0 +1,111 @@
&gt; 
&gt; [...]
&gt; 
&gt; &gt; +    if (m_location)
&gt; &gt; +        connect(m_location, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo)));
&gt; &gt; +    else
&gt; &gt; +        m_lastError = PositionError::create(PositionError::POSITION_UNAVAILABLE, tr(&quot;GPS device not found&quot;));
&gt; 
&gt; The platform independent WebKit code is using &quot;Failed to start Geolocation service&quot; error message (see Geolocation.cpp). Perhaps we should do the same here. I particularly dislike GPS in the error message as GPS is not the only location provider that QtMobility supports (I hope).
&gt; 
&gt; &gt; +void GeolocationServiceQt::positionUpdated(const QGeoPositionInfo &amp;gpsPos)
&gt; 
&gt; As noted above GPS is not the only source for location data. Can we use a more generic variable name - perhaps geoPos.


Actually QtMobility location service only supports GPS as of now. They have no  plans of supporting other measures in near future :( 
But I think your comment to make webkit changes more generic makes more sense. I will incorporate these change. 


&gt; 
&gt; &gt; Index: WebCore/platform/qt/GeolocationServiceQt.h
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/platform/qt/GeolocationServiceQt.h	(revision 0)
&gt; &gt; +++ WebCore/platform/qt/GeolocationServiceQt.h	(revision 0)
&gt; &gt; +// FIXME: Remove usage of &quot;usinb namespace&quot; in a header file.
&gt; 
&gt; Misspelled using. 
&gt; 

My bad :( 
Done.


&gt; &gt; +// There is bug in qtMobility signal names are not full qualified when used with namespace
&gt; &gt; +// QtMobility namespace in slots throws up error and its required to be fixed in qtmobility.
&gt; 
&gt; Maybe mention the QtMobility version - is it v1.0 ? 
&gt; 
&gt; &gt; +// nmea simulation will read static positions from a log file
&gt; 
&gt; This is only relevant for Symbian; does not have much value in WebKit code I think. 

Sorry what exactly is only Symbian you meant here? 
nmea simulation reads positions from a log file and simulates similar behavior of GPS positioning. This helps in testing geolocation on any platform. It would be good to have this in webkit code but not sure if this is right?



&gt; 
&gt; &gt; Index: WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebKit/qt/tests/qwebpage/tst_qwebpage.cpp	(revision 60618)
&gt; &gt; +++ WebKit/qt/tests/qwebpage/tst_qwebpage.cpp	(working copy)
&gt; &gt; @@ -77,6 +77,7 @@ private slots:
&gt; &gt;  
&gt; 
&gt; [...]
&gt; 
&gt; &gt;  void tst_QWebPage::infiniteLoopJS()
&gt; &gt;  {
&gt; &gt;      JSTestPage* newPage = new JSTestPage(m_view);
&gt; &gt;      m_view-&gt;setPage(newPage);
&gt; &gt; -    m_view-&gt;setHtml(QString(&quot;&lt;html&gt;&lt;bodytest&lt;/body&gt;&lt;/html&gt;&quot;), QUrl());
&gt; &gt; +    m_view-&gt;setHtml(QString(&quot;&lt;html&gt;&lt;body&gt;test&lt;/body&gt;&lt;/html&gt;&quot;), QUrl());
&gt; 
&gt; Unrelated change, please remove.
&gt; 
&gt; &gt;      m_view-&gt;page()-&gt;mainFrame()-&gt;evaluateJavaScript(&quot;var run = true;var a = 1;while(run){a++;}&quot;);
&gt; &gt; +    delete newPage;
&gt; 
&gt; This looks like a good change but you should really have a separate patch for this.

Will do that. 

&gt; 
&gt; This is really close for r+. Hope you find some time to address this minor issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>235834</commentid>
    <comment_count>15</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2010-06-09 09:45:40 -0700</bug_when>
    <thetext>Qt Mobility API 1.0.0 is installed on &quot;Qt Linux Release&quot;, 
&quot;Qt Windows 32-bit Release&quot;, &quot;Qt Windows 32-bit Debug&quot;
buildbots, feel free to experiment with this API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236217</commentid>
    <comment_count>16</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-10 01:05:24 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; Qt Mobility API 1.0.0 is installed on &quot;Qt Linux Release&quot;, 
&gt; &quot;Qt Windows 32-bit Release&quot;, &quot;Qt Windows 32-bit Debug&quot;
&gt; buildbots, feel free to experiment with this API.

For the detection of QtMobility - load(mobilityconfig) - to work, QtMobility 1.0.1 is needed :-/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236319</commentid>
    <comment_count>17</comment_count>
      <attachid>58367</attachid>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-06-10 05:45:22 -0700</bug_when>
    <thetext>Created attachment 58367
solution with layout testing

This patch,

1) Takes care all of comments from Laszlo in prev comment
2) Enables layout cases for geolocation for all qt platform
3) Implementation for geolocation cases under DumpRenderTreeQt
4) One case is failing and it is skipped for now (will raise a different bug and analyze) 
5) Does *not* include symbian def files which will follow in a separate patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236360</commentid>
    <comment_count>18</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2010-06-10 07:29:17 -0700</bug_when>
    <thetext>&gt; For the detection of QtMobility - load(mobilityconfig) - to work, QtMobility 1.0.1 is needed :-/

:-/ I asked Laszlo if 1.0.0 is good for us ...

When I asked, I can&apos;t build the Qt Mobility trunk,
only 1.0.0. And I haven&apos;t find 1.0.1 release anywhere.

Fortunately build problem was fixed, and now the
trunk of Qt Mobility API is buildable.

Will 2e9e10ec43b2ca22823ab162ba8a52d3ef9da106 good for us?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236380</commentid>
    <comment_count>19</comment_count>
      <attachid>58367</attachid>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-10 08:56:33 -0700</bug_when>
    <thetext>Comment on attachment 58367
solution with layout testing

&gt; +## load mobilityconfig if mobility is available 
&gt; +load(mobilityconfig, true)

I nit - I think we should test to make sure that the mobility.prf exists before loading it ? 

Patch otherwise looks good to me.

Simon, Kenneth - are you in agreement with the API proposed  ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236388</commentid>
    <comment_count>20</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-10 09:18:21 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; (From update of attachment 58367 [details])
&gt; &gt; +## load mobilityconfig if mobility is available 
&gt; &gt; +load(mobilityconfig, true)
&gt; 
&gt; I nit - I think we should test to make sure that the mobility.prf exists before loading it ? 

From bug 39357

A better fix is to replace

load(mobilityconfig)

with

load(mobilityconfig,true)

where the second argument (true) means: ignore errors when loading

I will mark https://bug-39357-attachments.webkit.org/attachment.cgi?id=58142 obsolete as this patch should take care of this as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236391</commentid>
    <comment_count>21</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-10 09:26:10 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; &gt; For the detection of QtMobility - load(mobilityconfig) - to work, QtMobility 1.0.1 is needed :-/
&gt; 
&gt; :-/ I asked Laszlo if 1.0.0 is good for us ...
&gt; 
&gt; When I asked, I can&apos;t build the Qt Mobility trunk,
&gt; only 1.0.0. And I haven&apos;t find 1.0.1 release anywhere.
&gt; 
&gt; Fortunately build problem was fixed, and now the
&gt; trunk of Qt Mobility API is buildable.
&gt; 
&gt; Will 2e9e10ec43b2ca22823ab162ba8a52d3ef9da106 good for us?

On IRC we agreed to pursue 1.0.0 for now until there is another official QtMobility release.

&lt;lgombos&gt; Ossy: I was going to ask you if you have Qt 4.6 or 4.7 on the bot ? 
&lt;Ossy&gt; lgombos, on &quot;Qt Linux Release&quot; 4.6.2
&lt;Ossy&gt; lgombos, but we have a Qt-4.7.0 bot on webkit.sed.hu
&lt;lgombos&gt; Ossy: I see - so so far &quot;official&quot; bots are running official Qt releases
&lt;Ossy&gt; lgombos, yes
&lt;lgombos&gt; Ossy: I&apos;m a bit nervous adding unofficial Qt snapshot to the &quot;official&quot; bots
&lt;Ossy&gt; lgombos, agree
&lt;lgombos&gt; Ossy: instead what i was thinking of is to use 1.0 QtMobility release but when we build webkit the bot would force geolocation - e.g. build-webkit --geolocation
&lt;lgombos&gt; Ossy: do you think this is a good idea ? 
&lt;Ossy&gt; lgombos, I think we can do it with BUILD_WEBKIT_ARGS, I&apos;ll try if it is buildable with --geolocation option</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236415</commentid>
    <comment_count>22</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2010-06-10 10:22:45 -0700</bug_when>
    <thetext>&quot;solution with layout testing&quot;

I tested this patch on the bot with GeoLocation 
enabled, it works without any regression.

After the patch landed I will add WEBKIT_BUILD_ARGS=--geolocation
environment variable to the bot to force enabling GeoLocation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236698</commentid>
    <comment_count>23</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-10 22:50:27 -0700</bug_when>
    <thetext>Mahesh, what do you think about moving allowGeolocationRequest to QWebFrame instead of QWebPage ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236701</commentid>
    <comment_count>24</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-10 22:59:12 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; Mahesh, what do you think about moving allowGeolocationRequest to QWebFrame instead of QWebPage ?

Since QWebFrame cannot be subclassed, I think QWebPage is the right location.

However we&apos;re getting more and more of these kinds of callbacks and I&apos;d really like to find a nicer solution there. But let that be our worry, I don&apos;t want to stall this great patch because of that :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236704</commentid>
    <comment_count>25</comment_count>
      <attachid>58367</attachid>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-10 23:35:03 -0700</bug_when>
    <thetext>Comment on attachment 58367
solution with layout testing

API is agreed, so this looks good to me, r+.

Marking cq- as buildbot needs to enable geolocation in order to pass the LayoutTests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237776</commentid>
    <comment_count>26</comment_count>
      <attachid>58367</attachid>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-14 05:00:56 -0700</bug_when>
    <thetext>Comment on attachment 58367
solution with layout testing

Ossy promised to land and adjust the bot to enable Geolocation at the same time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237796</commentid>
    <comment_count>27</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2010-06-14 06:39:21 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; (From update of attachment 58367 [details])
&gt; Ossy promised to land and adjust the bot to enable Geolocation at the same time.

I landed the patch manually in http://trac.webkit.org/changeset/61117.
(Before it I resolved two trivial conflicts. And fixed qt and QT typos
in changelogs to Qt.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237798</commentid>
    <comment_count>28</comment_count>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-06-14 06:48:59 -0700</bug_when>
    <thetext>Thanks a lot Laszlo, Simon, Kenneth and Csaba! 

Special thanks to Jayakishore Thunga for the equal contribution with the patch!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>243731</commentid>
    <comment_count>29</comment_count>
    <who name="Yael">yael</who>
    <bug_when>2010-06-28 09:21:57 -0700</bug_when>
    <thetext>I think the API that was defined for the permission is inadequate. Other browsers display a bar at the top and if/when the user wants, he will accept/reject/ignore the question. The API that this patch introduces does not allow the user to ignore the question.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244403</commentid>
    <comment_count>30</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-29 11:36:27 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; I think the API that was defined for the permission is inadequate. Other browsers display a bar at the top and if/when the user wants, he will accept/reject/ignore the question. The API that this patch introduces does not allow the user to ignore the question.

I agree - opened a new bug for it - https://bugs.webkit.org/show_bug.cgi?id=41364.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244407</commentid>
    <comment_count>31</comment_count>
    <who name="Mahesh Kulkarni">maheshk</who>
    <bug_when>2010-06-29 11:45:33 -0700</bug_when>
    <thetext>(In reply to comment #30)
&gt; (In reply to comment #29)
&gt; &gt; I think the API that was defined for the permission is inadequate. Other browsers display a bar at the top and if/when the user wants, he will accept/reject/ignore the question. The API that this patch introduces does not allow the user to ignore the question.
&gt; 
&gt; I agree - opened a new bug for it - https://bugs.webkit.org/show_bug.cgi?id=41364.

Yes async for geolocation request API is required and also need to add  ChromeClient::cancelGeolocationPermissionRequestForFrame to cancel the same.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244433</commentid>
    <comment_count>32</comment_count>
    <who name="Yael">yael</who>
    <bug_when>2010-06-29 12:44:25 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; (In reply to comment #30)
&gt; &gt; (In reply to comment #29)
&gt; &gt; &gt; I think the API that was defined for the permission is inadequate. Other browsers display a bar at the top and if/when the user wants, he will accept/reject/ignore the question. The API that this patch introduces does not allow the user to ignore the question.
&gt; &gt; 
&gt; &gt; I agree - opened a new bug for it - https://bugs.webkit.org/show_bug.cgi?id=41364.
&gt; 
&gt; Yes async for geolocation request API is required and also need to add  ChromeClient::cancelGeolocationPermissionRequestForFrame to cancel the same.

Looking at the Chromium implementation of GeoLocation, they ask the user for permission before starting the GeoLocation service, while the QtWebKit implementation asks the user for permission only after it receives an update from the service. Should we change the behavior in GeoLocationServiceQt.cpp as well?</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57751</attachid>
            <date>2010-06-03 04:25:02 -0700</date>
            <delta_ts>2010-06-03 23:27:11 -0700</delta_ts>
            <desc>proposed solution</desc>
            <filename>geolocation_proposal.patch</filename>
            <type>text/plain</type>
            <size>21171</size>
            <attacher name="Mahesh Kulkarni">maheshk</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiA2MDYxOCkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC02MTYsNiArNjE2LDEwIEBACiAj
ZGVmaW5lIFdURl9QTEFURk9STV9DRiAxCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKFFUKQorI2Rl
ZmluZSBFTkFCTEVfR0VPTE9DQVRJT04gMQorI2VuZGlmCisKICNpZiBQTEFURk9STShJUEhPTkUp
CiAjZGVmaW5lIEVOQUJMRV9DT05URVhUX01FTlVTIDAKICNkZWZpbmUgRU5BQkxFX0RSQUdfU1VQ
UE9SVCAwCkluZGV4OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0No
YW5nZUxvZwkocmV2aXNpb24gNjA2MTgpCisrKyBXZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBj
b3B5KQpAQCAtMSwzICsxLDMwIEBACisyMDEwLTA2LTAzICBNYWhlc2ggS3Vsa2FybmkgIDxtYWhl
c2gua3Vsa2FybmlAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFtRdF0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uIHN1cHBvcnQgZm9yIHF0
IHBvcnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM5
NzI0CisKKyAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgbmF2aWdhdG9yLmdlb2xvY2F0aW9uIGlu
IHF0d2Via2l0IHVzaW5nIHF0bW9iaWxpdHkgbG9jYXRpb24gc2VydmljZQorCisgICAgICAgIFRl
c3Q6IE5vIG5ldyBjYXNlcyBhZGRlZC4gUmFuIGV4aXN0aW5nIGdlb2xvY2F0aW9uIHRlc3QgY2Fz
ZXMuCisKKyAgICAgICAgKiBXZWJDb3JlLnByaToKKyAgICAgICAgKiBXZWJDb3JlLnBybzoKKyAg
ICAgICAgKiBwbGF0Zm9ybS9xdC9HZW9sb2NhdGlvblNlcnZpY2VRdC5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Om1fcGFyZW50KToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9u
U2VydmljZVF0UHJpdmF0ZTo6fkdlb2xvY2F0aW9uU2VydmljZVF0UHJpdmF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VRdFByaXZhdGU6OnBvc2l0aW9uVXBkYXRlZCk6
CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VRdDo6Y3JlYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZVF0OjpHZW9sb2NhdGlvblNlcnZpY2VRdCk6
CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VRdDo6fkdlb2xvY2F0aW9uU2Vy
dmljZVF0KToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZVF0OjpzdGFydFVw
ZGF0aW5nKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZVF0OjpzdG9wVXBk
YXRpbmcpOgorICAgICAgICAqIHBsYXRmb3JtL3F0L0dlb2xvY2F0aW9uU2VydmljZVF0Lmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlUXQ6Omxhc3RQb3NpdGlv
bik6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VRdDo6bGFzdEVycm9yKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9xdC9HZW9sb2NhdGlvblNlcnZpY2VRdFByaXZhdGUuaDogQWRk
ZWQuCisKIDIwMTAtMDYtMDMgIEtpbSBHcsO2bmhvbG0gIDxraW0uMS5ncm9uaG9sbUBub2tpYS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2ltb24gSGF1c21hbm4uCkluZGV4OiBXZWJDb3Jl
L1dlYkNvcmUucHJpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5wcmkJKHJldmlzaW9u
IDYwNjE4KQorKysgV2ViQ29yZS9XZWJDb3JlLnByaQkod29ya2luZyBjb3B5KQpAQCAtMTA5LDYg
KzEwOSwxMiBAQCBncmVhdGVyVGhhbihRVF9NSU5PUl9WRVJTSU9OLCA1KSB7CiAgICAgZWxzZTpE
RUZJTkVTICs9IEVOQUJMRV9YU0xUPTAKIH0KIAorIUNPTkZJRyhRVERJUl9idWlsZCk6IWNvbnRh
aW5zKERFRklORVMsIEVOQUJMRV9HRU9MT0NBVElPTj0uKSB7CisgICAgZXhpc3RzKCQkW1FNQUtF
X01LU1BFQ1NdL2ZlYXR1cmVzL21vYmlsaXR5LnByZikgeworICAgICAgIERFRklORVMgKz0gRU5B
QkxFX0dFT0xPQ0FUSU9OPTEKKyAgICB9Cit9CisKICFDT05GSUcoUVRESVJfYnVpbGQpOiFjb250
YWlucyhERUZJTkVTLCBFTkFCTEVfUVRfQkVBUkVSPS4pIHsKICAgICBzeW1iaWFuOiB7CiAgICAg
ICAgIGV4aXN0cygkJHtFUE9DUk9PVH1lcG9jMzIvcmVsZWFzZS93aW5zY3cvdWRlYi9RdEJlYXJl
ci5saWIpfCBcCkBAIC0xNzEsNiArMTc3LDcgQEAgY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1RJ
TEVEX0JBQ0tJTkdfUwogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX05PVElGSUNBVElPTlM9MSk6
IEZFQVRVUkVfREVGSU5FU19KQVZBU0NSSVBUICs9IEVOQUJMRV9OT1RJRklDQVRJT05TPTEKIGNv
bnRhaW5zKERFRklORVMsIEVOQUJMRV9NRVRFUl9UQUc9MSk6IEZFQVRVUkVfREVGSU5FU19KQVZB
U0NSSVBUICs9IEVOQUJMRV9NRVRFUl9UQUc9MQogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1BS
T0dSRVNTX1RBRz0xKTogRkVBVFVSRV9ERUZJTkVTX0pBVkFTQ1JJUFQgKz0gRU5BQkxFX1BST0dS
RVNTX1RBRz0xCitjb250YWlucyhERUZJTkVTLCBFTkFCTEVfR0VPTE9DQVRJT049MSk6IEZFQVRV
UkVfREVGSU5FU19KQVZBU0NSSVBUICs9IEVOQUJMRV9HRU9MT0NBVElPTj0xCiAKIAogIyMgRGVy
aXZlZCBzb3VyY2UgZ2VuZXJhdG9ycwpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUucHJvCShyZXZpc2lvbiA2MDYxOCkKKysrIFdlYkNvcmUv
V2ViQ29yZS5wcm8JKHdvcmtpbmcgY29weSkKQEAgLTI2MTcsMTYgKzI2MTcsMjEgQEAgY29udGFp
bnMoREVGSU5FUywgRU5BQkxFX1hIVE1MTVA9MSkgewogfQogCiBjb250YWlucyhERUZJTkVTLCBF
TkFCTEVfUVRfQkVBUkVSPTEpIHsKLSAgICBIRUFERVJTICs9IFwKLSAgICAgICAgcGxhdGZvcm0v
bmV0d29yay9xdC9OZXR3b3JrU3RhdGVOb3RpZmllclByaXZhdGUuaAotCi0gICAgU09VUkNFUyAr
PSBcCi0gICAgICAgIHBsYXRmb3JtL25ldHdvcmsvcXQvTmV0d29ya1N0YXRlTm90aWZpZXJRdC5j
cHAKLQorICAgIG1lc3NhZ2UoImJlYXJlciBleGlzdHMiKQorICAgIEhFQURFUlMgKz0gcGxhdGZv
cm0vbmV0d29yay9xdC9OZXR3b3JrU3RhdGVOb3RpZmllclByaXZhdGUuaAorICAgIFNPVVJDRVMg
Kz0gcGxhdGZvcm0vbmV0d29yay9xdC9OZXR3b3JrU3RhdGVOb3RpZmllclF0LmNwcAogICAgIENP
TkZJRyArPSBtb2JpbGl0eQogICAgIE1PQklMSVRZICs9IGJlYXJlcgogfQogCitjb250YWlucyhE
RUZJTkVTLCBFTkFCTEVfR0VPTE9DQVRJT049MSkgeworICAgIEhFQURFUlMgKz0gcGxhdGZvcm0v
cXQvR2VvbG9jYXRpb25TZXJ2aWNlUXQuaCBcCisgICAgICAgICAgICAgICBwbGF0Zm9ybS9xdC9H
ZW9sb2NhdGlvblNlcnZpY2VRdFByaXZhdGUuaAorICAgIFNPVVJDRVMgKz0gcGxhdGZvcm0vcXQv
R2VvbG9jYXRpb25TZXJ2aWNlUXQuY3BwCisgICAgQ09ORklHICs9IG1vYmlsaXR5CisgICAgTU9C
SUxJVFkgKz0gbG9jYXRpb24KK30KKwogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1NWRz0xKSB7
CiAgICAgU09VUkNFUyArPSBcCiAjIFRPRE86IHRoaXMtb25lLWlzLW5vdC1hdXRvLWFkZGVkISBG
SVhNRSEgdG1wL1NWR0VsZW1lbnRGYWN0b3J5LmNwcCBcCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L3F0L0dlb2xvY2F0aW9uU2VydmljZVF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL3F0L0dlb2xvY2F0aW9uU2VydmljZVF0LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vcXQvR2VvbG9jYXRpb25TZXJ2aWNlUXQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBh
bmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHZW9sb2NhdGlv
blNlcnZpY2VRdC5oIgorCisjaW5jbHVkZSAiR2VvbG9jYXRpb24uaCIKKyNpbmNsdWRlICJHZW9w
b3NpdGlvbi5oIgorI2luY2x1ZGUgIlBvc2l0aW9uRXJyb3IuaCIKKyNpbmNsdWRlICJQb3NpdGlv
bk9wdGlvbnMuaCIKKworI2luY2x1ZGUgPHFnZW9wb3NpdGlvbmluZm9zb3VyY2UuaD4KKwordXNp
bmcgbmFtZXNwYWNlIFF0TW9iaWxpdHk7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworR2VvbG9j
YXRpb25TZXJ2aWNlOjpGYWN0b3J5RnVuY3Rpb24qIEdlb2xvY2F0aW9uU2VydmljZTo6c19mYWN0
b3J5RnVuY3Rpb24gPSAmR2VvbG9jYXRpb25TZXJ2aWNlUXQ6OmNyZWF0ZTsKKworR2VvbG9jYXRp
b25TZXJ2aWNlUXRQcml2YXRlOjpHZW9sb2NhdGlvblNlcnZpY2VRdFByaXZhdGUoR2VvbG9jYXRp
b25TZXJ2aWNlUXQqIHBhcmVudCkKKyAgICA6bV9wYXJlbnQocGFyZW50KQoreworfQorCitHZW9s
b2NhdGlvblNlcnZpY2VRdFByaXZhdGU6On5HZW9sb2NhdGlvblNlcnZpY2VRdFByaXZhdGUoKQor
eworfQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZVF0UHJpdmF0ZTo6cG9zaXRpb25VcGRhdGVk
KGNvbnN0IFFHZW9Qb3NpdGlvbkluZm8gJmdwc1BvcykKK3sKKyAgICBpZiAoZ3BzUG9zLmlzVmFs
aWQoKSkgeworICAgICAgICBRR2VvQ29vcmRpbmF0ZSBjb29yZCA9IGdwc1Bvcy5jb29yZGluYXRl
KCk7CisgICAgICAgIGRvdWJsZSBsYXRpdHVkZSA9IGNvb3JkLmxhdGl0dWRlKCk7CisgICAgICAg
IGRvdWJsZSBsb25naXR1ZGUgPSBjb29yZC5sb25naXR1ZGUoKTsKKyAgICAgICAgYm9vbCBwcm92
aWRlc0FsdGl0dWRlID0gdHJ1ZTsKKyAgICAgICAgZG91YmxlIGFsdGl0dWRlID0gY29vcmQuYWx0
aXR1ZGUoKTsKKworICAgICAgICBkb3VibGUgYWNjdXJhY3kgPSBncHNQb3MuaGFzQXR0cmlidXRl
KFFHZW9Qb3NpdGlvbkluZm86Okhvcml6b250YWxBY2N1cmFjeSk/CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZ3BzUG9zLmF0dHJpYnV0ZShRR2VvUG9zaXRpb25JbmZvOjpIb3Jpem9udGFs
QWNjdXJhY3kpOjAuMDsKKworICAgICAgICBib29sIHByb3ZpZGVzQWx0aXR1ZGVBY2N1cmFjeSA9
IGdwc1Bvcy5oYXNBdHRyaWJ1dGUoUUdlb1Bvc2l0aW9uSW5mbzo6VmVydGljYWxBY2N1cmFjeSk7
CisgICAgICAgIGRvdWJsZSBhbHRpdHVkZUFjY3VyYWN5ID0gcHJvdmlkZXNBbHRpdHVkZUFjY3Vy
YWN5P2dwc1Bvcy5hdHRyaWJ1dGUoUUdlb1Bvc2l0aW9uSW5mbzo6VmVydGljYWxBY2N1cmFjeSk6
MC4wOworCisgICAgICAgIGJvb2wgcHJvdmlkZXNIZWFkaW5nID0gIGdwc1Bvcy5oYXNBdHRyaWJ1
dGUoUUdlb1Bvc2l0aW9uSW5mbzo6RGlyZWN0aW9uKTsKKyAgICAgICAgZG91YmxlIGhlYWRpbmcg
PSBwcm92aWRlc0hlYWRpbmc/Z3BzUG9zLmF0dHJpYnV0ZShRR2VvUG9zaXRpb25JbmZvOjpEaXJl
Y3Rpb24pOjAuMDsKKworICAgICAgICBib29sIHByb3ZpZGVzU3BlZWQgPSBncHNQb3MuaGFzQXR0
cmlidXRlKFFHZW9Qb3NpdGlvbkluZm86Okdyb3VuZFNwZWVkKTsKKyAgICAgICAgZG91YmxlIHNw
ZWVkID0gcHJvdmlkZXNTcGVlZD9ncHNQb3MuYXR0cmlidXRlKFFHZW9Qb3NpdGlvbkluZm86Okdy
b3VuZFNwZWVkKTowLjA7CisKKyAgICAgICAgUmVmUHRyPENvb3JkaW5hdGVzPiBjb29yZGluYXRl
cyA9IENvb3JkaW5hdGVzOjpjcmVhdGUobGF0aXR1ZGUsIGxvbmdpdHVkZSwgcHJvdmlkZXNBbHRp
dHVkZSwgYWx0aXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSwgcHJvdmlkZXNBbHRpdHVkZUFjY3VyYWN5
LCBhbHRpdHVkZUFjY3VyYWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXNIZWFkaW5nLCBoZWFkaW5nLCBwcm92
aWRlc1NwZWVkLCBzcGVlZCk7CisgICAgICAgIG1fcGFyZW50LT5tX2xhc3RQb3NpdGlvbiA9IEdl
b3Bvc2l0aW9uOjpjcmVhdGUoY29vcmRpbmF0ZXMucmVsZWFzZSgpLCBncHNQb3MudGltZXN0YW1w
KCkudG9UaW1lX3QoKSk7CisgICAgICAgIG1fcGFyZW50LT5wb3NpdGlvbkNoYW5nZWQoKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgbV9wYXJlbnQtPmVycm9yT2NjdXJyZWQoKTsKK30KKworR2VvbG9j
YXRpb25TZXJ2aWNlKiBHZW9sb2NhdGlvblNlcnZpY2VRdDo6Y3JlYXRlKEdlb2xvY2F0aW9uU2Vy
dmljZUNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR2VvbG9jYXRpb25TZXJ2aWNl
UXQoY2xpZW50KTsKK30KKworR2VvbG9jYXRpb25TZXJ2aWNlUXQ6Okdlb2xvY2F0aW9uU2Vydmlj
ZVF0KEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCogY2xpZW50KQorICAgIDogR2VvbG9jYXRpb25T
ZXJ2aWNlKGNsaWVudCkKKyAgICAsIG1fbGFzdFBvc2l0aW9uKDApCisgICAgLCBtX2xhc3RFcnJv
cigwKQorICAgICwgbV9wKG5ldyBHZW9sb2NhdGlvblNlcnZpY2VRdFByaXZhdGUodGhpcykpCit7
CisgICAgbV9sb2NhdGlvbiA9IFFHZW9Qb3NpdGlvbkluZm9Tb3VyY2U6OmNyZWF0ZURlZmF1bHRT
b3VyY2UobV9wKTsKKworICAgIGlmIChtX2xvY2F0aW9uKQorICAgICAgICBRT2JqZWN0Ojpjb25u
ZWN0KG1fbG9jYXRpb24sIFNJR05BTChwb3NpdGlvblVwZGF0ZWQoUUdlb1Bvc2l0aW9uSW5mbykp
LAorICAgICAgICAgICAgICAgIG1fcCwgU0xPVChwb3NpdGlvblVwZGF0ZWQoUUdlb1Bvc2l0aW9u
SW5mbykpKTsKKyAgICBlbHNlCisgICAgICAgIG1fbGFzdEVycm9yID0gUG9zaXRpb25FcnJvcjo6
Y3JlYXRlKFBvc2l0aW9uRXJyb3I6OlBPU0lUSU9OX1VOQVZBSUxBQkxFLCAiR1BTIGRldmljZSBu
b3QgZm91bmQiKTsKK30KKworR2VvbG9jYXRpb25TZXJ2aWNlUXQ6On5HZW9sb2NhdGlvblNlcnZp
Y2VRdCgpCit7CisgICAgZGVsZXRlIG1fcDsKK30KKworYm9vbCBHZW9sb2NhdGlvblNlcnZpY2VR
dDo6c3RhcnRVcGRhdGluZyhQb3NpdGlvbk9wdGlvbnMqKQoreworICAgIG1fbGFzdFBvc2l0aW9u
ID0gMDsKKworICAgIGlmICghbV9sb2NhdGlvbikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gVE9ETzogaGFuZGxlIGVuYWJsZUhpZ2hBY2N1cmFjeSgpCisKKyAgICBtX2xvY2F0aW9u
LT5zdGFydFVwZGF0ZXMoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHZW9sb2NhdGlv
blNlcnZpY2VRdDo6c3RvcFVwZGF0aW5nKCkKK3sKKyAgICBpZiAobV9sb2NhdGlvbikKKyAgICAg
ICAgbV9sb2NhdGlvbi0+c3RvcFVwZGF0ZXMoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9xdC9HZW9sb2NhdGlvblNlcnZpY2VRdC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vcXQvR2VvbG9jYXRpb25TZXJ2aWNlUXQuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vcXQvR2VvbG9jYXRpb25TZXJ2aWNlUXQuaAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBO
b2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBHZW9sb2NhdGlvblNlcnZp
Y2VRdF9oCisjZGVmaW5lIEdlb2xvY2F0aW9uU2VydmljZVF0X2gKKworI2luY2x1ZGUgIkdlb2xv
Y2F0aW9uU2VydmljZS5oIgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uU2VydmljZVF0UHJpdmF0ZS5o
IgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIFF0TW9iaWxpdHkgeworY2xh
c3MgUUdlb1Bvc2l0aW9uSW5mb1NvdXJjZTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgaW1wbGVtZW50YXRpb24gb2YgYSBHZW9sb2NhdGlvblNl
cnZpY2UgZm9yIHF0V2Via2l0LgorLy8gSXQgdXNlcyBRdE1vYmlsaXR5IGxvY2F0aW9uIHNlcnZp
Y2UgdG8gZ2V0IHBvc2l0aW9ucyBhbmQgaWYgbm8gR1BTIGRldmljZSBmb3VuZCwKKy8vIG5tZWEg
c2ltdWxhdGlvbiB3aWxsIHJlYWQgc3RhdGljIHBvc2l0aW9ucyBmcm9tIGEgbG9nIGZpbGUKK2Ns
YXNzIEdlb2xvY2F0aW9uU2VydmljZVF0IDogcHVibGljIEdlb2xvY2F0aW9uU2VydmljZSB7Citw
dWJsaWM6CisgICAgc3RhdGljIEdlb2xvY2F0aW9uU2VydmljZSogY3JlYXRlKEdlb2xvY2F0aW9u
U2VydmljZUNsaWVudCopOworCisgICAgR2VvbG9jYXRpb25TZXJ2aWNlUXQoR2VvbG9jYXRpb25T
ZXJ2aWNlQ2xpZW50Kik7CisgICAgdmlydHVhbCB+R2VvbG9jYXRpb25TZXJ2aWNlUXQoKTsKKwor
ICAgIHZpcnR1YWwgYm9vbCBzdGFydFVwZGF0aW5nKFBvc2l0aW9uT3B0aW9ucyopOworICAgIHZp
cnR1YWwgdm9pZCBzdG9wVXBkYXRpbmcoKTsKKworICAgIHZpcnR1YWwgR2VvcG9zaXRpb24qIGxh
c3RQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdFBvc2l0aW9uLmdldCgpOyB9CisgICAg
dmlydHVhbCBQb3NpdGlvbkVycm9yKiBsYXN0RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX2xhc3RF
cnJvci5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIFJlZlB0cjxHZW9wb3NpdGlvbj4gbV9sYXN0
UG9zaXRpb247CisgICAgUmVmUHRyPFBvc2l0aW9uRXJyb3I+IG1fbGFzdEVycm9yOworCisgICAg
UXRNb2JpbGl0eTo6UUdlb1Bvc2l0aW9uSW5mb1NvdXJjZSogbV9sb2NhdGlvbjsKKyAgICBHZW9s
b2NhdGlvblNlcnZpY2VRdFByaXZhdGUqIG1fcDsKKworICAgIGZyaWVuZCBjbGFzcyBHZW9sb2Nh
dGlvblNlcnZpY2VRdFByaXZhdGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBHZW9sb2NhdGlvblNlcnZpY2VRdF9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3F0
L0dlb2xvY2F0aW9uU2VydmljZVF0UHJpdmF0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vcXQvR2VvbG9jYXRpb25TZXJ2aWNlUXRQcml2YXRlLmgJKHJldmlzaW9uIDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3F0L0dlb2xvY2F0aW9uU2VydmljZVF0UHJpdmF0ZS5oCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENv
cnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgR2VvbG9jYXRpb25TZXJ2aWNlUXRQ
cml2YXRlX2gKKyNkZWZpbmUgR2VvbG9jYXRpb25TZXJ2aWNlUXRQcml2YXRlX2gKKworI2luY2x1
ZGUgPFFHZW9Qb3NpdGlvbkluZm8+CisjaW5jbHVkZSA8UU9iamVjdD4KKwordXNpbmcgbmFtZXNw
YWNlIFF0TW9iaWxpdHk7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR2VvbG9jYXRp
b25TZXJ2aWNlUXQ7CisKKy8vIFRoaXMgcHJpdmF0ZSBjbGFzcyBpcyB0byBkZWZpbmUgc2xvdCBw
b3NpdGlvblVwZGF0ZWQsCisvLyBhcyB0aGVyZSBpcyBidWcgaW4gcXRNb2JpbGl0eSBzaWduYWwg
bmFtZXMgYXJlIG5vdCBmdWxsIHF1YWxpZmllZC4KKy8vIFF0TW9iaWxpdHkgbmFtZXNwYWNlIGlu
IHNsb3RzIHRocm93cyB1cCBlcnJvciBhbmQgaXRzIHJlcXVpcmVkIHRvIGJlIGZpeGVkIGluIHF0
bW9iaWxpdHkuCisvLyBUT0RPOiByZW1vdmUgdGhpcyBjbGFzcyBvbmNlIHF0bW9iaWxpdHkgZml4
ZXMgdGhlIGlzc3VlCitjbGFzcyBHZW9sb2NhdGlvblNlcnZpY2VRdFByaXZhdGUgOiBwdWJsaWMg
UU9iamVjdCB7CisgICAgUV9PQkpFQ1Q7CitwdWJsaWM6CisgICAgR2VvbG9jYXRpb25TZXJ2aWNl
UXRQcml2YXRlKEdlb2xvY2F0aW9uU2VydmljZVF0KiBwYXJlbnQpOworICAgIH5HZW9sb2NhdGlv
blNlcnZpY2VRdFByaXZhdGUoKTsKK3B1YmxpYyBzbG90czoKKyAgICAvLyBRR2VvUG9zaXRpb25J
bmZvU291cmNlCisgICAgdm9pZCBwb3NpdGlvblVwZGF0ZWQoY29uc3QgUUdlb1Bvc2l0aW9uSW5m
byAmKTsKK3ByaXZhdGU6CisgICAgR2VvbG9jYXRpb25TZXJ2aWNlUXQqIG1fcGFyZW50OworfTsK
K30KKworI2VuZGlmIC8vIEdlb2xvY2F0aW9uU2VydmljZVF0UHJpdmF0ZV9oCkluZGV4OiBXZWJL
aXQvcXQvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9DaGFuZ2VMb2cJKHJldmlz
aW9uIDYwNjE4KQorKysgV2ViS2l0L3F0L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI2IEBACisyMDEwLTA2LTAzICBNYWhlc2ggS3Vsa2FybmkgIDxtYWhlc2gua3Vsa2FybmlA
bm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFtRdF0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uIHN1cHBvcnQgZm9yIHF0IHBvcnQKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM5NzI0CisKKyAgICAg
ICAgQWRkZWQgZXh0cmEgc2xvdCB0byBxd2VicGFnZSBmb3IgbG9jYXRpb24gcmVxdWVzdCB0byB1
c2VyCisgCisgICAgICAgIFRlc3Q6IEFkZGVkIHVuaXQgdGVzdCBjYXNlIGZvciBuZXcgQVBJIGFs
bG93R2VvbG9jYXRpb25SZXF1ZXN0KCkgYW5kIGZpeGVkIGEgbGVhayBpbiBvdGhlciB0ZXN0IGNh
c2UuCisKKyAgICAgICAgKiBBcGkvcXdlYnBhZ2UuY3BwOgorICAgICAgICAoUVdlYlBhZ2U6OmFs
bG93R2VvbG9jYXRpb25SZXF1ZXN0KToKKyAgICAgICAgKiBBcGkvcXdlYnBhZ2UuaDoKKyAgICAg
ICAgKiBXZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDaHJvbWVDbGllbnRRdDo6cmVxdWVzdEdlb2xvY2F0aW9uUGVybWlzc2lvbkZvckZyYW1lKToK
KyAgICAgICAgKiB0ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwOgorICAgICAgICAoSlNU
ZXN0UGFnZTo6c2hvdWxkSW50ZXJydXB0SmF2YVNjcmlwdCk6CisgICAgICAgIChKU1Rlc3RQYWdl
OjphbGxvd0dlb2xvY2F0aW9uUmVxdWVzdCk6CisgICAgICAgIChKU1Rlc3RQYWdlOjpzZXRHZW9s
b2NhdGlvblBlcm1pc3Npb24pOgorICAgICAgICAodHN0X1FXZWJQYWdlOjppbmZpbml0ZUxvb3BK
Uyk6CisgICAgICAgICh0c3RfUVdlYlBhZ2U6Omdlb2xvY2F0aW9uUmVxdWVzdEpTKToKKwogMjAx
MC0wNi0wMiAgVGFzdWt1IFN1enVraSAgPHRhc3VrdS5zdXp1a2lAbm9raWEuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IFNoaW5pY2hpcm8gSGFtYWppLgpJbmRleDogV2ViS2l0L3F0L0FwaS9x
d2VicGFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAJKHJl
dmlzaW9uIDYwNjE4KQorKysgV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTE5MzMsNiArMTkzMywzMCBAQCBib29sIFFXZWJQYWdlOjpzaG91bGRJbnRlcnJ1cHRK
YXZhU2NyaXB0CiB9CiAKIC8qIQorICAgIFxmbiBib29sIFFXZWJQYWdlOjphbGxvd0dlb2xvY2F0
aW9uUmVxdWVzdCgpCisgICAgXHNpbmNlIDQuNworCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxs
ZWQgd2hlbmV2ZXIgYSBKYXZhU2NyaXB0IHByb2dyYW0gcnVubmluZyBpbnNpZGUgXGEgZnJhbWUg
dHJpZXMgdG8gYWNjZXNzIHVzZXIgbG9jYXRpb24gdGhyb3VnaCBuYXZpZ2F0b3IuZ2VvbG9jYXRp
b24uCisKKyAgICBJZiB0aGUgdXNlciB3YW50cyB0byBhbGxvdyBhY2Nlc3MgdG8gbG9jYXRpb24g
dGhlbiBpdCBzaG91bGQgcmV0dXJuIHRydWU7IG90aGVyd2lzZSBmYWxzZS4KKworICAgIFRoZSBk
ZWZhdWx0IGltcGxlbWVudGF0aW9uIGV4ZWN1dGVzIHRoZSBxdWVyeSB1c2luZyBRTWVzc2FnZUJv
eDo6aW5mb3JtYXRpb24gd2l0aCBRTWVzc2FnZUJveDo6WWVzIGFuZCBRTWVzc2FnZUJveDo6Tm8g
YnV0dG9ucy4KKworICAgIFx3YXJuaW5nIEJlY2F1c2Ugb2YgYmluYXJ5IGNvbXBhdGliaWxpdHkg
Y29uc3RyYWludHMsIHRoaXMgZnVuY3Rpb24gaXMgbm90IHZpcnR1YWwuIElmIHlvdSB3YW50IHRv
CisgICAgcHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBpbiBhIFFXZWJQYWdlIHN1YmNs
YXNzLCByZWltcGxlbWVudCB0aGUgYWxsb3dHZW9sb2NhdGlvblJlcXVlc3QoKQorICAgIHNsb3Qg
aW4geW91ciBzdWJjbGFzcyBpbnN0ZWFkLiBRdFdlYktpdCB3aWxsIGR5bmFtaWNhbGx5IGRldGVj
dCB0aGUgc2xvdCBhbmQgY2FsbCBpdC4KKyovCitib29sIFFXZWJQYWdlOjphbGxvd0dlb2xvY2F0
aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lKQoreworI2lmZGVmIFFUX05PX01FU1NBR0VCT1gK
KyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIFFXaWRnZXQqIHBhcmVudCA9IChkLT5jbGll
bnQpID8gZC0+Y2xpZW50LT5vd25lcldpZGdldCgpIDogMDsKKyAgICByZXR1cm4gUU1lc3NhZ2VC
b3g6OlllcyA9PSBRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24ocGFyZW50LCB0cigiTG9jYXRpb24g
UmVxdWVzdCBieS0gJTEiKS5hcmcoZnJhbWUtPnVybCgpLmhvc3QoKSksIHRyKCJUaGUgcGFnZSB3
YW50cyB0byBhY2Nlc3MgeW91ciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gRG8geW91IHdhbnQgdG8g
YWxsb3cgdGhlIHJlcXVlc3Q/IiksIFFNZXNzYWdlQm94OjpZZXMsIFFNZXNzYWdlQm94OjpObyk7
CisjZW5kaWYKK30KKworLyohCiAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIg
V2ViS2l0IHdhbnRzIHRvIGNyZWF0ZSBhIG5ldyB3aW5kb3cgb2YgdGhlIGdpdmVuIFxhIHR5cGUs
IGZvcgogICAgIGV4YW1wbGUgd2hlbiBhIEphdmFTY3JpcHQgcHJvZ3JhbSByZXF1ZXN0cyB0byBv
cGVuIGEgZG9jdW1lbnQgaW4gYSBuZXcgd2luZG93LgogCkluZGV4OiBXZWJLaXQvcXQvQXBpL3F3
ZWJwYWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5oCShyZXZpc2lv
biA2MDYxOCkKKysrIFdlYktpdC9xdC9BcGkvcXdlYnBhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAt
MzA3LDYgKzMwNyw3IEBAIHB1YmxpYzoKIAogcHVibGljIFFfU0xPVFM6CiAgICAgYm9vbCBzaG91
bGRJbnRlcnJ1cHRKYXZhU2NyaXB0KCk7CisgICAgYm9vbCBhbGxvd0dlb2xvY2F0aW9uUmVxdWVz
dChRV2ViRnJhbWUgKmZyYW1lKTsKIAogUV9TSUdOQUxTOgogICAgIHZvaWQgbG9hZFN0YXJ0ZWQo
KTsKSW5kZXg6IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcAko
cmV2aXNpb24gNjA2MTgpCisrKyBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50
UXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiRnJhbWVM
b2FkZXIuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudFF0LmgiCiAjaW5jbHVkZSAiRnJh
bWVWaWV3LmgiCisjaW5jbHVkZSAiR2VvbG9jYXRpb24uaCIKICNpbmNsdWRlICJIaXRUZXN0UmVz
dWx0LmgiCiAjaW5jbHVkZSAiSWNvbi5oIgogI2luY2x1ZGUgIk5vdGlmaWNhdGlvblByZXNlbnRl
ckNsaWVudFF0LmgiCkBAIC01MzQsMTAgKzUzNSwxMiBAQCBib29sIENocm9tZUNsaWVudFF0Ojpz
ZXRDdXJzb3IoUGxhdGZvcm1DCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENocm9tZUNs
aWVudFF0OjpyZXF1ZXN0R2VvbG9jYXRpb25QZXJtaXNzaW9uRm9yRnJhbWUoRnJhbWUqLCBHZW9s
b2NhdGlvbiopCit2b2lkIENocm9tZUNsaWVudFF0OjpyZXF1ZXN0R2VvbG9jYXRpb25QZXJtaXNz
aW9uRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBHZW9sb2NhdGlvbiogZ2VvbG9jYXRpb24pCiB7Ci0g
ICAgLy8gU2VlIHRoZSBjb21tZW50IGluIFdlYkNvcmUvcGFnZS9DaHJvbWVDbGllbnQuaAotICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgYm9vbCBhbGxvdyA9IGZhbHNlOworICAgIFFXZWJGcmFt
ZSogd2ViRnJhbWUgPSBRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpOworICAgIFFNZXRhT2Jq
ZWN0OjppbnZva2VNZXRob2QobV93ZWJQYWdlLCAiYWxsb3dHZW9sb2NhdGlvblJlcXVlc3QiLCBR
dDo6RGlyZWN0Q29ubmVjdGlvbiwgUV9SRVRVUk5fQVJHKGJvb2wsIGFsbG93KSwgUV9BUkcoUVdl
YkZyYW1lKiwgd2ViRnJhbWUpKTsKKyAgICBnZW9sb2NhdGlvbi0+c2V0SXNBbGxvd2VkKGFsbG93
KTsKIH0KIAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKSW5kZXg6IFdlYktpdC9x
dC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9x
dC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwCShyZXZpc2lvbiA2MDYxOCkKKysrIFdl
YktpdC9xdC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC03Nyw2ICs3Nyw3IEBAIHByaXZhdGUgc2xvdHM6CiAKICAgICB2b2lkIGFjY2VwdE5hdmlnYXRp
b25SZXF1ZXN0KCk7CiAgICAgdm9pZCBpbmZpbml0ZUxvb3BKUygpOworICAgIHZvaWQgZ2VvbG9j
YXRpb25SZXF1ZXN0SlMoKTsKICAgICB2b2lkIGxvYWRGaW5pc2hlZCgpOwogICAgIHZvaWQgYWNj
ZXB0TmF2aWdhdGlvblJlcXVlc3RXaXRoTmV3V2luZG93KCk7CiAgICAgdm9pZCB1c2VyU3R5bGVT
aGVldCgpOwpAQCAtMjEyLDE3ICsyMTMsNTQgQEAgcHVibGljOgogICAgIDogUVdlYlBhZ2UocGFy
ZW50KSB7fQogCiBwdWJsaWMgc2xvdHM6Ci0gICAgYm9vbCBzaG91bGRJbnRlcnJ1cHRKYXZhU2Ny
aXB0KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsgCisgICAgYm9vbCBzaG91bGRJbnRlcnJ1cHRK
YXZhU2NyaXB0KCkgCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9v
bCBhbGxvd0dlb2xvY2F0aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lKSAKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX2FsbG93R2VvbG9jYXRpb247CisgICAgfQorCitwdWJsaWM6CisgICAgdm9p
ZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbCBhbGxvdykgCisgICAgeworICAgICAgICBt
X2FsbG93R2VvbG9jYXRpb24gPSBhbGxvdzsKICAgICB9CisKK3ByaXZhdGU6IAorICAgIGJvb2wg
bV9hbGxvd0dlb2xvY2F0aW9uOwogfTsKIAogdm9pZCB0c3RfUVdlYlBhZ2U6OmluZmluaXRlTG9v
cEpTKCkKIHsKICAgICBKU1Rlc3RQYWdlKiBuZXdQYWdlID0gbmV3IEpTVGVzdFBhZ2UobV92aWV3
KTsKICAgICBtX3ZpZXctPnNldFBhZ2UobmV3UGFnZSk7Ci0gICAgbV92aWV3LT5zZXRIdG1sKFFT
dHJpbmcoIjxodG1sPjxib2R5dGVzdDwvYm9keT48L2h0bWw+IiksIFFVcmwoKSk7CisgICAgbV92
aWV3LT5zZXRIdG1sKFFTdHJpbmcoIjxodG1sPjxib2R5PnRlc3Q8L2JvZHk+PC9odG1sPiIpLCBR
VXJsKCkpOwogICAgIG1fdmlldy0+cGFnZSgpLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2Ny
aXB0KCJ2YXIgcnVuID0gdHJ1ZTt2YXIgYSA9IDE7d2hpbGUocnVuKXthKys7fSIpOworICAgIGRl
bGV0ZSBuZXdQYWdlOworfQorCit2b2lkIHRzdF9RV2ViUGFnZTo6Z2VvbG9jYXRpb25SZXF1ZXN0
SlMoKQoreworICAgIEpTVGVzdFBhZ2UqIG5ld1BhZ2UgPSBuZXcgSlNUZXN0UGFnZShtX3ZpZXcp
OworICAgIG5ld1BhZ2UtPnNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihmYWxzZSk7CisgICAgbV92
aWV3LT5zZXRQYWdlKG5ld1BhZ2UpOworICAgIG1fdmlldy0+c2V0SHRtbChRU3RyaW5nKCI8aHRt
bD48Ym9keT50ZXN0PC9ib2R5PjwvaHRtbD4iKSwgUVVybCgpKTsKKyAgICBtX3ZpZXctPnBhZ2Uo
KS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgidmFyIGVycm9yQ29kZSA9IDA7IGZ1
bmN0aW9uIGVycm9yKGVycikgeyBlcnJvckNvZGUgPSBlcnIuY29kZTsgfSBmdW5jdGlvbiBzdWNj
ZXNzKHBvcykgeyB9IG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oc3Vj
Y2VzcywgZXJyb3IpIik7CisgICAgUVRlc3Q6OnFXYWl0KDIwMDApOworICAgIFFWYXJpYW50IGVt
cHR5ID0gbV92aWV3LT5wYWdlKCktPm1haW5GcmFtZSgpLT5ldmFsdWF0ZUphdmFTY3JpcHQoImVy
cm9yQ29kZSIpOworCisgICAgUVZFUklGWShlbXB0eS50eXBlKCkgPT0gUVZhcmlhbnQ6OkRvdWJs
ZSAmJiBlbXB0eS50b0ludCgpICE9IDApOworCisgICAgbmV3UGFnZS0+c2V0R2VvbG9jYXRpb25Q
ZXJtaXNzaW9uKHRydWUpOworICAgIG1fdmlldy0+cGFnZSgpLT5tYWluRnJhbWUoKS0+ZXZhbHVh
dGVKYXZhU2NyaXB0KCJlcnJvckNvZGUgPSAwOyBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3Vy
cmVudFBvc2l0aW9uKHN1Y2Nlc3MsIGVycm9yKTsiKTsKKyAgICBlbXB0eSA9IG1fdmlldy0+cGFn
ZSgpLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJlcnJvckNvZGUiKTsKKworICAg
IC8vaHR0cDovL2Rldi53My5vcmcvZ2VvL2FwaS9zcGVjLXNvdXJjZS5odG1sI3Bvc2l0aW9uCisg
ICAgLy9Qb3NpdGlvbkVycm9yOiBjb25zdCB1bnNpZ25lZCBzaG9ydCBQRVJNSVNTSU9OX0RFTklF
RCA9IDE7CisgICAgUVZFUklGWShlbXB0eS50eXBlKCkgPT0gUVZhcmlhbnQ6OkRvdWJsZSAmJiBl
bXB0eS50b0ludCgpICE9IDEpOworICAgIGRlbGV0ZSBuZXdQYWdlOwogfQogCiB2b2lkIHRzdF9R
V2ViUGFnZTo6bG9hZEZpbmlzaGVkKCkK
</data>
<flag name="review"
          id="42394"
          type_id="1"
          status="-"
          setter="kenneth"
    />
    <flag name="commit-queue"
          id="42395"
          type_id="3"
          status="-"
          setter="kenneth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57846</attachid>
            <date>2010-06-03 23:27:11 -0700</date>
            <delta_ts>2010-06-08 04:32:29 -0700</delta_ts>
            <desc>proposed solution</desc>
            <filename>geolocation_proposal.patch</filename>
            <type>text/plain</type>
            <size>17832</size>
            <attacher name="Mahesh Kulkarni">maheshk</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MDY1NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjcgQEAKKzIwMTAtMDYtMDQgIE1haGVzaCBLdWxrYXJuaSAgPG1haGVzaC5rdWxr
YXJuaUBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgW1F0XSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24gc3VwcG9ydCBmb3IgcXQgcG9ydAor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzk3MjQKKwor
ICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24gaW4gcXR3ZWJr
aXQgdXNpbmcgcXRtb2JpbGl0eSBsb2NhdGlvbiBzZXJ2aWNlCisKKyAgICAgICAgVGVzdDogTm8g
bmV3IGNhc2VzIGFkZGVkLiBSYW4gZXhpc3RpbmcgZ2VvbG9jYXRpb24gdGVzdCBjYXNlcy4KKwor
ICAgICAgICAqIFdlYkNvcmUucHJpOgorICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAq
IHBsYXRmb3JtL3F0L0dlb2xvY2F0aW9uU2VydmljZVF0LmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VRdDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
Okdlb2xvY2F0aW9uU2VydmljZVF0OjpHZW9sb2NhdGlvblNlcnZpY2VRdCk6CisgICAgICAgIChX
ZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VRdDo6fkdlb2xvY2F0aW9uU2VydmljZVF0KToKKyAg
ICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZVF0Ojpwb3NpdGlvblVwZGF0ZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlUXQ6OnN0YXJ0VXBkYXRpbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlUXQ6OnN0b3BVcGRhdGluZyk6Cisg
ICAgICAgICogcGxhdGZvcm0vcXQvR2VvbG9jYXRpb25TZXJ2aWNlUXQuaDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VRdDo6bGFzdFBvc2l0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZVF0OjpsYXN0RXJyb3IpOgorCiAyMDEwLTA2
LTAzICBTaGVyaWZmIEJvdCAgPHdlYmtpdC5yZXZpZXcuYm90QGdtYWlsLmNvbT4KIAogICAgICAg
ICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByNjA2NDIuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUu
cHJpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5wcmkJKHJldmlzaW9uIDYwNjE4KQor
KysgV2ViQ29yZS9XZWJDb3JlLnByaQkod29ya2luZyBjb3B5KQpAQCAtMTA5LDYgKzEwOSwxMiBA
QCBncmVhdGVyVGhhbihRVF9NSU5PUl9WRVJTSU9OLCA1KSB7CiAgICAgZWxzZTpERUZJTkVTICs9
IEVOQUJMRV9YU0xUPTAKIH0KIAorIUNPTkZJRyhRVERJUl9idWlsZCk6IWNvbnRhaW5zKERFRklO
RVMsIEVOQUJMRV9HRU9MT0NBVElPTj0uKSB7CisgICAgZXhpc3RzKCQkW1FNQUtFX01LU1BFQ1Nd
L2ZlYXR1cmVzL21vYmlsaXR5LnByZikgeworICAgICAgIERFRklORVMgKz0gRU5BQkxFX0dFT0xP
Q0FUSU9OPTEKKyAgICB9Cit9CisKICFDT05GSUcoUVRESVJfYnVpbGQpOiFjb250YWlucyhERUZJ
TkVTLCBFTkFCTEVfUVRfQkVBUkVSPS4pIHsKICAgICBzeW1iaWFuOiB7CiAgICAgICAgIGV4aXN0
cygkJHtFUE9DUk9PVH1lcG9jMzIvcmVsZWFzZS93aW5zY3cvdWRlYi9RdEJlYXJlci5saWIpfCBc
CkBAIC0xNzEsNiArMTc3LDcgQEAgY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1RJTEVEX0JBQ0tJ
TkdfUwogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX05PVElGSUNBVElPTlM9MSk6IEZFQVRVUkVf
REVGSU5FU19KQVZBU0NSSVBUICs9IEVOQUJMRV9OT1RJRklDQVRJT05TPTEKIGNvbnRhaW5zKERF
RklORVMsIEVOQUJMRV9NRVRFUl9UQUc9MSk6IEZFQVRVUkVfREVGSU5FU19KQVZBU0NSSVBUICs9
IEVOQUJMRV9NRVRFUl9UQUc9MQogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1BST0dSRVNTX1RB
Rz0xKTogRkVBVFVSRV9ERUZJTkVTX0pBVkFTQ1JJUFQgKz0gRU5BQkxFX1BST0dSRVNTX1RBRz0x
Citjb250YWlucyhERUZJTkVTLCBFTkFCTEVfR0VPTE9DQVRJT049MSk6IEZFQVRVUkVfREVGSU5F
U19KQVZBU0NSSVBUICs9IEVOQUJMRV9HRU9MT0NBVElPTj0xCiAKIAogIyMgRGVyaXZlZCBzb3Vy
Y2UgZ2VuZXJhdG9ycwpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUucHJvCShyZXZpc2lvbiA2MDYxOCkKKysrIFdlYkNvcmUvV2ViQ29yZS5w
cm8JKHdvcmtpbmcgY29weSkKQEAgLTI2MTcsMTYgKzI2MTcsMjAgQEAgY29udGFpbnMoREVGSU5F
UywgRU5BQkxFX1hIVE1MTVA9MSkgewogfQogCiBjb250YWlucyhERUZJTkVTLCBFTkFCTEVfUVRf
QkVBUkVSPTEpIHsKLSAgICBIRUFERVJTICs9IFwKLSAgICAgICAgcGxhdGZvcm0vbmV0d29yay9x
dC9OZXR3b3JrU3RhdGVOb3RpZmllclByaXZhdGUuaAotCi0gICAgU09VUkNFUyArPSBcCi0gICAg
ICAgIHBsYXRmb3JtL25ldHdvcmsvcXQvTmV0d29ya1N0YXRlTm90aWZpZXJRdC5jcHAKLQorICAg
IG1lc3NhZ2UoImJlYXJlciBleGlzdHMiKQorICAgIEhFQURFUlMgKz0gcGxhdGZvcm0vbmV0d29y
ay9xdC9OZXR3b3JrU3RhdGVOb3RpZmllclByaXZhdGUuaAorICAgIFNPVVJDRVMgKz0gcGxhdGZv
cm0vbmV0d29yay9xdC9OZXR3b3JrU3RhdGVOb3RpZmllclF0LmNwcAogICAgIENPTkZJRyArPSBt
b2JpbGl0eQogICAgIE1PQklMSVRZICs9IGJlYXJlcgogfQogCitjb250YWlucyhERUZJTkVTLCBF
TkFCTEVfR0VPTE9DQVRJT049MSkgeworICAgIEhFQURFUlMgKz0gcGxhdGZvcm0vcXQvR2VvbG9j
YXRpb25TZXJ2aWNlUXQuaAorICAgIFNPVVJDRVMgKz0gcGxhdGZvcm0vcXQvR2VvbG9jYXRpb25T
ZXJ2aWNlUXQuY3BwCisgICAgQ09ORklHICs9IG1vYmlsaXR5CisgICAgTU9CSUxJVFkgKz0gbG9j
YXRpb24KK30KKwogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1NWRz0xKSB7CiAgICAgU09VUkNF
UyArPSBcCiAjIFRPRE86IHRoaXMtb25lLWlzLW5vdC1hdXRvLWFkZGVkISBGSVhNRSEgdG1wL1NW
R0VsZW1lbnRGYWN0b3J5LmNwcCBcCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3F0L0dlb2xvY2F0
aW9uU2VydmljZVF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3F0L0dlb2xv
Y2F0aW9uU2VydmljZVF0LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vcXQv
R2VvbG9jYXRpb25TZXJ2aWNlUXQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExMSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZpY2VRdC5o
IgorCisjaW5jbHVkZSAiR2VvbG9jYXRpb24uaCIKKyNpbmNsdWRlICJHZW9wb3NpdGlvbi5oIgor
I2luY2x1ZGUgIlBvc2l0aW9uRXJyb3IuaCIKKyNpbmNsdWRlICJQb3NpdGlvbk9wdGlvbnMuaCIK
KwordXNpbmcgbmFtZXNwYWNlIFF0TW9iaWxpdHk7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
R2VvbG9jYXRpb25TZXJ2aWNlOjpGYWN0b3J5RnVuY3Rpb24qIEdlb2xvY2F0aW9uU2VydmljZTo6
c19mYWN0b3J5RnVuY3Rpb24gPSAmR2VvbG9jYXRpb25TZXJ2aWNlUXQ6OmNyZWF0ZTsKKworR2Vv
bG9jYXRpb25TZXJ2aWNlKiBHZW9sb2NhdGlvblNlcnZpY2VRdDo6Y3JlYXRlKEdlb2xvY2F0aW9u
U2VydmljZUNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR2VvbG9jYXRpb25TZXJ2
aWNlUXQoY2xpZW50KTsKK30KKworR2VvbG9jYXRpb25TZXJ2aWNlUXQ6Okdlb2xvY2F0aW9uU2Vy
dmljZVF0KEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCogY2xpZW50KQorICAgIDogR2VvbG9jYXRp
b25TZXJ2aWNlKGNsaWVudCkKKyAgICAsIG1fbGFzdFBvc2l0aW9uKDApCisgICAgLCBtX2xhc3RF
cnJvcigwKQoreworICAgIG1fbG9jYXRpb24gPSBRR2VvUG9zaXRpb25JbmZvU291cmNlOjpjcmVh
dGVEZWZhdWx0U291cmNlKHRoaXMpOworCisgICAgaWYgKG1fbG9jYXRpb24pCisgICAgICAgIGNv
bm5lY3QobV9sb2NhdGlvbiwgU0lHTkFMKHBvc2l0aW9uVXBkYXRlZChRR2VvUG9zaXRpb25JbmZv
KSksIHRoaXMsIFNMT1QocG9zaXRpb25VcGRhdGVkKFFHZW9Qb3NpdGlvbkluZm8pKSk7CisgICAg
ZWxzZQorICAgICAgICBtX2xhc3RFcnJvciA9IFBvc2l0aW9uRXJyb3I6OmNyZWF0ZShQb3NpdGlv
bkVycm9yOjpQT1NJVElPTl9VTkFWQUlMQUJMRSwgdHIoIkdQUyBkZXZpY2Ugbm90IGZvdW5kIikp
OworfQorCitHZW9sb2NhdGlvblNlcnZpY2VRdDo6fkdlb2xvY2F0aW9uU2VydmljZVF0KCkKK3sK
K30KKwordm9pZCBHZW9sb2NhdGlvblNlcnZpY2VRdDo6cG9zaXRpb25VcGRhdGVkKGNvbnN0IFFH
ZW9Qb3NpdGlvbkluZm8gJmdwc1BvcykKK3sKKyAgICBpZiAoIWdwc1Bvcy5pc1ZhbGlkKCkpCisg
ICAgICAgIGVycm9yT2NjdXJyZWQoKTsKKworICAgIFFHZW9Db29yZGluYXRlIGNvb3JkID0gZ3Bz
UG9zLmNvb3JkaW5hdGUoKTsKKyAgICBkb3VibGUgbGF0aXR1ZGUgPSBjb29yZC5sYXRpdHVkZSgp
OworICAgIGRvdWJsZSBsb25naXR1ZGUgPSBjb29yZC5sb25naXR1ZGUoKTsKKyAgICBib29sIHBy
b3ZpZGVzQWx0aXR1ZGUgPSB0cnVlOworICAgIGRvdWJsZSBhbHRpdHVkZSA9IGNvb3JkLmFsdGl0
dWRlKCk7CisKKyAgICBkb3VibGUgYWNjdXJhY3kgPSBncHNQb3MuaGFzQXR0cmlidXRlKFFHZW9Q
b3NpdGlvbkluZm86Okhvcml6b250YWxBY2N1cmFjeSkgPworICAgICAgICAgICAgICAgICAgICAg
ICAgZ3BzUG9zLmF0dHJpYnV0ZShRR2VvUG9zaXRpb25JbmZvOjpIb3Jpem9udGFsQWNjdXJhY3kp
IDogMC4wOworCisgICAgYm9vbCBwcm92aWRlc0FsdGl0dWRlQWNjdXJhY3kgPSBncHNQb3MuaGFz
QXR0cmlidXRlKFFHZW9Qb3NpdGlvbkluZm86OlZlcnRpY2FsQWNjdXJhY3kpOworICAgIGRvdWJs
ZSBhbHRpdHVkZUFjY3VyYWN5ID0gcHJvdmlkZXNBbHRpdHVkZUFjY3VyYWN5ID8gZ3BzUG9zLmF0
dHJpYnV0ZShRR2VvUG9zaXRpb25JbmZvOjpWZXJ0aWNhbEFjY3VyYWN5KSA6IDAuMDsKKworICAg
IGJvb2wgcHJvdmlkZXNIZWFkaW5nID0gIGdwc1Bvcy5oYXNBdHRyaWJ1dGUoUUdlb1Bvc2l0aW9u
SW5mbzo6RGlyZWN0aW9uKTsKKyAgICBkb3VibGUgaGVhZGluZyA9IHByb3ZpZGVzSGVhZGluZyA/
IGdwc1Bvcy5hdHRyaWJ1dGUoUUdlb1Bvc2l0aW9uSW5mbzo6RGlyZWN0aW9uKSA6IDAuMDsKKwor
ICAgIGJvb2wgcHJvdmlkZXNTcGVlZCA9IGdwc1Bvcy5oYXNBdHRyaWJ1dGUoUUdlb1Bvc2l0aW9u
SW5mbzo6R3JvdW5kU3BlZWQpOworICAgIGRvdWJsZSBzcGVlZCA9IHByb3ZpZGVzU3BlZWQgPyBn
cHNQb3MuYXR0cmlidXRlKFFHZW9Qb3NpdGlvbkluZm86Okdyb3VuZFNwZWVkKSA6IDAuMDsKKwor
ICAgIFJlZlB0cjxDb29yZGluYXRlcz4gY29vcmRpbmF0ZXMgPSBDb29yZGluYXRlczo6Y3JlYXRl
KGxhdGl0dWRlLCBsb25naXR1ZGUsIHByb3ZpZGVzQWx0aXR1ZGUsIGFsdGl0dWRlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3Vy
YWN5LCBwcm92aWRlc0FsdGl0dWRlQWNjdXJhY3ksIGFsdGl0dWRlQWNjdXJhY3ksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlk
ZXNIZWFkaW5nLCBoZWFkaW5nLCBwcm92aWRlc1NwZWVkLCBzcGVlZCk7CisgICAgbV9sYXN0UG9z
aXRpb24gPSBHZW9wb3NpdGlvbjo6Y3JlYXRlKGNvb3JkaW5hdGVzLnJlbGVhc2UoKSwgZ3BzUG9z
LnRpbWVzdGFtcCgpLnRvVGltZV90KCkpOworICAgIHBvc2l0aW9uQ2hhbmdlZCgpOworfQorCiti
b29sIEdlb2xvY2F0aW9uU2VydmljZVF0OjpzdGFydFVwZGF0aW5nKFBvc2l0aW9uT3B0aW9ucyop
Cit7CisgICAgbV9sYXN0UG9zaXRpb24gPSAwOworCisgICAgaWYgKCFtX2xvY2F0aW9uKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUT0RPOiBoYW5kbGUgZW5hYmxlSGlnaEFjY3Vy
YWN5KCkKKworICAgIG1fbG9jYXRpb24tPnN0YXJ0VXBkYXRlcygpOworICAgIHJldHVybiB0cnVl
OworfQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZVF0OjpzdG9wVXBkYXRpbmcoKQoreworICAg
IGlmIChtX2xvY2F0aW9uKQorICAgICAgICBtX2xvY2F0aW9uLT5zdG9wVXBkYXRlcygpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3F0L0dlb2xv
Y2F0aW9uU2VydmljZVF0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9xdC9HZW9s
b2NhdGlvblNlcnZpY2VRdC5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9xdC9H
ZW9sb2NhdGlvblNlcnZpY2VRdC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDcxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lk
aWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIEdlb2xvY2F0aW9uU2VydmljZVF0X2gKKyNkZWZpbmUgR2VvbG9jYXRpb25TZXJ2aWNl
UXRfaAorCisjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlLmgiCisjaW5jbHVkZSA8UUdlb1Bv
c2l0aW9uSW5mb1NvdXJjZT4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKKy8vIEZJWE1FOiBS
ZW1vdmUgdXNhZ2Ugb2YgInVzaW5iIG5hbWVzcGFjZSIgaW4gYSBoZWFkZXIgZmlsZS4KKy8vIFRo
ZXJlIGlzIGJ1ZyBpbiBxdE1vYmlsaXR5IHNpZ25hbCBuYW1lcyBhcmUgbm90IGZ1bGwgcXVhbGlm
aWVkIHdoZW4gdXNlZCB3aXRoIG5hbWVzcGFjZQorLy8gUXRNb2JpbGl0eSBuYW1lc3BhY2UgaW4g
c2xvdHMgdGhyb3dzIHVwIGVycm9yIGFuZCBpdHMgcmVxdWlyZWQgdG8gYmUgZml4ZWQgaW4gcXRt
b2JpbGl0eS4KK3VzaW5nIG5hbWVzcGFjZSBRdE1vYmlsaXR5OworCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBpbXBsZW1lbnRhdGlvbiBvZiBhIEdlb2xv
Y2F0aW9uU2VydmljZSBmb3IgcXRXZWJraXQuCisvLyBJdCB1c2VzIFF0TW9iaWxpdHkgbG9jYXRp
b24gc2VydmljZSB0byBnZXQgcG9zaXRpb25zIGFuZCBpZiBubyBHUFMgZGV2aWNlIGZvdW5kLAor
Ly8gbm1lYSBzaW11bGF0aW9uIHdpbGwgcmVhZCBzdGF0aWMgcG9zaXRpb25zIGZyb20gYSBsb2cg
ZmlsZQorY2xhc3MgR2VvbG9jYXRpb25TZXJ2aWNlUXQgOiBwdWJsaWMgUU9iamVjdCwgR2VvbG9j
YXRpb25TZXJ2aWNlIHsKKyAgICBRX09CSkVDVAorCitwdWJsaWM6CisgICAgc3RhdGljIEdlb2xv
Y2F0aW9uU2VydmljZSogY3JlYXRlKEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCopOworCisgICAg
R2VvbG9jYXRpb25TZXJ2aWNlUXQoR2VvbG9jYXRpb25TZXJ2aWNlQ2xpZW50Kik7CisgICAgdmly
dHVhbCB+R2VvbG9jYXRpb25TZXJ2aWNlUXQoKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdGFydFVw
ZGF0aW5nKFBvc2l0aW9uT3B0aW9ucyopOworICAgIHZpcnR1YWwgdm9pZCBzdG9wVXBkYXRpbmco
KTsKKworICAgIHZpcnR1YWwgR2VvcG9zaXRpb24qIGxhc3RQb3NpdGlvbigpIGNvbnN0IHsgcmV0
dXJuIG1fbGFzdFBvc2l0aW9uLmdldCgpOyB9CisgICAgdmlydHVhbCBQb3NpdGlvbkVycm9yKiBs
YXN0RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX2xhc3RFcnJvci5nZXQoKTsgfQorCitwdWJsaWMg
UV9TTE9UUzoKKyAgICAvLyBRR2VvUG9zaXRpb25JbmZvU291cmNlCisgICAgdm9pZCBwb3NpdGlv
blVwZGF0ZWQoY29uc3QgUUdlb1Bvc2l0aW9uSW5mbyYpOworCitwcml2YXRlOgorICAgIFJlZlB0
cjxHZW9wb3NpdGlvbj4gbV9sYXN0UG9zaXRpb247CisgICAgUmVmUHRyPFBvc2l0aW9uRXJyb3I+
IG1fbGFzdEVycm9yOworCisgICAgUXRNb2JpbGl0eTo6UUdlb1Bvc2l0aW9uSW5mb1NvdXJjZSog
bV9sb2NhdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEdl
b2xvY2F0aW9uU2VydmljZVF0X2gKSW5kZXg6IFdlYktpdC9xdC9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0L3F0L0NoYW5nZUxvZwkocmV2aXNpb24gNjA2NTUpCisrKyBXZWJLaXQvcXQv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjYgQEAKKzIwMTAtMDYtMDQgIE1h
aGVzaCBLdWxrYXJuaSAgPG1haGVzaC5rdWxrYXJuaUBub2tpYS5jb20+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1F0XSBuYXZpZ2F0b3IuZ2VvbG9j
YXRpb24gc3VwcG9ydCBmb3IgcXQgcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9Mzk3MjQKKworICAgICAgICBBZGRlZCBleHRyYSBzbG90IHRvIHF3
ZWJwYWdlIGZvciBsb2NhdGlvbiByZXF1ZXN0IHRvIHVzZXIKKyAKKyAgICAgICAgVGVzdDogQWRk
ZWQgdW5pdCB0ZXN0IGNhc2UgZm9yIG5ldyBBUEkgYWxsb3dHZW9sb2NhdGlvblJlcXVlc3QoKSBh
bmQgZml4ZWQgYSBsZWFrIGluIG90aGVyIHRlc3QgY2FzZS4KKworICAgICAgICAqIEFwaS9xd2Vi
cGFnZS5jcHA6CisgICAgICAgIChRV2ViUGFnZTo6YWxsb3dHZW9sb2NhdGlvblJlcXVlc3QpOgor
ICAgICAgICAqIEFwaS9xd2VicGFnZS5oOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0Nocm9t
ZUNsaWVudFF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNocm9tZUNsaWVudFF0OjpyZXF1ZXN0
R2VvbG9jYXRpb25QZXJtaXNzaW9uRm9yRnJhbWUpOgorICAgICAgICAqIHRlc3RzL3F3ZWJwYWdl
L3RzdF9xd2VicGFnZS5jcHA6CisgICAgICAgIChKU1Rlc3RQYWdlOjpzaG91bGRJbnRlcnJ1cHRK
YXZhU2NyaXB0KToKKyAgICAgICAgKEpTVGVzdFBhZ2U6OmFsbG93R2VvbG9jYXRpb25SZXF1ZXN0
KToKKyAgICAgICAgKEpTVGVzdFBhZ2U6OnNldEdlb2xvY2F0aW9uUGVybWlzc2lvbik6CisgICAg
ICAgICh0c3RfUVdlYlBhZ2U6OmluZmluaXRlTG9vcEpTKToKKyAgICAgICAgKHRzdF9RV2ViUGFn
ZTo6Z2VvbG9jYXRpb25SZXF1ZXN0SlMpOgorCiAyMDEwLTA2LTAzICBZYWVsIEFoYXJvbiAgPHlh
ZWwuYWhhcm9uQG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBMYXN6bG8gR29tYm9z
LgpJbmRleDogV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L3F0L0FwaS9xd2VicGFnZS5jcHAJKHJldmlzaW9uIDYwNjE4KQorKysgV2ViS2l0L3F0L0FwaS9x
d2VicGFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE5MzMsNiArMTkzMywzMCBAQCBib29sIFFX
ZWJQYWdlOjpzaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0CiB9CiAKIC8qIQorICAgIFxmbiBib29s
IFFXZWJQYWdlOjphbGxvd0dlb2xvY2F0aW9uUmVxdWVzdCgpCisgICAgXHNpbmNlIDQuNworCisg
ICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBKYXZhU2NyaXB0IHByb2dyYW0g
cnVubmluZyBpbnNpZGUgXGEgZnJhbWUgdHJpZXMgdG8gYWNjZXNzIHVzZXIgbG9jYXRpb24gdGhy
b3VnaCBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uCisKKyAgICBJZiB0aGUgdXNlciB3YW50cyB0byBh
bGxvdyBhY2Nlc3MgdG8gbG9jYXRpb24gdGhlbiBpdCBzaG91bGQgcmV0dXJuIHRydWU7IG90aGVy
d2lzZSBmYWxzZS4KKworICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGV4ZWN1dGVzIHRo
ZSBxdWVyeSB1c2luZyBRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24gd2l0aCBRTWVzc2FnZUJveDo6
WWVzIGFuZCBRTWVzc2FnZUJveDo6Tm8gYnV0dG9ucy4KKworICAgIFx3YXJuaW5nIEJlY2F1c2Ug
b2YgYmluYXJ5IGNvbXBhdGliaWxpdHkgY29uc3RyYWludHMsIHRoaXMgZnVuY3Rpb24gaXMgbm90
IHZpcnR1YWwuIElmIHlvdSB3YW50IHRvCisgICAgcHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRh
dGlvbiBpbiBhIFFXZWJQYWdlIHN1YmNsYXNzLCByZWltcGxlbWVudCB0aGUgYWxsb3dHZW9sb2Nh
dGlvblJlcXVlc3QoKQorICAgIHNsb3QgaW4geW91ciBzdWJjbGFzcyBpbnN0ZWFkLiBRdFdlYktp
dCB3aWxsIGR5bmFtaWNhbGx5IGRldGVjdCB0aGUgc2xvdCBhbmQgY2FsbCBpdC4KKyovCitib29s
IFFXZWJQYWdlOjphbGxvd0dlb2xvY2F0aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lKQorewor
I2lmZGVmIFFUX05PX01FU1NBR0VCT1gKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIFFX
aWRnZXQqIHBhcmVudCA9IChkLT5jbGllbnQpID8gZC0+Y2xpZW50LT5vd25lcldpZGdldCgpIDog
MDsKKyAgICByZXR1cm4gUU1lc3NhZ2VCb3g6OlllcyA9PSBRTWVzc2FnZUJveDo6aW5mb3JtYXRp
b24ocGFyZW50LCB0cigiTG9jYXRpb24gUmVxdWVzdCBieS0gJTEiKS5hcmcoZnJhbWUtPnVybCgp
Lmhvc3QoKSksIHRyKCJUaGUgcGFnZSB3YW50cyB0byBhY2Nlc3MgeW91ciBsb2NhdGlvbiBpbmZv
cm1hdGlvbi4gRG8geW91IHdhbnQgdG8gYWxsb3cgdGhlIHJlcXVlc3Q/IiksIFFNZXNzYWdlQm94
OjpZZXMsIFFNZXNzYWdlQm94OjpObyk7CisjZW5kaWYKK30KKworLyohCiAgICAgVGhpcyBmdW5j
dGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgV2ViS2l0IHdhbnRzIHRvIGNyZWF0ZSBhIG5ldyB3aW5k
b3cgb2YgdGhlIGdpdmVuIFxhIHR5cGUsIGZvcgogICAgIGV4YW1wbGUgd2hlbiBhIEphdmFTY3Jp
cHQgcHJvZ3JhbSByZXF1ZXN0cyB0byBvcGVuIGEgZG9jdW1lbnQgaW4gYSBuZXcgd2luZG93Lgog
CkluZGV4OiBXZWJLaXQvcXQvQXBpL3F3ZWJwYWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0
L0FwaS9xd2VicGFnZS5oCShyZXZpc2lvbiA2MDYxOCkKKysrIFdlYktpdC9xdC9BcGkvcXdlYnBh
Z2UuaAkod29ya2luZyBjb3B5KQpAQCAtMzA3LDYgKzMwNyw3IEBAIHB1YmxpYzoKIAogcHVibGlj
IFFfU0xPVFM6CiAgICAgYm9vbCBzaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0KCk7CisgICAgYm9v
bCBhbGxvd0dlb2xvY2F0aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lKTsKIAogUV9TSUdOQUxT
OgogICAgIHZvaWQgbG9hZFN0YXJ0ZWQoKTsKSW5kZXg6IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9y
dC9DaHJvbWVDbGllbnRRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L1dlYkNvcmVTdXBw
b3J0L0Nocm9tZUNsaWVudFF0LmNwcAkocmV2aXNpb24gNjA2MTgpCisrKyBXZWJLaXQvcXQvV2Vi
Q29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICsz
NSw3IEBACiAjaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlckNs
aWVudFF0LmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR2VvbG9jYXRpb24u
aCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiSWNvbi5oIgogI2luY2x1
ZGUgIk5vdGlmaWNhdGlvblByZXNlbnRlckNsaWVudFF0LmgiCkBAIC01MzQsMTAgKzUzNSwxMiBA
QCBib29sIENocm9tZUNsaWVudFF0OjpzZXRDdXJzb3IoUGxhdGZvcm1DCiAgICAgcmV0dXJuIGZh
bHNlOwogfQogCi12b2lkIENocm9tZUNsaWVudFF0OjpyZXF1ZXN0R2VvbG9jYXRpb25QZXJtaXNz
aW9uRm9yRnJhbWUoRnJhbWUqLCBHZW9sb2NhdGlvbiopCit2b2lkIENocm9tZUNsaWVudFF0Ojpy
ZXF1ZXN0R2VvbG9jYXRpb25QZXJtaXNzaW9uRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBHZW9sb2Nh
dGlvbiogZ2VvbG9jYXRpb24pCiB7Ci0gICAgLy8gU2VlIHRoZSBjb21tZW50IGluIFdlYkNvcmUv
cGFnZS9DaHJvbWVDbGllbnQuaAotICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgYm9vbCBhbGxv
dyA9IGZhbHNlOworICAgIFFXZWJGcmFtZSogd2ViRnJhbWUgPSBRV2ViRnJhbWVQcml2YXRlOjpr
aXQoZnJhbWUpOworICAgIFFNZXRhT2JqZWN0OjppbnZva2VNZXRob2QobV93ZWJQYWdlLCAiYWxs
b3dHZW9sb2NhdGlvblJlcXVlc3QiLCBRdDo6RGlyZWN0Q29ubmVjdGlvbiwgUV9SRVRVUk5fQVJH
KGJvb2wsIGFsbG93KSwgUV9BUkcoUVdlYkZyYW1lKiwgd2ViRnJhbWUpKTsKKyAgICBnZW9sb2Nh
dGlvbi0+c2V0SXNBbGxvd2VkKGFsbG93KTsKIH0KIAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKSW5kZXg6IFdlYktpdC9xdC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBhZ2UuY3Bw
CShyZXZpc2lvbiA2MDYxOCkKKysrIFdlYktpdC9xdC90ZXN0cy9xd2VicGFnZS90c3RfcXdlYnBh
Z2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Nyw2ICs3Nyw3IEBAIHByaXZhdGUgc2xvdHM6CiAK
ICAgICB2b2lkIGFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KCk7CiAgICAgdm9pZCBpbmZpbml0ZUxv
b3BKUygpOworICAgIHZvaWQgZ2VvbG9jYXRpb25SZXF1ZXN0SlMoKTsKICAgICB2b2lkIGxvYWRG
aW5pc2hlZCgpOwogICAgIHZvaWQgYWNjZXB0TmF2aWdhdGlvblJlcXVlc3RXaXRoTmV3V2luZG93
KCk7CiAgICAgdm9pZCB1c2VyU3R5bGVTaGVldCgpOwpAQCAtMjEyLDE3ICsyMTMsNTQgQEAgcHVi
bGljOgogICAgIDogUVdlYlBhZ2UocGFyZW50KSB7fQogCiBwdWJsaWMgc2xvdHM6Ci0gICAgYm9v
bCBzaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsgCisg
ICAgYm9vbCBzaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0KCkgCisgICAgeworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBhbGxvd0dlb2xvY2F0aW9uUmVxdWVzdChRV2ViRnJh
bWUgKmZyYW1lKSAKKyAgICB7CisgICAgICAgIHJldHVybiBtX2FsbG93R2VvbG9jYXRpb247Cisg
ICAgfQorCitwdWJsaWM6CisgICAgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbCBh
bGxvdykgCisgICAgeworICAgICAgICBtX2FsbG93R2VvbG9jYXRpb24gPSBhbGxvdzsKICAgICB9
CisKK3ByaXZhdGU6IAorICAgIGJvb2wgbV9hbGxvd0dlb2xvY2F0aW9uOwogfTsKIAogdm9pZCB0
c3RfUVdlYlBhZ2U6OmluZmluaXRlTG9vcEpTKCkKIHsKICAgICBKU1Rlc3RQYWdlKiBuZXdQYWdl
ID0gbmV3IEpTVGVzdFBhZ2UobV92aWV3KTsKICAgICBtX3ZpZXctPnNldFBhZ2UobmV3UGFnZSk7
Ci0gICAgbV92aWV3LT5zZXRIdG1sKFFTdHJpbmcoIjxodG1sPjxib2R5dGVzdDwvYm9keT48L2h0
bWw+IiksIFFVcmwoKSk7CisgICAgbV92aWV3LT5zZXRIdG1sKFFTdHJpbmcoIjxodG1sPjxib2R5
PnRlc3Q8L2JvZHk+PC9odG1sPiIpLCBRVXJsKCkpOwogICAgIG1fdmlldy0+cGFnZSgpLT5tYWlu
RnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJ2YXIgcnVuID0gdHJ1ZTt2YXIgYSA9IDE7d2hp
bGUocnVuKXthKys7fSIpOworICAgIGRlbGV0ZSBuZXdQYWdlOworfQorCit2b2lkIHRzdF9RV2Vi
UGFnZTo6Z2VvbG9jYXRpb25SZXF1ZXN0SlMoKQoreworICAgIEpTVGVzdFBhZ2UqIG5ld1BhZ2Ug
PSBuZXcgSlNUZXN0UGFnZShtX3ZpZXcpOworICAgIG5ld1BhZ2UtPnNldEdlb2xvY2F0aW9uUGVy
bWlzc2lvbihmYWxzZSk7CisgICAgbV92aWV3LT5zZXRQYWdlKG5ld1BhZ2UpOworICAgIG1fdmll
dy0+c2V0SHRtbChRU3RyaW5nKCI8aHRtbD48Ym9keT50ZXN0PC9ib2R5PjwvaHRtbD4iKSwgUVVy
bCgpKTsKKyAgICBtX3ZpZXctPnBhZ2UoKS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlw
dCgidmFyIGVycm9yQ29kZSA9IDA7IGZ1bmN0aW9uIGVycm9yKGVycikgeyBlcnJvckNvZGUgPSBl
cnIuY29kZTsgfSBmdW5jdGlvbiBzdWNjZXNzKHBvcykgeyB9IG5hdmlnYXRvci5nZW9sb2NhdGlv
bi5nZXRDdXJyZW50UG9zaXRpb24oc3VjY2VzcywgZXJyb3IpIik7CisgICAgUVRlc3Q6OnFXYWl0
KDIwMDApOworICAgIFFWYXJpYW50IGVtcHR5ID0gbV92aWV3LT5wYWdlKCktPm1haW5GcmFtZSgp
LT5ldmFsdWF0ZUphdmFTY3JpcHQoImVycm9yQ29kZSIpOworCisgICAgUVZFUklGWShlbXB0eS50
eXBlKCkgPT0gUVZhcmlhbnQ6OkRvdWJsZSAmJiBlbXB0eS50b0ludCgpICE9IDApOworCisgICAg
bmV3UGFnZS0+c2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKHRydWUpOworICAgIG1fdmlldy0+cGFn
ZSgpLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJlcnJvckNvZGUgPSAwOyBuYXZp
Z2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHN1Y2Nlc3MsIGVycm9yKTsiKTsK
KyAgICBlbXB0eSA9IG1fdmlldy0+cGFnZSgpLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2Ny
aXB0KCJlcnJvckNvZGUiKTsKKworICAgIC8vaHR0cDovL2Rldi53My5vcmcvZ2VvL2FwaS9zcGVj
LXNvdXJjZS5odG1sI3Bvc2l0aW9uCisgICAgLy9Qb3NpdGlvbkVycm9yOiBjb25zdCB1bnNpZ25l
ZCBzaG9ydCBQRVJNSVNTSU9OX0RFTklFRCA9IDE7CisgICAgUVZFUklGWShlbXB0eS50eXBlKCkg
PT0gUVZhcmlhbnQ6OkRvdWJsZSAmJiBlbXB0eS50b0ludCgpICE9IDEpOworICAgIGRlbGV0ZSBu
ZXdQYWdlOwogfQogCiB2b2lkIHRzdF9RV2ViUGFnZTo6bG9hZEZpbmlzaGVkKCkK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58367</attachid>
            <date>2010-06-10 05:45:22 -0700</date>
            <delta_ts>2010-06-14 05:00:56 -0700</delta_ts>
            <desc>solution with layout testing</desc>
            <filename>geolocation_latest.patch</filename>
            <type>text/plain</type>
            <size>26564</size>
            <attacher name="Mahesh Kulkarni">maheshk</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MDk1MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjUgQEAKKzIwMTAtMDYtMTAgIE1haGVzaCBLdWxrYXJuaSAgPG1haGVzaC5rdWxr
YXJuaUBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgW1F0XSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24gc3VwcG9ydCBmb3IgcXQgcG9ydAor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzk3MjQKKwor
ICAgICAgICBJbXBsZW1ldGlvbiBmb3IgUVQgcG9ydCBvZiBuYXZpZ2F0b3IuZ2Vsb2NhdGlvbi4g
VXNpbmcgcXRtb2JpbGl0eSBsb2NhdGlvbiBzZXJ2aWNlLiAKKworICAgICAgICAqIFdlYkNvcmUu
cHJpOgorICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAqIHBsYXRmb3JtL3F0L0dlb2xv
Y2F0aW9uU2VydmljZVF0LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlv
blNlcnZpY2VRdDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2Vydmlj
ZVF0OjpHZW9sb2NhdGlvblNlcnZpY2VRdCk6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlv
blNlcnZpY2VRdDo6fkdlb2xvY2F0aW9uU2VydmljZVF0KToKKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uU2VydmljZVF0Ojpwb3NpdGlvblVwZGF0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6
R2VvbG9jYXRpb25TZXJ2aWNlUXQ6OnN0YXJ0VXBkYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6
R2VvbG9jYXRpb25TZXJ2aWNlUXQ6OnN0b3BVcGRhdGluZyk6CisgICAgICAgICogcGxhdGZvcm0v
cXQvR2VvbG9jYXRpb25TZXJ2aWNlUXQuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHZW9s
b2NhdGlvblNlcnZpY2VRdDo6bGFzdFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xv
Y2F0aW9uU2VydmljZVF0OjpsYXN0RXJyb3IpOgorCiAyMDEwLTA2LTA5ICBNT1JJVEEgSGFqaW1l
ICA8bW9ycml0YUBnb29nbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEtlbnQgVGFtdXJh
LgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNv
cmUucHJpCShyZXZpc2lvbiA2MDk1MSkKKysrIFdlYkNvcmUvV2ViQ29yZS5wcmkJKHdvcmtpbmcg
Y29weSkKQEAgLTgsNiArOCw5IEBAIENPTkZJRyhtaW5pbWFsKSB7CiAgIERFRklORVMgKz0gRU5B
QkxFX05FVFNDQVBFX1BMVUdJTl9BUEk9MAogfQogCisjIyBsb2FkIG1vYmlsaXR5Y29uZmlnIGlm
IG1vYmlsaXR5IGlzIGF2YWlsYWJsZSAKK2xvYWQobW9iaWxpdHljb25maWcsIHRydWUpCisKICMj
IERlZmluZSBkZWZhdWx0IGZlYXR1cmVzIG1hY3JvcyBmb3Igb3B0aW9uYWwgY29tcG9uZW50cwog
IyMgKGxvb2sgZm9yIGRlZnMgaW4gY29uZmlnLmggYW5kIGluY2x1ZGVkIGZpbGVzISkKICMgVHJ5
IHRvIGxvY2F0ZSBzcWxpdGUzIHNvdXJjZQpAQCAtMTA5LDEzICsxMTIsMTkgQEAgZ3JlYXRlclRo
YW4oUVRfTUlOT1JfVkVSU0lPTiwgNSkgewogICAgIGVsc2U6REVGSU5FUyArPSBFTkFCTEVfWFNM
VD0wCiB9CiAKKyMgZ2VvbG9jYXRpb24gc3VwcG9ydCBpZiBRdE1vYmlsaXR5IGV4aXN0cworIUNP
TkZJRyhRVERJUl9idWlsZCk6IWNvbnRhaW5zKERFRklORVMsIEVOQUJMRV9HRU9MT0NBVElPTj0u
KSB7CisgICAgY29udGFpbnMoTU9CSUxJVFlfQ09ORklHLCBsb2NhdGlvbikgeworICAgICAgIERF
RklORVMgKz0gRU5BQkxFX0dFT0xPQ0FUSU9OPTEKKyAgICB9Cit9CisKICMgQmVhcmVyIG1hbmFn
ZW1lbnQgaXMgcGFydCBvZiBRdCA0LjcKICMgZm9yIG9sZGVyIHZlcnNpb24sIGNoZWNrIGZvciBt
b2JpbGl0eSB3aXRoIGJlYXJlciAKICFjb250YWlucyhERUZJTkVTLCBFTkFCTEVfUVRfQkVBUkVS
PS4pIHsKICAgICAgIWxlc3NUaGFuKFFUX01JTk9SX1ZFUlNJT04sIDcpIHsKICAgICAgICAgREVG
SU5FUyArPSBFTkFCTEVfUVRfQkVBUkVSPTEKICAgICAgfSBlbHNlIHsKLSAgICAgICAgbG9hZCht
b2JpbGl0eWNvbmZpZykKICAgICAgICAgY29udGFpbnMoTU9CSUxJVFlfQ09ORklHLCBiZWFyZXIp
IHsKICAgICAgICAgICAgIERFRklORVMgKz0gRU5BQkxFX1FUX0JFQVJFUj0xCiAgICAgICAgIH0K
QEAgLTE2OCw3ICsxNzcsNyBAQCBjb250YWlucyhERUZJTkVTLCBFTkFCTEVfVElMRURfQkFDS0lO
R19TCiBjb250YWlucyhERUZJTkVTLCBFTkFCTEVfTk9USUZJQ0FUSU9OUz0xKTogRkVBVFVSRV9E
RUZJTkVTX0pBVkFTQ1JJUFQgKz0gRU5BQkxFX05PVElGSUNBVElPTlM9MQogY29udGFpbnMoREVG
SU5FUywgRU5BQkxFX01FVEVSX1RBRz0xKTogRkVBVFVSRV9ERUZJTkVTX0pBVkFTQ1JJUFQgKz0g
RU5BQkxFX01FVEVSX1RBRz0xCiBjb250YWlucyhERUZJTkVTLCBFTkFCTEVfUFJPR1JFU1NfVEFH
PTEpOiBGRUFUVVJFX0RFRklORVNfSkFWQVNDUklQVCArPSBFTkFCTEVfUFJPR1JFU1NfVEFHPTEK
LQorY29udGFpbnMoREVGSU5FUywgRU5BQkxFX0dFT0xPQ0FUSU9OPTEpOiBGRUFUVVJFX0RFRklO
RVNfSkFWQVNDUklQVCArPSBFTkFCTEVfR0VPTE9DQVRJT049MQogCiAjIyBEZXJpdmVkIHNvdXJj
ZSBnZW5lcmF0b3JzCiBNQVRITUxfTkFNRVMgPSAkJFBXRC9tYXRobWwvbWF0aHRhZ3MuaW4KSW5k
ZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBy
bwkocmV2aXNpb24gNjA5NTEpCisrKyBXZWJDb3JlL1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkp
CkBAIC0yNjM5LDYgKzI2MzksMTYgQEAgY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1FUX0JFQVJF
Uj0xKSB7CiAgICAgfQogfQogCitjb250YWlucyhERUZJTkVTLCBFTkFCTEVfR0VPTE9DQVRJT049
MSkgeworICAgIEhFQURFUlMgKz0gXAorICAgICAgICBwbGF0Zm9ybS9xdC9HZW9sb2NhdGlvblNl
cnZpY2VRdC5oCisgICAgU09VUkNFUyArPSBcCisgICAgICAgIHBsYXRmb3JtL3F0L0dlb2xvY2F0
aW9uU2VydmljZVF0LmNwcAorCisgICAgQ09ORklHICs9IG1vYmlsaXR5CisgICAgTU9CSUxJVFkg
Kz0gbG9jYXRpb24KK30KKwogY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1NWRz0xKSB7CiAgICAg
U09VUkNFUyArPSBcCiAjIFRPRE86IHRoaXMtb25lLWlzLW5vdC1hdXRvLWFkZGVkISBGSVhNRSEg
dG1wL1NWR0VsZW1lbnRGYWN0b3J5LmNwcCBcCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3F0L0dl
b2xvY2F0aW9uU2VydmljZVF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3F0
L0dlb2xvY2F0aW9uU2VydmljZVF0LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vcXQvR2VvbG9jYXRpb25TZXJ2aWNlUXQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEw
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3Ig
aXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZp
Y2VRdC5oIgorCisjaW5jbHVkZSAiR2VvbG9jYXRpb24uaCIKKyNpbmNsdWRlICJHZW9wb3NpdGlv
bi5oIgorI2luY2x1ZGUgIlBvc2l0aW9uRXJyb3IuaCIKKyNpbmNsdWRlICJQb3NpdGlvbk9wdGlv
bnMuaCIKKwordXNpbmcgbmFtZXNwYWNlIFF0TW9iaWxpdHk7CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworR2VvbG9jYXRpb25TZXJ2aWNlOjpGYWN0b3J5RnVuY3Rpb24qIEdlb2xvY2F0aW9uU2Vy
dmljZTo6c19mYWN0b3J5RnVuY3Rpb24gPSAmR2VvbG9jYXRpb25TZXJ2aWNlUXQ6OmNyZWF0ZTsK
KworR2VvbG9jYXRpb25TZXJ2aWNlKiBHZW9sb2NhdGlvblNlcnZpY2VRdDo6Y3JlYXRlKEdlb2xv
Y2F0aW9uU2VydmljZUNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR2VvbG9jYXRp
b25TZXJ2aWNlUXQoY2xpZW50KTsKK30KKworR2VvbG9jYXRpb25TZXJ2aWNlUXQ6Okdlb2xvY2F0
aW9uU2VydmljZVF0KEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCogY2xpZW50KQorICAgIDogR2Vv
bG9jYXRpb25TZXJ2aWNlKGNsaWVudCkKKyAgICAsIG1fbGFzdFBvc2l0aW9uKDApCisgICAgLCBt
X2xhc3RFcnJvcigwKQoreworICAgIG1fbG9jYXRpb24gPSBRR2VvUG9zaXRpb25JbmZvU291cmNl
OjpjcmVhdGVEZWZhdWx0U291cmNlKHRoaXMpOworCisgICAgaWYgKG1fbG9jYXRpb24pCisgICAg
ICAgIGNvbm5lY3QobV9sb2NhdGlvbiwgU0lHTkFMKHBvc2l0aW9uVXBkYXRlZChRR2VvUG9zaXRp
b25JbmZvKSksIHRoaXMsIFNMT1QocG9zaXRpb25VcGRhdGVkKFFHZW9Qb3NpdGlvbkluZm8pKSk7
Cit9CisKK0dlb2xvY2F0aW9uU2VydmljZVF0Ojp+R2VvbG9jYXRpb25TZXJ2aWNlUXQoKQorewor
fQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZVF0Ojpwb3NpdGlvblVwZGF0ZWQoY29uc3QgUUdl
b1Bvc2l0aW9uSW5mbyAmZ2VvUG9zaXRpb24pCit7CisgICAgaWYgKCFnZW9Qb3NpdGlvbi5pc1Zh
bGlkKCkpCisgICAgICAgIGVycm9yT2NjdXJyZWQoKTsKKworICAgIFFHZW9Db29yZGluYXRlIGNv
b3JkID0gZ2VvUG9zaXRpb24uY29vcmRpbmF0ZSgpOworICAgIGRvdWJsZSBsYXRpdHVkZSA9IGNv
b3JkLmxhdGl0dWRlKCk7CisgICAgZG91YmxlIGxvbmdpdHVkZSA9IGNvb3JkLmxvbmdpdHVkZSgp
OworICAgIGJvb2wgcHJvdmlkZXNBbHRpdHVkZSA9IHRydWU7CisgICAgZG91YmxlIGFsdGl0dWRl
ID0gY29vcmQuYWx0aXR1ZGUoKTsKKworICAgIGRvdWJsZSBhY2N1cmFjeSA9IGdlb1Bvc2l0aW9u
Lmhhc0F0dHJpYnV0ZShRR2VvUG9zaXRpb25JbmZvOjpIb3Jpem9udGFsQWNjdXJhY3kpID8KKyAg
ICAgICAgICAgICAgICAgICAgICAgIGdlb1Bvc2l0aW9uLmF0dHJpYnV0ZShRR2VvUG9zaXRpb25J
bmZvOjpIb3Jpem9udGFsQWNjdXJhY3kpIDogMC4wOworCisgICAgYm9vbCBwcm92aWRlc0FsdGl0
dWRlQWNjdXJhY3kgPSBnZW9Qb3NpdGlvbi5oYXNBdHRyaWJ1dGUoUUdlb1Bvc2l0aW9uSW5mbzo6
VmVydGljYWxBY2N1cmFjeSk7CisgICAgZG91YmxlIGFsdGl0dWRlQWNjdXJhY3kgPSBwcm92aWRl
c0FsdGl0dWRlQWNjdXJhY3kgPyBnZW9Qb3NpdGlvbi5hdHRyaWJ1dGUoUUdlb1Bvc2l0aW9uSW5m
bzo6VmVydGljYWxBY2N1cmFjeSkgOiAwLjA7CisKKyAgICBib29sIHByb3ZpZGVzSGVhZGluZyA9
ICBnZW9Qb3NpdGlvbi5oYXNBdHRyaWJ1dGUoUUdlb1Bvc2l0aW9uSW5mbzo6RGlyZWN0aW9uKTsK
KyAgICBkb3VibGUgaGVhZGluZyA9IHByb3ZpZGVzSGVhZGluZyA/IGdlb1Bvc2l0aW9uLmF0dHJp
YnV0ZShRR2VvUG9zaXRpb25JbmZvOjpEaXJlY3Rpb24pIDogMC4wOworCisgICAgYm9vbCBwcm92
aWRlc1NwZWVkID0gZ2VvUG9zaXRpb24uaGFzQXR0cmlidXRlKFFHZW9Qb3NpdGlvbkluZm86Okdy
b3VuZFNwZWVkKTsKKyAgICBkb3VibGUgc3BlZWQgPSBwcm92aWRlc1NwZWVkID8gZ2VvUG9zaXRp
b24uYXR0cmlidXRlKFFHZW9Qb3NpdGlvbkluZm86Okdyb3VuZFNwZWVkKSA6IDAuMDsKKworICAg
IFJlZlB0cjxDb29yZGluYXRlcz4gY29vcmRpbmF0ZXMgPSBDb29yZGluYXRlczo6Y3JlYXRlKGxh
dGl0dWRlLCBsb25naXR1ZGUsIHByb3ZpZGVzQWx0aXR1ZGUsIGFsdGl0dWRlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5
LCBwcm92aWRlc0FsdGl0dWRlQWNjdXJhY3ksIGFsdGl0dWRlQWNjdXJhY3ksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXNI
ZWFkaW5nLCBoZWFkaW5nLCBwcm92aWRlc1NwZWVkLCBzcGVlZCk7CisgICAgbV9sYXN0UG9zaXRp
b24gPSBHZW9wb3NpdGlvbjo6Y3JlYXRlKGNvb3JkaW5hdGVzLnJlbGVhc2UoKSwgZ2VvUG9zaXRp
b24udGltZXN0YW1wKCkudG9UaW1lX3QoKSk7CisgICAgcG9zaXRpb25DaGFuZ2VkKCk7Cit9CisK
K2Jvb2wgR2VvbG9jYXRpb25TZXJ2aWNlUXQ6OnN0YXJ0VXBkYXRpbmcoUG9zaXRpb25PcHRpb25z
KikKK3sKKyAgICBtX2xhc3RQb3NpdGlvbiA9IDA7CisKKyAgICBpZiAoIW1fbG9jYXRpb24pCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRPRE86IGhhbmRsZSBlbmFibGVIaWdoQWNj
dXJhY3koKQorCisgICAgbV9sb2NhdGlvbi0+c3RhcnRVcGRhdGVzKCk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlUXQ6OnN0b3BVcGRhdGluZygpCit7Cisg
ICAgaWYgKG1fbG9jYXRpb24pCisgICAgICAgIG1fbG9jYXRpb24tPnN0b3BVcGRhdGVzKCk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vcXQvR2Vv
bG9jYXRpb25TZXJ2aWNlUXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3F0L0dl
b2xvY2F0aW9uU2VydmljZVF0LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL3F0
L0dlb2xvY2F0aW9uU2VydmljZVF0LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzAgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgR2VvbG9jYXRpb25TZXJ2aWNlUXRfaAorI2RlZmluZSBHZW9sb2NhdGlvblNlcnZp
Y2VRdF9oCisKKyNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZpY2UuaCIKKyNpbmNsdWRlIDxRR2Vv
UG9zaXRpb25JbmZvU291cmNlPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworLy8gRklYTUU6
IFJlbW92ZSB1c2FnZSBvZiAidXNpbmcgbmFtZXNwYWNlIiBpbiBhIGhlYWRlciBmaWxlLgorLy8g
VGhlcmUgaXMgYnVnIGluIHF0TW9iaWxpdHkgc2lnbmFsIG5hbWVzIGFyZSBub3QgZnVsbCBxdWFs
aWZpZWQgd2hlbiB1c2VkIHdpdGggbmFtZXNwYWNlCisvLyBRdE1vYmlsaXR5IG5hbWVzcGFjZSBp
biBzbG90cyB0aHJvd3MgdXAgZXJyb3IgYW5kIGl0cyByZXF1aXJlZCB0byBiZSBmaXhlZCBpbiBx
dG1vYmlsaXR5LgordXNpbmcgbmFtZXNwYWNlIFF0TW9iaWxpdHk7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGltcGxlbWVudGF0aW9uIG9mIGEgR2Vv
bG9jYXRpb25TZXJ2aWNlIGZvciBxdFdlYmtpdC4KKy8vIEl0IHVzZXMgUXRNb2JpbGl0eSAodjEu
MC4wKSBsb2NhdGlvbiBzZXJ2aWNlIHRvIGdldCBwb3NpdGlvbnMKK2NsYXNzIEdlb2xvY2F0aW9u
U2VydmljZVF0IDogcHVibGljIFFPYmplY3QsIEdlb2xvY2F0aW9uU2VydmljZSB7CisgICAgUV9P
QkpFQ1QKKworcHVibGljOgorICAgIHN0YXRpYyBHZW9sb2NhdGlvblNlcnZpY2UqIGNyZWF0ZShH
ZW9sb2NhdGlvblNlcnZpY2VDbGllbnQqKTsKKworICAgIEdlb2xvY2F0aW9uU2VydmljZVF0KEdl
b2xvY2F0aW9uU2VydmljZUNsaWVudCopOworICAgIHZpcnR1YWwgfkdlb2xvY2F0aW9uU2Vydmlj
ZVF0KCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3RhcnRVcGRhdGluZyhQb3NpdGlvbk9wdGlvbnMq
KTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcFVwZGF0aW5nKCk7CisKKyAgICB2aXJ0dWFsIEdlb3Bv
c2l0aW9uKiBsYXN0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX2xhc3RQb3NpdGlvbi5nZXQo
KTsgfQorICAgIHZpcnR1YWwgUG9zaXRpb25FcnJvciogbGFzdEVycm9yKCkgY29uc3QgeyByZXR1
cm4gbV9sYXN0RXJyb3IuZ2V0KCk7IH0KKworcHVibGljIFFfU0xPVFM6CisgICAgLy8gUUdlb1Bv
c2l0aW9uSW5mb1NvdXJjZQorICAgIHZvaWQgcG9zaXRpb25VcGRhdGVkKGNvbnN0IFFHZW9Qb3Np
dGlvbkluZm8mKTsKKworcHJpdmF0ZToKKyAgICBSZWZQdHI8R2VvcG9zaXRpb24+IG1fbGFzdFBv
c2l0aW9uOworICAgIFJlZlB0cjxQb3NpdGlvbkVycm9yPiBtX2xhc3RFcnJvcjsKKworICAgIFF0
TW9iaWxpdHk6OlFHZW9Qb3NpdGlvbkluZm9Tb3VyY2UqIG1fbG9jYXRpb247Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBHZW9sb2NhdGlvblNlcnZpY2VRdF9oCklu
ZGV4OiBXZWJLaXQvcXQvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9DaGFuZ2VM
b2cJKHJldmlzaW9uIDYwOTUxKQorKysgV2ViS2l0L3F0L0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDI4IEBACisyMDEwLTA2LTEwICBNYWhlc2ggS3Vsa2FybmkgIDxtYWhlc2gu
a3Vsa2FybmlAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFtRdF0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uIHN1cHBvcnQgZm9yIHF0IHBv
cnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM5NzI0
CisKKyAgICAgICAgSW1wbGVtZW50IENocm9tZUNsaWVudFF0OjpyZXF1ZXN0R2VvbG9jYXRpb25Q
ZXJtaXNzaW9uRm9yRnJhbWUoKSB3aGljaCBkZWxlZ2F0ZXMgY2FsbCB0byBRV2ViUGFnZTo6YWxs
b3dHZW9sb2NhdGlvblJlcXVlc3QKKyAgICAgICAgTGF5b3V0IGFuZCB1bml0IHRlc3QgY2FzZXMg
Zm9yIHRoZSBhcmUgYWxzbyBhZGRlZC4gCisKKyAgICAgICAgKiBBcGkvcXdlYnBhZ2UuY3BwOgor
ICAgICAgICAoUVdlYlBhZ2U6OmFsbG93R2VvbG9jYXRpb25SZXF1ZXN0KToKKyAgICAgICAgKiBB
cGkvcXdlYnBhZ2UuaDoKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpDaHJvbWVDbGllbnRRdDo6cmVxdWVzdEdlb2xvY2F0aW9u
UGVybWlzc2lvbkZvckZyYW1lKToKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVy
VHJlZVN1cHBvcnRRdC5jcHA6CisgICAgICAgIChEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDo6c2V0
TW9ja0dlb2xvY2F0aW9uUG9zaXRpb24pOgorICAgICAgICAoRHVtcFJlbmRlclRyZWVTdXBwb3J0
UXQ6OnNldE1vY2tHZW9sb2NhdGlvbkVycm9yKToKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9E
dW1wUmVuZGVyVHJlZVN1cHBvcnRRdC5oOgorICAgICAgICAqIHRlc3RzL3F3ZWJwYWdlL3RzdF9x
d2VicGFnZS5jcHA6CisgICAgICAgIChKU1Rlc3RQYWdlOjpzaG91bGRJbnRlcnJ1cHRKYXZhU2Ny
aXB0KToKKyAgICAgICAgKEpTVGVzdFBhZ2U6OmFsbG93R2VvbG9jYXRpb25SZXF1ZXN0KToKKyAg
ICAgICAgKEpTVGVzdFBhZ2U6OnNldEdlb2xvY2F0aW9uUGVybWlzc2lvbik6CisgICAgICAgICh0
c3RfUVdlYlBhZ2U6Omdlb2xvY2F0aW9uUmVxdWVzdEpTKToKKwogMjAxMC0wNi0xMCAgRXJpYyBT
ZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBCYXJ0
aC4KSW5kZXg6IFdlYktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9xdC9BcGkvcXdlYnBhZ2UuY3BwCShyZXZpc2lvbiA2MDk1MSkKKysrIFdlYktpdC9xdC9BcGkv
cXdlYnBhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xOTMzLDYgKzE5MzMsMzAgQEAgYm9vbCBR
V2ViUGFnZTo6c2hvdWxkSW50ZXJydXB0SmF2YVNjcmlwdAogfQogCiAvKiEKKyAgICBcZm4gYm9v
bCBRV2ViUGFnZTo6YWxsb3dHZW9sb2NhdGlvblJlcXVlc3QoKQorICAgIFxzaW5jZSA0LjcKKwor
ICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgSmF2YVNjcmlwdCBwcm9ncmFt
IHJ1bm5pbmcgaW5zaWRlIFxhIGZyYW1lIHRyaWVzIHRvIGFjY2VzcyB1c2VyIGxvY2F0aW9uIHRo
cm91Z2ggbmF2aWdhdG9yLmdlb2xvY2F0aW9uLgorCisgICAgSWYgdGhlIHVzZXIgd2FudHMgdG8g
YWxsb3cgYWNjZXNzIHRvIGxvY2F0aW9uIHRoZW4gaXQgc2hvdWxkIHJldHVybiB0cnVlOyBvdGhl
cndpc2UgZmFsc2UuCisKKyAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBleGVjdXRlcyB0
aGUgcXVlcnkgdXNpbmcgUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uIHdpdGggUU1lc3NhZ2VCb3g6
OlllcyBhbmQgUU1lc3NhZ2VCb3g6Ok5vIGJ1dHRvbnMuCisKKyAgICBcd2FybmluZyBCZWNhdXNl
IG9mIGJpbmFyeSBjb21wYXRpYmlsaXR5IGNvbnN0cmFpbnRzLCB0aGlzIGZ1bmN0aW9uIGlzIG5v
dCB2aXJ0dWFsLiBJZiB5b3Ugd2FudCB0bworICAgIHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50
YXRpb24gaW4gYSBRV2ViUGFnZSBzdWJjbGFzcywgcmVpbXBsZW1lbnQgdGhlIGFsbG93R2VvbG9j
YXRpb25SZXF1ZXN0KCkKKyAgICBzbG90IGluIHlvdXIgc3ViY2xhc3MgaW5zdGVhZC4gUXRXZWJL
aXQgd2lsbCBkeW5hbWljYWxseSBkZXRlY3QgdGhlIHNsb3QgYW5kIGNhbGwgaXQuCisqLworYm9v
bCBRV2ViUGFnZTo6YWxsb3dHZW9sb2NhdGlvblJlcXVlc3QoUVdlYkZyYW1lICpmcmFtZSkKK3sK
KyNpZmRlZiBRVF9OT19NRVNTQUdFQk9YCisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICBR
V2lkZ2V0KiBwYXJlbnQgPSAoZC0+Y2xpZW50KSA/IGQtPmNsaWVudC0+b3duZXJXaWRnZXQoKSA6
IDA7CisgICAgcmV0dXJuIFFNZXNzYWdlQm94OjpZZXMgPT0gUU1lc3NhZ2VCb3g6OmluZm9ybWF0
aW9uKHBhcmVudCwgdHIoIkxvY2F0aW9uIFJlcXVlc3QgYnktICUxIikuYXJnKGZyYW1lLT51cmwo
KS5ob3N0KCkpLCB0cigiVGhlIHBhZ2Ugd2FudHMgdG8gYWNjZXNzIHlvdXIgbG9jYXRpb24gaW5m
b3JtYXRpb24uIERvIHlvdSB3YW50IHRvIGFsbG93IHRoZSByZXF1ZXN0PyIpLCBRTWVzc2FnZUJv
eDo6WWVzLCBRTWVzc2FnZUJveDo6Tm8pOworI2VuZGlmCit9CisKKy8qIQogICAgIFRoaXMgZnVu
Y3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIFdlYktpdCB3YW50cyB0byBjcmVhdGUgYSBuZXcgd2lu
ZG93IG9mIHRoZSBnaXZlbiBcYSB0eXBlLCBmb3IKICAgICBleGFtcGxlIHdoZW4gYSBKYXZhU2Ny
aXB0IHByb2dyYW0gcmVxdWVzdHMgdG8gb3BlbiBhIGRvY3VtZW50IGluIGEgbmV3IHdpbmRvdy4K
IApJbmRleDogV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9x
dC9BcGkvcXdlYnBhZ2UuaAkocmV2aXNpb24gNjA5NTEpCisrKyBXZWJLaXQvcXQvQXBpL3F3ZWJw
YWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMwNyw2ICszMDcsNyBAQCBwdWJsaWM6CiAKIHB1Ymxp
YyBRX1NMT1RTOgogICAgIGJvb2wgc2hvdWxkSW50ZXJydXB0SmF2YVNjcmlwdCgpOworICAgIGJv
b2wgYWxsb3dHZW9sb2NhdGlvblJlcXVlc3QoUVdlYkZyYW1lICpmcmFtZSk7CiAKIFFfU0lHTkFM
UzoKICAgICB2b2lkIGxvYWRTdGFydGVkKCk7CkluZGV4OiBXZWJLaXQvcXQvV2ViQ29yZVN1cHBv
cnQvQ2hyb21lQ2xpZW50UXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3Vw
cG9ydC9DaHJvbWVDbGllbnRRdC5jcHAJKHJldmlzaW9uIDYwOTUxKQorKysgV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYsNiAr
MzYsNyBAQAogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCiAjaW5jbHVkZSAiRnJhbWVMb2FkZXJD
bGllbnRRdC5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdlb2xvY2F0aW9u
LmgiCiAjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgogI2luY2x1ZGUgIkljb24uaCIKICNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgpAQCAtNTM0LDEwICs1MzUsMTIgQEAgYm9vbCBDaHJvbWVD
bGllbnRRdDo6c2V0Q3Vyc29yKFBsYXRmb3JtQwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9p
ZCBDaHJvbWVDbGllbnRRdDo6cmVxdWVzdEdlb2xvY2F0aW9uUGVybWlzc2lvbkZvckZyYW1lKEZy
YW1lKiwgR2VvbG9jYXRpb24qKQordm9pZCBDaHJvbWVDbGllbnRRdDo6cmVxdWVzdEdlb2xvY2F0
aW9uUGVybWlzc2lvbkZvckZyYW1lKEZyYW1lKiBmcmFtZSwgR2VvbG9jYXRpb24qIGdlb2xvY2F0
aW9uKQogewotICAgIC8vIFNlZSB0aGUgY29tbWVudCBpbiBXZWJDb3JlL3BhZ2UvQ2hyb21lQ2xp
ZW50LmgKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIGJvb2wgYWxsb3cgPSBmYWxzZTsKKyAg
ICBRV2ViRnJhbWUqIHdlYkZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKTsKKyAg
ICBRTWV0YU9iamVjdDo6aW52b2tlTWV0aG9kKG1fd2ViUGFnZSwgImFsbG93R2VvbG9jYXRpb25S
ZXF1ZXN0IiwgUXQ6OkRpcmVjdENvbm5lY3Rpb24sIFFfUkVUVVJOX0FSRyhib29sLCBhbGxvdyks
IFFfQVJHKFFXZWJGcmFtZSosIHdlYkZyYW1lKSk7CisgICAgZ2VvbG9jYXRpb24tPnNldElzQWxs
b3dlZChhbGxvdyk7CiB9CiAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4
OiBXZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBv
cnRRdC5jcHAJKHJldmlzaW9uIDYwOTUxKQorKysgV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0R1
bXBSZW5kZXJUcmVlU3VwcG9ydFF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzUsMTIgKzM1LDE2
IEBACiAjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRRdC5oIgogI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgogI2luY2x1ZGUgIkdDQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uLmgi
CisjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlTW9jay5oIgorI2luY2x1ZGUgIkdlb3Bvc2l0
aW9uLmgiCiAjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgogI2luY2x1ZGUgIkluc3BlY3Rv
ckNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJOb3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnRRdC5o
IgogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJQYWdlR3JvdXAuaCIKICNpbmNsdWRlICJQ
bHVnaW5EYXRhYmFzZS5oIgorI2luY2x1ZGUgIlBvc2l0aW9uRXJyb3IuaCIKICNpbmNsdWRlICJQ
cmludENvbnRleHQuaCIKICNpbmNsdWRlICJSZW5kZXJMaXN0SXRlbS5oIgogI2luY2x1ZGUgIlJl
bmRlclRyZWVBc1RleHQuaCIKQEAgLTUxLDYgKzU1LDcgQEAKICNlbmRpZgogI2luY2x1ZGUgIlRl
eHRJdGVyYXRvci5oIgogI2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgorI2luY2x1ZGUgPHd0Zi9D
dXJyZW50VGltZS5oPgogCiAjaW5jbHVkZSAicXdlYmVsZW1lbnQuaCIKICNpbmNsdWRlICJxd2Vi
ZnJhbWUuaCIKQEAgLTU1NSw2ICs1NjAsMjIgQEAgdm9pZCBEdW1wUmVuZGVyVHJlZVN1cHBvcnRR
dDo6YWxsb3dOb3RpZgogI2VuZGlmCiB9CiAKK3ZvaWQgRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ6
OnNldE1vY2tHZW9sb2NhdGlvblBvc2l0aW9uKGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdp
dHVkZSwgZG91YmxlIGFjY3VyYWN5KQoreworI2lmIEVOQUJMRShHRU9MT0NBVElPTikKKyAgICBS
ZWZQdHI8R2VvcG9zaXRpb24+IGdlb3Bvc2l0aW9uID0gR2VvcG9zaXRpb246OmNyZWF0ZShDb29y
ZGluYXRlczo6Y3JlYXRlKGxhdGl0dWRlLCBsb25naXR1ZGUsIGZhbHNlLCAwLCBhY2N1cmFjeSwg
dHJ1ZSwgMCwgZmFsc2UsIDAsIGZhbHNlLCAwKSwgY3VycmVudFRpbWUoKSAqIDEwMDAuMCk7Cisg
ICAgR2VvbG9jYXRpb25TZXJ2aWNlTW9jazo6c2V0UG9zaXRpb24oZ2VvcG9zaXRpb24pOworI2Vu
ZGlmCit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ6OnNldE1vY2tHZW9sb2NhdGlv
bkVycm9yKGludCBlcnJvckNvZGUsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpCit7CisjaWYgRU5B
QkxFKEdFT0xPQ0FUSU9OKQorICAgIFJlZlB0cjxQb3NpdGlvbkVycm9yPiBwb3NpdGlvbkVycm9y
ID0gUG9zaXRpb25FcnJvcjo6Y3JlYXRlKHN0YXRpY19jYXN0PFBvc2l0aW9uRXJyb3I6OkVycm9y
Q29kZT4oZXJyb3JDb2RlKSwgbWVzc2FnZSk7CisgICAgR2VvbG9jYXRpb25TZXJ2aWNlTW9jazo6
c2V0RXJyb3IocG9zaXRpb25FcnJvcik7CisjZW5kaWYKK30KKwogdm9pZCBEdW1wUmVuZGVyVHJl
ZVN1cHBvcnRRdDo6c2V0Q2hlY2tQZXJtaXNzaW9uRnVuY3Rpb24oQ2hlY2tQZXJtaXNzaW9uRnVu
Y3Rpb25UeXBlKiBmKQogewogICAgIGNoZWNrUGVybWlzc2lvbkZ1bmN0aW9uID0gZjsKSW5kZXg6
IFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRRdC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRR
dC5oCShyZXZpc2lvbiA2MDk1MSkKKysrIFdlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EdW1wUmVu
ZGVyVHJlZVN1cHBvcnRRdC5oCSh3b3JraW5nIGNvcHkpCkBAIC05Niw2ICs5Niw5IEBAIHB1Ymxp
YzoKICAgICBzdGF0aWMgdm9pZCByZW1vdmVXaGl0ZUxpc3RBY2Nlc3NGcm9tT3JpZ2luKGNvbnN0
IFFTdHJpbmcmIHNvdXJjZU9yaWdpbiwgY29uc3QgUVN0cmluZyYgZGVzdGluYXRpb25Qcm90b2Nv
bCwgY29uc3QgUVN0cmluZyYgZGVzdGluYXRpb25Ib3N0LCBib29sIGFsbG93RGVzdGluYXRpb25T
dWJkb21haW5zKTsKICAgICBzdGF0aWMgdm9pZCByZXNldE9yaWdpbkFjY2Vzc1doaXRlTGlzdHMo
KTsKIAorICAgIHN0YXRpYyB2b2lkIHNldE1vY2tHZW9sb2NhdGlvblBvc2l0aW9uKGRvdWJsZSBs
YXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwgZG91YmxlIGFjY3VyYWN5KTsKKyAgICBzdGF0aWMg
dm9pZCBzZXRNb2NrR2VvbG9jYXRpb25FcnJvcihpbnQgZXJyb3JDb2RlLCBjb25zdCBRU3RyaW5n
JiBtZXNzYWdlKTsKKwogICAgIHN0YXRpYyBpbnQgd29ya2VyVGhyZWFkQ291bnQoKTsKIAogICAg
IHN0YXRpYyBRU3RyaW5nIG1hcmtlclRleHRGb3JMaXN0SXRlbShjb25zdCBRV2ViRWxlbWVudCYg
bGlzdEl0ZW0pOwpJbmRleDogV2ViS2l0L3F0L3Rlc3RzL3F3ZWJwYWdlL3RzdF9xd2VicGFnZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L3F0L3Rlc3RzL3F3ZWJwYWdlL3RzdF9xd2VicGFnZS5j
cHAJKHJldmlzaW9uIDYwOTUxKQorKysgV2ViS2l0L3F0L3Rlc3RzL3F3ZWJwYWdlL3RzdF9xd2Vi
cGFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc3LDYgKzc3LDcgQEAgcHJpdmF0ZSBzbG90czoK
IAogICAgIHZvaWQgYWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoKTsKICAgICB2b2lkIGluZmluaXRl
TG9vcEpTKCk7CisgICAgdm9pZCBnZW9sb2NhdGlvblJlcXVlc3RKUygpOwogICAgIHZvaWQgbG9h
ZEZpbmlzaGVkKCk7CiAgICAgdm9pZCBhY2NlcHROYXZpZ2F0aW9uUmVxdWVzdFdpdGhOZXdXaW5k
b3coKTsKICAgICB2b2lkIHVzZXJTdHlsZVNoZWV0KCk7CkBAIC0yMTQsOCArMjE1LDIxIEBAIHB1
YmxpYzoKIAogcHVibGljIHNsb3RzOgogICAgIGJvb2wgc2hvdWxkSW50ZXJydXB0SmF2YVNjcmlw
dCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7IAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgYm9vbCBhbGxvd0dlb2xvY2F0aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lKSAKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX2FsbG93R2VvbG9jYXRpb247CisgICAgfQorCitwdWJsaWM6
CisgICAgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbCBhbGxvdykgCisgICAgewor
ICAgICAgICBtX2FsbG93R2VvbG9jYXRpb24gPSBhbGxvdzsKICAgICB9CisKK3ByaXZhdGU6IAor
ICAgIGJvb2wgbV9hbGxvd0dlb2xvY2F0aW9uOwogfTsKIAogdm9pZCB0c3RfUVdlYlBhZ2U6Omlu
ZmluaXRlTG9vcEpTKCkKQEAgLTIyNiw2ICsyNDAsMjggQEAgdm9pZCB0c3RfUVdlYlBhZ2U6Omlu
ZmluaXRlTG9vcEpTKCkKICAgICBtX3ZpZXctPnBhZ2UoKS0+bWFpbkZyYW1lKCktPmV2YWx1YXRl
SmF2YVNjcmlwdCgidmFyIHJ1biA9IHRydWU7dmFyIGEgPSAxO3doaWxlKHJ1bil7YSsrO30iKTsK
IH0KIAordm9pZCB0c3RfUVdlYlBhZ2U6Omdlb2xvY2F0aW9uUmVxdWVzdEpTKCkKK3sKKyAgICBK
U1Rlc3RQYWdlKiBuZXdQYWdlID0gbmV3IEpTVGVzdFBhZ2UobV92aWV3KTsKKyAgICBuZXdQYWdl
LT5zZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oZmFsc2UpOworICAgIG1fdmlldy0+c2V0UGFnZShu
ZXdQYWdlKTsKKyAgICBtX3ZpZXctPnNldEh0bWwoUVN0cmluZygiPGh0bWw+PGJvZHk+dGVzdDwv
Ym9keT48L2h0bWw+IiksIFFVcmwoKSk7CisgICAgbV92aWV3LT5wYWdlKCktPm1haW5GcmFtZSgp
LT5ldmFsdWF0ZUphdmFTY3JpcHQoInZhciBlcnJvckNvZGUgPSAwOyBmdW5jdGlvbiBlcnJvcihl
cnIpIHsgZXJyb3JDb2RlID0gZXJyLmNvZGU7IH0gZnVuY3Rpb24gc3VjY2Vzcyhwb3MpIHsgfSBu
YXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHN1Y2Nlc3MsIGVycm9yKSIp
OworICAgIFFUZXN0OjpxV2FpdCgyMDAwKTsKKyAgICBRVmFyaWFudCBlbXB0eSA9IG1fdmlldy0+
cGFnZSgpLT5tYWluRnJhbWUoKS0+ZXZhbHVhdGVKYXZhU2NyaXB0KCJlcnJvckNvZGUiKTsKKwor
ICAgIFFWRVJJRlkoZW1wdHkudHlwZSgpID09IFFWYXJpYW50OjpEb3VibGUgJiYgZW1wdHkudG9J
bnQoKSAhPSAwKTsKKworICAgIG5ld1BhZ2UtPnNldEdlb2xvY2F0aW9uUGVybWlzc2lvbih0cnVl
KTsKKyAgICBtX3ZpZXctPnBhZ2UoKS0+bWFpbkZyYW1lKCktPmV2YWx1YXRlSmF2YVNjcmlwdCgi
ZXJyb3JDb2RlID0gMDsgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihz
dWNjZXNzLCBlcnJvcik7Iik7CisgICAgZW1wdHkgPSBtX3ZpZXctPnBhZ2UoKS0+bWFpbkZyYW1l
KCktPmV2YWx1YXRlSmF2YVNjcmlwdCgiZXJyb3JDb2RlIik7CisKKyAgICAvL2h0dHA6Ly9kZXYu
dzMub3JnL2dlby9hcGkvc3BlYy1zb3VyY2UuaHRtbCNwb3NpdGlvbgorICAgIC8vUG9zaXRpb25F
cnJvcjogY29uc3QgdW5zaWduZWQgc2hvcnQgUEVSTUlTU0lPTl9ERU5JRUQgPSAxOworICAgIFFW
RVJJRlkoZW1wdHkudHlwZSgpID09IFFWYXJpYW50OjpEb3VibGUgJiYgZW1wdHkudG9JbnQoKSAh
PSAxKTsKKyAgICBkZWxldGUgbmV3UGFnZTsKK30KKwogdm9pZCB0c3RfUVdlYlBhZ2U6OmxvYWRG
aW5pc2hlZCgpCiB7CiAgICAgcVJlZ2lzdGVyTWV0YVR5cGU8UVdlYkZyYW1lKj4oIlFXZWJGcmFt
ZSoiKTsKSW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRU
b29scy9DaGFuZ2VMb2cJKHJldmlzaW9uIDYwOTUxKQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9n
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMDYtMTAgIE1haGVzaCBLdWxr
YXJuaSAgPG1haGVzaC5rdWxrYXJuaUBub2tpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW1F0XSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24gc3Vw
cG9ydCBmb3IgcXQgcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9Mzk3MjQKKworICAgICAgICBJbXBsZW1lbnRhdGlvbiBmb3IgZ2VvbG9jYXRpb24g
Y2FzZXMgdG8gRHVtcFJlbmRlclRyZWVRdAorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvcXQv
RHVtcFJlbmRlclRyZWVRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJQYWdlOjphbGxvd0dl
b2xvY2F0aW9uUmVxdWVzdCk6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRl
clRyZWVRdC5oOgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL3F0L0xheW91dFRlc3RDb250cm9s
bGVyUXQuY3BwOgorICAgICAgICAoTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEdlb2xvY2F0aW9u
UGVybWlzc2lvbik6CisgICAgICAgIChMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0TW9ja0dlb2xv
Y2F0aW9uRXJyb3IpOgorICAgICAgICAoTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldE1vY2tHZW9s
b2NhdGlvblBvc2l0aW9uKToKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9xdC9MYXlvdXRUZXN0
Q29udHJvbGxlclF0Lmg6CisgICAgICAgIChMYXlvdXRUZXN0Q29udHJvbGxlcjo6aXNHZW9sb2Nh
dGlvblBlcm1pc3Npb25TZXQpOgorICAgICAgICAoTGF5b3V0VGVzdENvbnRyb2xsZXI6Omdlb2xv
Y2F0aW9uUGVybWlzc2lvbik6CisKIDIwMTAtMDYtMDkgIEFkYW0gQmFydGggIDxhYmFydGhAd2Vi
a2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBPamFuIFZhZmFpLgpJbmRleDogV2ViS2l0
VG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWVRdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWVRdC5jcHAJKHJl
dmlzaW9uIDYwOTUxKQorKysgV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRl
clRyZWVRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0OCw2ICszNDgsMTEgQEAgUU9iamVjdCog
V2ViUGFnZTo6Y3JlYXRlUGx1Z2luKGNvbnN0IFFTdAogI2VuZGlmCiB9CiAKK2Jvb2wgV2ViUGFn
ZTo6YWxsb3dHZW9sb2NhdGlvblJlcXVlc3QoUVdlYkZyYW1lICopCit7CisgICAgcmV0dXJuIG1f
ZHJ0LT5sYXlvdXRUZXN0Q29udHJvbGxlcigpLT5nZW9sb2NhdGlvblBlcm1pc3Npb24oKTsKK30K
KwogV2ViVmlld0dyYXBoaWNzQmFzZWQ6OldlYlZpZXdHcmFwaGljc0Jhc2VkKFFXaWRnZXQqIHBh
cmVudCkKICAgICA6IG1faXRlbShuZXcgUUdyYXBoaWNzV2ViVmlldykKIHsKSW5kZXg6IFdlYktp
dFRvb2xzL0R1bXBSZW5kZXJUcmVlL3F0L0R1bXBSZW5kZXJUcmVlUXQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9xdC9EdW1wUmVuZGVyVHJlZVF0LmgJKHJldmlz
aW9uIDYwOTUxKQorKysgV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRy
ZWVRdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTEsNiArMTkxLDcgQEAgcHVibGljOgogCiBwdWJs
aWMgc2xvdHM6CiAgICAgYm9vbCBzaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0KCkgeyByZXR1cm4g
ZmFsc2U7IH0KKyAgICBib29sIGFsbG93R2VvbG9jYXRpb25SZXF1ZXN0KFFXZWJGcmFtZSAqZnJh
bWUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBhY2NlcHROYXZpZ2F0aW9uUmVxdWVzdChRV2Vi
RnJhbWUqIGZyYW1lLCBjb25zdCBRTmV0d29ya1JlcXVlc3QmIHJlcXVlc3QsIE5hdmlnYXRpb25U
eXBlIHR5cGUpOwpJbmRleDogV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvTGF5b3V0VGVz
dENvbnRyb2xsZXJRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRy
ZWUvcXQvTGF5b3V0VGVzdENvbnRyb2xsZXJRdC5jcHAJKHJldmlzaW9uIDYwOTUxKQorKysgV2Vi
S2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvTGF5b3V0VGVzdENvbnRyb2xsZXJRdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTY0NSw1ICs2NDUsMjEgQEAgdm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6c2V0RWRpdGluZ0JlaAogICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydFF0OjpzZXRFZGl0aW5n
QmVoYXZpb3IobV9kcnQtPndlYlBhZ2UoKSwgZWRpdGluZ0JlaGF2aW9yKTsKIH0KIAordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2wgYWxsb3cp
Cit7CisgICAgIG1faXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSB0cnVlOworICAgICBtX2dl
b2xvY2F0aW9uUGVybWlzc2lvbiA9IGFsbG93OworfQorCit2b2lkIExheW91dFRlc3RDb250cm9s
bGVyOjpzZXRNb2NrR2VvbG9jYXRpb25FcnJvcihpbnQgY29kZSwgY29uc3QgUVN0cmluZyYgbWVz
c2FnZSkKK3sKKyAgICBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDo6c2V0TW9ja0dlb2xvY2F0aW9u
RXJyb3IoY29kZSwgbWVzc2FnZSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNl
dE1vY2tHZW9sb2NhdGlvblBvc2l0aW9uKGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVk
ZSwgZG91YmxlIGFjY3VyYWN5KQoreworICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydFF0OjpzZXRN
b2NrR2VvbG9jYXRpb25Qb3NpdGlvbihsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhY2N1cmFjeSk7Cit9
CisKIGNvbnN0IHVuc2lnbmVkIExheW91dFRlc3RDb250cm9sbGVyOjptYXhWaWV3V2lkdGggPSA4
MDA7CiBjb25zdCB1bnNpZ25lZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bWF4Vmlld0hlaWdodCA9
IDYwMDsKSW5kZXg6IFdlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL3F0L0xheW91dFRlc3RDb250
cm9sbGVyUXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9xdC9M
YXlvdXRUZXN0Q29udHJvbGxlclF0LmgJKHJldmlzaW9uIDYwOTUxKQorKysgV2ViS2l0VG9vbHMv
RHVtcFJlbmRlclRyZWUvcXQvTGF5b3V0VGVzdENvbnRyb2xsZXJRdC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0xODEsNiArMTgxLDEyIEBAIHB1YmxpYyBzbG90czoKICAgICBpbnQgbnVtYmVyT2ZQYWdl
cyhmbG9hdCB3aWR0aCA9IG1heFZpZXdXaWR0aCwgZmxvYXQgaGVpZ2h0ID0gbWF4Vmlld0hlaWdo
dCk7CiAgICAgYm9vbCBjYWxsU2hvdWxkQ2xvc2VPbldlYlZpZXcoKTsKIAorICAgIHZvaWQgc2V0
TW9ja0dlb2xvY2F0aW9uRXJyb3IoaW50IGNvZGUsIGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UpOwor
ICAgIHZvaWQgc2V0TW9ja0dlb2xvY2F0aW9uUG9zaXRpb24oZG91YmxlIGxhdGl0dWRlLCBkb3Vi
bGUgbG9uZ2l0dWRlLCBkb3VibGUgYWNjdXJhY3kpOworICAgIHZvaWQgc2V0R2VvbG9jYXRpb25Q
ZXJtaXNzaW9uKGJvb2wgYWxsb3cpOworICAgIGJvb2wgaXNHZW9sb2NhdGlvblBlcm1pc3Npb25T
ZXQoKSBjb25zdCB7IHJldHVybiBtX2lzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OyB9CisgICAg
Ym9vbCBnZW9sb2NhdGlvblBlcm1pc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2dlb2xvY2F0aW9u
UGVybWlzc2lvbjsgfQorCiAgICAgLyoKICAgICAgICAgUG9saWN5IHZhbHVlczogJ29uJywgJ2F1
dG8nIG9yICdvZmYnLgogICAgICAgICBPcmllbnRhdGlvbiB2YWx1ZXM6ICd2ZXJ0aWNhbCcgb3Ig
J2hvcml6b250YWwnLgpAQCAtMjEyLDYgKzIxOCw4IEBAIHByaXZhdGU6CiAgICAgYm9vbCBtX2hh
bmRsZUVycm9yUGFnZXM7CiAgICAgYm9vbCBtX2xvYWRGaW5pc2hlZDsKICAgICBib29sIG1fZ2xv
YmFsRmxhZzsKKyAgICBib29sIG1faXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQ7CisgICAgYm9v
bCBtX2dlb2xvY2F0aW9uUGVybWlzc2lvbjsKIAogICAgIFFVcmwgbV91c2VyU3R5bGVTaGVldExv
Y2F0aW9uOwogICAgIFFCYXNpY1RpbWVyIG1fdGltZW91dFRpbWVyOwpJbmRleDogTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNp
b24gNjA5NTEpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxNCBAQAorMjAxMC0wNi0xMCAgTWFoZXNoIEt1bGthcm5pICA8bWFoZXNoLmt1bGthcm5p
QG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBbUXRdIG5hdmlnYXRvci5nZW9sb2NhdGlvbiBzdXBwb3J0IGZvciBxdCBwb3J0CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zOTcyNAorCisgICAg
ICAgIHVuY29tbWVudGluZyBnZWxvY2F0aW9uIGNhc2VzIGZyb20gcXQuIFNraXBwZWQgb25lIGNh
c2U6IGZhc3QvZG9tL0dlb2xvY2F0aW9uL2NhbGxiYWNrLXRvLXJlbW90ZS1jb250ZXh0Mi5odG1s
CisKKyAgICAgICAgKiBwbGF0Zm9ybS9xdC9Ta2lwcGVkOgorCiAyMDEwLTA2LTEwICBBZGFtIEJh
cnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlk
ZWwuCkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9xdC9Ta2lwcGVkCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL3BsYXRmb3JtL3F0L1NraXBwZWQJKHJldmlzaW9uIDYwOTUxKQorKysgTGF5
b3V0VGVzdHMvcGxhdGZvcm0vcXQvU2tpcHBlZAkod29ya2luZyBjb3B5KQpAQCAtNzksOSArNzks
NiBAQCBzdmcvd2ViYXJjaGl2ZQogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIwogIyAgICAgICBGZWF0
dXJlIG5vdCBzdXBwb3J0ZWQuLi4geWV0CiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAjCi0jIC0tLS0t
IFRoaXMgcG9ydCBkb2Vzbid0IHN1cHBvcnQgR2VvbG9jYXRpb24uLiB5ZXQKLWZhc3QvZG9tL0dl
b2xvY2F0aW9uCi1mYXN0L2RvbS9XaW5kb3cvd2luZG93LXByb3BlcnRpZXMtZ2VvbG9jYXRpb24u
aHRtbAogCiAjIFRoaXMgcG9ydCBkb2Vzbid0IHN1cHBvcnQgRGV2aWNlT3JpZW50YXRpb24uCiBm
YXN0L2RvbS9EZXZpY2VPcmllbnRhdGlvbgpAQCAtNTQ0NSw3ICs1NDQyLDcgQEAgc3ZnL1czQy1T
VkctMS4xL2ZpbHRlcnMtbGlnaHQtMDQtZi5zdmcKICMgPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIwog
CiAjIG5ldyBza2lwcGVkIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBmaXhlZC9pbnZlc3RpZ2F0ZWQK
LQorZmFzdC9kb20vR2VvbG9jYXRpb24vY2FsbGJhY2stdG8tcmVtb3RlLWNvbnRleHQyLmh0bWwg
CiAjIGV4cGVjdHMgYSBwbGFpbnRleHQgcmVzdWx0IGJ1dCBwcm9kdWNlcyBhIHJlbmRlcnRyZWUK
IHBsYXRmb3JtL3F0L2Zhc3QvZXZlbnRzL2V2ZW50LXNlbmRlci1rZXlkb3duLWZyYW1lLmh0bWwK
IAo=
</data>
<flag name="review"
          id="43430"
          type_id="1"
          status="+"
          setter="laszlo.gombos"
    />
          </attachment>
      

    </bug>

</bugzilla>