<?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>23721</bug_id>
          
          <creation_ts>2009-02-03 17:27:16 -0800</creation_ts>
          <short_desc>Changing dropdown&apos;s selectedIndex within onchange handler fires another onchange</short_desc>
          <delta_ts>2022-07-22 11:51:11 -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>Forms</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>http://chatbotgame.com/?cmd=chat_s</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>HasReduction</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="jasneet">jasneet</reporter>
          <assigned_to name="David Levin">levin</assigned_to>
          <cc>adele</cc>
    
    <cc>ap</cc>
    
    <cc>jasneet</cc>
    
    <cc>root</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>108216</commentid>
    <comment_count>0</comment_count>
    <who name="jasneet">jasneet</who>
    <bug_when>2009-02-03 17:27:16 -0800</bug_when>
    <thetext>I Steps:
Go to http://chatbotgame.com/?cmd=chat_s

II Issue:
What happens on this site, is if you answer cancel in the confirmation dialog, and then blur the dropdown (say by scrolling the page), it will submit the form.

&lt;select name=&quot;filter&quot; onchange=&quot;if (this.selectedIndex == 0 || confirm(&apos;Turn safe spy off?  If you 
are younger than 18, click Cancel.&apos;) ) document.safeSpyForm.submit(); else this.selectedIndex = 
0;&quot;&gt;
       &lt;option value=&quot;on&quot; selected=&quot;selected&quot;&gt;I&apos;m 13+&lt;/option&gt;      
       &lt;option value=&quot;off&quot; &gt;I&apos;m 18+&lt;/option&gt;      
    &lt;/select&gt; 

The problem is in Chromium + Safari, if you change the selectedIndex from within the onchange handler (notably while it still has focus), then once you blur if the index has changed it fires another onchange event.

III Other Browsers:
IE7: ok
FF3: ok

IV Nightly tested: 40471

Bug in Chromium : http://code.google.com/p/chromium/issues/detail?id=4251</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>108217</commentid>
    <comment_count>1</comment_count>
      <attachid>27303</attachid>
    <who name="jasneet">jasneet</who>
    <bug_when>2009-02-03 17:27:33 -0800</bug_when>
    <thetext>Created attachment 27303
testcase</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115992</commentid>
    <comment_count>2</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-03-31 00:17:12 -0700</bug_when>
    <thetext>The bug title is somewhat misleading - onchange if fired when deselecting the SELECT, not when changing it programmatically. Further investigation is needed to find out what exactly goes wrong here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124609</commentid>
    <comment_count>3</comment_count>
    <who name="John Gregg">johnnyg</who>
    <bug_when>2009-06-05 19:31:52 -0700</bug_when>
    <thetext>Did some investigating: the problem will occur whenever selectedIndex is changed by script while the select element is in focus.  when the focus leaves, the onchange event fires.  this doesn&apos;t happen on IE or Firefox.  it&apos;s not limited to within an onchange: script in onfocus, onkeypress, or a timer will cause the same inconsistency.

test and patch on the way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>124611</commentid>
    <comment_count>4</comment_count>
      <attachid>31025</attachid>
    <who name="John Gregg">johnnyg</who>
    <bug_when>2009-06-05 19:38:47 -0700</bug_when>
    <thetext>Created attachment 31025
patch &amp; test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127813</commentid>
    <comment_count>5</comment_count>
      <attachid>31025</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-06-23 22:39:40 -0700</bug_when>
    <thetext>Comment on attachment 31025
patch &amp; test

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 44476)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,34 @@
&gt; +2009-06-05  John Gregg  &lt;johnnyg@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Fix for bug 23721: onchange events fire when a SELECT element has
&gt; +        focus and the selectedIndex is updated by script in some way--either
&gt; +        during another onchange, onkeypress, onfocus, or timer--and then
&gt; +        focus is lost. 

It is good to add the URL for the bug and the title in the changelogs.

&gt; +
&gt; +        Fixed by making a separate method for user-driven selectedIndex 
&gt; +        changes, leaving scripts to use one which doesn&apos;t cause onchange to
&gt; +        be queued.
&gt; +        
&gt; +        Test: fast/forms/select-script-onchange.html
&gt; +
&gt; +        * dom/SelectElement.cpp: check if the pending change is user driven
&gt; +        before calling onchange
&gt; +        (WebCore::SelectElement::menuListOnChange):
&gt; +        (WebCore::SelectElement::setSelectedIndex):
&gt; +        * dom/SelectElement.h: store whether the pending change is user driven
&gt; +        (WebCore::SelectElementData::userDrivenChange):
&gt; +        (WebCore::SelectElementData::setUserDrivenChange):
&gt; +        * html/HTMLSelectElement.cpp: split into two methods -- script version
&gt; +        [non-user-driven] corresponds to IDL defined property name
&gt; +        (WebCore::HTMLSelectElement::setSelectedIndex):
&gt; +        (WebCore::HTMLSelectElement::setSelectedIndexByUser):
&gt; +        * html/HTMLSelectElement.h: 
&gt; +        * rendering/RenderMenuList.cpp: use ByUser method when coming through
&gt; +        the renderer
&gt; +        (WebCore::RenderMenuList::valueChanged):
&gt; +
&gt;  2009-06-05  Sam Weinig  &lt;sam@webkit.org&gt;
&gt;  
&gt;          Reviewed by Anders Carlsson.
&gt; Index: WebCore/dom/SelectElement.cpp
&gt; ===================================================================
&gt; --- WebCore/dom/SelectElement.cpp	(revision 44474)
&gt; +++ WebCore/dom/SelectElement.cpp	(working copy)
&gt; @@ -198,8 +198,9 @@ void SelectElement::menuListOnChange(Sel
&gt;      ASSERT(data.usesMenuList());
&gt;  
&gt;      int selected = selectedIndex(data, element);
&gt; -    if (data.lastOnChangeIndex() != selected) {
&gt; +    if (data.lastOnChangeIndex() != selected &amp;&amp; data.userDrivenChange()) {
&gt;          data.setLastOnChangeIndex(selected);
&gt; +        data.setUserDrivenChange(false);
&gt;          element-&gt;dispatchFormControlChangeEvent();
&gt;      }
&gt;  }
&gt; @@ -309,7 +310,7 @@ int SelectElement::selectedIndex(const S
&gt;      return -1;
&gt;  }
&gt;  
&gt; -void SelectElement::setSelectedIndex(SelectElementData&amp; data, Element* element, int optionIndex, bool deselect, bool fireOnChange)
&gt; +void SelectElement::setSelectedIndex(SelectElementData&amp; data, Element* element, int optionIndex, bool deselect, bool fireOnChangeNow, bool userDrivenChange)
&gt;  {
&gt;      const Vector&lt;Element*&gt;&amp; items = data.listItems(element);
&gt;      int listIndex = optionToListIndex(data, element, optionIndex);
&gt; @@ -335,9 +336,12 @@ void SelectElement::setSelectedIndex(Sel
&gt;  
&gt;      scrollToSelection(data, element);
&gt;  
&gt; -    // This only gets called with fireOnChange for menu lists. 
&gt; -    if (fireOnChange &amp;&amp; data.usesMenuList())
&gt; -        menuListOnChange(data, element);
&gt; +    // This only gets called with fireOnChangeNow for menu lists. 
&gt; +    if (data.usesMenuList()) {
&gt; +        data.setUserDrivenChange(userDrivenChange);
&gt; +        if (fireOnChangeNow)
&gt; +            menuListOnChange(data, element);
&gt; +    }
&gt;  
&gt;      if (Frame* frame = element-&gt;document()-&gt;frame())
&gt;          frame-&gt;page()-&gt;chrome()-&gt;client()-&gt;formStateDidChange(element);
&gt; Index: WebCore/dom/SelectElement.h
&gt; ===================================================================
&gt; --- WebCore/dom/SelectElement.h	(revision 44474)
&gt; +++ WebCore/dom/SelectElement.h	(working copy)
&gt; @@ -57,7 +57,8 @@ public:
&gt;      virtual int optionToListIndex(int optionIndex) const = 0;
&gt;  
&gt;      virtual int selectedIndex() const = 0;
&gt; -    virtual void setSelectedIndex(int index, bool deselect = true, bool fireOnChange = false) = 0;
&gt; +    virtual void setSelectedIndex(int index, bool deselect = true) = 0;
&gt; +    virtual void setSelectedIndexByUser(int index, bool deselect = true, bool fireOnChangeNow = false) = 0;
&gt;  
&gt;  protected:
&gt;      virtual ~SelectElement() { }
&gt; @@ -78,7 +79,7 @@ protected:
&gt;      static void setRecalcListItems(SelectElementData&amp;, Element*);
&gt;      static void recalcListItems(SelectElementData&amp;, const Element*, bool updateSelectedStates = true);
&gt;      static int selectedIndex(const SelectElementData&amp;, const Element*);
&gt; -    static void setSelectedIndex(SelectElementData&amp;, Element*, int optionIndex, bool deselect = true, bool fireOnChange = false);
&gt; +    static void setSelectedIndex(SelectElementData&amp;, Element*, int optionIndex, bool deselect = true, bool fireOnChangeNow = false, bool userDrivenChange = true);
&gt;      static int optionToListIndex(const SelectElementData&amp;, const Element*, int optionIndex);
&gt;      static int listToOptionIndex(const SelectElementData&amp;, const Element*, int listIndex);
&gt;      static void dispatchFocusEvent(SelectElementData&amp;, Element*);
&gt; @@ -117,6 +118,9 @@ public:
&gt;      int lastOnChangeIndex() const { return m_lastOnChangeIndex; }
&gt;      void setLastOnChangeIndex(int value) { m_lastOnChangeIndex = value; }
&gt;  
&gt; +    bool userDrivenChange() const { return m_userDrivenChange; }
&gt; +    void setUserDrivenChange(bool value) { m_userDrivenChange = value; }
&gt; +
&gt;      Vector&lt;bool&gt;&amp; lastOnChangeSelection() { return m_lastOnChangeSelection; }
&gt;  
&gt;      bool activeSelectionState() const { return m_activeSelectionState; }
&gt; @@ -154,6 +158,7 @@ private:
&gt;  
&gt;      int m_lastOnChangeIndex;
&gt;      Vector&lt;bool&gt; m_lastOnChangeSelection;
&gt; +    bool m_userDrivenChange;
&gt;  
&gt;      bool m_activeSelectionState;
&gt;      int m_activeSelectionAnchorIndex;
&gt; Index: WebCore/html/HTMLSelectElement.cpp
&gt; ===================================================================
&gt; --- WebCore/html/HTMLSelectElement.cpp	(revision 44474)
&gt; +++ WebCore/html/HTMLSelectElement.cpp	(working copy)
&gt; @@ -80,9 +80,14 @@ void HTMLSelectElement::deselectItems(HT
&gt;      SelectElement::deselectItems(m_data, this, excludeElement);
&gt;  }
&gt;  
&gt; -void HTMLSelectElement::setSelectedIndex(int optionIndex, bool deselect, bool fireOnChange)
&gt; +void HTMLSelectElement::setSelectedIndex(int optionIndex, bool deselect)
&gt;  {
&gt; -    SelectElement::setSelectedIndex(m_data, this, optionIndex, deselect, fireOnChange);
&gt; +    SelectElement::setSelectedIndex(m_data, this, optionIndex, deselect, false, false);
&gt; +}
&gt; +
&gt; +void HTMLSelectElement::setSelectedIndexByUser(int optionIndex, bool deselect, bool fireOnChangeNow)
&gt; +{
&gt; +    SelectElement::setSelectedIndex(m_data, this, optionIndex, deselect, fireOnChangeNow, true);
&gt;  }
&gt;  
&gt;  int HTMLSelectElement::activeSelectionStartListIndex() const
&gt; Index: WebCore/html/HTMLSelectElement.h
&gt; ===================================================================
&gt; --- WebCore/html/HTMLSelectElement.h	(revision 44474)
&gt; +++ WebCore/html/HTMLSelectElement.h	(working copy)
&gt; @@ -39,7 +39,8 @@ public:
&gt;      HTMLSelectElement(const QualifiedName&amp;, Document*, HTMLFormElement* = 0);
&gt;  
&gt;      virtual int selectedIndex() const;
&gt; -    virtual void setSelectedIndex(int index, bool deselect = true, bool fireOnChange = false);
&gt; +    virtual void setSelectedIndex(int index, bool deselect = true);
&gt; +    virtual void setSelectedIndexByUser(int index, bool deselect = true, bool fireOnChangeNow = false);
&gt;  
&gt;      unsigned length() const;
&gt;  
&gt; Index: WebCore/rendering/RenderMenuList.cpp
&gt; ===================================================================
&gt; --- WebCore/rendering/RenderMenuList.cpp	(revision 44474)
&gt; +++ WebCore/rendering/RenderMenuList.cpp	(working copy)
&gt; @@ -297,7 +297,7 @@ void RenderMenuList::hidePopup()
&gt;  void RenderMenuList::valueChanged(unsigned listIndex, bool fireOnChange)
&gt;  {
&gt;      SelectElement* select = toSelectElement(static_cast&lt;Element*&gt;(node()));
&gt; -    select-&gt;setSelectedIndex(select-&gt;listToOptionIndex(listIndex), true, fireOnChange);
&gt; +    select-&gt;setSelectedIndexByUser(select-&gt;listToOptionIndex(listIndex), true, fireOnChange);
&gt;  }
&gt;  
&gt;  String RenderMenuList::itemText(unsigned listIndex) const
&gt; Index: LayoutTests/ChangeLog
&gt; ===================================================================
&gt; --- LayoutTests/ChangeLog	(revision 44476)
&gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; @@ -1,3 +1,13 @@
&gt; +2009-06-05  John Gregg  &lt;johnnyg@google.com&gt;
&gt; +
&gt; +        Check for unnecessary calls to onchange in response to script
&gt; +        actions.
&gt; +
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=23721
&gt; +
&gt; +        * fast/forms/select-script-onchange-expected.txt: Added.
&gt; +        * fast/forms/select-script-onchange.html: Added.
&gt; +
&gt;  2009-06-01  Ben Murdoch  &lt;benm@google.com&gt;
&gt;  
&gt;          &lt;https://bugs.webkit.org/show_bug.cgi?id=25710&gt; HTML5 Database stops executing transactions if the URL hash changes while a transaction is open and an XHR is in progress.
&gt; Index: LayoutTests/fast/forms/select-script-onchange-expected.txt
&gt; ===================================================================
&gt; --- LayoutTests/fast/forms/select-script-onchange-expected.txt	(revision 0)
&gt; +++ LayoutTests/fast/forms/select-script-onchange-expected.txt	(revision 0)
&gt; @@ -0,0 +1,7 @@
&gt; +Test for http://bugs.webkit.org/show_bug.cgi?id=23721 Changing dropdown&apos;s selectedIndex within onchange handler fires another onchange.
&gt; +
&gt; +SUCCESS
&gt; +
&gt; +This select changes on focus: should not fire onchange.  
&gt; +This select changes on change: should only fire onchange once.  
&gt; +This select is changed by a timeout in the test script. It should not fire onchange.  
&gt; Index: LayoutTests/fast/forms/select-script-onchange.html
&gt; ===================================================================
&gt; --- LayoutTests/fast/forms/select-script-onchange.html	(revision 0)
&gt; +++ LayoutTests/fast/forms/select-script-onchange.html	(revision 0)
&gt; @@ -0,0 +1,86 @@
&gt; +&lt;html&gt;
&gt; +    &lt;head&gt;
&gt; +        &lt;title&gt;&lt;/title&gt;
&gt; +        &lt;script type=&quot;text/javascript&quot;&gt;
&gt; +            var changeCount = new Array(4);
&gt; +            changeCount[1] = changeCount[2] = changeCount[3] = 0;
&gt; +
&gt; +            function test()
&gt; +            {
&gt; +                if (!window.eventSender)
&gt; +                    return;
&gt; +
&gt; +                layoutTestController.dumpAsText();
&gt; +
&gt; +                var popup = document.getElementById(&quot;switcher1&quot;);
&gt; +                popup.focus();
&gt; +
&gt; +                popup = document.getElementById(&quot;switcher2&quot;);
&gt; +                popup.focus();
&gt; +
&gt; +                eventSender.keyDown(&quot;t&quot;, null);
&gt; +                eventSender.keyDown(&quot;\r&quot;, null);
&gt; +
&gt; +                var popup = document.getElementById(&quot;switcher3&quot;);
&gt; +                popup.focus();
&gt; +
&gt; +                check();
&gt; +           }
&gt; +
&gt; +           function check() {
&gt; +                setTimeout(&quot;document.getElementById(&apos;switcher3&apos;).selectedIndex = 1;&quot;, 0);
&gt; +
&gt; +                var popup = document.getElementById(&quot;switcher2&quot;);
&gt; +                popup.focus();
&gt; +
&gt; +                var result = document.getElementById(&quot;result&quot;);
&gt; +                result.innerHTML = &quot;&quot;;
&gt; +                if (changeCount[1] != 0) {
&gt; +                    result.innerHTML += &quot;&lt;br/&gt;FAILURE: onchange(1) called &quot; + changeCount[1] + &quot; times.&quot;;
&gt; +                } 
&gt; +                if (changeCount[2] != 1) {
&gt; +                    result.innerHTML += &quot;&lt;br/&gt;FAILURE: onchange(2) called &quot; + changeCount[2] + &quot; times.&quot;;
&gt; +                } 
&gt; +                if (changeCount[3] != 0) {
&gt; +                    result.innerHTML += &quot;&lt;br/&gt;FAILURE: onchange(3) called &quot; + changeCount[3] + &quot; times.&quot;;
&gt; +                } 
&gt; +                if (result.innerHTML == &quot;&quot;) result.innerHTML = &quot;SUCCESS&quot;;
&gt; +
&gt; +            }
&gt; +
&gt; +            function changed(select)
&gt; +            {
&gt; +                changeCount[select]++;
&gt; +            }
&gt; +        &lt;/script&gt;
&gt; +    &lt;/head&gt;
&gt; +    &lt;body onload=&quot;test()&quot;&gt;
&gt; +        &lt;p&gt;
&gt; +            Test for &lt;i&gt;&lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=23721&quot;&gt;http://bugs.webkit.org/show_bug.cgi?id=23721&lt;/a&gt;
&gt; +            Changing dropdown&apos;s selectedIndex within onchange handler fires another onchange&lt;/i&gt;.
&gt; +        &lt;/p&gt;
&gt; +        &lt;p id=&quot;result&quot;&gt;
&gt; +          To test interactively: focus on the first select (don&apos;t change it).&lt;br/&gt;
&gt; +          Change the second select to &quot;two&quot;&lt;br/&gt;
&gt; +          Focus on the third, then click &lt;a href=&quot;#&quot; onclick=&quot;check(); return false;&quot;&gt;here&lt;/a&gt;.  
&gt; +        &lt;/p&gt;
&gt; +        This select changes on focus: should not fire onchange.
&gt; +        &lt;select name=&quot;switcher1&quot; id=&quot;switcher1&quot; onfocus=&quot;this.selectedIndex = 1;&quot; onchange=&quot;changed(1)&quot;&gt;
&gt; +            &lt;option value=&quot;one&quot;&gt;One&lt;/option&gt;
&gt; +            &lt;option value=&quot;two&quot;&gt;Two&lt;/option&gt;
&gt; +        &lt;/select&gt;
&gt; +        &lt;hr/&gt;
&gt; +        This select changes on change: should only fire onchange once.
&gt; +        &lt;select name=&quot;switcher2&quot; id=&quot;switcher2&quot; onchange=&quot;changed(2); if (this.selectedIndex == 1) this.selectedIndex = 2;&quot;&gt;
&gt; +            &lt;option value=&quot;one&quot;&gt;One&lt;/option&gt;
&gt; +            &lt;option value=&quot;two&quot;&gt;Two&lt;/option&gt;
&gt; +            &lt;option value=&quot;three&quot;&gt;Three&lt;/option&gt;
&gt; +        &lt;/select&gt;
&gt; +        &lt;hr/&gt;
&gt; +        This select is changed by a timeout in the test script.  It should not fire onchange.
&gt; +        &lt;select name=&quot;switcher3&quot; id=&quot;switcher3&quot; onchange=&quot;changed(3)&quot;&gt;
&gt; +            &lt;option value=&quot;one&quot;&gt;One&lt;/option&gt;
&gt; +            &lt;option value=&quot;two&quot;&gt;Two&lt;/option&gt;
&gt; +        &lt;/select&gt;        
&gt; +    &lt;/body&gt;
&gt; +&lt;/html&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128208</commentid>
    <comment_count>6</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-25 10:28:22 -0700</bug_when>
    <thetext>Assign to levin for landing.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128257</commentid>
    <comment_count>7</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-25 13:43:16 -0700</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/45185.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1886053</commentid>
    <comment_count>8</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2022-07-22 11:51:11 -0700</bug_when>
    <thetext>*** Bug 18748 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27303</attachid>
            <date>2009-02-03 17:27:33 -0800</date>
            <delta_ts>2009-02-03 17:27:33 -0800</delta_ts>
            <desc>testcase</desc>
            <filename>test-standard.html</filename>
            <type>text/html</type>
            <size>999</size>
            <attacher name="jasneet">jasneet</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFs
Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25h
bC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhl
YWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsg
Y2hhcnNldD11dGYtOCIgLz4NCjx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+DQo8L2hl
YWQ+DQoNCjxib2R5Pg0KMS4gU2VsZWN0ICJJJ20gMTgrIiBmcm9tIGJlbG93IGRyb3Bkb3duIGFu
ZCB0aGVuIGNsaWNrICJDYW5jZWwiIG9uIHRoZSBwb3AtdXAgY29uZmlybWF0aW9uIGJveDxiciAv
Pg0KPGZvcm0gbmFtZT0ic2FmZVNweUZvcm0iPg0KPHNlbGVjdCBuYW1lPSJmaWx0ZXIiIG9uY2hh
bmdlPSJpZiAodGhpcy5zZWxlY3RlZEluZGV4ID09IDAgfHwgY29uZmlybSgnVHVybiBzYWZlIHNw
eSBvZmY/ICBJZiB5b3UgYXJlIHlvdW5nZXIgdGhhbiAxOCwgY2xpY2sgQ2FuY2VsLicpICkgZG9j
dW1lbnQuc2FmZVNweUZvcm0uc3VibWl0KCk7IGVsc2UgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDsi
Pg0KPG9wdGlvbiB2YWx1ZT0ib24iIHNlbGVjdGVkPSJzZWxlY3RlZCI+SSdtIDEzKzwvb3B0aW9u
PiAgICAgIA0KPG9wdGlvbiB2YWx1ZT0ib2ZmIiA+SSdtIDE4Kzwvb3B0aW9uPiAgICAgIA0KPC9z
ZWxlY3Q+DQo8L2Zvcm0+DQoyLiBDbGljayBhbnkgYmxhbmsgYXJlYSBvZiB0aGUgcGFnZTxiciAv
Pg0KMy4gQ2hlY2sgaWYgYSBzdHJpbmcgIj9maWx0ZXI9b24iIGlzIGFwcGVuZGVkIHRvIHRoZSBV
UkwgaW4gYWRkcmVzcyBiYXIvb21uaWJveDxiciAvPg0KNC4gIj9maWx0ZXI9b24iIHNob3VsZCBu
b3QgYmUgYXBwZW5kZWQgdG8gdGhlIFVSTCwgYmVjYXVzZSB0aGUgZm9ybSBzaG91bGQgbm90IGJl
IHN1Ym1pdHRlZA0KPC9ib2R5Pg0KPC9odG1sPg0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31025</attachid>
            <date>2009-06-05 19:38:47 -0700</date>
            <delta_ts>2009-06-23 22:39:40 -0700</delta_ts>
            <desc>patch &amp; test</desc>
            <filename>SelectPatch.diff</filename>
            <type>text/plain</type>
            <size>13069</size>
            <attacher name="John Gregg">johnnyg</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NDQ3NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzQgQEAKKzIwMDktMDYtMDUgIEpvaG4gR3JlZ2cgIDxqb2hubnlnQGdvb2dsZS5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRml4
IGZvciBidWcgMjM3MjE6IG9uY2hhbmdlIGV2ZW50cyBmaXJlIHdoZW4gYSBTRUxFQ1QgZWxlbWVu
dCBoYXMKKyAgICAgICAgZm9jdXMgYW5kIHRoZSBzZWxlY3RlZEluZGV4IGlzIHVwZGF0ZWQgYnkg
c2NyaXB0IGluIHNvbWUgd2F5LS1laXRoZXIKKyAgICAgICAgZHVyaW5nIGFub3RoZXIgb25jaGFu
Z2UsIG9ua2V5cHJlc3MsIG9uZm9jdXMsIG9yIHRpbWVyLS1hbmQgdGhlbgorICAgICAgICBmb2N1
cyBpcyBsb3N0LiAKKworICAgICAgICBGaXhlZCBieSBtYWtpbmcgYSBzZXBhcmF0ZSBtZXRob2Qg
Zm9yIHVzZXItZHJpdmVuIHNlbGVjdGVkSW5kZXggCisgICAgICAgIGNoYW5nZXMsIGxlYXZpbmcg
c2NyaXB0cyB0byB1c2Ugb25lIHdoaWNoIGRvZXNuJ3QgY2F1c2Ugb25jaGFuZ2UgdG8KKyAgICAg
ICAgYmUgcXVldWVkLgorICAgICAgICAKKyAgICAgICAgVGVzdDogZmFzdC9mb3Jtcy9zZWxlY3Qt
c2NyaXB0LW9uY2hhbmdlLmh0bWwKKworICAgICAgICAqIGRvbS9TZWxlY3RFbGVtZW50LmNwcDog
Y2hlY2sgaWYgdGhlIHBlbmRpbmcgY2hhbmdlIGlzIHVzZXIgZHJpdmVuCisgICAgICAgIGJlZm9y
ZSBjYWxsaW5nIG9uY2hhbmdlCisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjptZW51
TGlzdE9uQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnNldFNlbGVj
dGVkSW5kZXgpOgorICAgICAgICAqIGRvbS9TZWxlY3RFbGVtZW50Lmg6IHN0b3JlIHdoZXRoZXIg
dGhlIHBlbmRpbmcgY2hhbmdlIGlzIHVzZXIgZHJpdmVuCisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6dXNlckRyaXZlbkNoYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6c2V0VXNlckRyaXZlbkNoYW5nZSk6CisgICAgICAgICogaHRtbC9IVE1M
U2VsZWN0RWxlbWVudC5jcHA6IHNwbGl0IGludG8gdHdvIG1ldGhvZHMgLS0gc2NyaXB0IHZlcnNp
b24KKyAgICAgICAgW25vbi11c2VyLWRyaXZlbl0gY29ycmVzcG9uZHMgdG8gSURMIGRlZmluZWQg
cHJvcGVydHkgbmFtZQorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFNl
bGVjdGVkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFNl
bGVjdGVkSW5kZXhCeVVzZXIpOgorICAgICAgICAqIGh0bWwvSFRNTFNlbGVjdEVsZW1lbnQuaDog
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlck1lbnVMaXN0LmNwcDogdXNlIEJ5VXNlciBtZXRo
b2Qgd2hlbiBjb21pbmcgdGhyb3VnaAorICAgICAgICB0aGUgcmVuZGVyZXIKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlck1lbnVMaXN0Ojp2YWx1ZUNoYW5nZWQpOgorCiAyMDA5LTA2LTA1ICBTYW0g
V2VpbmlnICA8c2FtQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQW5kZXJzIENh
cmxzc29uLgpJbmRleDogV2ViQ29yZS9kb20vU2VsZWN0RWxlbWVudC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9kb20vU2VsZWN0RWxlbWVudC5jcHAJKHJldmlzaW9uIDQ0NDc0KQorKysgV2Vi
Q29yZS9kb20vU2VsZWN0RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE5OCw4ICsxOTgs
OSBAQCB2b2lkIFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0T25DaGFuZ2UoU2VsCiAgICAgQVNTRVJU
KGRhdGEudXNlc01lbnVMaXN0KCkpOwogCiAgICAgaW50IHNlbGVjdGVkID0gc2VsZWN0ZWRJbmRl
eChkYXRhLCBlbGVtZW50KTsKLSAgICBpZiAoZGF0YS5sYXN0T25DaGFuZ2VJbmRleCgpICE9IHNl
bGVjdGVkKSB7CisgICAgaWYgKGRhdGEubGFzdE9uQ2hhbmdlSW5kZXgoKSAhPSBzZWxlY3RlZCAm
JiBkYXRhLnVzZXJEcml2ZW5DaGFuZ2UoKSkgewogICAgICAgICBkYXRhLnNldExhc3RPbkNoYW5n
ZUluZGV4KHNlbGVjdGVkKTsKKyAgICAgICAgZGF0YS5zZXRVc2VyRHJpdmVuQ2hhbmdlKGZhbHNl
KTsKICAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50KCk7CiAg
ICAgfQogfQpAQCAtMzA5LDcgKzMxMCw3IEBAIGludCBTZWxlY3RFbGVtZW50OjpzZWxlY3RlZElu
ZGV4KGNvbnN0IFMKICAgICByZXR1cm4gLTE7CiB9CiAKLXZvaWQgU2VsZWN0RWxlbWVudDo6c2V0
U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwg
aW50IG9wdGlvbkluZGV4LCBib29sIGRlc2VsZWN0LCBib29sIGZpcmVPbkNoYW5nZSkKK3ZvaWQg
U2VsZWN0RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwg
RWxlbWVudCogZWxlbWVudCwgaW50IG9wdGlvbkluZGV4LCBib29sIGRlc2VsZWN0LCBib29sIGZp
cmVPbkNoYW5nZU5vdywgYm9vbCB1c2VyRHJpdmVuQ2hhbmdlKQogewogICAgIGNvbnN0IFZlY3Rv
cjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CiAgICAgaW50IGxp
c3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIG9wdGlvbkluZGV4KTsK
QEAgLTMzNSw5ICszMzYsMTIgQEAgdm9pZCBTZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4
KFNlbAogCiAgICAgc2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7CiAKLSAgICAvLyBU
aGlzIG9ubHkgZ2V0cyBjYWxsZWQgd2l0aCBmaXJlT25DaGFuZ2UgZm9yIG1lbnUgbGlzdHMuIAot
ICAgIGlmIChmaXJlT25DaGFuZ2UgJiYgZGF0YS51c2VzTWVudUxpc3QoKSkKLSAgICAgICAgbWVu
dUxpc3RPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKKyAgICAvLyBUaGlzIG9ubHkgZ2V0cyBjYWxs
ZWQgd2l0aCBmaXJlT25DaGFuZ2VOb3cgZm9yIG1lbnUgbGlzdHMuIAorICAgIGlmIChkYXRhLnVz
ZXNNZW51TGlzdCgpKSB7CisgICAgICAgIGRhdGEuc2V0VXNlckRyaXZlbkNoYW5nZSh1c2VyRHJp
dmVuQ2hhbmdlKTsKKyAgICAgICAgaWYgKGZpcmVPbkNoYW5nZU5vdykKKyAgICAgICAgICAgIG1l
bnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7CisgICAgfQogCiAgICAgaWYgKEZyYW1lKiBm
cmFtZSA9IGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkpCiAgICAgICAgIGZyYW1lLT5wYWdl
KCktPmNocm9tZSgpLT5jbGllbnQoKS0+Zm9ybVN0YXRlRGlkQ2hhbmdlKGVsZW1lbnQpOwpJbmRl
eDogV2ViQ29yZS9kb20vU2VsZWN0RWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZG9t
L1NlbGVjdEVsZW1lbnQuaAkocmV2aXNpb24gNDQ0NzQpCisrKyBXZWJDb3JlL2RvbS9TZWxlY3RF
bGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTU3LDcgKzU3LDggQEAgcHVibGljOgogICAgIHZp
cnR1YWwgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3QgPSAwOwog
CiAgICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFs
IHZvaWQgc2V0U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBi
b29sIGZpcmVPbkNoYW5nZSA9IGZhbHNlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldFNlbGVj
dGVkSW5kZXgoaW50IGluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSkgPSAwOworICAgIHZpcnR1
YWwgdm9pZCBzZXRTZWxlY3RlZEluZGV4QnlVc2VyKGludCBpbmRleCwgYm9vbCBkZXNlbGVjdCA9
IHRydWUsIGJvb2wgZmlyZU9uQ2hhbmdlTm93ID0gZmFsc2UpID0gMDsKIAogcHJvdGVjdGVkOgog
ICAgIHZpcnR1YWwgflNlbGVjdEVsZW1lbnQoKSB7IH0KQEAgLTc4LDcgKzc5LDcgQEAgcHJvdGVj
dGVkOgogICAgIHN0YXRpYyB2b2lkIHNldFJlY2FsY0xpc3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0
YSYsIEVsZW1lbnQqKTsKICAgICBzdGF0aWMgdm9pZCByZWNhbGNMaXN0SXRlbXMoU2VsZWN0RWxl
bWVudERhdGEmLCBjb25zdCBFbGVtZW50KiwgYm9vbCB1cGRhdGVTZWxlY3RlZFN0YXRlcyA9IHRy
dWUpOwogICAgIHN0YXRpYyBpbnQgc2VsZWN0ZWRJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0
YSYsIGNvbnN0IEVsZW1lbnQqKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRTZWxlY3RlZEluZGV4KFNl
bGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIGludCBvcHRpb25JbmRleCwgYm9vbCBkZXNlbGVj
dCA9IHRydWUsIGJvb2wgZmlyZU9uQ2hhbmdlID0gZmFsc2UpOworICAgIHN0YXRpYyB2b2lkIHNl
dFNlbGVjdGVkSW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IG9wdGlvbklu
ZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSwgYm9vbCBmaXJlT25DaGFuZ2VOb3cgPSBmYWxzZSwg
Ym9vbCB1c2VyRHJpdmVuQ2hhbmdlID0gdHJ1ZSk7CiAgICAgc3RhdGljIGludCBvcHRpb25Ub0xp
c3RJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBpbnQgb3B0
aW9uSW5kZXgpOwogICAgIHN0YXRpYyBpbnQgbGlzdFRvT3B0aW9uSW5kZXgoY29uc3QgU2VsZWN0
RWxlbWVudERhdGEmLCBjb25zdCBFbGVtZW50KiwgaW50IGxpc3RJbmRleCk7CiAgICAgc3RhdGlj
IHZvaWQgZGlzcGF0Y2hGb2N1c0V2ZW50KFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOwpA
QCAtMTE3LDYgKzExOCw5IEBAIHB1YmxpYzoKICAgICBpbnQgbGFzdE9uQ2hhbmdlSW5kZXgoKSBj
b25zdCB7IHJldHVybiBtX2xhc3RPbkNoYW5nZUluZGV4OyB9CiAgICAgdm9pZCBzZXRMYXN0T25D
aGFuZ2VJbmRleChpbnQgdmFsdWUpIHsgbV9sYXN0T25DaGFuZ2VJbmRleCA9IHZhbHVlOyB9CiAK
KyAgICBib29sIHVzZXJEcml2ZW5DaGFuZ2UoKSBjb25zdCB7IHJldHVybiBtX3VzZXJEcml2ZW5D
aGFuZ2U7IH0KKyAgICB2b2lkIHNldFVzZXJEcml2ZW5DaGFuZ2UoYm9vbCB2YWx1ZSkgeyBtX3Vz
ZXJEcml2ZW5DaGFuZ2UgPSB2YWx1ZTsgfQorCiAgICAgVmVjdG9yPGJvb2w+JiBsYXN0T25DaGFu
Z2VTZWxlY3Rpb24oKSB7IHJldHVybiBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbjsgfQogCiAgICAg
Ym9vbCBhY3RpdmVTZWxlY3Rpb25TdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aXZlU2VsZWN0
aW9uU3RhdGU7IH0KQEAgLTE1NCw2ICsxNTgsNyBAQCBwcml2YXRlOgogCiAgICAgaW50IG1fbGFz
dE9uQ2hhbmdlSW5kZXg7CiAgICAgVmVjdG9yPGJvb2w+IG1fbGFzdE9uQ2hhbmdlU2VsZWN0aW9u
OworICAgIGJvb2wgbV91c2VyRHJpdmVuQ2hhbmdlOwogCiAgICAgYm9vbCBtX2FjdGl2ZVNlbGVj
dGlvblN0YXRlOwogICAgIGludCBtX2FjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4OwpJbmRleDog
V2ViQ29yZS9odG1sL0hUTUxTZWxlY3RFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2h0bWwvSFRNTFNlbGVjdEVsZW1lbnQuY3BwCShyZXZpc2lvbiA0NDQ3NCkKKysrIFdlYkNvcmUv
aHRtbC9IVE1MU2VsZWN0RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgwLDkgKzgwLDE0
IEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OmRlc2VsZWN0SXRlbXMoSFQKICAgICBTZWxlY3RF
bGVtZW50OjpkZXNlbGVjdEl0ZW1zKG1fZGF0YSwgdGhpcywgZXhjbHVkZUVsZW1lbnQpOwogfQog
Ci12b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4KGludCBvcHRpb25JbmRl
eCwgYm9vbCBkZXNlbGVjdCwgYm9vbCBmaXJlT25DaGFuZ2UpCit2b2lkIEhUTUxTZWxlY3RFbGVt
ZW50OjpzZXRTZWxlY3RlZEluZGV4KGludCBvcHRpb25JbmRleCwgYm9vbCBkZXNlbGVjdCkKIHsK
LSAgICBTZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4KG1fZGF0YSwgdGhpcywgb3B0aW9u
SW5kZXgsIGRlc2VsZWN0LCBmaXJlT25DaGFuZ2UpOworICAgIFNlbGVjdEVsZW1lbnQ6OnNldFNl
bGVjdGVkSW5kZXgobV9kYXRhLCB0aGlzLCBvcHRpb25JbmRleCwgZGVzZWxlY3QsIGZhbHNlLCBm
YWxzZSk7Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldFNlbGVjdGVkSW5kZXhCeVVz
ZXIoaW50IG9wdGlvbkluZGV4LCBib29sIGRlc2VsZWN0LCBib29sIGZpcmVPbkNoYW5nZU5vdykK
K3sKKyAgICBTZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4KG1fZGF0YSwgdGhpcywgb3B0
aW9uSW5kZXgsIGRlc2VsZWN0LCBmaXJlT25DaGFuZ2VOb3csIHRydWUpOwogfQogCiBpbnQgSFRN
TFNlbGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvblN0YXJ0TGlzdEluZGV4KCkgY29uc3QKSW5k
ZXg6IFdlYkNvcmUvaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5oCShyZXZpc2lvbiA0NDQ3NCkKKysrIFdlYkNvcmUv
aHRtbC9IVE1MU2VsZWN0RWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw4IEBA
IHB1YmxpYzoKICAgICBIVE1MU2VsZWN0RWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiwgRG9j
dW1lbnQqLCBIVE1MRm9ybUVsZW1lbnQqID0gMCk7CiAKICAgICB2aXJ0dWFsIGludCBzZWxlY3Rl
ZEluZGV4KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkSW5kZXgoaW50IGlu
ZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSwgYm9vbCBmaXJlT25DaGFuZ2UgPSBmYWxzZSk7Cisg
ICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkSW5kZXgoaW50IGluZGV4LCBib29sIGRlc2VsZWN0
ID0gdHJ1ZSk7CisgICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkSW5kZXhCeVVzZXIoaW50IGlu
ZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSwgYm9vbCBmaXJlT25DaGFuZ2VOb3cgPSBmYWxzZSk7
CiAKICAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyTWVudUxpc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlck1lbnVMaXN0LmNwcAkocmV2aXNpb24gNDQ0NzQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJNZW51TGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5Nyw3ICsyOTcsNyBAQCB2b2lk
IFJlbmRlck1lbnVMaXN0OjpoaWRlUG9wdXAoKQogdm9pZCBSZW5kZXJNZW51TGlzdDo6dmFsdWVD
aGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlT25DaGFuZ2UpCiB7CiAgICAgU2Vs
ZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQq
Pihub2RlKCkpKTsKLSAgICBzZWxlY3QtPnNldFNlbGVjdGVkSW5kZXgoc2VsZWN0LT5saXN0VG9P
cHRpb25JbmRleChsaXN0SW5kZXgpLCB0cnVlLCBmaXJlT25DaGFuZ2UpOworICAgIHNlbGVjdC0+
c2V0U2VsZWN0ZWRJbmRleEJ5VXNlcihzZWxlY3QtPmxpc3RUb09wdGlvbkluZGV4KGxpc3RJbmRl
eCksIHRydWUsIGZpcmVPbkNoYW5nZSk7CiB9CiAKIFN0cmluZyBSZW5kZXJNZW51TGlzdDo6aXRl
bVRleHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNDQ0NzYp
CisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBA
QAorMjAwOS0wNi0wNSAgSm9obiBHcmVnZyAgPGpvaG5ueWdAZ29vZ2xlLmNvbT4KKworICAgICAg
ICBDaGVjayBmb3IgdW5uZWNlc3NhcnkgY2FsbHMgdG8gb25jaGFuZ2UgaW4gcmVzcG9uc2UgdG8g
c2NyaXB0CisgICAgICAgIGFjdGlvbnMuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTIzNzIxCisKKyAgICAgICAgKiBmYXN0L2Zvcm1zL3NlbGVjdC1z
Y3JpcHQtb25jaGFuZ2UtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L2Zvcm1z
L3NlbGVjdC1zY3JpcHQtb25jaGFuZ2UuaHRtbDogQWRkZWQuCisKIDIwMDktMDYtMDEgIEJlbiBN
dXJkb2NoICA8YmVubUBnb29nbGUuY29tPgogCiAgICAgICAgIDxodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU3MTA+IEhUTUw1IERhdGFiYXNlIHN0b3BzIGV4ZWN1dGlu
ZyB0cmFuc2FjdGlvbnMgaWYgdGhlIFVSTCBoYXNoIGNoYW5nZXMgd2hpbGUgYSB0cmFuc2FjdGlv
biBpcyBvcGVuIGFuZCBhbiBYSFIgaXMgaW4gcHJvZ3Jlc3MuCkluZGV4OiBMYXlvdXRUZXN0cy9m
YXN0L2Zvcm1zL3NlbGVjdC1zY3JpcHQtb25jaGFuZ2UtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIExheW91dFRlc3RzL2Zhc3QvZm9ybXMvc2VsZWN0LXNjcmlwdC1vbmNoYW5nZS1leHBlY3Rl
ZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2Zvcm1zL3NlbGVjdC1zY3Jp
cHQtb25jaGFuZ2UtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDcgQEAKK1Rl
c3QgZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzNzIxIENoYW5n
aW5nIGRyb3Bkb3duJ3Mgc2VsZWN0ZWRJbmRleCB3aXRoaW4gb25jaGFuZ2UgaGFuZGxlciBmaXJl
cyBhbm90aGVyIG9uY2hhbmdlLgorCitTVUNDRVNTCisKK1RoaXMgc2VsZWN0IGNoYW5nZXMgb24g
Zm9jdXM6IHNob3VsZCBub3QgZmlyZSBvbmNoYW5nZS4gIAorVGhpcyBzZWxlY3QgY2hhbmdlcyBv
biBjaGFuZ2U6IHNob3VsZCBvbmx5IGZpcmUgb25jaGFuZ2Ugb25jZS4gIAorVGhpcyBzZWxlY3Qg
aXMgY2hhbmdlZCBieSBhIHRpbWVvdXQgaW4gdGhlIHRlc3Qgc2NyaXB0LiBJdCBzaG91bGQgbm90
IGZpcmUgb25jaGFuZ2UuICAKSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvZm9ybXMvc2VsZWN0LXNj
cmlwdC1vbmNoYW5nZS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvZm9ybXMv
c2VsZWN0LXNjcmlwdC1vbmNoYW5nZS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMv
ZmFzdC9mb3Jtcy9zZWxlY3Qtc2NyaXB0LW9uY2hhbmdlLmh0bWwJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsODYgQEAKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+PC90aXRsZT4K
KyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICAgICAgdmFy
IGNoYW5nZUNvdW50ID0gbmV3IEFycmF5KDQpOworICAgICAgICAgICAgY2hhbmdlQ291bnRbMV0g
PSBjaGFuZ2VDb3VudFsyXSA9IGNoYW5nZUNvdW50WzNdID0gMDsKKworICAgICAgICAgICAgZnVu
Y3Rpb24gdGVzdCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cu
ZXZlbnRTZW5kZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKworICAgICAgICAgICAgICAg
IHZhciBwb3B1cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzd2l0Y2hlcjEiKTsKKyAgICAg
ICAgICAgICAgICBwb3B1cC5mb2N1cygpOworCisgICAgICAgICAgICAgICAgcG9wdXAgPSBkb2N1
bWVudC5nZXRFbGVtZW50QnlJZCgic3dpdGNoZXIyIik7CisgICAgICAgICAgICAgICAgcG9wdXAu
Zm9jdXMoKTsKKworICAgICAgICAgICAgICAgIGV2ZW50U2VuZGVyLmtleURvd24oInQiLCBudWxs
KTsKKyAgICAgICAgICAgICAgICBldmVudFNlbmRlci5rZXlEb3duKCJcciIsIG51bGwpOworCisg
ICAgICAgICAgICAgICAgdmFyIHBvcHVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN3aXRj
aGVyMyIpOworICAgICAgICAgICAgICAgIHBvcHVwLmZvY3VzKCk7CisKKyAgICAgICAgICAgICAg
ICBjaGVjaygpOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7
CisgICAgICAgICAgICAgICAgc2V0VGltZW91dCgiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N3
aXRjaGVyMycpLnNlbGVjdGVkSW5kZXggPSAxOyIsIDApOworCisgICAgICAgICAgICAgICAgdmFy
IHBvcHVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN3aXRjaGVyMiIpOworICAgICAgICAg
ICAgICAgIHBvcHVwLmZvY3VzKCk7CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdCIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5p
bm5lckhUTUwgPSAiIjsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlQ291bnRbMV0gIT0gMCkg
eworICAgICAgICAgICAgICAgICAgICByZXN1bHQuaW5uZXJIVE1MICs9ICI8YnIvPkZBSUxVUkU6
IG9uY2hhbmdlKDEpIGNhbGxlZCAiICsgY2hhbmdlQ291bnRbMV0gKyAiIHRpbWVzLiI7CisgICAg
ICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlQ291bnRbMl0gIT0gMSkg
eworICAgICAgICAgICAgICAgICAgICByZXN1bHQuaW5uZXJIVE1MICs9ICI8YnIvPkZBSUxVUkU6
IG9uY2hhbmdlKDIpIGNhbGxlZCAiICsgY2hhbmdlQ291bnRbMl0gKyAiIHRpbWVzLiI7CisgICAg
ICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlQ291bnRbM10gIT0gMCkg
eworICAgICAgICAgICAgICAgICAgICByZXN1bHQuaW5uZXJIVE1MICs9ICI8YnIvPkZBSUxVUkU6
IG9uY2hhbmdlKDMpIGNhbGxlZCAiICsgY2hhbmdlQ291bnRbM10gKyAiIHRpbWVzLiI7CisgICAg
ICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlubmVySFRNTCA9PSAi
IikgcmVzdWx0LmlubmVySFRNTCA9ICJTVUNDRVNTIjsKKworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBmdW5jdGlvbiBjaGFuZ2VkKHNlbGVjdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICBjaGFuZ2VDb3VudFtzZWxlY3RdKys7CisgICAgICAgICAgICB9CisgICAgICAgIDwv
c2NyaXB0PgorICAgIDwvaGVhZD4KKyAgICA8Ym9keSBvbmxvYWQ9InRlc3QoKSI+CisgICAgICAg
IDxwPgorICAgICAgICAgICAgVGVzdCBmb3IgPGk+PGEgaHJlZj0iaHR0cDovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM3MjEiPmh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIzNzIxPC9hPgorICAgICAgICAgICAgQ2hhbmdpbmcgZHJvcGRvd24ncyBzZWxl
Y3RlZEluZGV4IHdpdGhpbiBvbmNoYW5nZSBoYW5kbGVyIGZpcmVzIGFub3RoZXIgb25jaGFuZ2U8
L2k+LgorICAgICAgICA8L3A+CisgICAgICAgIDxwIGlkPSJyZXN1bHQiPgorICAgICAgICAgIFRv
IHRlc3QgaW50ZXJhY3RpdmVseTogZm9jdXMgb24gdGhlIGZpcnN0IHNlbGVjdCAoZG9uJ3QgY2hh
bmdlIGl0KS48YnIvPgorICAgICAgICAgIENoYW5nZSB0aGUgc2Vjb25kIHNlbGVjdCB0byAidHdv
Ijxici8+CisgICAgICAgICAgRm9jdXMgb24gdGhlIHRoaXJkLCB0aGVuIGNsaWNrIDxhIGhyZWY9
IiMiIG9uY2xpY2s9ImNoZWNrKCk7IHJldHVybiBmYWxzZTsiPmhlcmU8L2E+LiAgCisgICAgICAg
IDwvcD4KKyAgICAgICAgVGhpcyBzZWxlY3QgY2hhbmdlcyBvbiBmb2N1czogc2hvdWxkIG5vdCBm
aXJlIG9uY2hhbmdlLgorICAgICAgICA8c2VsZWN0IG5hbWU9InN3aXRjaGVyMSIgaWQ9InN3aXRj
aGVyMSIgb25mb2N1cz0idGhpcy5zZWxlY3RlZEluZGV4ID0gMTsiIG9uY2hhbmdlPSJjaGFuZ2Vk
KDEpIj4KKyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Im9uZSI+T25lPC9vcHRpb24+CisgICAg
ICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0d28iPlR3bzwvb3B0aW9uPgorICAgICAgICA8L3NlbGVj
dD4KKyAgICAgICAgPGhyLz4KKyAgICAgICAgVGhpcyBzZWxlY3QgY2hhbmdlcyBvbiBjaGFuZ2U6
IHNob3VsZCBvbmx5IGZpcmUgb25jaGFuZ2Ugb25jZS4KKyAgICAgICAgPHNlbGVjdCBuYW1lPSJz
d2l0Y2hlcjIiIGlkPSJzd2l0Y2hlcjIiIG9uY2hhbmdlPSJjaGFuZ2VkKDIpOyBpZiAodGhpcy5z
ZWxlY3RlZEluZGV4ID09IDEpIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDI7Ij4KKyAgICAgICAgICAg
IDxvcHRpb24gdmFsdWU9Im9uZSI+T25lPC9vcHRpb24+CisgICAgICAgICAgICA8b3B0aW9uIHZh
bHVlPSJ0d28iPlR3bzwvb3B0aW9uPgorICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idGhyZWUi
PlRocmVlPC9vcHRpb24+CisgICAgICAgIDwvc2VsZWN0PgorICAgICAgICA8aHIvPgorICAgICAg
ICBUaGlzIHNlbGVjdCBpcyBjaGFuZ2VkIGJ5IGEgdGltZW91dCBpbiB0aGUgdGVzdCBzY3JpcHQu
ICBJdCBzaG91bGQgbm90IGZpcmUgb25jaGFuZ2UuCisgICAgICAgIDxzZWxlY3QgbmFtZT0ic3dp
dGNoZXIzIiBpZD0ic3dpdGNoZXIzIiBvbmNoYW5nZT0iY2hhbmdlZCgzKSI+CisgICAgICAgICAg
ICA8b3B0aW9uIHZhbHVlPSJvbmUiPk9uZTwvb3B0aW9uPgorICAgICAgICAgICAgPG9wdGlvbiB2
YWx1ZT0idHdvIj5Ud288L29wdGlvbj4KKyAgICAgICAgPC9zZWxlY3Q+ICAgICAgICAKKyAgICA8
L2JvZHk+Cis8L2h0bWw+Cg==
</data>
<flag name="review"
          id="15792"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
      

    </bug>

</bugzilla>