<?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>23433</bug_id>
          
          <creation_ts>2009-01-20 09:57:44 -0800</creation_ts>
          <short_desc>Add InputElement abstraction</short_desc>
          <delta_ts>2009-01-20 13:16:26 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>XML</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>20393</blocked>
    
    <blocked>23434</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikolas Zimmermann">zimmermann</reporter>
          <assigned_to name="Nikolas Zimmermann">zimmermann</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>106336</commentid>
    <comment_count>0</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 09:57:44 -0800</bug_when>
    <thetext>Add an abstract InputElement interface (just like ScriptElement) in dom/ allowing to share a lot of code between HTMLInputElement and the upcoming WMLInputElement.

In a previous step the rendering/RenderTextControl* classes have already been split up and prepared to support non-HTMLInputElement derived objects using these render classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106338</commentid>
    <comment_count>1</comment_count>
      <attachid>26863</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 10:06:39 -0800</bug_when>
    <thetext>Created attachment 26863
Initial patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106340</commentid>
    <comment_count>2</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 10:21:58 -0800</bug_when>
    <thetext>Forgot to mention: no regression, checked carefully since some weeks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106354</commentid>
    <comment_count>3</comment_count>
      <attachid>26863</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2009-01-20 11:34:44 -0800</bug_when>
    <thetext>Comment on attachment 26863
Initial patch

&gt; +        A lot of code from HTMLInputElement now lives in InputElement, as static member functions - the
&gt; +        InputElement class itself is an abstract virtual class, just like ScriptElement. HTML/WMLInputElement
&gt; +        derive from InputElement, and hold a InputElementData member variable, that they pass to the
&gt; +        static functions in InputElement. The abstraction is equal to the one chosen for HTML/SVGScriptElement.

Why do HTML/WMLInputElement hold the InputElementData, rather than InputElement itself? Is it just from a desire to keep InputElement an abstract base class?

&gt; +        * WebCore.xcodeproj/project.pbxproj:
&gt; +        * dom/FormControlElement.cpp: Added.
&gt; +        (WebCore::formControlElementForElement):
&gt; +        * dom/FormControlElement.h:
&gt; +        * dom/InputElement.cpp: Added.
&gt; +        (WebCore::InputElement::dispatchFocusEvent):
&gt; +        (WebCore::InputElement::dispatchBlurEvent):
&gt; +        (WebCore::InputElement::updatePlaceholderVisibility):
&gt; +        (WebCore::InputElement::updateFocusAppearance):
&gt; +        (WebCore::InputElement::updateSelectionRange):
&gt; +        (WebCore::InputElement::aboutToUnload):
&gt; +        (WebCore::InputElement::setValueFromRenderer):
&gt; +        (WebCore::numCharactersInGraphemeClusters):
&gt; +        (WebCore::InputElement::constrainValue):
&gt; +        (WebCore::numGraphemeClusters):
&gt; +        (WebCore::InputElement::handleBeforeTextInsertedEvent):
&gt; +        (WebCore::InputElement::parseSizeAttribute):
&gt; +        (WebCore::InputElement::parseMaxLengthAttribute):
&gt; +        (WebCore::InputElement::updateValueIfNeeded):
&gt; +        (WebCore::InputElement::notifyFormStateChanged):
&gt; +        (WebCore::InputElementData::InputElementData):
&gt; +        (WebCore::InputElementData::~InputElementData):
&gt; +        (WebCore::InputElementData::name):
&gt; +        (WebCore::inputElementForElement):
&gt; +        * dom/InputElement.h: Added.
&gt; +        (WebCore::InputElement::~InputElement):
&gt; +        (WebCore::InputElement::InputElement):
&gt; +        (WebCore::InputElementData::inputElement):
&gt; +        (WebCore::InputElementData::element):
&gt; +        (WebCore::InputElementData::placeholderShouldBeVisible):
&gt; +        (WebCore::InputElementData::setPlaceholderShouldBeVisible):
&gt; +        (WebCore::InputElementData::setName):
&gt; +        (WebCore::InputElementData::value):
&gt; +        (WebCore::InputElementData::setValue):
&gt; +        (WebCore::InputElementData::size):
&gt; +        (WebCore::InputElementData::setSize):
&gt; +        (WebCore::InputElementData::maxLength):
&gt; +        (WebCore::InputElementData::setMaxLength):
&gt; +        (WebCore::InputElementData::cachedSelectionStart):
&gt; +        (WebCore::InputElementData::setCachedSelectionStart):
&gt; +        (WebCore::InputElementData::cachedSelectionEnd):
&gt; +        (WebCore::InputElementData::setCachedSelectionEnd):
&gt; +        * html/HTMLInputElement.cpp:
&gt; +        (WebCore::HTMLInputElement::HTMLInputElement):
&gt; +        (WebCore::HTMLInputElement::name):
&gt; +        (WebCore::HTMLInputElement::updateFocusAppearance):
&gt; +        (WebCore::HTMLInputElement::aboutToUnload):
&gt; +        (WebCore::HTMLInputElement::dispatchFocusEvent):
&gt; +        (WebCore::HTMLInputElement::dispatchBlurEvent):
&gt; +        (WebCore::HTMLInputElement::setInputType):
&gt; +        (WebCore::HTMLInputElement::selectionStart):
&gt; +        (WebCore::HTMLInputElement::selectionEnd):
&gt; +        (WebCore::HTMLInputElement::setSelectionRange):
&gt; +        (WebCore::HTMLInputElement::parseMappedAttribute):
&gt; +        (WebCore::HTMLInputElement::appendFormData):
&gt; +        (WebCore::HTMLInputElement::size):
&gt; +        (WebCore::HTMLInputElement::copyNonAttributeProperties):
&gt; +        (WebCore::HTMLInputElement::value):
&gt; +        (WebCore::HTMLInputElement::setValue):
&gt; +        (WebCore::HTMLInputElement::placeholderValue):
&gt; +        (WebCore::HTMLInputElement::searchEventsShouldBeDispatched):
&gt; +        (WebCore::HTMLInputElement::setValueFromRenderer):
&gt; +        (WebCore::HTMLInputElement::setFileListFromRenderer):
&gt; +        (WebCore::HTMLInputElement::defaultEventHandler):
&gt; +        (WebCore::HTMLInputElement::setDefaultName):
&gt; +        (WebCore::HTMLInputElement::maxLength):
&gt; +        (WebCore::HTMLInputElement::constrainValue):
&gt; +        (WebCore::HTMLInputElement::cacheSelection):
&gt; +        (WebCore::HTMLInputElement::selection):
&gt; +        (WebCore::HTMLInputElement::placeholderShouldBeVisible):
&gt; +        * html/HTMLInputElement.h:
&gt; +        (WebCore::HTMLInputElement::isTextField):
&gt; +        (WebCore::HTMLInputElement::isSearchField):
&gt; +        (WebCore::HTMLInputElement::isAutofilled):
&gt; +        * html/HTMLIsIndexElement.cpp:
&gt; +        (WebCore::HTMLIsIndexElement::HTMLIsIndexElement):
&gt; +        * rendering/RenderTextControl.cpp:
&gt; +        (WebCore::RenderTextControl::formControlElement):
&gt; +        * rendering/RenderTextControlSingleLine.cpp:
&gt; +        (WebCore::RenderTextControlSingleLine::placeholderShouldBeVisible):
&gt; +        (WebCore::RenderTextControlSingleLine::addSearchResult):
&gt; +        (WebCore::RenderTextControlSingleLine::stopSearchEventTimer):
&gt; +        (WebCore::RenderTextControlSingleLine::showPopup):
&gt; +        (WebCore::RenderTextControlSingleLine::hidePopup):
&gt; +        (WebCore::RenderTextControlSingleLine::subtreeHasChanged):
&gt; +        (WebCore::RenderTextControlSingleLine::capsLockStateMayHaveChanged):
&gt; +        (WebCore::RenderTextControlSingleLine::preferredContentWidth):
&gt; +        (WebCore::RenderTextControlSingleLine::createSubtreeIfNeeded):
&gt; +        (WebCore::RenderTextControlSingleLine::updateFromElement):
&gt; +        (WebCore::RenderTextControlSingleLine::cacheSelection):
&gt; +        (WebCore::RenderTextControlSingleLine::createInnerBlockStyle):
&gt; +        (WebCore::RenderTextControlSingleLine::createResultsButtonStyle):
&gt; +        (WebCore::RenderTextControlSingleLine::createCancelButtonStyle):
&gt; +        (WebCore::RenderTextControlSingleLine::updateCancelButtonVisibility):
&gt; +        (WebCore::RenderTextControlSingleLine::startSearchEventTimer):
&gt; +        (WebCore::RenderTextControlSingleLine::searchEventTimerFired):
&gt; +        (WebCore::RenderTextControlSingleLine::valueChanged):
&gt; +        (WebCore::RenderTextControlSingleLine::setTextFromItem):
&gt; +        (WebCore::RenderTextControlSingleLine::inputElement):
&gt; +        * rendering/RenderTextControlSingleLine.h:

It would be useful to have function-level comments explaining how the code was moved around.

&gt; +void InputElement::dispatchFocusEvent(InputElementData&amp; data, Document* document)
&gt; +{
&gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; +        return;
&gt; +
&gt; +    InputElement::updatePlaceholderVisibility(data, document);

I don&apos;t think &quot;InputElement::&quot; is needed here or in the other member functions in this file.

&gt; +void InputElement::dispatchBlurEvent(InputElementData&amp; data, Document* document)
&gt; +{
&gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; +        return;
&gt; +
&gt; +    if (Frame* frame = document-&gt;frame()) {

You could make this an early return to remove some nesting.

&gt; +void InputElement::updatePlaceholderVisibility(InputElementData&amp; data, Document* document, bool placeholderValueChanged)
&gt; +{
&gt; +    ASSERT(data.inputElement()-&gt;isTextField());
&gt; +
&gt; +    bool oldPlaceholderShouldBeVisible = data.placeholderShouldBeVisible();
&gt; +    Element* element = data.element();
&gt; +
&gt; +    data.setPlaceholderShouldBeVisible(data.inputElement()-&gt;value().isEmpty() 
&gt; +                                       &amp;&amp; document-&gt;focusedNode() != element
&gt; +                                       &amp;&amp; !data.inputElement()-&gt;placeholderValue().isEmpty());
&gt; +
&gt; +    if ((oldPlaceholderShouldBeVisible != data.placeholderShouldBeVisible() || placeholderValueChanged) &amp;&amp; element-&gt;renderer())
&gt; +        static_cast&lt;RenderTextControlSingleLine*&gt;(element-&gt;renderer())-&gt;updatePlaceholderVisibility();

What guarantees that element-&gt;renderer() will be a RenderTextControlSingleLine?

&gt; +void InputElement::updateSelectionRange(InputElementData&amp; data, int start, int end)
&gt; +{
&gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; +        return;
&gt; +
&gt; +    if (RenderTextControl* renderer = static_cast&lt;RenderTextControl*&gt;(data.element()-&gt;renderer()))

What guarantees that data.element()-&gt;renderer() is a RenderTextControl?

&gt; +void InputElement::setValueFromRenderer(InputElementData&amp; data, Document* document, const String&amp; value)
&gt; +{
&gt; +    // Renderer and our event handler are responsible for constraining values.
&gt; +    ASSERT(value == data.inputElement()-&gt;constrainValue(value) || data.inputElement()-&gt;constrainValue(value).isEmpty());
&gt; +
&gt; +    if (data.inputElement()-&gt;isTextField())
&gt; +        InputElement::updatePlaceholderVisibility(data, document);
&gt; +
&gt; +    // Workaround for bug where trailing \n is included in the result of textContent.
&gt; +    // The assert macro above may also be simplified to:  value == constrainValue(value)
&gt; +    // http://bugs.webkit.org/show_bug.cgi?id=9661
&gt; +    if (value == &quot;\n&quot;)
&gt; +        data.setValue(&quot;&quot;);
&gt; +    else
&gt; +        data.setValue(value);
&gt; +
&gt; +    Element* element = data.element();
&gt; +    formControlElementForElement(element)-&gt;setValueMatchesRenderer();

Should we assert that formControlElementForElement returns a non-null value?

&gt; +String InputElement::constrainValue(const InputElementData&amp; data, const String&amp; proposedValue, int maxLength)
&gt; +{
&gt; +    String string = proposedValue;
&gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; +        return string;
&gt; +        
&gt; +    string.replace(&quot;\r\n&quot;, &quot; &quot;);
&gt; +    string.replace(&apos;\r&apos;, &apos; &apos;);
&gt; +    string.replace(&apos;\n&apos;, &apos; &apos;);
&gt; +    
&gt; +    StringImpl* s = string.impl();
&gt; +    int newLength = numCharactersInGraphemeClusters(s, maxLength);
&gt; +    for (int i = 0; i &lt; newLength; ++i) {
&gt; +        const UChar&amp; current = (*s)[i];
&gt; +        if (current &lt; &apos; &apos; &amp;&amp; current != &apos;\t&apos;) {
&gt; +            newLength = i;
&gt; +            break;
&gt; +        }
&gt; +    }
&gt; +
&gt; +    if (newLength &lt; static_cast&lt;int&gt;(string.length()))
&gt; +        return string.substring(0, newLength);

I believe String::left could be used here, but I know this isn&apos;t new code.

&gt; +void InputElement::parseMaxLengthAttribute(InputElementData&amp; data, MappedAttribute* attribute)
&gt; +{
&gt; +    int maxLength = attribute-&gt;isNull() ? InputElement::s_maximumLength : attribute-&gt;value().toInt();
&gt; +    if (maxLength &lt;= 0 || maxLength &gt; InputElement::s_maximumLength)
&gt; +        maxLength = InputElement::s_maximumLength;

Often we do this kind of clamping using max() and min(): maxLength = max(0, min(maxLength, InputElement::s_maximumLength))

&gt; @@ -348,9 +353,6 @@ void RenderTextControlSingleLine::styleD
&gt;  
&gt;  void RenderTextControlSingleLine::capsLockStateMayHaveChanged()
&gt;  {
&gt; -    if (!node() || !document())
&gt; -        return;
&gt; -

Why remove these null-checks?

r=me, but please consider these comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106358</commentid>
    <comment_count>4</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 11:46:43 -0800</bug_when>
    <thetext>&gt; Why do HTML/WMLInputElement hold the InputElementData, rather than InputElement
&gt; itself? Is it just from a desire to keep InputElement an abstract base class?
Yes exactly. We had this debate before when introducing ScriptElement(Data). Maciej strongly suggested to keep an ABC an ABC :-)
 
&gt; It would be useful to have function-level comments explaining how the code was
&gt; moved around.
Okay, I can try commenting better.

&gt; 
&gt; &gt; +void InputElement::dispatchFocusEvent(InputElementData&amp; data, Document* document)
&gt; &gt; +{
&gt; &gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    InputElement::updatePlaceholderVisibility(data, document);
&gt; 
&gt; I don&apos;t think &quot;InputElement::&quot; is needed here or in the other member functions
&gt; in this file.
True - I use this style to explicitely show I&apos;m calling another static function. But I can easily change it.
 
&gt; &gt; +void InputElement::dispatchBlurEvent(InputElementData&amp; data, Document* document)
&gt; &gt; +{
&gt; &gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    if (Frame* frame = document-&gt;frame()) {
&gt; 
&gt; You could make this an early return to remove some nesting.
Will fix.

&gt; 
&gt; &gt; +void InputElement::updatePlaceholderVisibility(InputElementData&amp; data, Document* document, bool placeholderValueChanged)
&gt; &gt; +{
&gt; &gt; +    ASSERT(data.inputElement()-&gt;isTextField());
&gt; &gt; +
&gt; &gt; +    bool oldPlaceholderShouldBeVisible = data.placeholderShouldBeVisible();
&gt; &gt; +    Element* element = data.element();
&gt; &gt; +
&gt; &gt; +    data.setPlaceholderShouldBeVisible(data.inputElement()-&gt;value().isEmpty() 
&gt; &gt; +                                       &amp;&amp; document-&gt;focusedNode() != element
&gt; &gt; +                                       &amp;&amp; !data.inputElement()-&gt;placeholderValue().isEmpty());
&gt; &gt; +
&gt; &gt; +    if ((oldPlaceholderShouldBeVisible != data.placeholderShouldBeVisible() || placeholderValueChanged) &amp;&amp; element-&gt;renderer())
&gt; &gt; +        static_cast&lt;RenderTextControlSingleLine*&gt;(element-&gt;renderer())-&gt;updatePlaceholderVisibility();
&gt; 
&gt; What guarantees that element-&gt;renderer() will be a RenderTextControlSingleLine?
The ASSERT above relating to isTextField(). See HTMLInputElement::createRenderer, and HTMLInputElement::isTextField().

&gt; 
&gt; &gt; +void InputElement::updateSelectionRange(InputElementData&amp; data, int start, int end)
&gt; &gt; +{
&gt; &gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    if (RenderTextControl* renderer = static_cast&lt;RenderTextControl*&gt;(data.element()-&gt;renderer()))
&gt; 
&gt; What guarantees that data.element()-&gt;renderer() is a RenderTextControl?
Same reason as above.

&gt; 
&gt; &gt; +void InputElement::setValueFromRenderer(InputElementData&amp; data, Document* document, const String&amp; value)
&gt; &gt; +{
&gt; &gt; +    // Renderer and our event handler are responsible for constraining values.
&gt; &gt; +    ASSERT(value == data.inputElement()-&gt;constrainValue(value) || data.inputElement()-&gt;constrainValue(value).isEmpty());
&gt; &gt; +
&gt; &gt; +    if (data.inputElement()-&gt;isTextField())
&gt; &gt; +        InputElement::updatePlaceholderVisibility(data, document);
&gt; &gt; +
&gt; &gt; +    // Workaround for bug where trailing \n is included in the result of textContent.
&gt; &gt; +    // The assert macro above may also be simplified to:  value == constrainValue(value)
&gt; &gt; +    // http://bugs.webkit.org/show_bug.cgi?id=9661
&gt; &gt; +    if (value == &quot;\n&quot;)
&gt; &gt; +        data.setValue(&quot;&quot;);
&gt; &gt; +    else
&gt; &gt; +        data.setValue(value);
&gt; &gt; +
&gt; &gt; +    Element* element = data.element();
&gt; &gt; +    formControlElementForElement(element)-&gt;setValueMatchesRenderer();
&gt; 
&gt; Should we assert that formControlElementForElement returns a non-null value?
That&apos;s an implicit assertion here, if an &apos;Element&apos; class derives from InputElement, it derived from &apos;FormControlElement&apos; as well. Do you prefer an assertion?
 
&gt; &gt; +String InputElement::constrainValue(const InputElementData&amp; data, const String&amp; proposedValue, int maxLength)
&gt; &gt; +{
&gt; &gt; +    String string = proposedValue;
&gt; &gt; +    if (!data.inputElement()-&gt;isTextField())
&gt; &gt; +        return string;
&gt; &gt; +        
&gt; &gt; +    string.replace(&quot;\r\n&quot;, &quot; &quot;);
&gt; &gt; +    string.replace(&apos;\r&apos;, &apos; &apos;);
&gt; &gt; +    string.replace(&apos;\n&apos;, &apos; &apos;);
&gt; &gt; +    
&gt; &gt; +    StringImpl* s = string.impl();
&gt; &gt; +    int newLength = numCharactersInGraphemeClusters(s, maxLength);
&gt; &gt; +    for (int i = 0; i &lt; newLength; ++i) {
&gt; &gt; +        const UChar&amp; current = (*s)[i];
&gt; &gt; +        if (current &lt; &apos; &apos; &amp;&amp; current != &apos;\t&apos;) {
&gt; &gt; +            newLength = i;
&gt; &gt; +            break;
&gt; &gt; +        }
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    if (newLength &lt; static_cast&lt;int&gt;(string.length()))
&gt; &gt; +        return string.substring(0, newLength);
&gt; 
&gt; I believe String::left could be used here, but I know this isn&apos;t new code.
Okay, will fix anyway.

 
&gt; &gt; +void InputElement::parseMaxLengthAttribute(InputElementData&amp; data, MappedAttribute* attribute)
&gt; &gt; +{
&gt; &gt; +    int maxLength = attribute-&gt;isNull() ? InputElement::s_maximumLength : attribute-&gt;value().toInt();
&gt; &gt; +    if (maxLength &lt;= 0 || maxLength &gt; InputElement::s_maximumLength)
&gt; &gt; +        maxLength = InputElement::s_maximumLength;
&gt; 
&gt; Often we do this kind of clamping using max() and min(): maxLength = max(0,
&gt; min(maxLength, InputElement::s_maximumLength))
Right, will fix.
 
&gt; &gt; @@ -348,9 +353,6 @@ void RenderTextControlSingleLine::styleD
&gt; &gt;  
&gt; &gt;  void RenderTextControlSingleLine::capsLockStateMayHaveChanged()
&gt; &gt;  {
&gt; &gt; -    if (!node() || !document())
&gt; &gt; -        return;
&gt; &gt; -
&gt; 
&gt; Why remove these null-checks?
Oops, leftover from testing, to see if any code hits those conditions. It doesn&apos;t, but i&apos;ll readd them to be on the safe side.

Thanks for the quick review, going to post another patch soon.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106360</commentid>
    <comment_count>5</comment_count>
      <attachid>26866</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 12:09:58 -0800</bug_when>
    <thetext>Created attachment 26866
Updated patch

Fixed Adams issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106361</commentid>
    <comment_count>6</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 12:10:48 -0800</bug_when>
    <thetext>Oops, patch contains a typo, missing semicolon in one line maxLength = max(0, ....);. Please ignore.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106367</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2009-01-20 12:19:52 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; &gt; +void InputElement::updatePlaceholderVisibility(InputElementData&amp; data, Document* document, bool placeholderValueChanged)
&gt; &gt; &gt; +{
&gt; &gt; &gt; +    ASSERT(data.inputElement()-&gt;isTextField());
&gt; &gt; &gt; +
&gt; &gt; &gt; +    bool oldPlaceholderShouldBeVisible = data.placeholderShouldBeVisible();
&gt; &gt; &gt; +    Element* element = data.element();
&gt; &gt; &gt; +
&gt; &gt; &gt; +    data.setPlaceholderShouldBeVisible(data.inputElement()-&gt;value().isEmpty() 
&gt; &gt; &gt; +                                       &amp;&amp; document-&gt;focusedNode() != element
&gt; &gt; &gt; +                                       &amp;&amp; !data.inputElement()-&gt;placeholderValue().isEmpty());
&gt; &gt; &gt; +
&gt; &gt; &gt; +    if ((oldPlaceholderShouldBeVisible != data.placeholderShouldBeVisible() || placeholderValueChanged) &amp;&amp; element-&gt;renderer())
&gt; &gt; &gt; +        static_cast&lt;RenderTextControlSingleLine*&gt;(element-&gt;renderer())-&gt;updatePlaceholderVisibility();
&gt; &gt; 
&gt; &gt; What guarantees that element-&gt;renderer() will be a RenderTextControlSingleLine?
&gt; The ASSERT above relating to isTextField(). See
&gt; HTMLInputElement::createRenderer, and HTMLInputElement::isTextField().


What if we have markup such as:

&lt;input style=&quot;-webkit-appearance: button&quot;&gt;

Will we still get a RenderTextControlSingleLine?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106368</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2009-01-20 12:22:22 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; &gt; +void InputElement::setValueFromRenderer(InputElementData&amp; data, Document* document, const String&amp; value)
&gt; &gt; &gt; +{
&gt; &gt; &gt; +    // Renderer and our event handler are responsible for constraining values.
&gt; &gt; &gt; +    ASSERT(value == data.inputElement()-&gt;constrainValue(value) || data.inputElement()-&gt;constrainValue(value).isEmpty());
&gt; &gt; &gt; +
&gt; &gt; &gt; +    if (data.inputElement()-&gt;isTextField())
&gt; &gt; &gt; +        InputElement::updatePlaceholderVisibility(data, document);
&gt; &gt; &gt; +
&gt; &gt; &gt; +    // Workaround for bug where trailing \n is included in the result of textContent.
&gt; &gt; &gt; +    // The assert macro above may also be simplified to:  value == constrainValue(value)
&gt; &gt; &gt; +    // http://bugs.webkit.org/show_bug.cgi?id=9661
&gt; &gt; &gt; +    if (value == &quot;\n&quot;)
&gt; &gt; &gt; +        data.setValue(&quot;&quot;);
&gt; &gt; &gt; +    else
&gt; &gt; &gt; +        data.setValue(value);
&gt; &gt; &gt; +
&gt; &gt; &gt; +    Element* element = data.element();
&gt; &gt; &gt; +    formControlElementForElement(element)-&gt;setValueMatchesRenderer();
&gt; &gt; 
&gt; &gt; Should we assert that formControlElementForElement returns a non-null value?
&gt; That&apos;s an implicit assertion here, if an &apos;Element&apos; class derives from
&gt; InputElement, it derived from &apos;FormControlElement&apos; as well. Do you prefer an
&gt; assertion?

Nothing in the code above says to me &quot;element&apos;s derived type derives from InputElement&quot;. All I see is &quot;element is an Element, and we&apos;d like the corresponding FormControlElement for it&quot;. So I do think an assertion would be helpful.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106369</commentid>
    <comment_count>9</comment_count>
      <attachid>26866</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2009-01-20 12:27:01 -0800</bug_when>
    <thetext>Comment on attachment 26866
Updated patch

&gt; +void InputElement::notifyFormStateChanged(InputElementData&amp; data, Document* document)
&gt; +{
&gt; +    Frame* frame = document-&gt;frame();
&gt; +    if (!frame)
&gt; +        return;
&gt; +
&gt; +    frame-&gt;page()-&gt;chrome()-&gt;client()-&gt;formStateDidChange(data.element());

I still think we should be null-checking frame-&gt;page() here.

&gt; +class InputElementData {
&gt; +public:
&gt; +    InputElementData(InputElement*, Element*);

When will these two parameters not have the same value? Maybe a comment here in the header explaining their purpose would help.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106375</commentid>
    <comment_count>10</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 12:57:17 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 26866 [review])
&gt; &gt; +void InputElement::notifyFormStateChanged(InputElementData&amp; data, Document* document)
&gt; &gt; +{
&gt; &gt; +    Frame* frame = document-&gt;frame();
&gt; &gt; +    if (!frame)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    frame-&gt;page()-&gt;chrome()-&gt;client()-&gt;formStateDidChange(data.element());
&gt; 
&gt; I still think we should be null-checking frame-&gt;page() here.
Fixed.

&gt; 
&gt; &gt; +class InputElementData {
&gt; &gt; +public:
&gt; &gt; +    InputElementData(InputElement*, Element*);
&gt; 
&gt; When will these two parameters not have the same value? Maybe a comment here in
&gt; the header explaining their purpose would help.
They always have the same value. But as InputElement doesn&apos;t inherit from Element, it&apos;s not possible to just pass one value here (just like it&apos;s done in ScriptElementData).

Thanks for r+.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106380</commentid>
    <comment_count>11</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-01-20 13:16:26 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; &gt; 
&gt; &gt; &gt; What guarantees that element-&gt;renderer() will be a RenderTextControlSingleLine?
&gt; &gt; The ASSERT above relating to isTextField(). See
&gt; &gt; HTMLInputElement::createRenderer, and HTMLInputElement::isTextField().
&gt; 
&gt; 
&gt; What if we have markup such as:
&gt; 
&gt; &lt;input style=&quot;-webkit-appearance: button&quot;&gt;
&gt; 
&gt; Will we still get a RenderTextControlSingleLine?
The renderer creation depends only on the &apos;type&apos; attribute, so this won&apos;t affect it.

Landed patch in r40065.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26863</attachid>
            <date>2009-01-20 10:06:39 -0800</date>
            <delta_ts>2009-01-20 12:09:58 -0800</delta_ts>
            <desc>Initial patch</desc>
            <filename>InputElementAbstraction.diff</filename>
            <type>text/plain</type>
            <size>71584</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQwMDU4
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIxIEBACisyMDA5LTAx
LTIwICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1hbm5AdG9yY2htb2JpbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eGVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM0MzMKKworICAg
ICAgICBBZGQgSW5wdXRFbGVtZW50IGFic3RyYWN0aW9uLCBzaW1pbGFyIHRvIHRoZSBGb3JtQ29u
dHJvbEVsZW1lbnQgcmVmYWN0b3JpemF0aW9uCisgICAgICAgIGRvbmUgYSBtb250aCBhZ28uIFRo
ZSBnb2FsIGlzIHRvIHNoYXJlIGFzIG11Y2ggY29kZSBhcyBwb3NzaWJsZSBiZXR3ZWVuIEhUTUwv
V01MSW5wdXRFbGVtZW50LgorICAgICAgICBJbiBhIHByZXZpb3VzIHBhdGNoIHRoZSBSZW5kZXJU
ZXh0Q29udHJvbCBjbGFzcyBoYXMgYmVlbiBzcGxpdC11cCBpbiBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZS9NdWx0aUxpbmUsCisgICAgICAgIFJlbmRlclRleHRDb250cm9sIGl0c2VsZiBvbmx5IGRl
cGVuZHMgb24gRm9ybUNvbnRyb2xFbGVtZW50LCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUg
c3RpbGwKKyAgICAgICAgZGVwZW5kcyBvbiBIVE1MSW5wdXRFbGVtZW50IGRpcmVjdGx5IC0+IGNo
YW5nZSB0aGF0IGFuZCBtYWtlIGl0IHVzZSB0aGUgbmV3IElucHV0RWxlbWVudCBhYnN0cmFjdGlv
bi4KKworICAgICAgICBBIGxvdCBvZiBjb2RlIGZyb20gSFRNTElucHV0RWxlbWVudCBub3cgbGl2
ZXMgaW4gSW5wdXRFbGVtZW50LCBhcyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyAtIHRoZQorICAg
ICAgICBJbnB1dEVsZW1lbnQgY2xhc3MgaXRzZWxmIGlzIGFuIGFic3RyYWN0IHZpcnR1YWwgY2xh
c3MsIGp1c3QgbGlrZSBTY3JpcHRFbGVtZW50LiBIVE1ML1dNTElucHV0RWxlbWVudAorICAgICAg
ICBkZXJpdmUgZnJvbSBJbnB1dEVsZW1lbnQsIGFuZCBob2xkIGEgSW5wdXRFbGVtZW50RGF0YSBt
ZW1iZXIgdmFyaWFibGUsIHRoYXQgdGhleSBwYXNzIHRvIHRoZQorICAgICAgICBzdGF0aWMgZnVu
Y3Rpb25zIGluIElucHV0RWxlbWVudC4gVGhlIGFic3RyYWN0aW9uIGlzIGVxdWFsIHRvIHRoZSBv
bmUgY2hvc2VuIGZvciBIVE1ML1NWR1NjcmlwdEVsZW1lbnQuCisKKyAgICAgICAgKiBXZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogZG9tL0Zvcm1Db250cm9sRWxl
bWVudC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Zm9ybUNvbnRyb2xFbGVtZW50Rm9y
RWxlbWVudCk6CisgICAgICAgICogZG9tL0Zvcm1Db250cm9sRWxlbWVudC5oOgorICAgICAgICAq
IGRvbS9JbnB1dEVsZW1lbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxl
bWVudDo6ZGlzcGF0Y2hGb2N1c0V2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVu
dDo6ZGlzcGF0Y2hCbHVyRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50Ojp1
cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVt
ZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVt
ZW50Ojp1cGRhdGVTZWxlY3Rpb25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1l
bnQ6OmFib3V0VG9VbmxvYWQpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50OjpzZXRW
YWx1ZUZyb21SZW5kZXJlcik6CisgICAgICAgIChXZWJDb3JlOjpudW1DaGFyYWN0ZXJzSW5HcmFw
aGVtZUNsdXN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6Y29uc3RyYWlu
VmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6bnVtR3JhcGhlbWVDbHVzdGVycyk6CisgICAgICAg
IChXZWJDb3JlOjpJbnB1dEVsZW1lbnQ6OmhhbmRsZUJlZm9yZVRleHRJbnNlcnRlZEV2ZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6cGFyc2VTaXplQXR0cmlidXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6cGFyc2VNYXhMZW5ndGhBdHRyaWJ1dGUpOgor
ICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50Ojp1cGRhdGVWYWx1ZUlmTmVlZGVkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6bm90aWZ5Rm9ybVN0YXRlQ2hhbmdlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjpJbnB1dEVsZW1lbnREYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6On5JbnB1dEVsZW1lbnREYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6Om5hbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6aW5wdXRFbGVtZW50Rm9yRWxlbWVudCk6CisgICAgICAgICogZG9tL0lucHV0RWxlbWVudC5o
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6fklucHV0RWxlbWVudCk6
CisgICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnQ6OklucHV0RWxlbWVudCk6CisgICAgICAg
IChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjppbnB1dEVsZW1lbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6SW5wdXRFbGVtZW50RGF0YTo6ZWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpJbnB1
dEVsZW1lbnREYXRhOjpwbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSk6CisgICAgICAgIChXZWJD
b3JlOjpJbnB1dEVsZW1lbnREYXRhOjpzZXRQbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjpzZXROYW1lKToKKyAgICAgICAgKFdl
YkNvcmU6OklucHV0RWxlbWVudERhdGE6OnZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0
RWxlbWVudERhdGE6OnNldFZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERh
dGE6OnNpemUpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50RGF0YTo6c2V0U2l6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjptYXhMZW5ndGgpOgorICAgICAg
ICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50RGF0YTo6c2V0TWF4TGVuZ3RoKToKKyAgICAgICAgKFdl
YkNvcmU6OklucHV0RWxlbWVudERhdGE6OmNhY2hlZFNlbGVjdGlvblN0YXJ0KToKKyAgICAgICAg
KFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6OnNldENhY2hlZFNlbGVjdGlvblN0YXJ0KToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6OmNhY2hlZFNlbGVjdGlvbkVuZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjpzZXRDYWNoZWRTZWxlY3Rpb25FbmQp
OgorICAgICAgICAqIGh0bWwvSFRNTElucHV0RWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MSW5wdXRFbGVtZW50OjpIVE1MSW5wdXRFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxJbnB1dEVsZW1lbnQ6Om5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxl
bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1
dEVsZW1lbnQ6OmFib3V0VG9VbmxvYWQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxl
bWVudDo6ZGlzcGF0Y2hGb2N1c0V2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVs
ZW1lbnQ6OmRpc3BhdGNoQmx1ckV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVs
ZW1lbnQ6OnNldElucHV0VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50
OjpzZWxlY3Rpb25TdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50Ojpz
ZWxlY3Rpb25FbmQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6c2V0U2Vs
ZWN0aW9uUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6YXBw
ZW5kRm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6c2l6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50Ojpjb3B5Tm9uQXR0cmlidXRlUHJv
cGVydGllcyk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50Ojp2YWx1ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpzZXRWYWx1ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpwbGFjZWhvbGRlclZhbHVlKToKKyAgICAgICAgKFdl
YkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OnNlYXJjaEV2ZW50c1Nob3VsZEJlRGlzcGF0Y2hlZCk6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpzZXRWYWx1ZUZyb21SZW5kZXJl
cik6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpzZXRGaWxlTGlzdEZyb21S
ZW5kZXJlcik6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpkZWZhdWx0RXZl
bnRIYW5kbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OnNldERlZmF1
bHROYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6Om1heExlbmd0aCk6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50Ojpjb25zdHJhaW5WYWx1ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpjYWNoZVNlbGVjdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpzZWxlY3Rpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTElucHV0RWxlbWVudDo6cGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUpOgorICAg
ICAgICAqIGh0bWwvSFRNTElucHV0RWxlbWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElu
cHV0RWxlbWVudDo6aXNUZXh0RmllbGQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxl
bWVudDo6aXNTZWFyY2hGaWVsZCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50
Ojppc0F1dG9maWxsZWQpOgorICAgICAgICAqIGh0bWwvSFRNTElzSW5kZXhFbGVtZW50LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkhUTUxJc0luZGV4RWxlbWVudDo6SFRNTElzSW5kZXhFbGVtZW50
KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmZvcm1Db250cm9sRWxlbWVudCk6CisgICAgICAg
ICogcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnBsYWNlaG9sZGVyU2hvdWxkQmVW
aXNpYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6
YWRkU2VhcmNoUmVzdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6c3RvcFNlYXJjaEV2ZW50VGltZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzaG93UG9wdXApOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpoaWRlUG9wdXApOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzdWJ0cmVlSGFzQ2hhbmdlZCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNhcHNMb2NrU3RhdGVNYXlI
YXZlQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6OnByZWZlcnJlZENvbnRlbnRXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZVN1YnRyZWVJZk5lZWRlZCk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZUZyb21FbGVtZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2FjaGVTZWxlY3Rp
b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjcmVh
dGVJbm5lckJsb2NrU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjpjcmVhdGVSZXN1bHRzQnV0dG9uU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjcmVhdGVDYW5jZWxCdXR0b25TdHlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZUNhbmNl
bEJ1dHRvblZpc2liaWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjpzdGFydFNlYXJjaEV2ZW50VGltZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzZWFyY2hFdmVudFRpbWVyRmlyZWQpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjp2YWx1ZUNoYW5nZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzZXRUZXh0RnJv
bUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpp
bnB1dEVsZW1lbnQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmUuaDoKKwogMjAwOS0wMS0yMCAgTmlrb2xhcyBaaW1tZXJtYW5uICA8bmlrb2xhcy56aW1t
ZXJtYW5uQHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXggZm9yIFdNTCBlbmFi
bGVkIGJ1aWxkcywgbm90IHJldmlld2VkLgpJbmRleDogV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkocmV2aXNpb24gNDAwNTMpCisrKyBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJ
KHdvcmtpbmcgY29weSkKQEAgLTYwLDEwICs2MCwxMiBAQAogCQkwODREQkFBMTBFRDM5RDM2MDAz
OEMyMjYgLyogV01MVmFyaWFibGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDA4NERCQTlEMEVEMzlEMzUwMDM4QzIyNiAvKiBXTUxWYXJpYWJsZXMu
Y3BwICovOyB9OwogCQkwODREQkFBMjBFRDM5RDM2MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODREQkE5RTBF
RDM5RDM2MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmggKi87IH07CiAJCTA4NTc3MzM1MEYwODQ2
MDEwMDgwNTgzRSAvKiBGb3JtQ29udHJvbEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4NTc3MzM0MEYwODQ2MDEwMDgwNTgzRSAvKiBGb3Jt
Q29udHJvbEVsZW1lbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OworCQkwODU5MUFBNTBGMDg1QzRFMDA5QkFDQjEgLyogSW5wdXRFbGVtZW50LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODU5MUFBNDBGMDg1
QzRFMDA5QkFDQjEgLyogSW5wdXRFbGVtZW50LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMg
PSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMDg1QjkyQkEwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1E
YXRhQnVpbGRlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSAwODVCOTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCAqLzsg
fTsKIAkJMDg1QjkyQkIwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1EYXRhQnVpbGRlci5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg1QjkyQjkwRUZERTcz
RDAwRTYxMjNDIC8qIEZvcm1EYXRhQnVpbGRlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVT
ID0gKFByaXZhdGUsICk7IH07IH07CiAJCTA4NjVDQ0U2MEVEREY1MUIwMERGOUVDMyAvKiBXTUxO
b29wRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSAwODY1Q0NFNDBFRERGNTFCMDBERjlFQzMgLyogV01MTm9vcEVsZW1lbnQuY3BwICovOyB9
OwogCQkwODY1Q0NFNzBFRERGNTFCMDBERjlFQzMgLyogV01MTm9vcEVsZW1lbnQuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4NjVDQ0U1MEVEREY1MUIw
MERGOUVDMyAvKiBXTUxOb29wRWxlbWVudC5oICovOyB9OworCQkwODcwMEJFNzBGMDg2QzUzMDA5
MTk0MTkgLyogSW5wdXRFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDA4NzAwQkU2MEYwODZDNTMwMDkxOTQxOSAvKiBJbnB1dEVsZW1lbnQu
Y3BwICovOyB9OwogCQkwODc0NEJBQTBFREI3RDg2MDA0QzlFNjMgLyogV01MT25FdmVudEVsZW1l
bnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg3
NDRCQTkwRURCN0Q4NjAwNEM5RTYzIC8qIFdNTE9uRXZlbnRFbGVtZW50LmNwcCAqLzsgfTsKIAkJ
MDg3NDRCQUUwRURCN0Q5MjAwNEM5RTYzIC8qIFdNTE9uRXZlbnRFbGVtZW50LmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODc0NEJBRDBFREI3RDkyMDA0
QzlFNjMgLyogV01MT25FdmVudEVsZW1lbnQuaCAqLzsgfTsKIAkJMDg3RkZBMEYwRUZGM0VEMzAw
OURCRDg4IC8qIFdNTEluc2VydGVkTGVnZW5kRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODdGRkEwRDBFRkYzRUQzMDA5REJEODggLyog
V01MSW5zZXJ0ZWRMZWdlbmRFbGVtZW50LmNwcCAqLzsgfTsKQEAgLTEwMSw2ICsxMDMsNyBAQAog
CQkwOEE0ODQ3NzBFNTI3MkM1MDBDM0ZFNzYgLyogU2NyaXB0RWxlbWVudC5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOEE0ODQ3NTBFNTI3MkM1MDBD
M0ZFNzYgLyogU2NyaXB0RWxlbWVudC5jcHAgKi87IH07CiAJCTA4QTQ4NDc4MEU1MjcyQzUwMEMz
RkU3NiAvKiBTY3JpcHRFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwOEE0ODQ3NjBFNTI3MkM1MDBDM0ZFNzYgLyogU2NyaXB0RWxlbWVudC5o
ICovOyB9OwogCQkwOEE0OEE2RTBFODZDRjZEMDBFMjI1REQgLyogSlNTVkdFbGVtZW50SW5zdGFu
Y2VDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMDhBNDhBNkQwRTg2Q0Y2RDAwRTIyNUREIC8qIEpTU1ZHRWxlbWVudEluc3RhbmNlQ3VzdG9t
LmNwcCAqLzsgfTsKKwkJMDhCRkRGQzQwRjA5OUU3MDAwN0RDMkJGIC8qIEZvcm1Db250cm9sRWxl
bWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAw
OEJGREZDMzBGMDk5RTcwMDA3REMyQkYgLyogRm9ybUNvbnRyb2xFbGVtZW50LmNwcCAqLzsgfTsK
IAkJMDhDNEM1MTgwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlRWxlbWVudC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOEM0QzUxNDBFRjE5QTQw
MDBFNDg0MEYgLyogV01MSW1hZ2VFbGVtZW50LmNwcCAqLzsgfTsKIAkJMDhDNEM1MTkwRUYxOUE0
MDAwRTQ4NDBGIC8qIFdNTEltYWdlRWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMDhDNEM1MTUwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdl
RWxlbWVudC5oICovOyB9OwogCQkwOEM0QzUxQTBFRjE5QTQwMDBFNDg0MEYgLyogV01MSW1hZ2VM
b2FkZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MDhDNEM1MTYwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlTG9hZGVyLmNwcCAqLzsgfTsKQEAg
LTQ4ODYsMTAgKzQ4ODksMTIgQEAKIAkJMDg0REJBOUQwRUQzOUQzNTAwMzhDMjI2IC8qIFdNTFZh
cmlhYmxlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXTUxWYXJp
YWJsZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODREQkE5RTBFRDM5RDM2
MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFdNTFZhcmlhYmxlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODU3NzMz
NDBGMDg0NjAxMDA4MDU4M0UgLyogRm9ybUNvbnRyb2xFbGVtZW50LmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IEZvcm1Db250cm9sRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwODU5MUFBNDBGMDg1QzRFMDA5QkFDQjEgLyogSW5wdXRFbGVtZW50Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IElucHV0RWxlbWVudC5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQkwODVCOTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURh
dGFCdWlsZGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1E
YXRhQnVpbGRlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NUI5MkI5MEVG
REU3M0QwMEU2MTIzQyAvKiBGb3JtRGF0YUJ1aWxkZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gRm9ybURhdGFCdWlsZGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTA4NjVDQ0U0MEVEREY1MUIwMERGOUVDMyAvKiBXTUxOb29wRWxlbWVudC5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXTUxOb29wRWxlbWVudC5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NjVDQ0U1MEVEREY1MUIwMERGOUVDMyAvKiBXTUxO
b29wRWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXTUxOb29wRWxl
bWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwODcwMEJFNjBGMDg2QzUzMDA5
MTk0MTkgLyogSW5wdXRFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IElucHV0RWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4
NzQ0QkE5MEVEQjdEODYwMDRDOUU2MyAvKiBXTUxPbkV2ZW50RWxlbWVudC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXTUxPbkV2ZW50RWxlbWVudC5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NzQ0QkFEMEVEQjdEOTIwMDRDOUU2MyAvKiBXTUxP
bkV2ZW50RWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXTUxPbkV2
ZW50RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODdGRkEwRDBFRkYz
RUQzMDA5REJEODggLyogV01MSW5zZXJ0ZWRMZWdlbmRFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFdNTEluc2VydGVkTGVnZW5kRWxlbWVudC5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC00OTE1LDYgKzQ5MjAsNyBAQAogCQkwOEE0ODQ3
NTBFNTI3MkM1MDBDM0ZFNzYgLyogU2NyaXB0RWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBTY3JpcHRFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJMDhBNDg0NzYwRTUyNzJDNTAwQzNGRTc2IC8qIFNjcmlwdEVsZW1lbnQuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2NyaXB0RWxlbWVudC5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQkwOEE0OEE2RDBFODZDRjZEMDBFMjI1REQgLyogSlNTVkdF
bGVtZW50SW5zdGFuY2VDdXN0b20uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gSlNTVkdFbGVtZW50SW5zdGFuY2VDdXN0b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQkwOEJGREZDMzBGMDk5RTcwMDA3REMyQkYgLyogRm9ybUNvbnRyb2xFbGVtZW50
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1Db250cm9sRWxl
bWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4QzRDNTE0MEVGMTlBNDAw
MEU0ODQwRiAvKiBXTUxJbWFnZUVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gV01MSW1hZ2VFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJMDhDNEM1MTUwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlRWxlbWVudC5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXTUxJbWFnZUVsZW1lbnQuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDhDNEM1MTYwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdl
TG9hZGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFdNTEltYWdl
TG9hZGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE0MjEyLDggKzE0MjE4
LDExIEBACiAJCQkJQkM2MEQ4RjEwRDJBMTFFMDAwQjk5MThGIC8qIEV4Y2VwdGlvbkJhc2UuaCAq
LywKIAkJCQk5MzgzMUI1NjBEMDg3RDYwMDBFNUM5ODQgLyogRXhjZXB0aW9uQ29kZS5jcHAgKi8s
CiAJCQkJOTM1RkJDRjEwOUJBMTQzQjAwRTIzMEIxIC8qIEV4Y2VwdGlvbkNvZGUuaCAqLywKKwkJ
CQkwOEJGREZDMzBGMDk5RTcwMDA3REMyQkYgLyogRm9ybUNvbnRyb2xFbGVtZW50LmNwcCAqLywK
IAkJCQkwODU3NzMzNDBGMDg0NjAxMDA4MDU4M0UgLyogRm9ybUNvbnRyb2xFbGVtZW50LmggKi8s
CiAJCQkJMEJBNUQzODUwRjI0MEZCNDAwOUI4NzBCIC8qIEdlbmVyaWNXb3JrZXJUYXNrLmggKi8s
CisJCQkJMDg3MDBCRTYwRjA4NkM1MzAwOTE5NDE5IC8qIElucHV0RWxlbWVudC5jcHAgKi8sCisJ
CQkJMDg1OTFBQTQwRjA4NUM0RTAwOUJBQ0IxIC8qIElucHV0RWxlbWVudC5oICovLAogCQkJCTg1
MDMxQjJEMEE0NEVGQzcwMEY5OTJFMCAvKiBLZXlib2FyZEV2ZW50LmNwcCAqLywKIAkJCQk4NTAz
MUIyRTBBNDRFRkM3MDBGOTkyRTAgLyogS2V5Ym9hcmRFdmVudC5oICovLAogCQkJCTE0Q0Y3QzIw
MDlGNzExMDYwMEVCMzY2NSAvKiBLZXlib2FyZEV2ZW50LmlkbCAqLywKQEAgLTE1NDkyLDYgKzE1
NTAxLDcgQEAKIAkJCQlBOENGRjVFMzBBMTU1QTA1MDAwQTQyMzQgLyogSW5saW5lRmxvd0JveC5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJQThDRkY1RTIwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZVJ1
bkJveC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4NUEwOTdEOTMwMjAwOTRDOUU0IC8qIElu
bGluZVRleHRCb3guaCBpbiBIZWFkZXJzICovLAorCQkJCTA4NTkxQUE1MEYwODVDNEUwMDlCQUNC
MSAvKiBJbnB1dEVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzMzA5REVBMDk5RTY0OTIw
MDU2RTU4MSAvKiBJbnNlcnRJbnRvVGV4dE5vZGVDb21tYW5kLmggaW4gSGVhZGVycyAqLywKIAkJ
CQk5MzMwOURFQzA5OUU2NDkyMDA1NkU1ODEgLyogSW5zZXJ0TGluZUJyZWFrQ29tbWFuZC5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJRDA3REVBQkEwQTM2NTU0QTAwQ0EzMEY4IC8qIEluc2VydExpc3RD
b21tYW5kLmggaW4gSGVhZGVycyAqLywKQEAgLTE3MzIwLDYgKzE3MzMwLDcgQEAKIAkJCQkzNzI0
Q0E3RTBFNjhCMjA1MDBEQjQzODQgLyogRm9udE1hY0NvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCUIyQUZGQzgyMEQwMEE1QzEwMDMwMDc0RCAvKiBGb250UGxhdGZvcm1EYXRhTWFjLm1t
IGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZDRjEwQTE5ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1
ZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwOEJGREZDNDBGMDk5RTcwMDA3REMyQkYgLyogRm9y
bUNvbnRyb2xFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUxNEM3NjZGMENFOTIzQTEw
MDdFRjNDRCAvKiBGb3JtRGF0YS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwODVCOTJCQTBFRkRF
NzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4
MTM2RDM5MDk3M0E4RTcwMEQ3NDQ2MyAvKiBGb3JtRGF0YUxpc3QuY3BwIGluIFNvdXJjZXMgKi8s
CkBAIC0xNzQ1Miw2ICsxNzQ2Myw3IEBACiAJCQkJQThDRkY1RTYwQTE1NUEwNTAwMEE0MjM0IC8q
IElubGluZUJveC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBOENGRjVFNDBBMTU1QTA1MDAwQTQy
MzQgLyogSW5saW5lRmxvd0JveC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg1OTA5N0Q5
MzAyMDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwODcw
MEJFNzBGMDg2QzUzMDA5MTk0MTkgLyogSW5wdXRFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTkzMzA5REU5MDk5RTY0OTIwMDU2RTU4MSAvKiBJbnNlcnRJbnRvVGV4dE5vZGVDb21tYW5k
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzMzA5REVCMDk5RTY0OTIwMDU2RTU4MSAvKiBJbnNl
cnRMaW5lQnJlYWtDb21tYW5kLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUQwN0RFQUI5MEEzNjU1
NEEwMENBMzBGOCAvKiBJbnNlcnRMaXN0Q29tbWFuZC5jcHAgaW4gU291cmNlcyAqLywKSW5kZXg6
IGRvbS9Gb3JtQ29udHJvbEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9Gb3JtQ29udHJv
bEVsZW1lbnQuY3BwCShyZXZpc2lvbiAwKQorKysgZG9tL0Zvcm1Db250cm9sRWxlbWVudC5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgg
VG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gKGh0dHA6Ly93d3cudG9yY2ht
b2JpbGUuY29tLykKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBV
U0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGb3JtQ29udHJv
bEVsZW1lbnQuaCIKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRm9ybUNv
bnRyb2xFbGVtZW50LmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworI2lmIEVOQUJM
RShXTUwpCisjaW5jbHVkZSAiV01MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiV01MTmFtZXMu
aCIKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0Zvcm1Db250cm9sRWxlbWVudCog
Zm9ybUNvbnRyb2xFbGVtZW50Rm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlm
IChlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhU
TUxFbGVtZW50Kj4oZWxlbWVudCktPmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkpCisgICAgICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1Db250cm9sRWxlbWVudCo+KGVsZW1lbnQpOwor
ICAgIH0KKworICAgIC8vIEZJWE1FOiBFbmFibGUgdGhpcyBjb2RlLCBvbmNlIHRoZSBmb2xsb3ct
dXAgV01MSW5wdXRFbGVtZW50IGFkZGl0aW9uIHBhdGNoIGxhbmRzLgorI2lmIEVOQUJMRShXTUwp
ICYmIDAKKyAgICBpZiAoZWxlbWVudC0+aXNXTUxFbGVtZW50KCkgJiYgZWxlbWVudC0+aGFzVGFn
TmFtZShXTUxOYW1lczo6aW5wdXRUYWcpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V01M
SW5wdXRFbGVtZW50Kj4oZWxlbWVudCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCit9
CkluZGV4OiBkb20vRm9ybUNvbnRyb2xFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0Zvcm1D
b250cm9sRWxlbWVudC5oCShyZXZpc2lvbiA0MDA1MykKKysrIGRvbS9Gb3JtQ29udHJvbEVsZW1l
bnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsNiArMjMsOCBAQAogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKK2NsYXNzIEVsZW1lbnQ7CisKIGNsYXNzIEZvcm1Db250cm9sRWxlbWVudCB7CiBwdWJs
aWM6CiAgICAgdmlydHVhbCB+Rm9ybUNvbnRyb2xFbGVtZW50KCkgeyB9CkBAIC0zNCw2ICszNiw4
IEBAIHByb3RlY3RlZDoKICAgICBGb3JtQ29udHJvbEVsZW1lbnQoKSB7IH0KIH07CiAKK0Zvcm1D
b250cm9sRWxlbWVudCogZm9ybUNvbnRyb2xFbGVtZW50Rm9yRWxlbWVudChFbGVtZW50Kik7CisK
IH0KIAogI2VuZGlmCkluZGV4OiBkb20vSW5wdXRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBk
b20vSW5wdXRFbGVtZW50LmNwcAkocmV2aXNpb24gMCkKKysrIGRvbS9JbnB1dEVsZW1lbnQuY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3Jj
aG1vYmlsZS5jb20vKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklucHV0RWxl
bWVudC5oIgorCisjaW5jbHVkZSAiQmVmb3JlVGV4dEluc2VydGVkRXZlbnQuaCIKKyNpbmNsdWRl
ICJDaHJvbWVDbGllbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkV2ZW50
LmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkZvcm1Db250cm9sRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgor
I2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJSZW5k
ZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuaCIKKyNpbmNsdWRlICJTZWxlY3Rpb25Db250cm9sbGVy
LmgiCisjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiVGV4dEJyZWFrSXRlcmF0
b3IuaCIKKworI2lmIEVOQUJMRShXTUwpCisjaW5jbHVkZSAiV01MSW5wdXRFbGVtZW50LmgiCisj
aW5jbHVkZSAiV01MTmFtZXMuaCIKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3Vz
aW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKKy8vIEZJWE1FOiBBY2NvcmRpbmcgdG8gSFRNTDQs
IHRoZSBsZW5ndGggYXR0cmlidXRlJ3MgdmFsdWUgY2FuIGJlIGFyYml0cmFyaWx5CisvLyBsYXJn
ZS4gSG93ZXZlciwgZHVlIHRvIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWdzLmNnaT9p
ZD0xNDUzNiB0aGluZ3MKKy8vIGdldCByYXRoZXIgc2x1Z2dpc2ggd2hlbiBhIHRleHQgZmllbGQg
aGFzIGEgbGFyZ2VyIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYW4KKy8vIHRoaXMsIGV2ZW4gd2hl
biBqdXN0IGNsaWNraW5nIGluIHRoZSB0ZXh0IGZpZWxkLgorY29uc3QgaW50IElucHV0RWxlbWVu
dDo6c19tYXhpbXVtTGVuZ3RoID0gNTI0Mjg4OworY29uc3QgaW50IElucHV0RWxlbWVudDo6c19k
ZWZhdWx0U2l6ZSA9IDIwOworCit2b2lkIElucHV0RWxlbWVudDo6ZGlzcGF0Y2hGb2N1c0V2ZW50
KElucHV0RWxlbWVudERhdGEmIGRhdGEsIERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBpZiAo
IWRhdGEuaW5wdXRFbGVtZW50KCktPmlzVGV4dEZpZWxkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIElucHV0RWxlbWVudDo6dXBkYXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5KGRhdGEsIGRvY3Vt
ZW50KTsKKworICAgIGlmIChkYXRhLmlucHV0RWxlbWVudCgpLT5pc1Bhc3N3b3JkRmllbGQoKSAm
JiBkb2N1bWVudC0+ZnJhbWUoKSkKKyAgICAgICAgZG9jdW1lbnQtPnNldFVzZVNlY3VyZUtleWJv
YXJkRW50cnlXaGVuQWN0aXZlKHRydWUpOworfQorCit2b2lkIElucHV0RWxlbWVudDo6ZGlzcGF0
Y2hCbHVyRXZlbnQoSW5wdXRFbGVtZW50RGF0YSYgZGF0YSwgRG9jdW1lbnQqIGRvY3VtZW50KQor
eworICAgIGlmICghZGF0YS5pbnB1dEVsZW1lbnQoKS0+aXNUZXh0RmllbGQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKSB7Cisg
ICAgICAgIElucHV0RWxlbWVudDo6dXBkYXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5KGRhdGEsIGRv
Y3VtZW50KTsKKworICAgICAgICBpZiAoZGF0YS5pbnB1dEVsZW1lbnQoKS0+aXNQYXNzd29yZEZp
ZWxkKCkpCisgICAgICAgICAgICBkb2N1bWVudC0+c2V0VXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdo
ZW5BY3RpdmUoZmFsc2UpOworCisgICAgICAgIGZyYW1lLT50ZXh0RmllbGREaWRFbmRFZGl0aW5n
KGRhdGEuZWxlbWVudCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgSW5wdXRFbGVtZW50Ojp1cGRhdGVQ
bGFjZWhvbGRlclZpc2liaWxpdHkoSW5wdXRFbGVtZW50RGF0YSYgZGF0YSwgRG9jdW1lbnQqIGRv
Y3VtZW50LCBib29sIHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2VkKQoreworICAgIEFTU0VSVChkYXRh
LmlucHV0RWxlbWVudCgpLT5pc1RleHRGaWVsZCgpKTsKKworICAgIGJvb2wgb2xkUGxhY2Vob2xk
ZXJTaG91bGRCZVZpc2libGUgPSBkYXRhLnBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCk7Cisg
ICAgRWxlbWVudCogZWxlbWVudCA9IGRhdGEuZWxlbWVudCgpOworCisgICAgZGF0YS5zZXRQbGFj
ZWhvbGRlclNob3VsZEJlVmlzaWJsZShkYXRhLmlucHV0RWxlbWVudCgpLT52YWx1ZSgpLmlzRW1w
dHkoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50
LT5mb2N1c2VkTm9kZSgpICE9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICYmICFkYXRhLmlucHV0RWxlbWVudCgpLT5wbGFjZWhvbGRlclZhbHVlKCkuaXNF
bXB0eSgpKTsKKworICAgIGlmICgob2xkUGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUgIT0gZGF0
YS5wbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpIHx8IHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2Vk
KSAmJiBlbGVtZW50LT5yZW5kZXJlcigpKQorICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmUqPihlbGVtZW50LT5yZW5kZXJlcigpKS0+dXBkYXRlUGxhY2Vob2xk
ZXJWaXNpYmlsaXR5KCk7Cit9CisKK3ZvaWQgSW5wdXRFbGVtZW50Ojp1cGRhdGVGb2N1c0FwcGVh
cmFuY2UoSW5wdXRFbGVtZW50RGF0YSYgZGF0YSwgRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIHJl
c3RvcmVQcmV2aW91c1NlbGVjdGlvbikKK3sKKyAgICBBU1NFUlQoZGF0YS5pbnB1dEVsZW1lbnQo
KS0+aXNUZXh0RmllbGQoKSk7CisKKyAgICBpZiAoIXJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbiB8
fCBkYXRhLmNhY2hlZFNlbGVjdGlvblN0YXJ0KCkgPT0gLTEpCisgICAgICAgIGRhdGEuaW5wdXRF
bGVtZW50KCktPnNlbGVjdCgpOworICAgIGVsc2UKKyAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2Fj
aGVkIHNlbGVjdGlvbi4KKyAgICAgICAgSW5wdXRFbGVtZW50Ojp1cGRhdGVTZWxlY3Rpb25SYW5n
ZShkYXRhLCBkYXRhLmNhY2hlZFNlbGVjdGlvblN0YXJ0KCksIGRhdGEuY2FjaGVkU2VsZWN0aW9u
RW5kKCkpOworCisgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LT5mcmFtZSgpKQorICAgICAg
ICBkb2N1bWVudC0+ZnJhbWUoKS0+cmV2ZWFsU2VsZWN0aW9uKCk7Cit9CisKK3ZvaWQgSW5wdXRF
bGVtZW50Ojp1cGRhdGVTZWxlY3Rpb25SYW5nZShJbnB1dEVsZW1lbnREYXRhJiBkYXRhLCBpbnQg
c3RhcnQsIGludCBlbmQpCit7CisgICAgaWYgKCFkYXRhLmlucHV0RWxlbWVudCgpLT5pc1RleHRG
aWVsZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoUmVuZGVyVGV4dENvbnRyb2wqIHJl
bmRlcmVyID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihkYXRhLmVsZW1lbnQoKS0+
cmVuZGVyZXIoKSkpCisgICAgICAgIHJlbmRlcmVyLT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwg
ZW5kKTsKK30KKwordm9pZCBJbnB1dEVsZW1lbnQ6OmFib3V0VG9VbmxvYWQoSW5wdXRFbGVtZW50
RGF0YSYgZGF0YSwgRG9jdW1lbnQqIGRvY3VtZW50KQoreworICAgIGlmICghZGF0YS5pbnB1dEVs
ZW1lbnQoKS0+aXNUZXh0RmllbGQoKSB8fCAhZGF0YS5lbGVtZW50KCktPmZvY3VzZWQoKSB8fCAh
ZG9jdW1lbnQtPmZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGRvY3VtZW50LT5mcmFt
ZSgpLT50ZXh0RmllbGREaWRFbmRFZGl0aW5nKGRhdGEuZWxlbWVudCgpKTsKK30KKwordm9pZCBJ
bnB1dEVsZW1lbnQ6OnNldFZhbHVlRnJvbVJlbmRlcmVyKElucHV0RWxlbWVudERhdGEmIGRhdGEs
IERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICAvLyBSZW5k
ZXJlciBhbmQgb3VyIGV2ZW50IGhhbmRsZXIgYXJlIHJlc3BvbnNpYmxlIGZvciBjb25zdHJhaW5p
bmcgdmFsdWVzLgorICAgIEFTU0VSVCh2YWx1ZSA9PSBkYXRhLmlucHV0RWxlbWVudCgpLT5jb25z
dHJhaW5WYWx1ZSh2YWx1ZSkgfHwgZGF0YS5pbnB1dEVsZW1lbnQoKS0+Y29uc3RyYWluVmFsdWUo
dmFsdWUpLmlzRW1wdHkoKSk7CisKKyAgICBpZiAoZGF0YS5pbnB1dEVsZW1lbnQoKS0+aXNUZXh0
RmllbGQoKSkKKyAgICAgICAgSW5wdXRFbGVtZW50Ojp1cGRhdGVQbGFjZWhvbGRlclZpc2liaWxp
dHkoZGF0YSwgZG9jdW1lbnQpOworCisgICAgLy8gV29ya2Fyb3VuZCBmb3IgYnVnIHdoZXJlIHRy
YWlsaW5nIFxuIGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHQgb2YgdGV4dENvbnRlbnQuCisgICAg
Ly8gVGhlIGFzc2VydCBtYWNybyBhYm92ZSBtYXkgYWxzbyBiZSBzaW1wbGlmaWVkIHRvOiAgdmFs
dWUgPT0gY29uc3RyYWluVmFsdWUodmFsdWUpCisgICAgLy8gaHR0cDovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9OTY2MQorICAgIGlmICh2YWx1ZSA9PSAiXG4iKQorICAgICAgICBk
YXRhLnNldFZhbHVlKCIiKTsKKyAgICBlbHNlCisgICAgICAgIGRhdGEuc2V0VmFsdWUodmFsdWUp
OworCisgICAgRWxlbWVudCogZWxlbWVudCA9IGRhdGEuZWxlbWVudCgpOworICAgIGZvcm1Db250
cm9sRWxlbWVudEZvckVsZW1lbnQoZWxlbWVudCktPnNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCk7
CisKKyAgICAvLyBGaXJlIHRoZSAiaW5wdXQiIERPTSBldmVudAorICAgIGVsZW1lbnQtPmRpc3Bh
dGNoRXZlbnRGb3JUeXBlKGV2ZW50TmFtZXMoKS5pbnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Cisg
ICAgSW5wdXRFbGVtZW50Ojpub3RpZnlGb3JtU3RhdGVDaGFuZ2VkKGRhdGEsIGRvY3VtZW50KTsK
K30KKworc3RhdGljIGludCBudW1DaGFyYWN0ZXJzSW5HcmFwaGVtZUNsdXN0ZXJzKFN0cmluZ0lt
cGwqIHMsIGludCBudW1HcmFwaGVtZUNsdXN0ZXJzKQoreworICAgIGlmICghcykKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBUZXh0QnJlYWtJdGVyYXRvciogaXQgPSBjaGFyYWN0ZXJCcmVha0l0
ZXJhdG9yKHMtPmNoYXJhY3RlcnMoKSwgcy0+bGVuZ3RoKCkpOworICAgIGlmICghaXQpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HcmFwaGVtZUNsdXN0
ZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKHRleHRCcmVha05leHQoaXQpID09IFRleHRCcmVha0Rv
bmUpCisgICAgICAgICAgICByZXR1cm4gcy0+bGVuZ3RoKCk7CisgICAgfQorCisgICAgcmV0dXJu
IHRleHRCcmVha0N1cnJlbnQoaXQpOworfQorCitTdHJpbmcgSW5wdXRFbGVtZW50Ojpjb25zdHJh
aW5WYWx1ZShjb25zdCBJbnB1dEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBTdHJpbmcmIHByb3Bv
c2VkVmFsdWUsIGludCBtYXhMZW5ndGgpCit7CisgICAgU3RyaW5nIHN0cmluZyA9IHByb3Bvc2Vk
VmFsdWU7CisgICAgaWYgKCFkYXRhLmlucHV0RWxlbWVudCgpLT5pc1RleHRGaWVsZCgpKQorICAg
ICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAKKyAgICBzdHJpbmcucmVwbGFjZSgiXHJcbiIs
ICIgIik7CisgICAgc3RyaW5nLnJlcGxhY2UoJ1xyJywgJyAnKTsKKyAgICBzdHJpbmcucmVwbGFj
ZSgnXG4nLCAnICcpOworICAgIAorICAgIFN0cmluZ0ltcGwqIHMgPSBzdHJpbmcuaW1wbCgpOwor
ICAgIGludCBuZXdMZW5ndGggPSBudW1DaGFyYWN0ZXJzSW5HcmFwaGVtZUNsdXN0ZXJzKHMsIG1h
eExlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdMZW5ndGg7ICsraSkgeworICAg
ICAgICBjb25zdCBVQ2hhciYgY3VycmVudCA9ICgqcylbaV07CisgICAgICAgIGlmIChjdXJyZW50
IDwgJyAnICYmIGN1cnJlbnQgIT0gJ1x0JykgeworICAgICAgICAgICAgbmV3TGVuZ3RoID0gaTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5ld0xlbmd0
aCA8IHN0YXRpY19jYXN0PGludD4oc3RyaW5nLmxlbmd0aCgpKSkKKyAgICAgICAgcmV0dXJuIHN0
cmluZy5zdWJzdHJpbmcoMCwgbmV3TGVuZ3RoKTsKKworICAgIHJldHVybiBzdHJpbmc7Cit9CisK
K3N0YXRpYyBpbnQgbnVtR3JhcGhlbWVDbHVzdGVycyhTdHJpbmdJbXBsKiBzKQoreworICAgIGlm
ICghcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBUZXh0QnJlYWtJdGVyYXRvciogaXQgPSBj
aGFyYWN0ZXJCcmVha0l0ZXJhdG9yKHMtPmNoYXJhY3RlcnMoKSwgcy0+bGVuZ3RoKCkpOworICAg
IGlmICghaXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaW50IG51bSA9IDA7CisgICAgd2hp
bGUgKHRleHRCcmVha05leHQoaXQpICE9IFRleHRCcmVha0RvbmUpCisgICAgICAgICsrbnVtOwor
CisgICAgcmV0dXJuIG51bTsKK30KKwordm9pZCBJbnB1dEVsZW1lbnQ6OmhhbmRsZUJlZm9yZVRl
eHRJbnNlcnRlZEV2ZW50KElucHV0RWxlbWVudERhdGEmIGRhdGEsIERvY3VtZW50KiBkb2N1bWVu
dCwgRXZlbnQqIGV2ZW50KQoreworICAgIEFTU0VSVChldmVudC0+aXNCZWZvcmVUZXh0SW5zZXJ0
ZWRFdmVudCgpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0IHRvIGJlIGluc2Vy
dGVkIHdpbGwgbm90IHZpb2xhdGUgdGhlIG1heExlbmd0aC4KKyAgICBpbnQgb2xkTGVuZ3RoID0g
bnVtR3JhcGhlbWVDbHVzdGVycyhkYXRhLmlucHV0RWxlbWVudCgpLT52YWx1ZSgpLmltcGwoKSk7
CisgICAgQVNTRVJUKG9sZExlbmd0aCA8PSBkYXRhLm1heExlbmd0aCgpKTsKKyAgICBpbnQgc2Vs
ZWN0aW9uTGVuZ3RoID0gbnVtR3JhcGhlbWVDbHVzdGVycyhwbGFpblRleHQoZG9jdW1lbnQtPmZy
YW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKS50b1JhbmdlKCkuZ2V0KCkpLmltcGwoKSk7
CisgICAgQVNTRVJUKG9sZExlbmd0aCA+PSBzZWxlY3Rpb25MZW5ndGgpOworICAgIGludCBtYXhO
ZXdMZW5ndGggPSBkYXRhLm1heExlbmd0aCgpIC0gKG9sZExlbmd0aCAtIHNlbGVjdGlvbkxlbmd0
aCk7CisKKyAgICAvLyBUcnVuY2F0ZSB0aGUgaW5zZXJ0ZWQgdGV4dCB0byBhdm9pZCB2aW9sYXRp
bmcgdGhlIG1heExlbmd0aCBhbmQgb3RoZXIgY29uc3RyYWludHMuCisgICAgQmVmb3JlVGV4dElu
c2VydGVkRXZlbnQqIHRleHRFdmVudCA9IHN0YXRpY19jYXN0PEJlZm9yZVRleHRJbnNlcnRlZEV2
ZW50Kj4oZXZlbnQpOworICAgIHRleHRFdmVudC0+c2V0VGV4dChJbnB1dEVsZW1lbnQ6OmNvbnN0
cmFpblZhbHVlKGRhdGEsIHRleHRFdmVudC0+dGV4dCgpLCBtYXhOZXdMZW5ndGgpKTsKK30KKwor
dm9pZCBJbnB1dEVsZW1lbnQ6OnBhcnNlU2l6ZUF0dHJpYnV0ZShJbnB1dEVsZW1lbnREYXRhJiBk
YXRhLCBNYXBwZWRBdHRyaWJ1dGUqIGF0dHJpYnV0ZSkKK3sKKyAgICBkYXRhLnNldFNpemUoYXR0
cmlidXRlLT5pc051bGwoKSA/IElucHV0RWxlbWVudDo6c19kZWZhdWx0U2l6ZSA6IGF0dHJpYnV0
ZS0+dmFsdWUoKS50b0ludCgpKTsKKworICAgIGlmIChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0g
ZGF0YS5lbGVtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRlcmVyLT5zZXROZWVkc0xh
eW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKK30KKwordm9pZCBJbnB1dEVsZW1lbnQ6OnBhcnNl
TWF4TGVuZ3RoQXR0cmlidXRlKElucHV0RWxlbWVudERhdGEmIGRhdGEsIE1hcHBlZEF0dHJpYnV0
ZSogYXR0cmlidXRlKQoreworICAgIGludCBtYXhMZW5ndGggPSBhdHRyaWJ1dGUtPmlzTnVsbCgp
ID8gSW5wdXRFbGVtZW50OjpzX21heGltdW1MZW5ndGggOiBhdHRyaWJ1dGUtPnZhbHVlKCkudG9J
bnQoKTsKKyAgICBpZiAobWF4TGVuZ3RoIDw9IDAgfHwgbWF4TGVuZ3RoID4gSW5wdXRFbGVtZW50
OjpzX21heGltdW1MZW5ndGgpCisgICAgICAgIG1heExlbmd0aCA9IElucHV0RWxlbWVudDo6c19t
YXhpbXVtTGVuZ3RoOworCisgICAgaW50IG9sZE1heExlbmd0aCA9IGRhdGEubWF4TGVuZ3RoKCk7
CisgICAgZGF0YS5zZXRNYXhMZW5ndGgobWF4TGVuZ3RoKTsKKworICAgIGlmIChvbGRNYXhMZW5n
dGggIT0gbWF4TGVuZ3RoKQorICAgICAgICBJbnB1dEVsZW1lbnQ6OnVwZGF0ZVZhbHVlSWZOZWVk
ZWQoZGF0YSk7CisKKyAgICBkYXRhLmVsZW1lbnQoKS0+c2V0Q2hhbmdlZCgpOworfQorCit2b2lk
IElucHV0RWxlbWVudDo6dXBkYXRlVmFsdWVJZk5lZWRlZChJbnB1dEVsZW1lbnREYXRhJiBkYXRh
KQoreworICAgIFN0cmluZyBvbGRWYWx1ZSA9IGRhdGEudmFsdWUoKTsKKyAgICBTdHJpbmcgbmV3
VmFsdWUgPSBkYXRhLmlucHV0RWxlbWVudCgpLT5jb25zdHJhaW5WYWx1ZShvbGRWYWx1ZSk7Cisg
ICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKQorICAgICAgICBkYXRhLmlucHV0RWxlbWVudCgp
LT5zZXRWYWx1ZShuZXdWYWx1ZSk7Cit9CisKK3ZvaWQgSW5wdXRFbGVtZW50Ojpub3RpZnlGb3Jt
U3RhdGVDaGFuZ2VkKElucHV0RWxlbWVudERhdGEmIGRhdGEsIERvY3VtZW50KiBkb2N1bWVudCkK
K3sKKyAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1l
KQorICAgICAgICByZXR1cm47CisKKyAgICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50
KCktPmZvcm1TdGF0ZURpZENoYW5nZShkYXRhLmVsZW1lbnQoKSk7Cit9CisKKy8vIElucHV0RWxl
bWVudERhdGEKK0lucHV0RWxlbWVudERhdGE6OklucHV0RWxlbWVudERhdGEoSW5wdXRFbGVtZW50
KiBpbnB1dEVsZW1lbnQsIEVsZW1lbnQqIGVsZW1lbnQpCisgICAgOiBtX2lucHV0RWxlbWVudChp
bnB1dEVsZW1lbnQpCisgICAgLCBtX2VsZW1lbnQoZWxlbWVudCkKKyAgICAsIG1fcGxhY2Vob2xk
ZXJTaG91bGRCZVZpc2libGUoZmFsc2UpCisgICAgLCBtX3NpemUoSW5wdXRFbGVtZW50OjpzX2Rl
ZmF1bHRTaXplKQorICAgICwgbV9tYXhMZW5ndGgoSW5wdXRFbGVtZW50OjpzX21heGltdW1MZW5n
dGgpCisgICAgLCBtX2NhY2hlZFNlbGVjdGlvblN0YXJ0KC0xKQorICAgICwgbV9jYWNoZWRTZWxl
Y3Rpb25FbmQoLTEpCit7CisgICAgQVNTRVJUKG1faW5wdXRFbGVtZW50KTsKKyAgICBBU1NFUlQo
bV9lbGVtZW50KTsKK30KKworSW5wdXRFbGVtZW50RGF0YTo6fklucHV0RWxlbWVudERhdGEoKQor
eworfQorCitjb25zdCBBdG9taWNTdHJpbmcmIElucHV0RWxlbWVudERhdGE6Om5hbWUoKSBjb25z
dAoreworICAgIHJldHVybiBtX25hbWUuaXNOdWxsKCkgPyBlbXB0eUF0b20gOiBtX25hbWU7Cit9
CisKK0lucHV0RWxlbWVudCogaW5wdXRFbGVtZW50Rm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50
KQoreworICAgIGlmIChlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgKGVsZW1lbnQtPmhhc1Rh
Z05hbWUoaW5wdXRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoaXNpbmRleFRhZykpKQorICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGVsZW1lbnQpOworCisg
ICAgLy8gRklYTUU6IEVuYWJsZSB0aGlzIGNvZGUsIG9uY2UgdGhlIGZvbGxvdy11cCBXTUxJbnB1
dEVsZW1lbnQgYWRkaXRpb24gcGF0Y2ggbGFuZHMuCisjaWYgRU5BQkxFKFdNTCkgJiYgMAorICAg
IGlmIChlbGVtZW50LT5pc1dNTEVsZW1lbnQoKSAmJiBlbGVtZW50LT5oYXNUYWdOYW1lKFdNTE5h
bWVzOjppbnB1dFRhZykpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxXTUxJbnB1dEVsZW1l
bnQqPihlbGVtZW50KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK30KSW5kZXg6IGRv
bS9JbnB1dEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vSW5wdXRFbGVtZW50LmgJKHJldmlz
aW9uIDApCisrKyBkb20vSW5wdXRFbGVtZW50LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTI1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIElu
cHV0RWxlbWVudF9oCisjZGVmaW5lIElucHV0RWxlbWVudF9oCisKKyNpbmNsdWRlICJBdG9taWNT
dHJpbmcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIERvY3VtZW50OworY2xhc3MgRWxlbWVudDsKK2NsYXNzIEV2ZW50OworY2xh
c3MgSW5wdXRFbGVtZW50RGF0YTsKK2NsYXNzIE1hcHBlZEF0dHJpYnV0ZTsKKworY2xhc3MgSW5w
dXRFbGVtZW50IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbnB1dEVsZW1lbnQoKSB7IH0KKwor
ICAgIHZpcnR1YWwgYm9vbCBpc1Bhc3N3b3JkRmllbGQoKSBjb25zdCA9IDA7CisgICAgdmlydHVh
bCBib29sIGlzU2VhcmNoRmllbGQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzVGV4
dEZpZWxkKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBib29sIHBsYWNlaG9sZGVyU2hvdWxk
QmVWaXNpYmxlKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzZWFyY2hFdmVudHNTaG91
bGRCZURpc3BhdGNoZWQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGludCBzaXplKCkgY29u
c3QgPSAwOworICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkgY29uc3QgPSAwOworICAgIHZpcnR1
YWwgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmKSA9IDA7CisgICAgdmlydHVhbCBTdHJpbmcg
cGxhY2Vob2xkZXJWYWx1ZSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgU3RyaW5nIGNvbnN0
cmFpblZhbHVlKGNvbnN0IFN0cmluZyYpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0
VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgU3RyaW5nJikgPSAwOworCisgICAgdmlydHVhbCB2b2lk
IGNhY2hlU2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCkgPSAwOworICAgIHZpcnR1YWwgdm9p
ZCBzZWxlY3QoKSA9IDA7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IHNfbWF4aW11bUxlbmd0aDsK
KyAgICBzdGF0aWMgY29uc3QgaW50IHNfZGVmYXVsdFNpemU7CisKK3Byb3RlY3RlZDoKKyAgICBJ
bnB1dEVsZW1lbnQoKSB7IH0KKworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoRm9jdXNFdmVudChJ
bnB1dEVsZW1lbnREYXRhJiwgRG9jdW1lbnQqKTsKKyAgICBzdGF0aWMgdm9pZCBkaXNwYXRjaEJs
dXJFdmVudChJbnB1dEVsZW1lbnREYXRhJiwgRG9jdW1lbnQqKTsKKyAgICBzdGF0aWMgdm9pZCB1
cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkoSW5wdXRFbGVtZW50RGF0YSYsIERvY3VtZW50Kiwg
Ym9vbCBwbGFjZWhvbGRlclZhbHVlQ2hhbmdlZCA9IGZhbHNlKTsKKyAgICBzdGF0aWMgdm9pZCB1
cGRhdGVGb2N1c0FwcGVhcmFuY2UoSW5wdXRFbGVtZW50RGF0YSYsIERvY3VtZW50KiwgYm9vbCBy
ZXN0b3JlUHJldmlvdXNTZWxlY3Rpb24pOworICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVNlbGVjdGlv
blJhbmdlKElucHV0RWxlbWVudERhdGEmLCBpbnQgc3RhcnQsIGludCBlbmQpOworICAgIHN0YXRp
YyB2b2lkIGFib3V0VG9VbmxvYWQoSW5wdXRFbGVtZW50RGF0YSYsIERvY3VtZW50Kik7CisgICAg
c3RhdGljIHZvaWQgc2V0VmFsdWVGcm9tUmVuZGVyZXIoSW5wdXRFbGVtZW50RGF0YSYsIERvY3Vt
ZW50KiwgY29uc3QgU3RyaW5nJik7CisgICAgc3RhdGljIFN0cmluZyBjb25zdHJhaW5WYWx1ZShj
b25zdCBJbnB1dEVsZW1lbnREYXRhJiwgY29uc3QgU3RyaW5nJiBwcm9wb3NlZFZhbHVlLCBpbnQg
bWF4TGVuZ3RoKTsKKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVCZWZvcmVUZXh0SW5zZXJ0ZWRFdmVu
dChJbnB1dEVsZW1lbnREYXRhJiwgRG9jdW1lbnQqLCBFdmVudCopOworICAgIHN0YXRpYyB2b2lk
IHBhcnNlU2l6ZUF0dHJpYnV0ZShJbnB1dEVsZW1lbnREYXRhJiwgTWFwcGVkQXR0cmlidXRlKik7
CisgICAgc3RhdGljIHZvaWQgcGFyc2VNYXhMZW5ndGhBdHRyaWJ1dGUoSW5wdXRFbGVtZW50RGF0
YSYsIE1hcHBlZEF0dHJpYnV0ZSopOworICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVZhbHVlSWZOZWVk
ZWQoSW5wdXRFbGVtZW50RGF0YSYpOworICAgIHN0YXRpYyB2b2lkIG5vdGlmeUZvcm1TdGF0ZUNo
YW5nZWQoSW5wdXRFbGVtZW50RGF0YSYsIERvY3VtZW50Kik7Cit9OworCisvLyBIVE1ML1dNTElu
cHV0RWxlbWVudCBob2xkIHRoaXMgc3RydWN0IGFzIG1lbWJlciB2YXJpYWJsZQorLy8gYW5kIHBh
c3MgaXQgdG8gdGhlIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zIGluIElucHV0RWxlbWVudAorY2xh
c3MgSW5wdXRFbGVtZW50RGF0YSB7CitwdWJsaWM6CisgICAgSW5wdXRFbGVtZW50RGF0YShJbnB1
dEVsZW1lbnQqLCBFbGVtZW50Kik7CisgICAgfklucHV0RWxlbWVudERhdGEoKTsKKworICAgIElu
cHV0RWxlbWVudCogaW5wdXRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dEVsZW1lbnQ7
IH0KKyAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50OyB9CisK
KyAgICBib29sIHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gbV9w
bGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZTsgfQorICAgIHZvaWQgc2V0UGxhY2Vob2xkZXJTaG91
bGRCZVZpc2libGUoYm9vbCB2aXNpYmxlKSB7IG1fcGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUg
PSB2aXNpYmxlOyB9CisKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAg
ICB2b2lkIHNldE5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkgeyBtX25hbWUgPSB2YWx1
ZTsgfQorCisgICAgU3RyaW5nIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorICAg
IHZvaWQgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7IH0K
KworICAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgdm9pZCBzZXRT
aXplKGludCB2YWx1ZSkgeyBtX3NpemUgPSB2YWx1ZTsgfQorCisgICAgaW50IG1heExlbmd0aCgp
IGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuZ3RoOyB9CisgICAgdm9pZCBzZXRNYXhMZW5ndGgoaW50
IHZhbHVlKSB7IG1fbWF4TGVuZ3RoID0gdmFsdWU7IH0KKworICAgIGludCBjYWNoZWRTZWxlY3Rp
b25TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVkU2VsZWN0aW9uU3RhcnQ7IH0KKyAgICB2
b2lkIHNldENhY2hlZFNlbGVjdGlvblN0YXJ0KGludCB2YWx1ZSkgeyBtX2NhY2hlZFNlbGVjdGlv
blN0YXJ0ID0gdmFsdWU7IH0KKworICAgIGludCBjYWNoZWRTZWxlY3Rpb25FbmQoKSBjb25zdCB7
IHJldHVybiBtX2NhY2hlZFNlbGVjdGlvbkVuZDsgfQorICAgIHZvaWQgc2V0Q2FjaGVkU2VsZWN0
aW9uRW5kKGludCB2YWx1ZSkgeyBtX2NhY2hlZFNlbGVjdGlvbkVuZCA9IHZhbHVlOyB9CisKK3By
aXZhdGU6CisgICAgSW5wdXRFbGVtZW50KiBtX2lucHV0RWxlbWVudDsKKyAgICBFbGVtZW50KiBt
X2VsZW1lbnQ7CisgICAgYm9vbCBtX3BsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlOworICAgIEF0
b21pY1N0cmluZyBtX25hbWU7CisgICAgU3RyaW5nIG1fdmFsdWU7CisgICAgaW50IG1fc2l6ZTsK
KyAgICBpbnQgbV9tYXhMZW5ndGg7CisgICAgaW50IG1fY2FjaGVkU2VsZWN0aW9uU3RhcnQ7Cisg
ICAgaW50IG1fY2FjaGVkU2VsZWN0aW9uRW5kOworfTsKKworSW5wdXRFbGVtZW50KiBpbnB1dEVs
ZW1lbnRGb3JFbGVtZW50KEVsZW1lbnQqKTsKKworfQorCisjZW5kaWYKSW5kZXg6IGh0bWwvSFRN
TElucHV0RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNw
cAkocmV2aXNpb24gNDAwNTMpCisrKyBodG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgogCi0jaW5jbHVkZSAiQmVmb3JlVGV4dEluc2VydGVkRXZlbnQu
aCIKICNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKICNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVz
LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKQEAgLTUzLDEwICs1Miw3IEBACiAjaW5jbHVkZSAi
UmVuZGVyVGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5oIgog
I2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCi0jaW5jbHVkZSAiU2VsZWN0aW9uQ29udHJvbGxlci5o
IgotI2luY2x1ZGUgIlRleHRCcmVha0l0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiVGV4dEV2ZW50Lmgi
Ci0jaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5o
PgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtNjcsNzkgKzYzLDI0IEBAIHVzaW5nIG5hbWVz
cGFjZSBIVE1MTmFtZXM7CiAKIGNvbnN0IGludCBtYXhTYXZlZFJlc3VsdHMgPSAyNTY7CiAKLS8v
IEZJWE1FOiBBY2NvcmRpbmcgdG8gSFRNTDQsIHRoZSBsZW5ndGggYXR0cmlidXRlJ3MgdmFsdWUg
Y2FuIGJlIGFyYml0cmFyaWx5Ci0vLyBsYXJnZS4gSG93ZXZlciwgZHVlIHRvIGh0dHA6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWdzLmNnaT9pZD0xNDUzNiB0aGluZ3MKLS8vIGdldCByYXRoZXIg
c2x1Z2dpc2ggd2hlbiBhIHRleHQgZmllbGQgaGFzIGEgbGFyZ2VyIG51bWJlciBvZiBjaGFyYWN0
ZXJzIHRoYW4KLS8vIHRoaXMsIGV2ZW4gd2hlbiBqdXN0IGNsaWNraW5nIGluIHRoZSB0ZXh0IGZp
ZWxkLgotc3RhdGljIGNvbnN0IGludCBjTWF4TGVuID0gNTI0Mjg4OwotCi1zdGF0aWMgaW50IG51
bUdyYXBoZW1lQ2x1c3RlcnMoU3RyaW5nSW1wbCogcykKLXsKLSAgICBpZiAoIXMpCi0gICAgICAg
IHJldHVybiAwOwotCi0gICAgVGV4dEJyZWFrSXRlcmF0b3IqIGl0ID0gY2hhcmFjdGVyQnJlYWtJ
dGVyYXRvcihzLT5jaGFyYWN0ZXJzKCksIHMtPmxlbmd0aCgpKTsKLSAgICBpZiAoIWl0KQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBpbnQgbnVtID0gMDsKLSAgICB3aGlsZSAodGV4dEJyZWFrTmV4
dChpdCkgIT0gVGV4dEJyZWFrRG9uZSkKLSAgICAgICAgKytudW07Ci0gICAgcmV0dXJuIG51bTsK
LX0KLQotc3RhdGljIGludCBudW1DaGFyYWN0ZXJzSW5HcmFwaGVtZUNsdXN0ZXJzKFN0cmluZ0lt
cGwqIHMsIGludCBudW1HcmFwaGVtZUNsdXN0ZXJzKQotewotICAgIGlmICghcykKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBUZXh0QnJlYWtJdGVyYXRvciogaXQgPSBjaGFyYWN0ZXJCcmVha0l0
ZXJhdG9yKHMtPmNoYXJhY3RlcnMoKSwgcy0+bGVuZ3RoKCkpOwotICAgIGlmICghaXQpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR3JhcGhlbWVDbHVzdGVy
czsgKytpKQotICAgICAgICBpZiAodGV4dEJyZWFrTmV4dChpdCkgPT0gVGV4dEJyZWFrRG9uZSkK
LSAgICAgICAgICAgIHJldHVybiBzLT5sZW5ndGgoKTsKLSAgICByZXR1cm4gdGV4dEJyZWFrQ3Vy
cmVudChpdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBub3RpZnlGb3JtU3RhdGVDaGFuZ2Vk
KGNvbnN0IEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgRnJhbWUqIGZyYW1lID0g
ZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICBy
ZXR1cm47Ci0gICAgZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5mb3JtU3RhdGVE
aWRDaGFuZ2UoZWxlbWVudCk7Ci19Ci0KIEhUTUxJbnB1dEVsZW1lbnQ6OkhUTUxJbnB1dEVsZW1l
bnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqIGRvYywgSFRNTEZvcm1F
bGVtZW50KiBmKQogICAgIDogSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSh0YWdOYW1l
LCBkb2MsIGYpCisgICAgLCBtX2RhdGEodGhpcywgdGhpcykKKyAgICAsIG1feFBvcygwKQorICAg
ICwgbV95UG9zKDApCisgICAgLCBtX21heFJlc3VsdHMoLTEpCisgICAgLCBtX3R5cGUoVEVYVCkK
KyAgICAsIG1fY2hlY2tlZChmYWxzZSkKKyAgICAsIG1fZGVmYXVsdENoZWNrZWQoZmFsc2UpCisg
ICAgLCBtX3VzZURlZmF1bHRDaGVja2VkKHRydWUpCisgICAgLCBtX2luZGV0ZXJtaW5hdGUoZmFs
c2UpCisgICAgLCBtX2hhdmVUeXBlKGZhbHNlKQorICAgICwgbV9hY3RpdmVTdWJtaXQoZmFsc2Up
CisgICAgLCBtX2F1dG9jb21wbGV0ZShVbmluaXRpYWxpemVkKQorICAgICwgbV9hdXRvZmlsbGVk
KGZhbHNlKQorICAgICwgbV9pbml0ZWQoZmFsc2UpCiB7CiAgICAgQVNTRVJUKGhhc1RhZ05hbWUo
aW5wdXRUYWcpIHx8IGhhc1RhZ05hbWUoaXNpbmRleFRhZykpOwotICAgIGluaXQoKTsKLX0KLQot
dm9pZCBIVE1MSW5wdXRFbGVtZW50Ojppbml0KCkKLXsKLSAgICBtX3R5cGUgPSBURVhUOwotICAg
IG1fbWF4TGVuID0gY01heExlbjsKLSAgICBtX3NpemUgPSAyMDsKLSAgICBtX2NoZWNrZWQgPSBm
YWxzZTsKLSAgICBtX2RlZmF1bHRDaGVja2VkID0gZmFsc2U7Ci0gICAgbV91c2VEZWZhdWx0Q2hl
Y2tlZCA9IHRydWU7Ci0gICAgbV9pbmRldGVybWluYXRlID0gZmFsc2U7Ci0KLSAgICBtX2hhdmVU
eXBlID0gZmFsc2U7Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBmYWxzZTsKLSAgICBtX2F1dG9jb21w
bGV0ZSA9IFVuaW5pdGlhbGl6ZWQ7Ci0gICAgbV9pbml0ZWQgPSBmYWxzZTsKLSAgICBtX2F1dG9m
aWxsZWQgPSBmYWxzZTsKLSAgICBtX3BsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlID0gZmFsc2U7
Ci0gICAgCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9IDA7Ci0gICAgCi0gICAgY2FjaGVkU2Vs
U3RhcnQgPSAtMTsKLSAgICBjYWNoZWRTZWxFbmQgPSAtMTsKLQotICAgIG1fbWF4UmVzdWx0cyA9
IC0xOwogfQogCiBIVE1MSW5wdXRFbGVtZW50Ojp+SFRNTElucHV0RWxlbWVudCgpCkBAIC0xNTYs
NyArOTcsNyBAQCBIVE1MSW5wdXRFbGVtZW50Ojp+SFRNTElucHV0RWxlbWVudCgpCiAKIGNvbnN0
IEF0b21pY1N0cmluZyYgSFRNTElucHV0RWxlbWVudDo6bmFtZSgpIGNvbnN0CiB7Ci0gICAgcmV0
dXJuIG1fbmFtZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IG1fbmFtZTsKKyAgICByZXR1cm4gbV9k
YXRhLm5hbWUoKTsKIH0KIAogYm9vbCBIVE1MSW5wdXRFbGVtZW50OjphdXRvQ29tcGxldGUoKSBj
b25zdApAQCAtMjE5LDIzICsxNjAsMTUgQEAgYm9vbCBIVE1MSW5wdXRFbGVtZW50Ojppc01vdXNl
Rm9jdXNhYmxlKAogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnVwZGF0ZUZvY3VzQXBwZWFyYW5j
ZShib29sIHJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbikKIHsgICAgICAgIAotICAgIGlmIChpc1Rl
eHRGaWVsZCgpKSB7Ci0gICAgICAgIGlmICghcmVzdG9yZVByZXZpb3VzU2VsZWN0aW9uIHx8IGNh
Y2hlZFNlbFN0YXJ0ID09IC0xKQotICAgICAgICAgICAgc2VsZWN0KCk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNhY2hlZCBzZWxlY3Rpb24uCi0gICAgICAgICAg
ICBzZXRTZWxlY3Rpb25SYW5nZShjYWNoZWRTZWxTdGFydCwgY2FjaGVkU2VsRW5kKTsgCi0gICAg
ICAgIAotICAgICAgICBpZiAoZG9jdW1lbnQoKSAmJiBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAg
ICAgICAgICAgZG9jdW1lbnQoKS0+ZnJhbWUoKS0+cmV2ZWFsU2VsZWN0aW9uKCk7Ci0gICAgfSBl
bHNlCisgICAgaWYgKGlzVGV4dEZpZWxkKCkpCisgICAgICAgIElucHV0RWxlbWVudDo6dXBkYXRl
Rm9jdXNBcHBlYXJhbmNlKG1fZGF0YSwgZG9jdW1lbnQoKSwgcmVzdG9yZVByZXZpb3VzU2VsZWN0
aW9uKTsKKyAgICBlbHNlCiAgICAgICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6
OnVwZGF0ZUZvY3VzQXBwZWFyYW5jZShyZXN0b3JlUHJldmlvdXNTZWxlY3Rpb24pOwogfQogCiB2
b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmFib3V0VG9VbmxvYWQoKQogewotICAgIGlmIChpc1RleHRG
aWVsZCgpICYmIGZvY3VzZWQoKSAmJiBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICBkb2N1
bWVudCgpLT5mcmFtZSgpLT50ZXh0RmllbGREaWRFbmRFZGl0aW5nKHRoaXMpOworICAgIElucHV0
RWxlbWVudDo6YWJvdXRUb1VubG9hZChtX2RhdGEsIGRvY3VtZW50KCkpOwogfQogCiBib29sIEhU
TUxJbnB1dEVsZW1lbnQ6OnNob3VsZFVzZUlucHV0TWV0aG9kKCkgY29uc3QKQEAgLTI0NSwyMyAr
MTc4LDE3IEBAIGJvb2wgSFRNTElucHV0RWxlbWVudDo6c2hvdWxkVXNlSW5wdXRNZXQKIAogdm9p
ZCBIVE1MSW5wdXRFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQoKQogewotICAgIGlmIChpc1Rl
eHRGaWVsZCgpKSB7Ci0gICAgICAgIHNldEF1dG9maWxsZWQoZmFsc2UpOwotICAgICAgICB1cGRh
dGVQbGFjZWhvbGRlclZpc2liaWxpdHkoKTsKLSAgICAgICAgaWYgKGlucHV0VHlwZSgpID09IFBB
U1NXT1JEICYmIGRvY3VtZW50KCktPmZyYW1lKCkpCi0gICAgICAgICAgICBkb2N1bWVudCgpLT5z
ZXRVc2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2ZSh0cnVlKTsKLSAgICB9CisgICAgSW5w
dXRFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQobV9kYXRhLCBkb2N1bWVudCgpKTsKKworICAg
IGlmIChpc1RleHRGaWVsZCgpKQorICAgICAgICBtX2F1dG9maWxsZWQgPSBmYWxzZTsKKwogICAg
IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6OmRpc3BhdGNoRm9jdXNFdmVudCgpOwog
fQogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmRpc3BhdGNoQmx1ckV2ZW50KCkKIHsKLSAgICBp
ZiAoaXNUZXh0RmllbGQoKSAmJiBkb2N1bWVudCgpLT5mcmFtZSgpKSB7Ci0gICAgICAgIHVwZGF0
ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSgpOwotICAgICAgICBpZiAoaW5wdXRUeXBlKCkgPT0gUEFT
U1dPUkQpCi0gICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRVc2VTZWN1cmVLZXlib2FyZEVudHJ5
V2hlbkFjdGl2ZShmYWxzZSk7Ci0gICAgICAgIGRvY3VtZW50KCktPmZyYW1lKCktPnRleHRGaWVs
ZERpZEVuZEVkaXRpbmcodGhpcyk7Ci0gICAgfQorICAgIElucHV0RWxlbWVudDo6ZGlzcGF0Y2hC
bHVyRXZlbnQobV9kYXRhLCBkb2N1bWVudCgpKTsKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50
V2l0aFN0YXRlOjpkaXNwYXRjaEJsdXJFdmVudCgpOwogfQogCkBAIC0zMzEsMTQgKzI1OCwxNCBA
QCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnNldElucHV0VHlwZShjb25zCiAgICAgICAgICAgICBi
b29sIGlzUGFzc3dvcmRGaWVsZCA9IGlucHV0VHlwZSgpID09IFBBU1NXT1JEOwogICAgICAgICAg
ICAgYm9vbCB3aWxsUmVzcGVjdEhlaWdodEFuZFdpZHRoID0gcmVzcGVjdEhlaWdodEFuZFdpZHRo
QXR0cnMoKTsKIAotICAgICAgICAgICAgaWYgKGRpZFN0b3JlVmFsdWUgJiYgIXdpbGxTdG9yZVZh
bHVlICYmICFtX3ZhbHVlLmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRl
KHZhbHVlQXR0ciwgbV92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgbV92YWx1ZSA9IFN0cmluZygp
OworICAgICAgICAgICAgaWYgKGRpZFN0b3JlVmFsdWUgJiYgIXdpbGxTdG9yZVZhbHVlICYmICFt
X2RhdGEudmFsdWUoKS5pc051bGwoKSkgeworICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZSh2
YWx1ZUF0dHIsIG1fZGF0YS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBtX2RhdGEuc2V0VmFs
dWUoU3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFkaWRTdG9yZVZh
bHVlICYmIHdpbGxTdG9yZVZhbHVlKQotICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBjb25zdHJh
aW5WYWx1ZShnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKSk7CisgICAgICAgICAgICAgICAgbV9kYXRh
LnNldFZhbHVlKGNvbnN0cmFpblZhbHVlKGdldEF0dHJpYnV0ZSh2YWx1ZUF0dHIpKSk7CiAgICAg
ICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVjaGVja1ZhbHVlKCk7CisgICAgICAgICAg
ICAgICAgSW5wdXRFbGVtZW50Ojp1cGRhdGVWYWx1ZUlmTmVlZGVkKG1fZGF0YSk7CiAKICAgICAg
ICAgICAgIGlmICh3YXNQYXNzd29yZEZpZWxkICYmICFpc1Bhc3N3b3JkRmllbGQpCiAgICAgICAg
ICAgICAgICAgdW5yZWdpc3RlckZvckFjdGl2YXRpb25DYWxsYmFja0lmTmVlZGVkKCk7CkBAIC0z
NjQsNyArMjkxLDcgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpzZXRJbnB1dFR5cGUoY29ucwog
ICAgICAgICAgICAgY2hlY2tlZFJhZGlvQnV0dG9ucyh0aGlzKS5hZGRCdXR0b24odGhpcyk7CiAg
ICAgICAgIH0KIAotICAgICAgICBub3RpZnlGb3JtU3RhdGVDaGFuZ2VkKHRoaXMpOworICAgICAg
ICBJbnB1dEVsZW1lbnQ6Om5vdGlmeUZvcm1TdGF0ZUNoYW5nZWQobV9kYXRhLCBkb2N1bWVudCgp
KTsKICAgICB9CiAgICAgbV9oYXZlVHlwZSA9IHRydWU7CiAKQEAgLTUwMCw4ICs0MjcsOCBAQCBp
bnQgSFRNTElucHV0RWxlbWVudDo6c2VsZWN0aW9uU3RhcnQoKSBjCiB7CiAgICAgaWYgKCFpc1Rl
eHRGaWVsZCgpKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoZG9jdW1lbnQoKS0+Zm9jdXNl
ZE5vZGUoKSAhPSB0aGlzICYmIGNhY2hlZFNlbFN0YXJ0ICE9IC0xKQotICAgICAgICByZXR1cm4g
Y2FjaGVkU2VsU3RhcnQ7CisgICAgaWYgKGRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkgIT0gdGhp
cyAmJiBtX2RhdGEuY2FjaGVkU2VsZWN0aW9uU3RhcnQoKSAhPSAtMSkKKyAgICAgICAgcmV0dXJu
IG1fZGF0YS5jYWNoZWRTZWxlY3Rpb25TdGFydCgpOwogICAgIGlmICghcmVuZGVyZXIoKSkKICAg
ICAgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250cm9s
Kj4ocmVuZGVyZXIoKSktPnNlbGVjdGlvblN0YXJ0KCk7CkBAIC01MTEsOCArNDM4LDggQEAgaW50
IEhUTUxJbnB1dEVsZW1lbnQ6OnNlbGVjdGlvbkVuZCgpIGNvbgogewogICAgIGlmICghaXNUZXh0
RmllbGQoKSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGRvY3VtZW50KCktPmZvY3VzZWRO
b2RlKCkgIT0gdGhpcyAmJiBjYWNoZWRTZWxFbmQgIT0gLTEpCi0gICAgICAgIHJldHVybiBjYWNo
ZWRTZWxFbmQ7CisgICAgaWYgKGRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkgIT0gdGhpcyAmJiBt
X2RhdGEuY2FjaGVkU2VsZWN0aW9uRW5kKCkgIT0gLTEpCisgICAgICAgIHJldHVybiBtX2RhdGEu
Y2FjaGVkU2VsZWN0aW9uRW5kKCk7CiAgICAgaWYgKCFyZW5kZXJlcigpKQogICAgICAgICByZXR1
cm4gMDsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5kZXJl
cigpKS0+c2VsZWN0aW9uRW5kKCk7CkBAIC01NDcsMTEgKzQ3NCw3IEBAIHZvaWQgSFRNTElucHV0
RWxlbWVudDo6c2VsZWN0KCkKIAogdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpzZXRTZWxlY3Rpb25S
YW5nZShpbnQgc3RhcnQsIGludCBlbmQpCiB7Ci0gICAgaWYgKCFpc1RleHRGaWVsZCgpKQotICAg
ICAgICByZXR1cm47Ci0gICAgaWYgKCFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm47Ci0gICAg
c3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5kZXJlcigpKS0+c2V0U2VsZWN0aW9u
UmFuZ2Uoc3RhcnQsIGVuZCk7CisgICAgSW5wdXRFbGVtZW50Ojp1cGRhdGVTZWxlY3Rpb25SYW5n
ZShtX2RhdGEsIHN0YXJ0LCBlbmQpOwogfQogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmFjY2Vz
c0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCkBAIC02MDYsNyArNTI5LDcgQEAgdm9p
ZCBIVE1MSW5wdXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYgogewogICAgIGlmIChhdHRyLT5u
YW1lKCkgPT0gbmFtZUF0dHIpIHsKICAgICAgICAgY2hlY2tlZFJhZGlvQnV0dG9ucyh0aGlzKS5y
ZW1vdmVCdXR0b24odGhpcyk7Ci0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVlKCk7CisgICAg
ICAgIG1fZGF0YS5zZXROYW1lKGF0dHItPnZhbHVlKCkpOwogICAgICAgICBjaGVja2VkUmFkaW9C
dXR0b25zKHRoaXMpLmFkZEJ1dHRvbih0aGlzKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBhdXRvY29tcGxldGVBdHRyKSB7CiAgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShh
dHRyLT52YWx1ZSgpLCAib2ZmIikpIHsKQEAgLTYyNCw3ICs1NDcsNyBAQCB2b2lkIEhUTUxJbnB1
dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmliCiAgICAgICAgIHNldElucHV0VHlwZShhdHRyLT52
YWx1ZSgpKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWx1ZUF0dHIpIHsKICAg
ICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHNldENoYW5nZWQgaWYgdGhlIGZvcm0gaXMgbG9va2lu
ZyBhdCB0aGUgZGVmYXVsdCB2YWx1ZSByaWdodCBub3cuCi0gICAgICAgIGlmIChtX3ZhbHVlLmlz
TnVsbCgpKQorICAgICAgICBpZiAobV9kYXRhLnZhbHVlKCkuaXNOdWxsKCkpCiAgICAgICAgICAg
ICBzZXRDaGFuZ2VkKCk7CiAgICAgICAgIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKGZhbHNlKTsK
ICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGVja2VkQXR0cikgewpAQCAtNjMzLDE5
ICs1NTYsMTEgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYgogICAg
ICAgICAgICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2VkKTsKICAgICAgICAgICAgIG1fdXNl
RGVmYXVsdENoZWNrZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gbWF4bGVuZ3RoQXR0cikgewotICAgICAgICBpbnQgb2xkTWF4TGVuID0gbV9tYXhM
ZW47Ci0gICAgICAgIG1fbWF4TGVuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50
b0ludCgpIDogY01heExlbjsKLSAgICAgICAgaWYgKG1fbWF4TGVuIDw9IDAgfHwgbV9tYXhMZW4g
PiBjTWF4TGVuKQotICAgICAgICAgICAgbV9tYXhMZW4gPSBjTWF4TGVuOwotICAgICAgICBpZiAo
b2xkTWF4TGVuICE9IG1fbWF4TGVuKQotICAgICAgICAgICAgcmVjaGVja1ZhbHVlKCk7Ci0gICAg
ICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXplQXR0
cikgewotICAgICAgICBtX3NpemUgPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRv
SW50KCkgOiAyMDsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJl
cigpLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBhbHRBdHRyKSB7CisgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gbWF4bGVuZ3RoQXR0cikKKyAgICAgICAgSW5wdXRFbGVtZW50OjpwYXJzZU1heExlbmd0aEF0
dHJpYnV0ZShtX2RhdGEsIGF0dHIpOworICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzaXpl
QXR0cikKKyAgICAgICAgSW5wdXRFbGVtZW50OjpwYXJzZVNpemVBdHRyaWJ1dGUobV9kYXRhLCBh
dHRyKTsKKyAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWx0QXR0cikgewogICAgICAgICBp
ZiAocmVuZGVyZXIoKSAmJiBpbnB1dFR5cGUoKSA9PSBJTUFHRSkKICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PFJlbmRlckltYWdlKj4ocmVuZGVyZXIoKSktPnVwZGF0ZUFsdFRleHQoKTsKICAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKSB7CkBAIC02OTksMTMgKzYxNCwxMyBA
QCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmliCiAgICAgICAgIHNldENo
YW5nZWQoKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBwbGFjZWhvbGRlckF0dHIp
IHsKICAgICAgICAgaWYgKGlzVGV4dEZpZWxkKCkpCi0gICAgICAgICAgICB1cGRhdGVQbGFjZWhv
bGRlclZpc2liaWxpdHkodHJ1ZSk7CisgICAgICAgICAgICBJbnB1dEVsZW1lbnQ6OnVwZGF0ZVBs
YWNlaG9sZGVyVmlzaWJpbGl0eShtX2RhdGEsIGRvY3VtZW50KCksIHRydWUpOwogICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0
ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFt
ZSgpID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBtYXhBdHRy
IHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gbXVsdGlwbGVBdHRyIHx8Ci0gICAg
ICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lzaW9uQXR0cikKKyAgICAgICAgICAgICBh
dHRyLT5uYW1lKCkgPT0gaW5jcmVtZW50YWxBdHRyIHx8CisgICAgICAgICAgICAgYXR0ci0+bmFt
ZSgpID09IG1pbkF0dHIgfHwKKyAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gbWF4QXR0ciB8
fAorICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIgfHwKKyAgICAgICAg
ICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lzaW9uQXR0cikKICAgICAgICAgc2V0Q2hhbmdlZCgp
OwogICAgIGVsc2UKICAgICAgICAgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6cGFy
c2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7CkBAIC04NTksOCArNzc0LDggQEAgYm9vbCBIVE1MSW5w
dXRFbGVtZW50OjphcHBlbmRGb3JtRGF0YShGbwogCiAgICAgICAgIGNhc2UgSU1BR0U6CiAgICAg
ICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZy5h
cHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAieCIgOiAobmFtZSgpICsgIi54IiksIHhQb3Mp
OwotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLmlzRW1wdHkoKSA/
ICJ5IiA6IChuYW1lKCkgKyAiLnkiKSwgeVBvcyk7CisgICAgICAgICAgICAgICAgZW5jb2Rpbmcu
YXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gIngiIDogKG5hbWUoKSArICIueCIpLCBtX3hQ
b3MpOworICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERhdGEobmFtZSgpLmlzRW1wdHko
KSA/ICJ5IiA6IChuYW1lKCkgKyAiLnkiKSwgbV95UG9zKTsKICAgICAgICAgICAgICAgICBpZiAo
IW5hbWUoKS5pc0VtcHR5KCkgJiYgIXZhbHVlKCkuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAg
ICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFsdWUoKSk7CiAgICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CkBAIC05NDQsMTQgKzg1OSwxOSBAQCB2b2lkIEhUTUxJbnB1dEVsZW1l
bnQ6OnNldEluZGV0ZXJtaW5hdGUoCiAgICAgICAgIHRoZW1lKCktPnN0YXRlQ2hhbmdlZChyZW5k
ZXJlcigpLCBDaGVja2VkU3RhdGUpOwogfQogCi12b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmNvcHlO
b25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnQgKnNvdXJjZSkKK2ludCBIVE1MSW5w
dXRFbGVtZW50OjpzaXplKCkgY29uc3QKIHsKLSAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50ICpz
b3VyY2VFbGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElucHV0RWxlbWVudCAqPihzb3VyY2Up
OworICAgIHJldHVybiBtX2RhdGEuc2l6ZSgpOworfQorCit2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6
OmNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnQqIHNvdXJjZSkKK3sKKyAg
ICBjb25zdCBIVE1MSW5wdXRFbGVtZW50KiBzb3VyY2VFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Y29u
c3QgSFRNTElucHV0RWxlbWVudCo+KHNvdXJjZSk7CisKKyAgICBtX2RhdGEuc2V0VmFsdWUoc291
cmNlRWxlbWVudC0+bV9kYXRhLnZhbHVlKCkpOworICAgIG1fY2hlY2tlZCA9IHNvdXJjZUVsZW1l
bnQtPm1fY2hlY2tlZDsKKyAgICBtX2luZGV0ZXJtaW5hdGUgPSBzb3VyY2VFbGVtZW50LT5tX2lu
ZGV0ZXJtaW5hdGU7CiAKLSAgICBtX3ZhbHVlID0gc291cmNlRWxlbS0+bV92YWx1ZTsKLSAgICBt
X2NoZWNrZWQgPSBzb3VyY2VFbGVtLT5tX2NoZWNrZWQ7Ci0gICAgbV9pbmRldGVybWluYXRlID0g
c291cmNlRWxlbS0+bV9pbmRldGVybWluYXRlOwotICAgIAogICAgIEhUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGU6OmNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKHNvdXJjZSk7CiB9CiAK
QEAgLTk2NSw3ICs4ODUsNyBAQCBTdHJpbmcgSFRNTElucHV0RWxlbWVudDo6dmFsdWUoKSBjb25z
dAogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgfQogCi0gICAgU3RyaW5nIHZhbHVlID0g
bV92YWx1ZTsKKyAgICBTdHJpbmcgdmFsdWUgPSBtX2RhdGEudmFsdWUoKTsKICAgICBpZiAodmFs
dWUuaXNOdWxsKCkpIHsKICAgICAgICAgdmFsdWUgPSBjb25zdHJhaW5WYWx1ZShnZXRBdHRyaWJ1
dGUodmFsdWVBdHRyKSk7CiAKQEAgLTEwMTQsMTQgKzkzNCwxNCBAQCB2b2lkIEhUTUxJbnB1dEVs
ZW1lbnQ6OnNldFZhbHVlKGNvbnN0IFN0CiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChpc1Rl
eHRGaWVsZCgpKQotICAgICAgICB1cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkoKTsKLSAgICAK
KyAgICAgICAgSW5wdXRFbGVtZW50Ojp1cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkobV9kYXRh
LCBkb2N1bWVudCgpKTsKKwogICAgIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKGZhbHNlKTsKICAg
ICBpZiAoc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSkgewogICAgICAgICBpZiAo
aW5wdXRUeXBlKCkgPT0gRklMRSkKICAgICAgICAgICAgIG1fZmlsZUxpc3QtPmNsZWFyKCk7CiAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgbV92YWx1ZSA9IGNvbnN0cmFpblZhbHVlKHZhbHVl
KTsKKyAgICAgICAgICAgIG1fZGF0YS5zZXRWYWx1ZShjb25zdHJhaW5WYWx1ZSh2YWx1ZSkpOwog
ICAgICAgICAgICAgaWYgKGlzVGV4dEZpZWxkKCkgJiYgaW5Eb2N1bWVudCgpKQogICAgICAgICAg
ICAgICAgIGRvY3VtZW50KCktPnVwZGF0ZVJlbmRlcmluZygpOwogICAgICAgICB9CkBAIC0xMDMy
LDQyICs5NTIsMzAgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpzZXRWYWx1ZShjb25zdCBTdAog
ICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBjb25zdHJhaW5WYWx1ZSh2YWx1ZSkpOwog
ICAgIAogICAgIGlmIChpc1RleHRGaWVsZCgpKSB7Ci0gICAgICAgIHVuc2lnbmVkIG1heCA9IG1f
dmFsdWUubGVuZ3RoKCk7CisgICAgICAgIHVuc2lnbmVkIG1heCA9IG1fZGF0YS52YWx1ZSgpLmxl
bmd0aCgpOwogICAgICAgICBpZiAoZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSA9PSB0aGlzKQot
ICAgICAgICAgICAgc2V0U2VsZWN0aW9uUmFuZ2UobWF4LCBtYXgpOwotICAgICAgICBlbHNlIHsK
LSAgICAgICAgICAgIGNhY2hlZFNlbFN0YXJ0ID0gbWF4OwotICAgICAgICAgICAgY2FjaGVkU2Vs
RW5kID0gbWF4OwotICAgICAgICB9CisgICAgICAgICAgICBJbnB1dEVsZW1lbnQ6OnVwZGF0ZVNl
bGVjdGlvblJhbmdlKG1fZGF0YSwgbWF4LCBtYXgpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBjYWNoZVNlbGVjdGlvbihtYXgsIG1heCk7CiAgICAgfQotICAgIG5vdGlmeUZvcm1TdGF0ZUNo
YW5nZWQodGhpcyk7CisgICAgSW5wdXRFbGVtZW50Ojpub3RpZnlGb3JtU3RhdGVDaGFuZ2VkKG1f
ZGF0YSwgZG9jdW1lbnQoKSk7CiB9CiAKLXZvaWQgSFRNTElucHV0RWxlbWVudDo6c2V0VmFsdWVG
cm9tUmVuZGVyZXIoY29uc3QgU3RyaW5nJiB2YWx1ZSkKK1N0cmluZyBIVE1MSW5wdXRFbGVtZW50
OjpwbGFjZWhvbGRlclZhbHVlKCkgY29uc3QKIHsKLSAgICAvLyBSZW5kZXJlciBhbmQgb3VyIGV2
ZW50IGhhbmRsZXIgYXJlIHJlc3BvbnNpYmxlIGZvciBjb25zdHJhaW5pbmcgdmFsdWVzLgotICAg
IEFTU0VSVCh2YWx1ZSA9PSBjb25zdHJhaW5WYWx1ZSh2YWx1ZSkgfHwgY29uc3RyYWluVmFsdWUo
dmFsdWUpLmlzRW1wdHkoKSk7Ci0KLSAgICAvLyBGaWxlIHVwbG9hZCBjb250cm9scyB3aWxsIGFs
d2F5cyB1c2Ugc2V0RmlsZUxpc3RGcm9tUmVuZGVyZXIuCi0gICAgQVNTRVJUIChpbnB1dFR5cGUo
KSAhPSBGSUxFKTsKLQotICAgIGlmIChpc1RleHRGaWVsZCgpKQotICAgICAgICB1cGRhdGVQbGFj
ZWhvbGRlclZpc2liaWxpdHkoKTsKLSAgICAKLSAgICAvLyBXb3JrYXJvdW5kIGZvciBidWcgd2hl
cmUgdHJhaWxpbmcgXG4gaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdCBvZiB0ZXh0Q29udGVudC4K
LSAgICAvLyBUaGUgYXNzZXJ0IG1hY3JvIGFib3ZlIG1heSBhbHNvIGJlIHNpbXBsaWZpZWQgdG86
ICB2YWx1ZSA9PSBjb25zdHJhaW5WYWx1ZSh2YWx1ZSkKLSAgICAvLyBodHRwOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NjYxCi0gICAgaWYgKHZhbHVlID09ICJcbiIpCi0gICAg
ICAgIG1fdmFsdWUgPSAiIjsKLSAgICBlbHNlCi0gICAgICAgIG1fdmFsdWUgPSB2YWx1ZTsKLQot
ICAgIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCk7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShw
bGFjZWhvbGRlckF0dHIpLnN0cmluZygpOworfQogCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBE
T00gZXZlbnQuCi0gICAgZGlzcGF0Y2hFdmVudEZvclR5cGUoZXZlbnROYW1lcygpLmlucHV0RXZl
bnQsIHRydWUsIGZhbHNlKTsKK2Jvb2wgSFRNTElucHV0RWxlbWVudDo6c2VhcmNoRXZlbnRzU2hv
dWxkQmVEaXNwYXRjaGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGFzQXR0cmlidXRlKGluY3Jl
bWVudGFsQXR0cik7Cit9CiAKLSAgICBub3RpZnlGb3JtU3RhdGVDaGFuZ2VkKHRoaXMpOwordm9p
ZCBIVE1MSW5wdXRFbGVtZW50OjpzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBTdHJpbmcmIHZh
bHVlKQoreworICAgIC8vIEZpbGUgdXBsb2FkIGNvbnRyb2xzIHdpbGwgYWx3YXlzIHVzZSBzZXRG
aWxlTGlzdEZyb21SZW5kZXJlci4KKyAgICBBU1NFUlQoaW5wdXRUeXBlKCkgIT0gRklMRSk7Cisg
ICAgSW5wdXRFbGVtZW50OjpzZXRWYWx1ZUZyb21SZW5kZXJlcihtX2RhdGEsIGRvY3VtZW50KCks
IHZhbHVlKTsKIH0KIAogdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpzZXRGaWxlTGlzdEZyb21SZW5k
ZXJlcihjb25zdCBWZWN0b3I8U3RyaW5nPiYgcGF0aHMpCkBAIC0xMDc4LDcgKzk4Niw3IEBAIHZv
aWQgSFRNTElucHV0RWxlbWVudDo6c2V0RmlsZUxpc3RGcm9tUmUKICAgICAgICAgbV9maWxlTGlz
dC0+YXBwZW5kKEZpbGU6OmNyZWF0ZShwYXRoc1tpXSkpOwogCiAgICAgc2V0VmFsdWVNYXRjaGVz
UmVuZGVyZXIoKTsKLSAgICBub3RpZnlGb3JtU3RhdGVDaGFuZ2VkKHRoaXMpOworICAgIElucHV0
RWxlbWVudDo6bm90aWZ5Rm9ybVN0YXRlQ2hhbmdlZChtX2RhdGEsIGRvY3VtZW50KCkpOwogfQog
CiBib29sIEhUTUxJbnB1dEVsZW1lbnQ6OnN0b3Jlc1ZhbHVlU2VwYXJhdGVGcm9tQXR0cmlidXRl
KCkgY29uc3QKQEAgLTExODUsMTMgKzEwOTMsMTMgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50Ojpk
ZWZhdWx0RXZlbnRIYW5kbAogICAgICAgICAvLyBGSVhNRTogV2UgY291bGQganVzdCBjYWxsIG9m
ZnNldFgoKSBhbmQgb2Zmc2V0WSgpIG9uIHRoZSBldmVudCwKICAgICAgICAgLy8gYnV0IHRoYXQn
cyBjdXJyZW50bHkgYnJva2VuLCBzbyBmb3Igbm93IGRvIHRoZSBjb21wdXRhdGlvbiBoZXJlLgog
ICAgICAgICBpZiAobWUtPmlzU2ltdWxhdGVkKCkgfHwgIXJlbmRlcmVyKCkpIHsKLSAgICAgICAg
ICAgIHhQb3MgPSAwOwotICAgICAgICAgICAgeVBvcyA9IDA7CisgICAgICAgICAgICBtX3hQb3Mg
PSAwOworICAgICAgICAgICAgbV95UG9zID0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg
ICAgIC8vIEZJWE1FOiBUaGlzIGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkgd2l0aCB0cmFuc2Zvcm1z
LgogICAgICAgICAgICAgSW50UG9pbnQgYWJzT2Zmc2V0ID0gcm91bmRlZEludFBvaW50KHJlbmRl
cmVyKCktPmxvY2FsVG9BYnNvbHV0ZSgpKTsKLSAgICAgICAgICAgIHhQb3MgPSBtZS0+cGFnZVgo
KSAtIGFic09mZnNldC54KCk7Ci0gICAgICAgICAgICB5UG9zID0gbWUtPnBhZ2VZKCkgLSBhYnNP
ZmZzZXQueSgpOworICAgICAgICAgICAgbV94UG9zID0gbWUtPnBhZ2VYKCkgLSBhYnNPZmZzZXQu
eCgpOworICAgICAgICAgICAgbV95UG9zID0gbWUtPnBhZ2VZKCkgLSBhYnNPZmZzZXQueSgpOwog
ICAgICAgICB9CiAgICAgfQogCkBAIC0xMjI2LDEzICsxMTM0LDEzIEBAIHZvaWQgSFRNTElucHV0
RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGwKICAgICAgICAgICAgICAgICBmb3JtKCktPnJlc2V0
KCk7CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IFdvdWxkIGJlIGNsZWFuZXIgdG8gZ2V0
IHhQb3MgYW5kIHlQb3Mgb3V0IG9mIHRoZSB1bmRlcmx5aW5nIG1vdXNlCisgICAgICAgICAgICAg
ICAgLy8gRklYTUU6IFdvdWxkIGJlIGNsZWFuZXIgdG8gZ2V0IG1feFBvcyBhbmQgbV95UG9zIG91
dCBvZiB0aGUgdW5kZXJseWluZyBtb3VzZQogICAgICAgICAgICAgICAgIC8vIGV2ZW50IChpZiBh
bnkpIGhlcmUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoZSB2YXJpYWJsZXMgc2V0IGFib3ZlIHdo
ZW4KICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHRoZSBjbGljayBldmVudC4gRXZlbiBi
ZXR0ZXIsIGFwcGVuZEZvcm1EYXRhIGNvdWxkIHBhc3MgdGhlCi0gICAgICAgICAgICAgICAgLy8g
ZXZlbnQgaW4sIGFuZCB0aGVuIHdlIGNvdWxkIGdldCByaWQgb2YgeFBvcyBhbmQgeVBvcyBhbHRv
Z2V0aGVyIQorICAgICAgICAgICAgICAgIC8vIGV2ZW50IGluLCBhbmQgdGhlbiB3ZSBjb3VsZCBn
ZXQgcmlkIG9mIG1feFBvcyBhbmQgbV95UG9zIGFsdG9nZXRoZXIhCiAgICAgICAgICAgICAgICAg
aWYgKCFmb3JtKCktPnByZXBhcmVTdWJtaXQoZXZ0KSkgewotICAgICAgICAgICAgICAgICAgICB4
UG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgeVBvcyA9IDA7CisgICAgICAgICAgICAgICAg
ICAgIG1feFBvcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1feVBvcyA9IDA7CiAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1fYWN0aXZlU3VibWl0ID0gZmFsc2U7CiAgICAg
ICAgICAgICB9CkBAIC0xNDExLDE4ICsxMzE5LDggQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50Ojpk
ZWZhdWx0RXZlbnRIYW5kbAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGV2dC0+
aXNCZWZvcmVUZXh0SW5zZXJ0ZWRFdmVudCgpKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0
IHRoZSB0ZXh0IHRvIGJlIGluc2VydGVkIHdpbGwgbm90IHZpb2xhdGUgdGhlIG1heExlbmd0aC4K
LSAgICAgICAgaW50IG9sZExlbiA9IG51bUdyYXBoZW1lQ2x1c3RlcnModmFsdWUoKS5pbXBsKCkp
OwotICAgICAgICBBU1NFUlQob2xkTGVuIDw9IG1heExlbmd0aCgpKTsKLSAgICAgICAgaW50IHNl
bGVjdGlvbkxlbiA9IG51bUdyYXBoZW1lQ2x1c3RlcnMocGxhaW5UZXh0KGRvY3VtZW50KCktPmZy
YW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKS50b1JhbmdlKCkuZ2V0KCkpLmltcGwoKSk7
Ci0gICAgICAgIEFTU0VSVChvbGRMZW4gPj0gc2VsZWN0aW9uTGVuKTsKLSAgICAgICAgaW50IG1h
eE5ld0xlbiA9IG1heExlbmd0aCgpIC0gKG9sZExlbiAtIHNlbGVjdGlvbkxlbik7Ci0KLSAgICAg
ICAgLy8gVHJ1bmNhdGUgdGhlIGluc2VydGVkIHRleHQgdG8gYXZvaWQgdmlvbGF0aW5nIHRoZSBt
YXhMZW5ndGggYW5kIG90aGVyIGNvbnN0cmFpbnRzLgotICAgICAgICBCZWZvcmVUZXh0SW5zZXJ0
ZWRFdmVudCogdGV4dEV2ZW50ID0gc3RhdGljX2Nhc3Q8QmVmb3JlVGV4dEluc2VydGVkRXZlbnQq
PihldnQpOwotICAgICAgICB0ZXh0RXZlbnQtPnNldFRleHQoY29uc3RyYWluVmFsdWUodGV4dEV2
ZW50LT50ZXh0KCksIG1heE5ld0xlbikpOwotICAgIH0KKyAgICBpZiAoZXZ0LT5pc0JlZm9yZVRl
eHRJbnNlcnRlZEV2ZW50KCkpCisgICAgICAgIElucHV0RWxlbWVudDo6aGFuZGxlQmVmb3JlVGV4
dEluc2VydGVkRXZlbnQobV9kYXRhLCBkb2N1bWVudCgpLCBldnQpOwogCiAgICAgaWYgKGlzVGV4
dEZpZWxkKCkgJiYgcmVuZGVyZXIoKSAmJiAoZXZ0LT5pc01vdXNlRXZlbnQoKSB8fCBldnQtPmlz
RHJhZ0V2ZW50KCkgfHwgZXZ0LT5pc1doZWVsRXZlbnQoKSB8fCBldnQtPnR5cGUoKSA9PSBldmVu
dE5hbWVzKCkuYmx1ckV2ZW50IHx8IGV2dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5mb2N1c0V2
ZW50KSkKICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lKj4o
cmVuZGVyZXIoKSktPmZvcndhcmRFdmVudChldnQpOwpAQCAtMTQ2OCw2ICsxMzY2LDExIEBAIHZv
aWQgSFRNTElucHV0RWxlbWVudDo6c2V0RGVmYXVsdENoZWNrZWQKICAgICBzZXRBdHRyaWJ1dGUo
Y2hlY2tlZEF0dHIsIGRlZmF1bHRDaGVja2VkID8gIiIgOiAwKTsKIH0KIAordm9pZCBIVE1MSW5w
dXRFbGVtZW50OjpzZXREZWZhdWx0TmFtZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7Cisg
ICAgbV9kYXRhLnNldE5hbWUobmFtZSk7Cit9CisKIFN0cmluZyBIVE1MSW5wdXRFbGVtZW50Ojph
Y2NlcHQoKSBjb25zdAogewogICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWNjZXB0QXR0cik7CkBA
IC0xNTA4LDYgKzE0MTEsMTEgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpzZXRBbHQoY29uc3Qg
U3RyaQogICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2YWx1ZSk7CiB9CiAKK2ludCBIVE1MSW5w
dXRFbGVtZW50OjptYXhMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEubWF4TGVu
Z3RoKCk7Cit9CisKIHZvaWQgSFRNTElucHV0RWxlbWVudDo6c2V0TWF4TGVuZ3RoKGludCBfbWF4
TGVuZ3RoKQogewogICAgIHNldEF0dHJpYnV0ZShtYXhsZW5ndGhBdHRyLCBTdHJpbmc6Om51bWJl
cihfbWF4TGVuZ3RoKSk7CkBAIC0xNTU2LDE1ICsxNDY0LDcgQEAgRmlsZUxpc3QqIEhUTUxJbnB1
dEVsZW1lbnQ6OmZpbGVzKCkKIAogU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnQ6OmNvbnN0cmFpblZh
bHVlKGNvbnN0IFN0cmluZyYgcHJvcG9zZWRWYWx1ZSkgY29uc3QKIHsKLSAgICByZXR1cm4gY29u
c3RyYWluVmFsdWUocHJvcG9zZWRWYWx1ZSwgbV9tYXhMZW4pOwotfQotCi12b2lkIEhUTUxJbnB1
dEVsZW1lbnQ6OnJlY2hlY2tWYWx1ZSgpCi17Ci0gICAgU3RyaW5nIG9sZFZhbHVlID0gdmFsdWUo
KTsKLSAgICBTdHJpbmcgbmV3VmFsdWUgPSBjb25zdHJhaW5WYWx1ZShvbGRWYWx1ZSk7Ci0gICAg
aWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKQotICAgICAgICBzZXRWYWx1ZShuZXdWYWx1ZSk7Cisg
ICAgcmV0dXJuIElucHV0RWxlbWVudDo6Y29uc3RyYWluVmFsdWUobV9kYXRhLCBwcm9wb3NlZFZh
bHVlLCBtX2RhdGEubWF4TGVuZ3RoKCkpOwogfQogCiBib29sIEhUTUxJbnB1dEVsZW1lbnQ6Om5l
ZWRzQWN0aXZhdGlvbkNhbGxiYWNrKCkKQEAgLTE1ODQsNDAgKzE0ODQsMTAgQEAgdm9pZCBIVE1M
SW5wdXRFbGVtZW50Ojp1bnJlZ2lzdGVyRm9yQWN0aQogICAgICAgICBkb2N1bWVudCgpLT51bnJl
Z2lzdGVyRm9yRG9jdW1lbnRBY3RpdmF0aW9uQ2FsbGJhY2tzKHRoaXMpOwogfQogCi12b2lkIEhU
TUxJbnB1dEVsZW1lbnQ6OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eShib29sIHBsYWNlaG9s
ZGVyVmFsdWVDaGFuZ2VkKQordm9pZCBIVE1MSW5wdXRFbGVtZW50OjpjYWNoZVNlbGVjdGlvbihp
bnQgc3RhcnQsIGludCBlbmQpCiB7Ci0gICAgQVNTRVJUKGlzVGV4dEZpZWxkKCkpOwotCi0gICAg
Ym9vbCBvbGRQbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSA9IG1fcGxhY2Vob2xkZXJTaG91bGRC
ZVZpc2libGU7Ci0KLSAgICBtX3BsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlID0gdmFsdWUoKS5p
c0VtcHR5KCkgCi0gICAgICAgICYmIGRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkgIT0gdGhpcwot
ICAgICAgICAmJiAhZ2V0QXR0cmlidXRlKHBsYWNlaG9sZGVyQXR0cikuaXNFbXB0eSgpOwotCi0g
ICAgaWYgKChvbGRQbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSAhPSBtX3BsYWNlaG9sZGVyU2hv
dWxkQmVWaXNpYmxlIHx8IHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2VkKSAmJiByZW5kZXJlcigpKQot
ICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUqPihyZW5kZXJl
cigpKS0+dXBkYXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5KCk7Ci19Ci0KLVN0cmluZyBIVE1MSW5w
dXRFbGVtZW50Ojpjb25zdHJhaW5WYWx1ZShjb25zdCBTdHJpbmcmIHByb3Bvc2VkVmFsdWUsIGlu
dCBtYXhMZW4pIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHN0cmluZyA9IHByb3Bvc2VkVmFsdWU7Ci0g
ICAgaWYgKGlzVGV4dEZpZWxkKCkpIHsKLSAgICAgICAgc3RyaW5nLnJlcGxhY2UoIlxyXG4iLCAi
ICIpOwotICAgICAgICBzdHJpbmcucmVwbGFjZSgnXHInLCAnICcpOwotICAgICAgICBzdHJpbmcu
cmVwbGFjZSgnXG4nLCAnICcpOwotICAgICAgICBTdHJpbmdJbXBsKiBzID0gc3RyaW5nLmltcGwo
KTsKLSAgICAgICAgaW50IG5ld0xlbiA9IG51bUNoYXJhY3RlcnNJbkdyYXBoZW1lQ2x1c3RlcnMo
cywgbWF4TGVuKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdMZW47ICsraSkgewot
ICAgICAgICAgICAgY29uc3QgVUNoYXIgY3VycmVudCA9ICgqcylbaV07Ci0gICAgICAgICAgICBp
ZiAoY3VycmVudCA8ICcgJyAmJiBjdXJyZW50ICE9ICdcdCcpIHsKLSAgICAgICAgICAgICAgICBu
ZXdMZW4gPSBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgICAgIGlmIChuZXdMZW4gPCBzdGF0aWNfY2FzdDxpbnQ+KHN0cmluZy5sZW5ndGgo
KSkpCi0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBuZXdMZW4pOwotICAg
IH0KLSAgICByZXR1cm4gc3RyaW5nOworICAgIG1fZGF0YS5zZXRDYWNoZWRTZWxlY3Rpb25TdGFy
dChzdGFydCk7CisgICAgbV9kYXRhLnNldENhY2hlZFNlbGVjdGlvbkVuZChlbmQpOwogfQogCiB2
b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmFkZFNlYXJjaFJlc3VsdCgpCkBAIC0xNjM3LDkgKzE1MDcs
OSBAQCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6Om9uU2VhcmNoKCkKIAogU2VsZWN0aW9uIEhUTUxJ
bnB1dEVsZW1lbnQ6OnNlbGVjdGlvbigpIGNvbnN0CiB7Ci0gICBpZiAoIXJlbmRlcmVyKCkgfHwg
IWlzVGV4dEZpZWxkKCkgfHwgY2FjaGVkU2VsU3RhcnQgPT0gLTEgfHwgY2FjaGVkU2VsRW5kID09
IC0xKQorICAgaWYgKCFyZW5kZXJlcigpIHx8ICFpc1RleHRGaWVsZCgpIHx8IG1fZGF0YS5jYWNo
ZWRTZWxlY3Rpb25TdGFydCgpID09IC0xIHx8IG1fZGF0YS5jYWNoZWRTZWxlY3Rpb25FbmQoKSA9
PSAtMSkKICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbigpOwotICAgcmV0dXJuIHN0YXRpY19jYXN0
PFJlbmRlclRleHRDb250cm9sKj4ocmVuZGVyZXIoKSktPnNlbGVjdGlvbihjYWNoZWRTZWxTdGFy
dCwgY2FjaGVkU2VsRW5kKTsKKyAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJv
bCo+KHJlbmRlcmVyKCkpLT5zZWxlY3Rpb24obV9kYXRhLmNhY2hlZFNlbGVjdGlvblN0YXJ0KCks
IG1fZGF0YS5jYWNoZWRTZWxlY3Rpb25FbmQoKSk7CiB9CiAKIHZvaWQgSFRNTElucHV0RWxlbWVu
dDo6ZG9jdW1lbnREaWRCZWNvbWVBY3RpdmUoKQpAQCAtMTY3OSw0ICsxNTQ5LDEwIEBAIGJvb2wg
SFRNTElucHV0RWxlbWVudDo6d2lsbFZhbGlkYXRlKCkgY28KICAgICByZXR1cm4gSFRNTEZvcm1D
b250cm9sRWxlbWVudFdpdGhTdGF0ZTo6d2lsbFZhbGlkYXRlKCkgJiYgaW5wdXRUeXBlKCkgIT0g
SElEREVOICYmCiAgICAgICAgICAgIGlucHV0VHlwZSgpICE9IEJVVFRPTiAmJiBpbnB1dFR5cGUo
KSAhPSBSRVNFVDsKIH0KKworYm9vbCBIVE1MSW5wdXRFbGVtZW50OjpwbGFjZWhvbGRlclNob3Vs
ZEJlVmlzaWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS5wbGFjZWhvbGRlclNob3Vs
ZEJlVmlzaWJsZSgpOworfQorCiB9IC8vIG5hbWVzcGFjZQpJbmRleDogaHRtbC9IVE1MSW5wdXRF
bGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgJKHJldmlzaW9u
IDQwMDUzKQorKysgaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI1
LDYgKzI1LDcgQEAKICNkZWZpbmUgSFRNTElucHV0RWxlbWVudF9oCiAKICNpbmNsdWRlICJIVE1M
Rm9ybUNvbnRyb2xFbGVtZW50LmgiCisjaW5jbHVkZSAiSW5wdXRFbGVtZW50LmgiCiAjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0zNCw3ICszNSw3IEBA
IGNsYXNzIEhUTUxJbWFnZUxvYWRlcjsKIGNsYXNzIEtVUkw7CiBjbGFzcyBTZWxlY3Rpb247CiAK
LWNsYXNzIEhUTUxJbnB1dEVsZW1lbnQgOiBwdWJsaWMgSFRNTEZvcm1Db250cm9sRWxlbWVudFdp
dGhTdGF0ZSB7CitjbGFzcyBIVE1MSW5wdXRFbGVtZW50IDogcHVibGljIEhUTUxGb3JtQ29udHJv
bEVsZW1lbnRXaXRoU3RhdGUsIHB1YmxpYyBJbnB1dEVsZW1lbnQgewogcHVibGljOgogICAgIGVu
dW0gSW5wdXRUeXBlIHsKICAgICAgICAgVEVYVCwKQEAgLTc0LDcgKzc1LDcgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgYm9vbCBzaG91bGRVc2VJbnB1dE1ldGhvZCgpIGNvbnN0OwogCiAgICAgdmly
dHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBjb25zdDsKLQorIAogICAgIGJvb2wgYXV0
b0NvbXBsZXRlKCkgY29uc3Q7CiAKICAgICAvLyBpc0NoZWNrZWQgaXMgdXNlZCBieSB0aGUgcmVu
ZGVyaW5nIHRyZWUvQ1NTIHdoaWxlIGNoZWNrZWQoKSBpcyB1c2VkIGJ5IEpTIHRvIGRldGVybWlu
ZSBjaGVja2VkIHN0YXRlCkBAIC04Nyw4ICs4OCw4IEBAIHB1YmxpYzoKIAogICAgIGJvb2wgaXNU
ZXh0QnV0dG9uKCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFNVQk1JVCB8fCBtX3R5cGUgPT0g
UkVTRVQgfHwgbV90eXBlID09IEJVVFRPTjsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1JhZGlvQnV0
dG9uKCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFJBRElPOyB9Ci0gICAgYm9vbCBpc1RleHRG
aWVsZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBURVhUIHx8IG1fdHlwZSA9PSBQQVNTV09S
RCB8fCBtX3R5cGUgPT0gU0VBUkNIIHx8IG1fdHlwZSA9PSBJU0lOREVYOyB9Ci0gICAgYm9vbCBp
c1NlYXJjaEZpZWxkKCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFNFQVJDSDsgfQorICAgIHZp
cnR1YWwgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBURVhUIHx8
IG1fdHlwZSA9PSBQQVNTV09SRCB8fCBtX3R5cGUgPT0gU0VBUkNIIHx8IG1fdHlwZSA9PSBJU0lO
REVYOyB9CisgICAgdmlydHVhbCBib29sIGlzU2VhcmNoRmllbGQoKSBjb25zdCB7IHJldHVybiBt
X3R5cGUgPT0gU0VBUkNIOyB9CiAgICAgdmlydHVhbCBib29sIGlzSW5wdXRUeXBlSGlkZGVuKCkg
Y29uc3QgeyByZXR1cm4gbV90eXBlID09IEhJRERFTjsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1Bh
c3N3b3JkRmllbGQoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gUEFTU1dPUkQ7IH0KIApAQCAt
OTYsMTcgKzk3LDE5IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldENoZWNrZWQoYm9vbCwgYm9vbCBz
ZW5kQ2hhbmdlRXZlbnQgPSBmYWxzZSk7CiAgICAgYm9vbCBpbmRldGVybWluYXRlKCkgY29uc3Qg
eyByZXR1cm4gbV9pbmRldGVybWluYXRlOyB9CiAgICAgdm9pZCBzZXRJbmRldGVybWluYXRlKGJv
b2wpOwotICAgIGludCBtYXhMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX21heExlbjsgfQotICAg
IGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgdmlydHVhbCBpbnQgc2l6
ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiB0eXBlKCkgY29uc3Q7
CiAgICAgdm9pZCBzZXRUeXBlKGNvbnN0IFN0cmluZyYpOwogCi0gICAgU3RyaW5nIHZhbHVlKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmKTsKKyAgICB2aXJ0dWFsIFN0
cmluZyB2YWx1ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJp
bmcmKTsKKworICAgIHZpcnR1YWwgU3RyaW5nIHBsYWNlaG9sZGVyVmFsdWUoKSBjb25zdDsKKyAg
ICB2aXJ0dWFsIGJvb2wgc2VhcmNoRXZlbnRzU2hvdWxkQmVEaXNwYXRjaGVkKCkgY29uc3Q7CiAK
ICAgICBTdHJpbmcgdmFsdWVXaXRoRGVmYXVsdCgpIGNvbnN0OwogCi0gICAgdm9pZCBzZXRWYWx1
ZUZyb21SZW5kZXJlcihjb25zdCBTdHJpbmcmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VmFsdWVG
cm9tUmVuZGVyZXIoY29uc3QgU3RyaW5nJik7CiAgICAgdm9pZCBzZXRGaWxlTGlzdEZyb21SZW5k
ZXJlcihjb25zdCBWZWN0b3I8U3RyaW5nPiYpOwogCiAgICAgdmlydHVhbCBib29sIHNhdmVTdGF0
ZShTdHJpbmcmIHZhbHVlKSBjb25zdDsKQEAgLTExOSw3ICsxMjIsNyBAQCBwdWJsaWM6CiAgICAg
aW50IHNlbGVjdGlvbkVuZCgpIGNvbnN0OwogICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50
KTsKICAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwotICAgIHZvaWQgc2VsZWN0KCk7Cisg
ICAgdmlydHVhbCB2b2lkIHNlbGVjdCgpOwogICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50
IHN0YXJ0LCBpbnQgZW5kKTsKIAogICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9v
bCBzZW5kVG9BbnlFbGVtZW50KTsKQEAgLTE2Myw2ICsxNjYsOCBAQCBwdWJsaWM6CiAgICAgYm9v
bCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwogICAgIHZvaWQgc2V0RGVmYXVsdENoZWNrZWQoYm9v
bCk7CiAKKyAgICB2b2lkIHNldERlZmF1bHROYW1lKGNvbnN0IEF0b21pY1N0cmluZyYpOworCiAg
ICAgU3RyaW5nIGFjY2VwdCgpIGNvbnN0OwogICAgIHZvaWQgc2V0QWNjZXB0KGNvbnN0IFN0cmlu
ZyYpOwogCkBAIC0xODAsMjMgKzE4NSwyNCBAQCBwdWJsaWM6CiAgICAgS1VSTCBzcmMoKSBjb25z
dDsKICAgICB2b2lkIHNldFNyYyhjb25zdCBTdHJpbmcmKTsKIAorICAgIGludCBtYXhMZW5ndGgo
KSBjb25zdDsKICAgICB2b2lkIHNldE1heExlbmd0aChpbnQpOwogCiAgICAgU3RyaW5nIHVzZU1h
cCgpIGNvbnN0OwogICAgIHZvaWQgc2V0VXNlTWFwKGNvbnN0IFN0cmluZyYpOwogCi0gICAgdmly
dHVhbCBib29sIGlzQXV0b2ZpbGxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2ZpbGxlZDsgfQot
ICAgIHZvaWQgc2V0QXV0b2ZpbGxlZChib29sIGIgPSB0cnVlKTsKKyAgICBib29sIGlzQXV0b2Zp
bGxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2ZpbGxlZDsgfQorICAgIHZvaWQgc2V0QXV0b2Zp
bGxlZChib29sIHZhbHVlID0gdHJ1ZSk7CiAKICAgICBGaWxlTGlzdCogZmlsZXMoKTsKIAotICAg
IHZvaWQgY2FjaGVTZWxlY3Rpb24oaW50IHMsIGludCBlKSB7IGNhY2hlZFNlbFN0YXJ0ID0gczsg
Y2FjaGVkU2VsRW5kID0gZTsgfTsKKyAgICB2aXJ0dWFsIHZvaWQgY2FjaGVTZWxlY3Rpb24oaW50
IHN0YXJ0LCBpbnQgZW5kKTsKICAgICB2b2lkIGFkZFNlYXJjaFJlc3VsdCgpOwogICAgIHZvaWQg
b25TZWFyY2goKTsKLSAgICAKKwogICAgIFNlbGVjdGlvbiBzZWxlY3Rpb24oKSBjb25zdDsKIAot
ICAgIFN0cmluZyBjb25zdHJhaW5WYWx1ZShjb25zdCBTdHJpbmcmIHByb3Bvc2VkVmFsdWUpIGNv
bnN0OworICAgIHZpcnR1YWwgU3RyaW5nIGNvbnN0cmFpblZhbHVlKGNvbnN0IFN0cmluZyYgcHJv
cG9zZWRWYWx1ZSkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHZvaWQgZG9jdW1lbnREaWRCZWNvbWVB
Y3RpdmUoKTsKIApAQCAtMjA0LDM5ICsyMTAsMjUgQEAgcHVibGljOgogICAgIAogICAgIHZpcnR1
YWwgYm9vbCB3aWxsVmFsaWRhdGUoKSBjb25zdDsKIAotICAgIGJvb2wgcGxhY2Vob2xkZXJTaG91
bGRCZVZpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3BsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxl
OyB9CisgICAgdmlydHVhbCBib29sIHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCkgY29uc3Q7
CiAgICAgCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB2b2lkIHdpbGxNb3ZlVG9OZXdPd25lckRv
Y3VtZW50KCk7CiAgICAgdmlydHVhbCB2b2lkIGRpZE1vdmVUb05ld093bmVyRG9jdW1lbnQoKTsK
LSAgICAKLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwogCiBwcml2YXRlOgotICAgIHZvaWQgaW5p
dCgpOwogICAgIGJvb2wgc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1dGUoKSBjb25zdDsK
LSAgICBTdHJpbmcgY29uc3RyYWluVmFsdWUoY29uc3QgU3RyaW5nJiBwcm9wb3NlZFZhbHVlLCBp
bnQgbWF4TGVuKSBjb25zdDsKLSAgICB2b2lkIHJlY2hlY2tWYWx1ZSgpOwotICAgIAorCiAgICAg
Ym9vbCBuZWVkc0FjdGl2YXRpb25DYWxsYmFjaygpOwogICAgIHZvaWQgcmVnaXN0ZXJGb3JBY3Rp
dmF0aW9uQ2FsbGJhY2tJZk5lZWRlZCgpOwogICAgIHZvaWQgdW5yZWdpc3RlckZvckFjdGl2YXRp
b25DYWxsYmFja0lmTmVlZGVkKCk7CiAKLSAgICB2b2lkIHVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJp
bGl0eShib29sIHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2VkID0gZmFsc2UpOwotICAgIAotICAgIFN0
cmluZyBtX3ZhbHVlOwotICAgIFN0cmluZyBtX29yaWdpbmFsVmFsdWU7Ci0gICAgaW50IHhQb3M7
Ci0gICAgaW50IHlQb3M7Ci0gICAgaW50IG1fbWF4TGVuOwotICAgIGludCBtX3NpemU7Ci0KKyAg
ICBJbnB1dEVsZW1lbnREYXRhIG1fZGF0YTsKKyAgICBpbnQgbV94UG9zOworICAgIGludCBtX3lQ
b3M7CiAgICAgc2hvcnQgbV9tYXhSZXN1bHRzOwotCiAgICAgT3duUHRyPEhUTUxJbWFnZUxvYWRl
cj4gbV9pbWFnZUxvYWRlcjsKLQogICAgIFJlZlB0cjxGaWxlTGlzdD4gbV9maWxlTGlzdDsKLQog
ICAgIHVuc2lnbmVkIG1fdHlwZSA6IDQ7IC8vIElucHV0VHlwZSAKICAgICBib29sIG1fY2hlY2tl
ZCA6IDE7CiAgICAgYm9vbCBtX2RlZmF1bHRDaGVja2VkIDogMTsKQEAgLTI0NywxMCArMjM5LDYg
QEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBtX2F1dG9jb21wbGV0ZSA6IDI7IC8vIEF1dG9Db21w
bGV0ZVNldHRpbmcKICAgICBib29sIG1fYXV0b2ZpbGxlZCA6IDE7CiAgICAgYm9vbCBtX2luaXRl
ZCA6IDE7Ci0gICAgYm9vbCBtX3BsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlIDogMTsKLSAgICAK
LSAgICBpbnQgY2FjaGVkU2VsU3RhcnQ7Ci0gICAgaW50IGNhY2hlZFNlbEVuZDsKIH07CiAKIH0g
Ly9uYW1lc3BhY2UKSW5kZXg6IGh0bWwvSFRNTElzSW5kZXhFbGVtZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBodG1sL0hUTUxJc0luZGV4RWxlbWVudC5jcHAJKHJldmlzaW9uIDQwMDUzKQorKysgaHRt
bC9IVE1MSXNJbmRleEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw3ICszNCw3IEBA
IEhUTUxJc0luZGV4RWxlbWVudDo6SFRNTElzSW5kZXhFbGVtZW50KGMKICAgICA6IEhUTUxJbnB1
dEVsZW1lbnQodGFnTmFtZSwgZG9jLCBmKQogewogICAgIEFTU0VSVChoYXNUYWdOYW1lKGlzaW5k
ZXhUYWcpKTsKLSAgICBtX25hbWUgPSAiaXNpbmRleCI7CisgICAgc2V0RGVmYXVsdE5hbWUoaXNp
bmRleFRhZy5sb2NhbE5hbWUoKSk7CiB9CiAKIHZvaWQgSFRNTElzSW5kZXhFbGVtZW50OjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIpCkluZGV4OiByZW5kZXJpbmcv
UmVuZGVyVGV4dENvbnRyb2wuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0
Q29udHJvbC5jcHAJKHJldmlzaW9uIDQwMDUzKQorKysgcmVuZGVyaW5nL1JlbmRlclRleHRDb250
cm9sLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTc1LDExICs1NzUsNyBAQCBIVE1MRWxlbWVudCog
UmVuZGVyVGV4dENvbnRyb2w6OmlubmVyVGV4CiAKIEZvcm1Db250cm9sRWxlbWVudCogUmVuZGVy
VGV4dENvbnRyb2w6OmZvcm1Db250cm9sRWxlbWVudCgpIGNvbnN0CiB7Ci0gICAgaWYgKG5vZGUo
KS0+aXNIVE1MRWxlbWVudCgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1D
b250cm9sRWxlbWVudCo+KG5vZGUoKSk7Ci0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAg
ICByZXR1cm4gMDsKKyAgICByZXR1cm4gZm9ybUNvbnRyb2xFbGVtZW50Rm9yRWxlbWVudChzdGF0
aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3BwCShyZXZpc2lv
biA0MDA1MykKKysrIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5o
IgogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIK
KyNpbmNsdWRlICJJbnB1dEVsZW1lbnQuaCIKICNpbmNsdWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgi
CiAjaW5jbHVkZSAiTW91c2VFdmVudC5oIgogI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVu
dC5oIgpAQCAtNjksNyArNzAsNyBAQCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6On5SZW5k
ZXJUZXh0CiAKIGJvb2wgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpwbGFjZWhvbGRlclNo
b3VsZEJlVmlzaWJsZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihub2RlKCkpLT5wbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpOworICAgIHJl
dHVybiBpbnB1dEVsZW1lbnQoKS0+cGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUoKTsKIH0KIAog
dm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJp
bGl0eSgpCkBAIC05MCw2ICs5MSw3IEBAIHZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5l
Ojp1cGRhdGUKIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmFkZFNlYXJjaFJl
c3VsdCgpCiB7CisgICAgQVNTRVJUKG5vZGUoKS0+aXNIVE1MRWxlbWVudCgpKTsKICAgICBIVE1M
SW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2Rl
KCkpOwogICAgIGlmIChpbnB1dC0+bWF4UmVzdWx0cygpIDw9IDApCiAgICAgICAgIHJldHVybjsK
QEAgLTEyMSwxMSArMTIzLDEzIEBAIHZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjph
ZGRTZWEKIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnN0b3BTZWFyY2hFdmVu
dFRpbWVyKCkKIHsKKyAgICBBU1NFUlQobm9kZSgpLT5pc0hUTUxFbGVtZW50KCkpOwogICAgIG1f
c2VhcmNoRXZlbnRUaW1lci5zdG9wKCk7CiB9CiAKIHZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjpzaG93UG9wdXAoKQogeworICAgIEFTU0VSVChub2RlKCktPmlzSFRNTEVsZW1lbnQo
KSk7CiAgICAgaWYgKG1fc2VhcmNoUG9wdXBJc1Zpc2libGUpCiAgICAgICAgIHJldHVybjsKIApA
QCAtMTU1LDYgKzE1OSw3IEBAIHZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzaG93
UG8KIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmhpZGVQb3B1cCgpCiB7Cisg
ICAgQVNTRVJUKG5vZGUoKS0+aXNIVE1MRWxlbWVudCgpKTsKICAgICBpZiAobV9zZWFyY2hQb3B1
cCkKICAgICAgICAgbV9zZWFyY2hQb3B1cC0+aGlkZSgpOwogCkBAIC0xNjYsMjQgKzE3MSwyNCBA
QCB2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6c3VidHJlCiAgICAgYm9vbCB3YXNF
ZGl0ZWQgPSBpc0VkaXRlZCgpOwogICAgIFJlbmRlclRleHRDb250cm9sOjpzdWJ0cmVlSGFzQ2hh
bmdlZCgpOwogCi0gICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBJbnB1dEVsZW1lbnQqIGlucHV0ID0gaW5wdXRF
bGVtZW50KCk7CiAgICAgaW5wdXQtPnNldFZhbHVlRnJvbVJlbmRlcmVyKGlucHV0LT5jb25zdHJh
aW5WYWx1ZSh0ZXh0KCkpKTsKIAogICAgIGlmIChSZW5kZXJPYmplY3QqIGNhbmNlbEJ1dHRvblJl
bmRlcmVyID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSA6IDAp
CiAgICAgICAgIHVwZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxpdHkoY2FuY2VsQnV0dG9uUmVuZGVy
ZXItPnN0eWxlKCkpOwogCiAgICAgLy8gSWYgdGhlIGluY3JlbWVudGFsIGF0dHJpYnV0ZSBpcyBz
ZXQsIHRoZW4gZGlzcGF0Y2ggdGhlIHNlYXJjaCBldmVudAotICAgIGlmICghaW5wdXQtPmdldEF0
dHJpYnV0ZShpbmNyZW1lbnRhbEF0dHIpLmlzTnVsbCgpKQorICAgIGlmIChpbnB1dC0+c2VhcmNo
RXZlbnRzU2hvdWxkQmVEaXNwYXRjaGVkKCkpCiAgICAgICAgIHN0YXJ0U2VhcmNoRXZlbnRUaW1l
cigpOwogCi0gICAgaWYgKCF3YXNFZGl0ZWQgJiYgaW5wdXQtPmZvY3VzZWQoKSkgeworICAgIGlm
ICghd2FzRWRpdGVkICYmIG5vZGUoKS0+Zm9jdXNlZCgpKSB7CiAgICAgICAgIGlmIChGcmFtZSog
ZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICAgICAgZnJhbWUtPnRleHRGaWVs
ZERpZEJlZ2luRWRpdGluZyhpbnB1dCk7CisgICAgICAgICAgICBmcmFtZS0+dGV4dEZpZWxkRGlk
QmVnaW5FZGl0aW5nKHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKICAgICB9CiAKLSAg
ICBpZiAoaW5wdXQtPmZvY3VzZWQoKSkgeworICAgIGlmIChub2RlKCktPmZvY3VzZWQoKSkgewog
ICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQoKS0+ZnJhbWUoKSkKLSAgICAgICAg
ICAgIGZyYW1lLT50ZXh0RGlkQ2hhbmdlSW5UZXh0RmllbGQoaW5wdXQpOworICAgICAgICAgICAg
ZnJhbWUtPnRleHREaWRDaGFuZ2VJblRleHRGaWVsZChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9k
ZSgpKSk7CiAgICAgfQogfQogCkBAIC0zNDgsOSArMzUzLDYgQEAgdm9pZCBSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmU6OnN0eWxlRAogCiB2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGlu
ZTo6Y2Fwc0xvY2tTdGF0ZU1heUhhdmVDaGFuZ2VkKCkKIHsKLSAgICBpZiAoIW5vZGUoKSB8fCAh
ZG9jdW1lbnQoKSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgLy8gT25seSBkcmF3IHRoZSBjYXBz
IGxvY2sgaW5kaWNhdG9yIGlmIHRoZXNlIHRoaW5ncyBhcmUgdHJ1ZToKICAgICAvLyAxKSBUaGUg
ZmllbGQgaXMgYSBwYXNzd29yZCBmaWVsZAogICAgIC8vIDIpIFRoZSBmcmFtZSBpcyBhY3RpdmUK
QEAgLTM1OSw3ICszNjEsNyBAQCB2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2Fw
c0xvCiAgICAgYm9vbCBzaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IgPSBmYWxzZTsKIAogICAg
IGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICBzaG91bGRE
cmF3Q2Fwc0xvY2tJbmRpY2F0b3IgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9k
ZSgpKS0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudDo6UEFTU1dPUkQKKyAgICAgICAg
c2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yID0gaW5wdXRFbGVtZW50KCktPmlzUGFzc3dvcmRG
aWVsZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZyYW1lLT5z
ZWxlY3Rpb24oKS0+aXNGb2N1c2VkQW5kQWN0aXZlKCkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJiYgZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSA9PSBub2RlKCkKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgUGxhdGZvcm1LZXlib2FyZEV2
ZW50OjpjdXJyZW50Q2Fwc0xvY2tTdGF0ZSgpOwpAQCAtMzg5LDcgKzM5MSw3IEBAIGludCBSZW5k
ZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnRleHRCbG8KIAogaW50IFJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6cHJlZmVycmVkQ29udGVudFdpZHRoKGZsb2F0IGNoYXJXaWR0aCkgY29uc3QK
IHsKLSAgICBpbnQgZmFjdG9yID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUo
KSktPnNpemUoKTsKKyAgICBpbnQgZmFjdG9yID0gaW5wdXRFbGVtZW50KCktPnNpemUoKTsKICAg
ICBpZiAoZmFjdG9yIDw9IDApCiAgICAgICAgIGZhY3RvciA9IDIwOwogCkBAIC00MzEsNyArNDMz
LDcgQEAgdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmFkanVzdAogCiB2b2lkIFJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRlU3VidHJlZUlmTmVlZGVkKCkKIHsKLSAg
ICBpZiAoIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5pc1NlYXJjaEZp
ZWxkKCkpIHsKKyAgICBpZiAoIWlucHV0RWxlbWVudCgpLT5pc1NlYXJjaEZpZWxkKCkpIHsKICAg
ICAgICAgUmVuZGVyVGV4dENvbnRyb2w6OmNyZWF0ZVN1YnRyZWVJZk5lZWRlZChtX2lubmVyQmxv
Y2suZ2V0KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDY5LDE0ICs0NzEsMTIgQEAg
dm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZQogICAgIGlmIChSZW5kZXJP
YmplY3QqIGNhbmNlbEJ1dHRvblJlbmRlcmVyID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNlbEJ1
dHRvbi0+cmVuZGVyZXIoKSA6IDApCiAgICAgICAgIHVwZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxp
dHkoY2FuY2VsQnV0dG9uUmVuZGVyZXItPnN0eWxlKCkpOwogCi0gICAgSFRNTElucHV0RWxlbWVu
dCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpOwotCiAg
ICAgaWYgKG1fcGxhY2Vob2xkZXJWaXNpYmxlKSB7CiAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgICAgICBpbm5lclRleHRFbGVtZW50KCktPnNldElubmVyVGV4dChlbGVtZW50LT5n
ZXRBdHRyaWJ1dGUocGxhY2Vob2xkZXJBdHRyKSwgZWMpOwotICAgICAgICBBU1NFUlQoZWMgPT0g
MCk7CisgICAgICAgIGlubmVyVGV4dEVsZW1lbnQoKS0+c2V0SW5uZXJUZXh0KGlucHV0RWxlbWVu
dCgpLT5wbGFjZWhvbGRlclZhbHVlKCksIGVjKTsKKyAgICAgICAgQVNTRVJUKCFlYyk7CiAgICAg
fSBlbHNlIGlmICghZm9ybUNvbnRyb2xFbGVtZW50KCktPnZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkg
fHwgcGxhY2Vob2xkZXJWaXNpYmlsaXR5U2hvdWxkQ2hhbmdlKQotICAgICAgICBzZXRJbm5lclRl
eHRWYWx1ZShlbGVtZW50LT52YWx1ZSgpKTsKKyAgICAgICAgc2V0SW5uZXJUZXh0VmFsdWUoaW5w
dXRFbGVtZW50KCktPnZhbHVlKCkpOwogCiAgICAgaWYgKG1fc2VhcmNoUG9wdXBJc1Zpc2libGUp
CiAgICAgICAgIG1fc2VhcmNoUG9wdXAtPnVwZGF0ZUZyb21FbGVtZW50KCk7CkBAIC00ODQsNyAr
NDg0LDcgQEAgdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZQogCiB2b2lk
IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2FjaGVTZWxlY3Rpb24oaW50IHN0YXJ0LCBp
bnQgZW5kKQogewotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5j
YWNoZVNlbGVjdGlvbihzdGFydCwgZW5kKTsKKyAgICBpbnB1dEVsZW1lbnQoKS0+Y2FjaGVTZWxl
Y3Rpb24oc3RhcnQsIGVuZCk7CiB9CiAKIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlclRl
eHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRlSW5uZXJUZXh0U3R5bGUoY29uc3QgUmVuZGVyU3R5
bGUqIHN0YXJ0U3R5bGUpIGNvbnN0CkBAIC01MjcsNiArNTI3LDggQEAgUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4gUmVuZGVyVGV4dENvbnRybwogCiBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5k
ZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUlubmVyQmxvY2tTdHlsZShjb25zdCBSZW5k
ZXJTdHlsZSogc3RhcnRTdHlsZSkgY29uc3QKIHsKKyAgICBBU1NFUlQobm9kZSgpLT5pc0hUTUxF
bGVtZW50KCkpOworCiAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBpbm5lckJsb2NrU3R5bGUgPSBS
ZW5kZXJTdHlsZTo6Y3JlYXRlKCk7CiAgICAgaW5uZXJCbG9ja1N0eWxlLT5pbmhlcml0RnJvbShz
dGFydFN0eWxlKTsKIApAQCAtNTQxLDYgKzU0Myw3IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+
IFJlbmRlclRleHRDb250cm8KIAogUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lOjpjcmVhdGVSZXN1bHRzQnV0dG9uU3R5bGUoY29uc3QgUmVuZGVyU3R5
bGUqIHN0YXJ0U3R5bGUpIGNvbnN0CiB7CisgICAgQVNTRVJUKG5vZGUoKS0+aXNIVE1MRWxlbWVu
dCgpKTsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihub2RlKCkpOwogCiAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiByZXN1bHRzQmxv
Y2tTdHlsZTsKQEAgLTU2Miw2ICs1NjUsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5k
ZXJUZXh0Q29udHJvCiAKIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6Y3JlYXRlQ2FuY2VsQnV0dG9uU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0
YXJ0U3R5bGUpIGNvbnN0CiB7CisgICAgQVNTRVJUKG5vZGUoKS0+aXNIVE1MRWxlbWVudCgpKTsK
ICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGNhbmNlbEJsb2NrU3R5bGU7CiAgICAgCiAgICAgaWYg
KFJlZlB0cjxSZW5kZXJTdHlsZT4gcHNldWRvU3R5bGUgPSBnZXRDYWNoZWRQc2V1ZG9TdHlsZShS
ZW5kZXJTdHlsZTo6U0VBUkNIX0NBTkNFTF9CVVRUT04pKQpAQCAtNTc5LDYgKzU4Myw3IEBAIFBh
c3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlclRleHRDb250cm8KIAogdm9pZCBSZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxpdHkoUmVuZGVyU3R5
bGUqIHN0eWxlKSBjb25zdAogeworICAgIEFTU0VSVChub2RlKCktPmlzSFRNTEVsZW1lbnQoKSk7
CiAgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50Kj4obm9kZSgpKTsKICAgICBzdHlsZS0+c2V0VmlzaWJpbGl0eShpbnB1dC0+dmFsdWUoKS5p
c0VtcHR5KCkgPyBISURERU4gOiBWSVNJQkxFKTsKIH0KQEAgLTU5MCw2ICs1OTUsNyBAQCBjb25z
dCBBdG9taWNTdHJpbmcmIFJlbmRlclRleHRDb250cm9sU2luCiAKIHZvaWQgUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lOjpzdGFydFNlYXJjaEV2ZW50VGltZXIoKQogeworICAgIEFTU0VSVChu
b2RlKCktPmlzSFRNTEVsZW1lbnQoKSk7CiAgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dCgpLmxl
bmd0aCgpOwogCiAgICAgLy8gSWYgdGhlcmUncyBubyB0ZXh0LCBmaXJlIHRoZSBldmVudCByaWdo
dCBhd2F5LgpAQCAtNjA2LDEyICs2MTIsMTQgQEAgdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6OnN0YXJ0UwogCiB2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6c2VhcmNo
RXZlbnRUaW1lckZpcmVkKFRpbWVyPFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZT4qKQogewor
ICAgIEFTU0VSVChub2RlKCktPmlzSFRNTEVsZW1lbnQoKSk7CiAgICAgc3RhdGljX2Nhc3Q8SFRN
TElucHV0RWxlbWVudCo+KG5vZGUoKSktPm9uU2VhcmNoKCk7CiB9CiAKIC8vIFBvcHVwTWVudUNs
aWVudCBtZXRob2RzCiB2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6dmFsdWVDaGFu
Z2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzKQogeworICAgIEFTU0VSVChu
b2RlKCktPmlzSFRNTEVsZW1lbnQoKSk7CiAgICAgQVNTRVJUKHN0YXRpY19jYXN0PGludD4obGlz
dEluZGV4KSA8IGxpc3RTaXplKCkpOwogICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0ID0gc3Rh
dGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSk7CiAgICAgaWYgKHN0YXRpY19jYXN0
PGludD4obGlzdEluZGV4KSA9PSAobGlzdFNpemUoKSAtIDEpKSB7CkBAIC03MzIsNiArNzQwLDcg
QEAgYm9vbCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Oml0ZW1JcwogCiB2b2lkIFJlbmRl
clRleHRDb250cm9sU2luZ2xlTGluZTo6c2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRl
eCkKIHsKKyAgICBBU1NFUlQobm9kZSgpLT5pc0hUTUxFbGVtZW50KCkpOwogICAgIHN0YXRpY19j
YXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zZXRWYWx1ZShpdGVtVGV4dChsaXN0SW5k
ZXgpKTsKIH0KIApAQCAtNzU2LDQgKzc2NSw5IEBAIFBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBSZW5k
ZXJUZXh0Q29udHJvbFMKICAgICByZXR1cm4gd2lkZ2V0LnJlbGVhc2UoKTsKIH0KIAorSW5wdXRF
bGVtZW50KiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmlucHV0RWxlbWVudCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGlucHV0RWxlbWVudEZvckVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVu
dCo+KG5vZGUoKSkpOworfQorCiB9CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZS5oCShyZXZpc2lvbiA0MDA1MykKKysrIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKK2NsYXNzIElucHV0RWxlbWVudDsKIGNsYXNzIFNlYXJjaEZpZWxkQ2Fu
Y2VsQnV0dG9uRWxlbWVudDsKIGNsYXNzIFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbkVsZW1lbnQ7
CiBjbGFzcyBTZWFyY2hQb3B1cE1lbnU7CkBAIC0xMDQsNiArMTA1LDggQEAgcHJpdmF0ZToKICAg
ICB2aXJ0dWFsIEhvc3RXaW5kb3cqIGhvc3RXaW5kb3coKSBjb25zdDsKICAgICB2aXJ0dWFsIFBh
c3NSZWZQdHI8U2Nyb2xsYmFyPiBjcmVhdGVTY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiwgU2Ny
b2xsYmFyT3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplKTsKIAorICAgIElucHV0RWxl
bWVudCogaW5wdXRFbGVtZW50KCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgYm9vbCBtX3BsYWNl
aG9sZGVyVmlzaWJsZTsKICAgICBib29sIG1fc2VhcmNoUG9wdXBJc1Zpc2libGU7Cg==
</data>
<flag name="review"
          id="12845"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26866</attachid>
            <date>2009-01-20 12:09:58 -0800</date>
            <delta_ts>2009-01-20 12:27:01 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>InputElementAbstraction.diff</filename>
            <type>text/plain</type>
            <size>72254</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQwMDYz
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTE3IEBACisyMDA5LTAx
LTIwICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1hbm5AdG9yY2htb2JpbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eGVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM0MzMKKworICAg
ICAgICBBZGQgSW5wdXRFbGVtZW50IGFic3RyYWN0aW9uLCBzaW1pbGFyIHRvIHRoZSBGb3JtQ29u
dHJvbEVsZW1lbnQgcmVmYWN0b3JpemF0aW9uCisgICAgICAgIGRvbmUgYSBtb250aCBhZ28uIFRo
ZSBnb2FsIGlzIHRvIHNoYXJlIGFzIG11Y2ggY29kZSBhcyBwb3NzaWJsZSBiZXR3ZWVuIEhUTUwv
V01MSW5wdXRFbGVtZW50LgorICAgICAgICBJbiBhIHByZXZpb3VzIHBhdGNoIHRoZSBSZW5kZXJU
ZXh0Q29udHJvbCBjbGFzcyBoYXMgYmVlbiBzcGxpdC11cCBpbiBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZS9NdWx0aUxpbmUsCisgICAgICAgIFJlbmRlclRleHRDb250cm9sIGl0c2VsZiBvbmx5IGRl
cGVuZHMgb24gRm9ybUNvbnRyb2xFbGVtZW50LCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUg
c3RpbGwKKyAgICAgICAgZGVwZW5kcyBvbiBIVE1MSW5wdXRFbGVtZW50IGRpcmVjdGx5IC0+IGNo
YW5nZSB0aGF0IGFuZCBtYWtlIGl0IHVzZSB0aGUgbmV3IElucHV0RWxlbWVudCBhYnN0cmFjdGlv
bi4KKworICAgICAgICBBIGxvdCBvZiBjb2RlIGZyb20gSFRNTElucHV0RWxlbWVudCBub3cgbGl2
ZXMgaW4gSW5wdXRFbGVtZW50LCBhcyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyAtIHRoZQorICAg
ICAgICBJbnB1dEVsZW1lbnQgY2xhc3MgaXRzZWxmIGlzIGFuIGFic3RyYWN0IHZpcnR1YWwgY2xh
c3MsIGp1c3QgbGlrZSBTY3JpcHRFbGVtZW50LiBIVE1ML1dNTElucHV0RWxlbWVudAorICAgICAg
ICBkZXJpdmUgZnJvbSBJbnB1dEVsZW1lbnQsIGFuZCBob2xkIGEgSW5wdXRFbGVtZW50RGF0YSBt
ZW1iZXIgdmFyaWFibGUsIHRoYXQgdGhleSBwYXNzIHRvIHRoZQorICAgICAgICBzdGF0aWMgZnVu
Y3Rpb25zIGluIElucHV0RWxlbWVudC4gVGhlIGFic3RyYWN0aW9uIGlzIGVxdWFsIHRvIHRoZSBv
bmUgY2hvc2VuIGZvciBIVE1ML1NWR1NjcmlwdEVsZW1lbnQuCisKKyAgICAgICAgKiBXZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogZG9tL0Zvcm1Db250cm9sRWxl
bWVudC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Zm9ybUNvbnRyb2xFbGVtZW50Rm9y
RWxlbWVudCk6CisgICAgICAgICogZG9tL0Zvcm1Db250cm9sRWxlbWVudC5oOgorICAgICAgICAq
IGRvbS9JbnB1dEVsZW1lbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxl
bWVudDo6ZGlzcGF0Y2hGb2N1c0V2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVu
dDo6ZGlzcGF0Y2hCbHVyRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50Ojp1
cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVt
ZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVt
ZW50Ojp1cGRhdGVTZWxlY3Rpb25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1l
bnQ6OmFib3V0VG9VbmxvYWQpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50OjpzZXRW
YWx1ZUZyb21SZW5kZXJlcik6CisgICAgICAgIChXZWJDb3JlOjpudW1DaGFyYWN0ZXJzSW5HcmFw
aGVtZUNsdXN0ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6Y29uc3RyYWlu
VmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6bnVtR3JhcGhlbWVDbHVzdGVycyk6CisgICAgICAg
IChXZWJDb3JlOjpJbnB1dEVsZW1lbnQ6OmhhbmRsZUJlZm9yZVRleHRJbnNlcnRlZEV2ZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6cGFyc2VTaXplQXR0cmlidXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6cGFyc2VNYXhMZW5ndGhBdHRyaWJ1dGUpOgor
ICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50Ojp1cGRhdGVWYWx1ZUlmTmVlZGVkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6bm90aWZ5Rm9ybVN0YXRlQ2hhbmdlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjpJbnB1dEVsZW1lbnREYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6On5JbnB1dEVsZW1lbnREYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6Om5hbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6aW5wdXRFbGVtZW50Rm9yRWxlbWVudCk6CisgICAgICAgICogZG9tL0lucHV0RWxlbWVudC5o
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudDo6fklucHV0RWxlbWVudCk6
CisgICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnQ6OklucHV0RWxlbWVudCk6CisgICAgICAg
IChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjppbnB1dEVsZW1lbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6SW5wdXRFbGVtZW50RGF0YTo6ZWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpJbnB1
dEVsZW1lbnREYXRhOjpwbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSk6CisgICAgICAgIChXZWJD
b3JlOjpJbnB1dEVsZW1lbnREYXRhOjpzZXRQbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjpzZXROYW1lKToKKyAgICAgICAgKFdl
YkNvcmU6OklucHV0RWxlbWVudERhdGE6OnZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0
RWxlbWVudERhdGE6OnNldFZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERh
dGE6OnNpemUpOgorICAgICAgICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50RGF0YTo6c2V0U2l6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjptYXhMZW5ndGgpOgorICAgICAg
ICAoV2ViQ29yZTo6SW5wdXRFbGVtZW50RGF0YTo6c2V0TWF4TGVuZ3RoKToKKyAgICAgICAgKFdl
YkNvcmU6OklucHV0RWxlbWVudERhdGE6OmNhY2hlZFNlbGVjdGlvblN0YXJ0KToKKyAgICAgICAg
KFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6OnNldENhY2hlZFNlbGVjdGlvblN0YXJ0KToKKyAg
ICAgICAgKFdlYkNvcmU6OklucHV0RWxlbWVudERhdGE6OmNhY2hlZFNlbGVjdGlvbkVuZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnB1dEVsZW1lbnREYXRhOjpzZXRDYWNoZWRTZWxlY3Rpb25FbmQp
OgorICAgICAgICAqIGh0bWwvSFRNTElucHV0RWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MSW5wdXRFbGVtZW50OjpIVE1MSW5wdXRFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxJbnB1dEVsZW1lbnQ6Om5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxl
bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlKTogTW92ZWQgdG8gSW5wdXRFbGVtZW50LgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6YWJvdXRUb1VubG9hZCk6IERpdHRvLgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6ZGlzcGF0Y2hGb2N1c0V2ZW50KTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpkaXNwYXRjaEJsdXJF
dmVudCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6c2V0U2Vs
ZWN0aW9uUmFuZ2UpOiBNb3ZlZCB0byBJbnB1dEVsZW1lbnQ6OnVwZGF0ZVNlbGVjdGlvblJhbmdl
LCBjYWxsIGl0IGZyb20gaGVyZS4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1l
bnQ6OnNpemUpOiBNYWtlIHZpcnR1YWwgYW5kIG92ZXJyaWRlIElucHV0RWxlbWVudHMgYWJzdHJh
Y3QgdmVyc2lvbi4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmNvcHlOb25B
dHRyaWJ1dGVQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6
OnZhbHVlKTogTWFrZSB2aXJ0dWFsIGFuZCBvdmVycmlkZSBJbnB1dEVsZW1lbnRzIGFic3RyYWN0
IHZlcnNpb24uCisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpzZXRWYWx1ZSk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6cGxhY2Vob2xkZXJW
YWx1ZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6c2VhcmNo
RXZlbnRzU2hvdWxkQmVEaXNwYXRjaGVkKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1M
SW5wdXRFbGVtZW50OjpzZXRWYWx1ZUZyb21SZW5kZXJlcik6IERpdHRvLgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTElucHV0RWxlbWVudDo6c2V0RmlsZUxpc3RGcm9tUmVuZGVyZXIpOiBVc2UgbmV3
IGNvZGUgaW4gSW5wdXRFbGVtZW50OjpzZXRWYWx1ZUZyb21SZW5kZXJlcgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTElucHV0RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcik6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50OjpzZXREZWZhdWx0TmFtZSk6IEFkZGVkIGFzIGhlbHBl
ciBmdW5jdGlvbiBmb3IgSFRNTElzSW5kZXhFbGVtZW50LgorICAgICAgICAoV2ViQ29yZTo6SFRN
TElucHV0RWxlbWVudDo6bWF4TGVuZ3RoKTogQWRkZWQgYWNjZXNvci4KKyAgICAgICAgKFdlYkNv
cmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmNvbnN0cmFpblZhbHVlKTogTW92ZSBmdW5jdGlvbmFsaXR5
IHRvIElucHV0RWxlbWVudDo6Y29uc3RyYWluVmFsdWUuCisgICAgICAgIChXZWJDb3JlOjpIVE1M
SW5wdXRFbGVtZW50OjpjYWNoZVNlbGVjdGlvbik6IE1vdmUgZnVuY3Rpb25hbGl0eSB0byBJbnB1
dEVsZW1lbnQ6OmNhY2hlU2VsZWN0aW9uLgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxl
bWVudDo6c2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OnBs
YWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKTogTWFrZSB2aXJ0dWFsIGFuZCBvdmVycmlkZSBJbnB1
dEVsZW1lbnRzIGFic3RyYWN0IHZlcnNpb24uCisgICAgICAgICogaHRtbC9IVE1MSW5wdXRFbGVt
ZW50Lmg6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50Ojppc1RleHRGaWVsZCk6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50Ojppc1NlYXJjaEZpZWxkKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmlzQXV0b2ZpbGxlZCk6CisgICAgICAg
ICogaHRtbC9IVE1MSXNJbmRleEVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElz
SW5kZXhFbGVtZW50OjpIVE1MSXNJbmRleEVsZW1lbnQpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJUZXh0Q29udHJvbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bDo6Zm9ybUNvbnRyb2xFbGVtZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6cGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjphZGRTZWFyY2hSZXN1bHQpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzdG9wU2VhcmNoRXZlbnRU
aW1lcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNo
b3dQb3B1cCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
OmhpZGVQb3B1cCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6OnN1YnRyZWVIYXNDaGFuZ2VkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZTo6Y2Fwc0xvY2tTdGF0ZU1heUhhdmVDaGFuZ2VkKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6cHJlZmVycmVkQ29udGVudFdpZHRo
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRl
U3VidHJlZUlmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6dXBkYXRlRnJvbUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lOjpjYWNoZVNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUlubmVyQmxvY2tTdHlsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZVJlc3VsdHNC
dXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6OmNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRl
eHRDb250cm9sU2luZ2xlTGluZTo6dXBkYXRlQ2FuY2VsQnV0dG9uVmlzaWJpbGl0eSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnN0YXJ0U2VhcmNoRXZl
bnRUaW1lcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
OnNlYXJjaEV2ZW50VGltZXJGaXJlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmU6OnZhbHVlQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNldFRleHRGcm9tSXRlbSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmlucHV0RWxlbWVudCk6CisgICAgICAgICog
cmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5oOgorCiAyMDA5LTAxLTIwICBE
aXJrIFNjaHVsemUgIDxrcml0QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTmlr
b2xhcyBaaW1tZXJtYW5uLgpJbmRleDogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNp
b24gNDAwNjMpCisrKyBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcg
Y29weSkKQEAgLTYwLDEwICs2MCwxMiBAQAogCQkwODREQkFBMTBFRDM5RDM2MDAzOEMyMjYgLyog
V01MVmFyaWFibGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDA4NERCQTlEMEVEMzlEMzUwMDM4QzIyNiAvKiBXTUxWYXJpYWJsZXMuY3BwICovOyB9
OwogCQkwODREQkFBMjBFRDM5RDM2MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODREQkE5RTBFRDM5RDM2MDAz
OEMyMjYgLyogV01MVmFyaWFibGVzLmggKi87IH07CiAJCTA4NTc3MzM1MEYwODQ2MDEwMDgwNTgz
RSAvKiBGb3JtQ29udHJvbEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDA4NTc3MzM0MEYwODQ2MDEwMDgwNTgzRSAvKiBGb3JtQ29udHJvbEVs
ZW1lbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9Owor
CQkwODU5MUFBNTBGMDg1QzRFMDA5QkFDQjEgLyogSW5wdXRFbGVtZW50LmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODU5MUFBNDBGMDg1QzRFMDA5QkFD
QjEgLyogSW5wdXRFbGVtZW50LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJMDg1QjkyQkEwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1EYXRhQnVpbGRl
ci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODVC
OTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCAqLzsgfTsKIAkJMDg1
QjkyQkIwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1EYXRhQnVpbGRlci5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg1QjkyQjkwRUZERTczRDAwRTYxMjND
IC8qIEZvcm1EYXRhQnVpbGRlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZh
dGUsICk7IH07IH07CiAJCTA4NjVDQ0U2MEVEREY1MUIwMERGOUVDMyAvKiBXTUxOb29wRWxlbWVu
dC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY1
Q0NFNDBFRERGNTFCMDBERjlFQzMgLyogV01MTm9vcEVsZW1lbnQuY3BwICovOyB9OwogCQkwODY1
Q0NFNzBFRERGNTFCMDBERjlFQzMgLyogV01MTm9vcEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4NjVDQ0U1MEVEREY1MUIwMERGOUVDMyAv
KiBXTUxOb29wRWxlbWVudC5oICovOyB9OworCQkwODcwMEJFNzBGMDg2QzUzMDA5MTk0MTkgLyog
SW5wdXRFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDA4NzAwQkU2MEYwODZDNTMwMDkxOTQxOSAvKiBJbnB1dEVsZW1lbnQuY3BwICovOyB9
OwogCQkwODc0NEJBQTBFREI3RDg2MDA0QzlFNjMgLyogV01MT25FdmVudEVsZW1lbnQuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg3NDRCQTkwRURC
N0Q4NjAwNEM5RTYzIC8qIFdNTE9uRXZlbnRFbGVtZW50LmNwcCAqLzsgfTsKIAkJMDg3NDRCQUUw
RURCN0Q5MjAwNEM5RTYzIC8qIFdNTE9uRXZlbnRFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODc0NEJBRDBFREI3RDkyMDA0QzlFNjMgLyog
V01MT25FdmVudEVsZW1lbnQuaCAqLzsgfTsKIAkJMDg3RkZBMEYwRUZGM0VEMzAwOURCRDg4IC8q
IFdNTEluc2VydGVkTGVnZW5kRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAwODdGRkEwRDBFRkYzRUQzMDA5REJEODggLyogV01MSW5zZXJ0
ZWRMZWdlbmRFbGVtZW50LmNwcCAqLzsgfTsKQEAgLTEwMSw2ICsxMDMsNyBAQAogCQkwOEE0ODQ3
NzBFNTI3MkM1MDBDM0ZFNzYgLyogU2NyaXB0RWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOEE0ODQ3NTBFNTI3MkM1MDBDM0ZFNzYgLyog
U2NyaXB0RWxlbWVudC5jcHAgKi87IH07CiAJCTA4QTQ4NDc4MEU1MjcyQzUwMEMzRkU3NiAvKiBT
Y3JpcHRFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSAwOEE0ODQ3NjBFNTI3MkM1MDBDM0ZFNzYgLyogU2NyaXB0RWxlbWVudC5oICovOyB9Owog
CQkwOEE0OEE2RTBFODZDRjZEMDBFMjI1REQgLyogSlNTVkdFbGVtZW50SW5zdGFuY2VDdXN0b20u
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDhBNDhB
NkQwRTg2Q0Y2RDAwRTIyNUREIC8qIEpTU1ZHRWxlbWVudEluc3RhbmNlQ3VzdG9tLmNwcCAqLzsg
fTsKKwkJMDhCRkRGQzQwRjA5OUU3MDAwN0RDMkJGIC8qIEZvcm1Db250cm9sRWxlbWVudC5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOEJGREZDMzBG
MDk5RTcwMDA3REMyQkYgLyogRm9ybUNvbnRyb2xFbGVtZW50LmNwcCAqLzsgfTsKIAkJMDhDNEM1
MTgwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOEM0QzUxNDBFRjE5QTQwMDBFNDg0MEYg
LyogV01MSW1hZ2VFbGVtZW50LmNwcCAqLzsgfTsKIAkJMDhDNEM1MTkwRUYxOUE0MDAwRTQ4NDBG
IC8qIFdNTEltYWdlRWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMDhDNEM1MTUwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlRWxlbWVudC5o
ICovOyB9OwogCQkwOEM0QzUxQTBFRjE5QTQwMDBFNDg0MEYgLyogV01MSW1hZ2VMb2FkZXIuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDhDNEM1MTYw
RUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlTG9hZGVyLmNwcCAqLzsgfTsKQEAgLTQ4ODUsMTAg
KzQ4ODgsMTIgQEAKIAkJMDg0REJBOUQwRUQzOUQzNTAwMzhDMjI2IC8qIFdNTFZhcmlhYmxlcy5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXTUxWYXJpYWJsZXMuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODREQkE5RTBFRDM5RDM2MDAzOEMyMjYg
LyogV01MVmFyaWFibGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdNTFZh
cmlhYmxlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODU3NzMzNDBGMDg0NjAx
MDA4MDU4M0UgLyogRm9ybUNvbnRyb2xFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEZvcm1Db250cm9sRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQkwODU5MUFBNDBGMDg1QzRFMDA5QkFDQjEgLyogSW5wdXRFbGVtZW50LmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IElucHV0RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkwODVCOTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVy
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1EYXRhQnVpbGRl
ci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NUI5MkI5MEVGREU3M0QwMEU2
MTIzQyAvKiBGb3JtRGF0YUJ1aWxkZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gRm9ybURhdGFCdWlsZGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NjVD
Q0U0MEVEREY1MUIwMERGOUVDMyAvKiBXTUxOb29wRWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXTUxOb29wRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTA4NjVDQ0U1MEVEREY1MUIwMERGOUVDMyAvKiBXTUxOb29wRWxlbWVu
dC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXTUxOb29wRWxlbWVudC5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwODcwMEJFNjBGMDg2QzUzMDA5MTk0MTkgLyog
SW5wdXRFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IElu
cHV0RWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NzQ0QkE5MEVE
QjdEODYwMDRDOUU2MyAvKiBXTUxPbkV2ZW50RWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBXTUxPbkV2ZW50RWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTA4NzQ0QkFEMEVEQjdEOTIwMDRDOUU2MyAvKiBXTUxPbkV2ZW50RWxl
bWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXTUxPbkV2ZW50RWxlbWVu
dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODdGRkEwRDBFRkYzRUQzMDA5REJE
ODggLyogV01MSW5zZXJ0ZWRMZWdlbmRFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IFdNTEluc2VydGVkTGVnZW5kRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CkBAIC00OTE0LDYgKzQ5MTksNyBAQAogCQkwOEE0ODQ3NTBFNTI3MkM1
MDBDM0ZFNzYgLyogU2NyaXB0RWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBTY3JpcHRFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJMDhBNDg0NzYwRTUyNzJDNTAwQzNGRTc2IC8qIFNjcmlwdEVsZW1lbnQuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2NyaXB0RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkwOEE0OEE2RDBFODZDRjZEMDBFMjI1REQgLyogSlNTVkdFbGVtZW50SW5z
dGFuY2VDdXN0b20uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNT
VkdFbGVtZW50SW5zdGFuY2VDdXN0b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQkwOEJGREZDMzBGMDk5RTcwMDA3REMyQkYgLyogRm9ybUNvbnRyb2xFbGVtZW50LmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1Db250cm9sRWxlbWVudC5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4QzRDNTE0MEVGMTlBNDAwMEU0ODQwRiAv
KiBXTUxJbWFnZUVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gV01MSW1hZ2VFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDhD
NEM1MTUwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlRWxlbWVudC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBXTUxJbWFnZUVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJMDhDNEM1MTYwRUYxOUE0MDAwRTQ4NDBGIC8qIFdNTEltYWdlTG9hZGVyLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFdNTEltYWdlTG9hZGVyLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE0MjA5LDggKzE0MjE1LDExIEBACiAJ
CQkJQkM2MEQ4RjEwRDJBMTFFMDAwQjk5MThGIC8qIEV4Y2VwdGlvbkJhc2UuaCAqLywKIAkJCQk5
MzgzMUI1NjBEMDg3RDYwMDBFNUM5ODQgLyogRXhjZXB0aW9uQ29kZS5jcHAgKi8sCiAJCQkJOTM1
RkJDRjEwOUJBMTQzQjAwRTIzMEIxIC8qIEV4Y2VwdGlvbkNvZGUuaCAqLywKKwkJCQkwOEJGREZD
MzBGMDk5RTcwMDA3REMyQkYgLyogRm9ybUNvbnRyb2xFbGVtZW50LmNwcCAqLywKIAkJCQkwODU3
NzMzNDBGMDg0NjAxMDA4MDU4M0UgLyogRm9ybUNvbnRyb2xFbGVtZW50LmggKi8sCiAJCQkJMEJB
NUQzODUwRjI0MEZCNDAwOUI4NzBCIC8qIEdlbmVyaWNXb3JrZXJUYXNrLmggKi8sCisJCQkJMDg3
MDBCRTYwRjA4NkM1MzAwOTE5NDE5IC8qIElucHV0RWxlbWVudC5jcHAgKi8sCisJCQkJMDg1OTFB
QTQwRjA4NUM0RTAwOUJBQ0IxIC8qIElucHV0RWxlbWVudC5oICovLAogCQkJCTg1MDMxQjJEMEE0
NEVGQzcwMEY5OTJFMCAvKiBLZXlib2FyZEV2ZW50LmNwcCAqLywKIAkJCQk4NTAzMUIyRTBBNDRF
RkM3MDBGOTkyRTAgLyogS2V5Ym9hcmRFdmVudC5oICovLAogCQkJCTE0Q0Y3QzIwMDlGNzExMDYw
MEVCMzY2NSAvKiBLZXlib2FyZEV2ZW50LmlkbCAqLywKQEAgLTE1NDg5LDYgKzE1NDk4LDcgQEAK
IAkJCQlBOENGRjVFMzBBMTU1QTA1MDAwQTQyMzQgLyogSW5saW5lRmxvd0JveC5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJQThDRkY1RTIwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZVJ1bkJveC5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4NUEwOTdEOTMwMjAwOTRDOUU0IC8qIElubGluZVRleHRC
b3guaCBpbiBIZWFkZXJzICovLAorCQkJCTA4NTkxQUE1MEYwODVDNEUwMDlCQUNCMSAvKiBJbnB1
dEVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzMzA5REVBMDk5RTY0OTIwMDU2RTU4MSAv
KiBJbnNlcnRJbnRvVGV4dE5vZGVDb21tYW5kLmggaW4gSGVhZGVycyAqLywKIAkJCQk5MzMwOURF
QzA5OUU2NDkyMDA1NkU1ODEgLyogSW5zZXJ0TGluZUJyZWFrQ29tbWFuZC5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJRDA3REVBQkEwQTM2NTU0QTAwQ0EzMEY4IC8qIEluc2VydExpc3RDb21tYW5kLmgg
aW4gSGVhZGVycyAqLywKQEAgLTE3MzE3LDYgKzE3MzI3LDcgQEAKIAkJCQkzNzI0Q0E3RTBFNjhC
MjA1MDBEQjQzODQgLyogRm9udE1hY0NvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIy
QUZGQzgyMEQwMEE1QzEwMDMwMDc0RCAvKiBGb250UGxhdGZvcm1EYXRhTWFjLm1tIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQTgwRTZDRjEwQTE5ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1ZS5jcHAgaW4g
U291cmNlcyAqLywKKwkJCQkwOEJGREZDNDBGMDk5RTcwMDA3REMyQkYgLyogRm9ybUNvbnRyb2xF
bGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUxNEM3NjZGMENFOTIzQTEwMDdFRjNDRCAv
KiBGb3JtRGF0YS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwODVCOTJCQTBFRkRFNzNEMDBFNjEy
M0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MTM2RDM5MDk3
M0E4RTcwMEQ3NDQ2MyAvKiBGb3JtRGF0YUxpc3QuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC0xNzQ0
OSw2ICsxNzQ2MCw3IEBACiAJCQkJQThDRkY1RTYwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZUJv
eC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBOENGRjVFNDBBMTU1QTA1MDAwQTQyMzQgLyogSW5s
aW5lRmxvd0JveC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg1OTA5N0Q5MzAyMDA5NEM5
RTQgLyogSW5saW5lVGV4dEJveC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwODcwMEJFNzBGMDg2
QzUzMDA5MTk0MTkgLyogSW5wdXRFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzMzA5
REU5MDk5RTY0OTIwMDU2RTU4MSAvKiBJbnNlcnRJbnRvVGV4dE5vZGVDb21tYW5kLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTkzMzA5REVCMDk5RTY0OTIwMDU2RTU4MSAvKiBJbnNlcnRMaW5lQnJl
YWtDb21tYW5kLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUQwN0RFQUI5MEEzNjU1NEEwMENBMzBG
OCAvKiBJbnNlcnRMaXN0Q29tbWFuZC5jcHAgaW4gU291cmNlcyAqLywKSW5kZXg6IGRvbS9Gb3Jt
Q29udHJvbEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9Gb3JtQ29udHJvbEVsZW1lbnQu
Y3BwCShyZXZpc2lvbiAwKQorKysgZG9tL0Zvcm1Db250cm9sRWxlbWVudC5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVG9yY2ggTW9i
aWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gKGh0dHA6Ly93d3cudG9yY2htb2JpbGUuY29t
LykKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGb3JtQ29udHJvbEVsZW1lbnQu
aCIKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRm9ybUNvbnRyb2xFbGVt
ZW50LmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworI2lmIEVOQUJMRShXTUwpCisj
aW5jbHVkZSAiV01MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiV01MTmFtZXMuaCIKKyNlbmRp
ZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0Zvcm1Db250cm9sRWxlbWVudCogZm9ybUNvbnRy
b2xFbGVtZW50Rm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlmIChlbGVtZW50
LT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxFbGVtZW50
Kj4oZWxlbWVudCktPmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkpCisgICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8SFRNTEZvcm1Db250cm9sRWxlbWVudCo+KGVsZW1lbnQpOworICAgIH0KKwor
ICAgIC8vIEZJWE1FOiBFbmFibGUgdGhpcyBjb2RlLCBvbmNlIHRoZSBmb2xsb3ctdXAgV01MSW5w
dXRFbGVtZW50IGFkZGl0aW9uIHBhdGNoIGxhbmRzLgorI2lmIEVOQUJMRShXTUwpICYmIDAKKyAg
ICBpZiAoZWxlbWVudC0+aXNXTUxFbGVtZW50KCkgJiYgZWxlbWVudC0+aGFzVGFnTmFtZShXTUxO
YW1lczo6aW5wdXRUYWcpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V01MSW5wdXRFbGVt
ZW50Kj4oZWxlbWVudCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCit9CkluZGV4OiBk
b20vRm9ybUNvbnRyb2xFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0Zvcm1Db250cm9sRWxl
bWVudC5oCShyZXZpc2lvbiA0MDA2MykKKysrIGRvbS9Gb3JtQ29udHJvbEVsZW1lbnQuaAkod29y
a2luZyBjb3B5KQpAQCAtMjMsNiArMjMsOCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2Ns
YXNzIEVsZW1lbnQ7CisKIGNsYXNzIEZvcm1Db250cm9sRWxlbWVudCB7CiBwdWJsaWM6CiAgICAg
dmlydHVhbCB+Rm9ybUNvbnRyb2xFbGVtZW50KCkgeyB9CkBAIC0zNCw2ICszNiw4IEBAIHByb3Rl
Y3RlZDoKICAgICBGb3JtQ29udHJvbEVsZW1lbnQoKSB7IH0KIH07CiAKK0Zvcm1Db250cm9sRWxl
bWVudCogZm9ybUNvbnRyb2xFbGVtZW50Rm9yRWxlbWVudChFbGVtZW50Kik7CisKIH0KIAogI2Vu
ZGlmCkluZGV4OiBkb20vSW5wdXRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vSW5wdXRF
bGVtZW50LmNwcAkocmV2aXNpb24gMCkKKysrIGRvbS9JbnB1dEVsZW1lbnQuY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUb3JjaCBN
b2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5j
b20vKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklucHV0RWxlbWVudC5oIgor
CisjaW5jbHVkZSAiQmVmb3JlVGV4dEluc2VydGVkRXZlbnQuaCIKKyNpbmNsdWRlICJDaHJvbWVD
bGllbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkV2ZW50LmgiCisjaW5j
bHVkZSAiRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkZvcm1Db250cm9sRWxlbWVudC5oIgorI2lu
Y2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmUuaCIKKyNpbmNsdWRlICJTZWxlY3Rpb25Db250cm9sbGVyLmgiCisjaW5j
bHVkZSAiVGV4dEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiVGV4dEJyZWFrSXRlcmF0b3IuaCIKKwor
I2lmIEVOQUJMRShXTUwpCisjaW5jbHVkZSAiV01MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAi
V01MTmFtZXMuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKKy8vIEZJWE1FOiBBY2Nv
cmRpbmcgdG8gSFRNTDQsIHRoZSBsZW5ndGggYXR0cmlidXRlJ3MgdmFsdWUgY2FuIGJlIGFyYml0
cmFyaWx5CisvLyBsYXJnZS4gSG93ZXZlciwgZHVlIHRvIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWdzLmNnaT9pZD0xNDUzNiB0aGluZ3MKKy8vIGdldCByYXRoZXIgc2x1Z2dpc2ggd2hl
biBhIHRleHQgZmllbGQgaGFzIGEgbGFyZ2VyIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYW4KKy8v
IHRoaXMsIGV2ZW4gd2hlbiBqdXN0IGNsaWNraW5nIGluIHRoZSB0ZXh0IGZpZWxkLgorY29uc3Qg
aW50IElucHV0RWxlbWVudDo6c19tYXhpbXVtTGVuZ3RoID0gNTI0Mjg4OworY29uc3QgaW50IElu
cHV0RWxlbWVudDo6c19kZWZhdWx0U2l6ZSA9IDIwOworCit2b2lkIElucHV0RWxlbWVudDo6ZGlz
cGF0Y2hGb2N1c0V2ZW50KElucHV0RWxlbWVudERhdGEmIGRhdGEsIERvY3VtZW50KiBkb2N1bWVu
dCkKK3sKKyAgICBpZiAoIWRhdGEuaW5wdXRFbGVtZW50KCktPmlzVGV4dEZpZWxkKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIHVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eShkYXRhLCBkb2N1
bWVudCk7CisKKyAgICBpZiAoZGF0YS5pbnB1dEVsZW1lbnQoKS0+aXNQYXNzd29yZEZpZWxkKCkg
JiYgZG9jdW1lbnQtPmZyYW1lKCkpCisgICAgICAgIGRvY3VtZW50LT5zZXRVc2VTZWN1cmVLZXli
b2FyZEVudHJ5V2hlbkFjdGl2ZSh0cnVlKTsKK30KKwordm9pZCBJbnB1dEVsZW1lbnQ6OmRpc3Bh
dGNoQmx1ckV2ZW50KElucHV0RWxlbWVudERhdGEmIGRhdGEsIERvY3VtZW50KiBkb2N1bWVudCkK
K3sKKyAgICBpZiAoIWRhdGEuaW5wdXRFbGVtZW50KCktPmlzVGV4dEZpZWxkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOworICAgIGlm
ICghZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIHVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJp
bGl0eShkYXRhLCBkb2N1bWVudCk7CisKKyAgICBpZiAoZGF0YS5pbnB1dEVsZW1lbnQoKS0+aXNQ
YXNzd29yZEZpZWxkKCkpCisgICAgICAgIGRvY3VtZW50LT5zZXRVc2VTZWN1cmVLZXlib2FyZEVu
dHJ5V2hlbkFjdGl2ZShmYWxzZSk7CisKKyAgICBmcmFtZS0+dGV4dEZpZWxkRGlkRW5kRWRpdGlu
ZyhkYXRhLmVsZW1lbnQoKSk7Cit9CisKK3ZvaWQgSW5wdXRFbGVtZW50Ojp1cGRhdGVQbGFjZWhv
bGRlclZpc2liaWxpdHkoSW5wdXRFbGVtZW50RGF0YSYgZGF0YSwgRG9jdW1lbnQqIGRvY3VtZW50
LCBib29sIHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2VkKQoreworICAgIEFTU0VSVChkYXRhLmlucHV0
RWxlbWVudCgpLT5pc1RleHRGaWVsZCgpKTsKKworICAgIGJvb2wgb2xkUGxhY2Vob2xkZXJTaG91
bGRCZVZpc2libGUgPSBkYXRhLnBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCk7CisgICAgRWxl
bWVudCogZWxlbWVudCA9IGRhdGEuZWxlbWVudCgpOworCisgICAgZGF0YS5zZXRQbGFjZWhvbGRl
clNob3VsZEJlVmlzaWJsZShkYXRhLmlucHV0RWxlbWVudCgpLT52YWx1ZSgpLmlzRW1wdHkoKSAK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LT5mb2N1
c2VkTm9kZSgpICE9IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICYmICFkYXRhLmlucHV0RWxlbWVudCgpLT5wbGFjZWhvbGRlclZhbHVlKCkuaXNFbXB0eSgp
KTsKKworICAgIGlmICgob2xkUGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUgIT0gZGF0YS5wbGFj
ZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpIHx8IHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2VkKSAmJiBl
bGVtZW50LT5yZW5kZXJlcigpKQorICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmUqPihlbGVtZW50LT5yZW5kZXJlcigpKS0+dXBkYXRlUGxhY2Vob2xkZXJWaXNp
YmlsaXR5KCk7Cit9CisKK3ZvaWQgSW5wdXRFbGVtZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2Uo
SW5wdXRFbGVtZW50RGF0YSYgZGF0YSwgRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIHJlc3RvcmVQ
cmV2aW91c1NlbGVjdGlvbikKK3sKKyAgICBBU1NFUlQoZGF0YS5pbnB1dEVsZW1lbnQoKS0+aXNU
ZXh0RmllbGQoKSk7CisKKyAgICBpZiAoIXJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbiB8fCBkYXRh
LmNhY2hlZFNlbGVjdGlvblN0YXJ0KCkgPT0gLTEpCisgICAgICAgIGRhdGEuaW5wdXRFbGVtZW50
KCktPnNlbGVjdCgpOworICAgIGVsc2UKKyAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2FjaGVkIHNl
bGVjdGlvbi4KKyAgICAgICAgdXBkYXRlU2VsZWN0aW9uUmFuZ2UoZGF0YSwgZGF0YS5jYWNoZWRT
ZWxlY3Rpb25TdGFydCgpLCBkYXRhLmNhY2hlZFNlbGVjdGlvbkVuZCgpKTsKKworICAgIGlmIChk
b2N1bWVudCAmJiBkb2N1bWVudC0+ZnJhbWUoKSkKKyAgICAgICAgZG9jdW1lbnQtPmZyYW1lKCkt
PnJldmVhbFNlbGVjdGlvbigpOworfQorCit2b2lkIElucHV0RWxlbWVudDo6dXBkYXRlU2VsZWN0
aW9uUmFuZ2UoSW5wdXRFbGVtZW50RGF0YSYgZGF0YSwgaW50IHN0YXJ0LCBpbnQgZW5kKQorewor
ICAgIGlmICghZGF0YS5pbnB1dEVsZW1lbnQoKS0+aXNUZXh0RmllbGQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKFJlbmRlclRleHRDb250cm9sKiByZW5kZXJlciA9IHN0YXRpY19jYXN0
PFJlbmRlclRleHRDb250cm9sKj4oZGF0YS5lbGVtZW50KCktPnJlbmRlcmVyKCkpKQorICAgICAg
ICByZW5kZXJlci0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgSW5w
dXRFbGVtZW50OjphYm91dFRvVW5sb2FkKElucHV0RWxlbWVudERhdGEmIGRhdGEsIERvY3VtZW50
KiBkb2N1bWVudCkKK3sKKyAgICBpZiAoIWRhdGEuaW5wdXRFbGVtZW50KCktPmlzVGV4dEZpZWxk
KCkgfHwgIWRhdGEuZWxlbWVudCgpLT5mb2N1c2VkKCkgfHwgIWRvY3VtZW50LT5mcmFtZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBkb2N1bWVudC0+ZnJhbWUoKS0+dGV4dEZpZWxkRGlkRW5k
RWRpdGluZyhkYXRhLmVsZW1lbnQoKSk7Cit9CisKK3ZvaWQgSW5wdXRFbGVtZW50OjpzZXRWYWx1
ZUZyb21SZW5kZXJlcihJbnB1dEVsZW1lbnREYXRhJiBkYXRhLCBEb2N1bWVudCogZG9jdW1lbnQs
IGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgLy8gUmVuZGVyZXIgYW5kIG91ciBldmVudCBo
YW5kbGVyIGFyZSByZXNwb25zaWJsZSBmb3IgY29uc3RyYWluaW5nIHZhbHVlcy4KKyAgICBBU1NF
UlQodmFsdWUgPT0gZGF0YS5pbnB1dEVsZW1lbnQoKS0+Y29uc3RyYWluVmFsdWUodmFsdWUpIHx8
IGRhdGEuaW5wdXRFbGVtZW50KCktPmNvbnN0cmFpblZhbHVlKHZhbHVlKS5pc0VtcHR5KCkpOwor
CisgICAgaWYgKGRhdGEuaW5wdXRFbGVtZW50KCktPmlzVGV4dEZpZWxkKCkpCisgICAgICAgIHVw
ZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eShkYXRhLCBkb2N1bWVudCk7CisKKyAgICAvLyBXb3Jr
YXJvdW5kIGZvciBidWcgd2hlcmUgdHJhaWxpbmcgXG4gaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3Vs
dCBvZiB0ZXh0Q29udGVudC4KKyAgICAvLyBUaGUgYXNzZXJ0IG1hY3JvIGFib3ZlIG1heSBhbHNv
IGJlIHNpbXBsaWZpZWQgdG86ICB2YWx1ZSA9PSBjb25zdHJhaW5WYWx1ZSh2YWx1ZSkKKyAgICAv
LyBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NjYxCisgICAgaWYgKHZh
bHVlID09ICJcbiIpCisgICAgICAgIGRhdGEuc2V0VmFsdWUoIiIpOworICAgIGVsc2UKKyAgICAg
ICAgZGF0YS5zZXRWYWx1ZSh2YWx1ZSk7CisKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gZGF0YS5l
bGVtZW50KCk7CisgICAgRm9ybUNvbnRyb2xFbGVtZW50KiBmb3JtQ29udHJvbEVsZW1lbnQgPSBm
b3JtQ29udHJvbEVsZW1lbnRGb3JFbGVtZW50KGVsZW1lbnQpOworICAgIEFTU0VSVChmb3JtQ29u
dHJvbEVsZW1lbnQpOworICAgIGZvcm1Db250cm9sRWxlbWVudC0+c2V0VmFsdWVNYXRjaGVzUmVu
ZGVyZXIoKTsKKworICAgIC8vIEZpcmUgdGhlICJpbnB1dCIgRE9NIGV2ZW50CisgICAgZWxlbWVu
dC0+ZGlzcGF0Y2hFdmVudEZvclR5cGUoZXZlbnROYW1lcygpLmlucHV0RXZlbnQsIHRydWUsIGZh
bHNlKTsKKyAgICBub3RpZnlGb3JtU3RhdGVDaGFuZ2VkKGRhdGEsIGRvY3VtZW50KTsKK30KKwor
c3RhdGljIGludCBudW1DaGFyYWN0ZXJzSW5HcmFwaGVtZUNsdXN0ZXJzKFN0cmluZ0ltcGwqIHMs
IGludCBudW1HcmFwaGVtZUNsdXN0ZXJzKQoreworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBUZXh0QnJlYWtJdGVyYXRvciogaXQgPSBjaGFyYWN0ZXJCcmVha0l0ZXJhdG9y
KHMtPmNoYXJhY3RlcnMoKSwgcy0+bGVuZ3RoKCkpOworICAgIGlmICghaXQpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HcmFwaGVtZUNsdXN0ZXJzOyAr
K2kpIHsKKyAgICAgICAgaWYgKHRleHRCcmVha05leHQoaXQpID09IFRleHRCcmVha0RvbmUpCisg
ICAgICAgICAgICByZXR1cm4gcy0+bGVuZ3RoKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHRC
cmVha0N1cnJlbnQoaXQpOworfQorCitTdHJpbmcgSW5wdXRFbGVtZW50Ojpjb25zdHJhaW5WYWx1
ZShjb25zdCBJbnB1dEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBTdHJpbmcmIHByb3Bvc2VkVmFs
dWUsIGludCBtYXhMZW5ndGgpCit7CisgICAgU3RyaW5nIHN0cmluZyA9IHByb3Bvc2VkVmFsdWU7
CisgICAgaWYgKCFkYXRhLmlucHV0RWxlbWVudCgpLT5pc1RleHRGaWVsZCgpKQorICAgICAgICBy
ZXR1cm4gc3RyaW5nOworICAgICAgICAKKyAgICBzdHJpbmcucmVwbGFjZSgiXHJcbiIsICIgIik7
CisgICAgc3RyaW5nLnJlcGxhY2UoJ1xyJywgJyAnKTsKKyAgICBzdHJpbmcucmVwbGFjZSgnXG4n
LCAnICcpOworICAgIAorICAgIFN0cmluZ0ltcGwqIHMgPSBzdHJpbmcuaW1wbCgpOworICAgIGlu
dCBuZXdMZW5ndGggPSBudW1DaGFyYWN0ZXJzSW5HcmFwaGVtZUNsdXN0ZXJzKHMsIG1heExlbmd0
aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdMZW5ndGg7ICsraSkgeworICAgICAgICBj
b25zdCBVQ2hhciYgY3VycmVudCA9ICgqcylbaV07CisgICAgICAgIGlmIChjdXJyZW50IDwgJyAn
ICYmIGN1cnJlbnQgIT0gJ1x0JykgeworICAgICAgICAgICAgbmV3TGVuZ3RoID0gaTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5ld0xlbmd0aCA8IHN0
YXRpY19jYXN0PGludD4oc3RyaW5nLmxlbmd0aCgpKSkKKyAgICAgICAgcmV0dXJuIHN0cmluZy5s
ZWZ0KG5ld0xlbmd0aCk7CisKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitzdGF0aWMgaW50IG51
bUdyYXBoZW1lQ2x1c3RlcnMoU3RyaW5nSW1wbCogcykKK3sKKyAgICBpZiAoIXMpCisgICAgICAg
IHJldHVybiAwOworCisgICAgVGV4dEJyZWFrSXRlcmF0b3IqIGl0ID0gY2hhcmFjdGVyQnJlYWtJ
dGVyYXRvcihzLT5jaGFyYWN0ZXJzKCksIHMtPmxlbmd0aCgpKTsKKyAgICBpZiAoIWl0KQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGludCBudW0gPSAwOworICAgIHdoaWxlICh0ZXh0QnJlYWtO
ZXh0KGl0KSAhPSBUZXh0QnJlYWtEb25lKQorICAgICAgICArK251bTsKKworICAgIHJldHVybiBu
dW07Cit9CisKK3ZvaWQgSW5wdXRFbGVtZW50OjpoYW5kbGVCZWZvcmVUZXh0SW5zZXJ0ZWRFdmVu
dChJbnB1dEVsZW1lbnREYXRhJiBkYXRhLCBEb2N1bWVudCogZG9jdW1lbnQsIEV2ZW50KiBldmVu
dCkKK3sKKyAgICBBU1NFUlQoZXZlbnQtPmlzQmVmb3JlVGV4dEluc2VydGVkRXZlbnQoKSk7CisK
KyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdGV4dCB0byBiZSBpbnNlcnRlZCB3aWxsIG5vdCB2
aW9sYXRlIHRoZSBtYXhMZW5ndGguCisgICAgaW50IG9sZExlbmd0aCA9IG51bUdyYXBoZW1lQ2x1
c3RlcnMoZGF0YS5pbnB1dEVsZW1lbnQoKS0+dmFsdWUoKS5pbXBsKCkpOworICAgIEFTU0VSVChv
bGRMZW5ndGggPD0gZGF0YS5tYXhMZW5ndGgoKSk7CisgICAgaW50IHNlbGVjdGlvbkxlbmd0aCA9
IG51bUdyYXBoZW1lQ2x1c3RlcnMocGxhaW5UZXh0KGRvY3VtZW50LT5mcmFtZSgpLT5zZWxlY3Rp
b24oKS0+c2VsZWN0aW9uKCkudG9SYW5nZSgpLmdldCgpKS5pbXBsKCkpOworICAgIEFTU0VSVChv
bGRMZW5ndGggPj0gc2VsZWN0aW9uTGVuZ3RoKTsKKyAgICBpbnQgbWF4TmV3TGVuZ3RoID0gZGF0
YS5tYXhMZW5ndGgoKSAtIChvbGRMZW5ndGggLSBzZWxlY3Rpb25MZW5ndGgpOworCisgICAgLy8g
VHJ1bmNhdGUgdGhlIGluc2VydGVkIHRleHQgdG8gYXZvaWQgdmlvbGF0aW5nIHRoZSBtYXhMZW5n
dGggYW5kIG90aGVyIGNvbnN0cmFpbnRzLgorICAgIEJlZm9yZVRleHRJbnNlcnRlZEV2ZW50KiB0
ZXh0RXZlbnQgPSBzdGF0aWNfY2FzdDxCZWZvcmVUZXh0SW5zZXJ0ZWRFdmVudCo+KGV2ZW50KTsK
KyAgICB0ZXh0RXZlbnQtPnNldFRleHQoY29uc3RyYWluVmFsdWUoZGF0YSwgdGV4dEV2ZW50LT50
ZXh0KCksIG1heE5ld0xlbmd0aCkpOworfQorCit2b2lkIElucHV0RWxlbWVudDo6cGFyc2VTaXpl
QXR0cmlidXRlKElucHV0RWxlbWVudERhdGEmIGRhdGEsIE1hcHBlZEF0dHJpYnV0ZSogYXR0cmli
dXRlKQoreworICAgIGRhdGEuc2V0U2l6ZShhdHRyaWJ1dGUtPmlzTnVsbCgpID8gSW5wdXRFbGVt
ZW50OjpzX2RlZmF1bHRTaXplIDogYXR0cmlidXRlLT52YWx1ZSgpLnRvSW50KCkpOworCisgICAg
aWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBkYXRhLmVsZW1lbnQoKS0+cmVuZGVyZXIoKSkK
KyAgICAgICAgcmVuZGVyZXItPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwor
fQorCit2b2lkIElucHV0RWxlbWVudDo6cGFyc2VNYXhMZW5ndGhBdHRyaWJ1dGUoSW5wdXRFbGVt
ZW50RGF0YSYgZGF0YSwgTWFwcGVkQXR0cmlidXRlKiBhdHRyaWJ1dGUpCit7CisgICAgaW50IG1h
eExlbmd0aCA9IGF0dHJpYnV0ZS0+aXNOdWxsKCkgPyBJbnB1dEVsZW1lbnQ6OnNfbWF4aW11bUxl
bmd0aCA6IGF0dHJpYnV0ZS0+dmFsdWUoKS50b0ludCgpOworICAgIG1heExlbmd0aCA9IG1heCgw
LCBtaW4obWF4TGVuZ3RoLCBJbnB1dEVsZW1lbnQ6OnNfbWF4aW11bUxlbmd0aCkpCisKKyAgICBp
bnQgb2xkTWF4TGVuZ3RoID0gZGF0YS5tYXhMZW5ndGgoKTsKKyAgICBkYXRhLnNldE1heExlbmd0
aChtYXhMZW5ndGgpOworCisgICAgaWYgKG9sZE1heExlbmd0aCAhPSBtYXhMZW5ndGgpCisgICAg
ICAgIHVwZGF0ZVZhbHVlSWZOZWVkZWQoZGF0YSk7CisKKyAgICBkYXRhLmVsZW1lbnQoKS0+c2V0
Q2hhbmdlZCgpOworfQorCit2b2lkIElucHV0RWxlbWVudDo6dXBkYXRlVmFsdWVJZk5lZWRlZChJ
bnB1dEVsZW1lbnREYXRhJiBkYXRhKQoreworICAgIFN0cmluZyBvbGRWYWx1ZSA9IGRhdGEudmFs
dWUoKTsKKyAgICBTdHJpbmcgbmV3VmFsdWUgPSBkYXRhLmlucHV0RWxlbWVudCgpLT5jb25zdHJh
aW5WYWx1ZShvbGRWYWx1ZSk7CisgICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKQorICAgICAg
ICBkYXRhLmlucHV0RWxlbWVudCgpLT5zZXRWYWx1ZShuZXdWYWx1ZSk7Cit9CisKK3ZvaWQgSW5w
dXRFbGVtZW50Ojpub3RpZnlGb3JtU3RhdGVDaGFuZ2VkKElucHV0RWxlbWVudERhdGEmIGRhdGEs
IERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJh
bWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBmcmFtZS0+cGFn
ZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZvcm1TdGF0ZURpZENoYW5nZShkYXRhLmVsZW1lbnQo
KSk7Cit9CisKKy8vIElucHV0RWxlbWVudERhdGEKK0lucHV0RWxlbWVudERhdGE6OklucHV0RWxl
bWVudERhdGEoSW5wdXRFbGVtZW50KiBpbnB1dEVsZW1lbnQsIEVsZW1lbnQqIGVsZW1lbnQpCisg
ICAgOiBtX2lucHV0RWxlbWVudChpbnB1dEVsZW1lbnQpCisgICAgLCBtX2VsZW1lbnQoZWxlbWVu
dCkKKyAgICAsIG1fcGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUoZmFsc2UpCisgICAgLCBtX3Np
emUoSW5wdXRFbGVtZW50OjpzX2RlZmF1bHRTaXplKQorICAgICwgbV9tYXhMZW5ndGgoSW5wdXRF
bGVtZW50OjpzX21heGltdW1MZW5ndGgpCisgICAgLCBtX2NhY2hlZFNlbGVjdGlvblN0YXJ0KC0x
KQorICAgICwgbV9jYWNoZWRTZWxlY3Rpb25FbmQoLTEpCit7CisgICAgQVNTRVJUKG1faW5wdXRF
bGVtZW50KTsKKyAgICBBU1NFUlQobV9lbGVtZW50KTsKK30KKworSW5wdXRFbGVtZW50RGF0YTo6
fklucHV0RWxlbWVudERhdGEoKQoreworfQorCitjb25zdCBBdG9taWNTdHJpbmcmIElucHV0RWxl
bWVudERhdGE6Om5hbWUoKSBjb25zdAoreworICAgIHJldHVybiBtX25hbWUuaXNOdWxsKCkgPyBl
bXB0eUF0b20gOiBtX25hbWU7Cit9CisKK0lucHV0RWxlbWVudCogaW5wdXRFbGVtZW50Rm9yRWxl
bWVudChFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlmIChlbGVtZW50LT5pc0hUTUxFbGVtZW50
KCkgJiYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoaW5wdXRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05h
bWUoaXNpbmRleFRhZykpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KGVsZW1lbnQpOworCisgICAgLy8gRklYTUU6IEVuYWJsZSB0aGlzIGNvZGUsIG9uY2Ug
dGhlIGZvbGxvdy11cCBXTUxJbnB1dEVsZW1lbnQgYWRkaXRpb24gcGF0Y2ggbGFuZHMuCisjaWYg
RU5BQkxFKFdNTCkgJiYgMAorICAgIGlmIChlbGVtZW50LT5pc1dNTEVsZW1lbnQoKSAmJiBlbGVt
ZW50LT5oYXNUYWdOYW1lKFdNTE5hbWVzOjppbnB1dFRhZykpCisgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxXTUxJbnB1dEVsZW1lbnQqPihlbGVtZW50KTsKKyNlbmRpZgorCisgICAgcmV0dXJu
IDA7Cit9CisKK30KSW5kZXg6IGRvbS9JbnB1dEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20v
SW5wdXRFbGVtZW50LmgJKHJldmlzaW9uIDApCisrKyBkb20vSW5wdXRFbGVtZW50LmgJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRvcmNo
IE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxl
LmNvbS8pCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICoKKyAqLworCisjaWZuZGVmIElucHV0RWxlbWVudF9oCisjZGVmaW5lIElucHV0RWxlbWVudF9o
CisKKyNpbmNsdWRlICJBdG9taWNTdHJpbmcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIERvY3VtZW50OworY2xhc3MgRWxlbWVu
dDsKK2NsYXNzIEV2ZW50OworY2xhc3MgSW5wdXRFbGVtZW50RGF0YTsKK2NsYXNzIE1hcHBlZEF0
dHJpYnV0ZTsKKworY2xhc3MgSW5wdXRFbGVtZW50IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5J
bnB1dEVsZW1lbnQoKSB7IH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1Bhc3N3b3JkRmllbGQoKSBj
b25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzU2VhcmNoRmllbGQoKSBjb25zdCA9IDA7Cisg
ICAgdmlydHVhbCBib29sIGlzVGV4dEZpZWxkKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBi
b29sIHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwg
Ym9vbCBzZWFyY2hFdmVudHNTaG91bGRCZURpc3BhdGNoZWQoKSBjb25zdCA9IDA7CisKKyAgICB2
aXJ0dWFsIGludCBzaXplKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgU3RyaW5nIHZhbHVlKCkg
Y29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmKSA9IDA7
CisgICAgdmlydHVhbCBTdHJpbmcgcGxhY2Vob2xkZXJWYWx1ZSgpIGNvbnN0ID0gMDsKKworICAg
IHZpcnR1YWwgU3RyaW5nIGNvbnN0cmFpblZhbHVlKGNvbnN0IFN0cmluZyYpIGNvbnN0ID0gMDsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgU3RyaW5nJikgPSAw
OworCisgICAgdmlydHVhbCB2b2lkIGNhY2hlU2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCkg
PSAwOworICAgIHZpcnR1YWwgdm9pZCBzZWxlY3QoKSA9IDA7CisKKyAgICBzdGF0aWMgY29uc3Qg
aW50IHNfbWF4aW11bUxlbmd0aDsKKyAgICBzdGF0aWMgY29uc3QgaW50IHNfZGVmYXVsdFNpemU7
CisKK3Byb3RlY3RlZDoKKyAgICBJbnB1dEVsZW1lbnQoKSB7IH0KKworICAgIHN0YXRpYyB2b2lk
IGRpc3BhdGNoRm9jdXNFdmVudChJbnB1dEVsZW1lbnREYXRhJiwgRG9jdW1lbnQqKTsKKyAgICBz
dGF0aWMgdm9pZCBkaXNwYXRjaEJsdXJFdmVudChJbnB1dEVsZW1lbnREYXRhJiwgRG9jdW1lbnQq
KTsKKyAgICBzdGF0aWMgdm9pZCB1cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkoSW5wdXRFbGVt
ZW50RGF0YSYsIERvY3VtZW50KiwgYm9vbCBwbGFjZWhvbGRlclZhbHVlQ2hhbmdlZCA9IGZhbHNl
KTsKKyAgICBzdGF0aWMgdm9pZCB1cGRhdGVGb2N1c0FwcGVhcmFuY2UoSW5wdXRFbGVtZW50RGF0
YSYsIERvY3VtZW50KiwgYm9vbCByZXN0b3JlUHJldmlvdXNTZWxlY3Rpb24pOworICAgIHN0YXRp
YyB2b2lkIHVwZGF0ZVNlbGVjdGlvblJhbmdlKElucHV0RWxlbWVudERhdGEmLCBpbnQgc3RhcnQs
IGludCBlbmQpOworICAgIHN0YXRpYyB2b2lkIGFib3V0VG9VbmxvYWQoSW5wdXRFbGVtZW50RGF0
YSYsIERvY3VtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2V0VmFsdWVGcm9tUmVuZGVyZXIoSW5w
dXRFbGVtZW50RGF0YSYsIERvY3VtZW50KiwgY29uc3QgU3RyaW5nJik7CisgICAgc3RhdGljIFN0
cmluZyBjb25zdHJhaW5WYWx1ZShjb25zdCBJbnB1dEVsZW1lbnREYXRhJiwgY29uc3QgU3RyaW5n
JiBwcm9wb3NlZFZhbHVlLCBpbnQgbWF4TGVuZ3RoKTsKKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVC
ZWZvcmVUZXh0SW5zZXJ0ZWRFdmVudChJbnB1dEVsZW1lbnREYXRhJiwgRG9jdW1lbnQqLCBFdmVu
dCopOworICAgIHN0YXRpYyB2b2lkIHBhcnNlU2l6ZUF0dHJpYnV0ZShJbnB1dEVsZW1lbnREYXRh
JiwgTWFwcGVkQXR0cmlidXRlKik7CisgICAgc3RhdGljIHZvaWQgcGFyc2VNYXhMZW5ndGhBdHRy
aWJ1dGUoSW5wdXRFbGVtZW50RGF0YSYsIE1hcHBlZEF0dHJpYnV0ZSopOworICAgIHN0YXRpYyB2
b2lkIHVwZGF0ZVZhbHVlSWZOZWVkZWQoSW5wdXRFbGVtZW50RGF0YSYpOworICAgIHN0YXRpYyB2
b2lkIG5vdGlmeUZvcm1TdGF0ZUNoYW5nZWQoSW5wdXRFbGVtZW50RGF0YSYsIERvY3VtZW50Kik7
Cit9OworCisvLyBIVE1ML1dNTElucHV0RWxlbWVudCBob2xkIHRoaXMgc3RydWN0IGFzIG1lbWJl
ciB2YXJpYWJsZQorLy8gYW5kIHBhc3MgaXQgdG8gdGhlIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25z
IGluIElucHV0RWxlbWVudAorY2xhc3MgSW5wdXRFbGVtZW50RGF0YSB7CitwdWJsaWM6CisgICAg
SW5wdXRFbGVtZW50RGF0YShJbnB1dEVsZW1lbnQqLCBFbGVtZW50Kik7CisgICAgfklucHV0RWxl
bWVudERhdGEoKTsKKworICAgIElucHV0RWxlbWVudCogaW5wdXRFbGVtZW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9pbnB1dEVsZW1lbnQ7IH0KKyAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9lbGVtZW50OyB9CisKKyAgICBib29sIHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxl
KCkgY29uc3QgeyByZXR1cm4gbV9wbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZTsgfQorICAgIHZv
aWQgc2V0UGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUoYm9vbCB2aXNpYmxlKSB7IG1fcGxhY2Vo
b2xkZXJTaG91bGRCZVZpc2libGUgPSB2aXNpYmxlOyB9CisKKyAgICBjb25zdCBBdG9taWNTdHJp
bmcmIG5hbWUoKSBjb25zdDsKKyAgICB2b2lkIHNldE5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiB2
YWx1ZSkgeyBtX25hbWUgPSB2YWx1ZTsgfQorCisgICAgU3RyaW5nIHZhbHVlKCkgY29uc3QgeyBy
ZXR1cm4gbV92YWx1ZTsgfQorICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkg
eyBtX3ZhbHVlID0gdmFsdWU7IH0KKworICAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9z
aXplOyB9CisgICAgdm9pZCBzZXRTaXplKGludCB2YWx1ZSkgeyBtX3NpemUgPSB2YWx1ZTsgfQor
CisgICAgaW50IG1heExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4TGVuZ3RoOyB9CisgICAg
dm9pZCBzZXRNYXhMZW5ndGgoaW50IHZhbHVlKSB7IG1fbWF4TGVuZ3RoID0gdmFsdWU7IH0KKwor
ICAgIGludCBjYWNoZWRTZWxlY3Rpb25TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVkU2Vs
ZWN0aW9uU3RhcnQ7IH0KKyAgICB2b2lkIHNldENhY2hlZFNlbGVjdGlvblN0YXJ0KGludCB2YWx1
ZSkgeyBtX2NhY2hlZFNlbGVjdGlvblN0YXJ0ID0gdmFsdWU7IH0KKworICAgIGludCBjYWNoZWRT
ZWxlY3Rpb25FbmQoKSBjb25zdCB7IHJldHVybiBtX2NhY2hlZFNlbGVjdGlvbkVuZDsgfQorICAg
IHZvaWQgc2V0Q2FjaGVkU2VsZWN0aW9uRW5kKGludCB2YWx1ZSkgeyBtX2NhY2hlZFNlbGVjdGlv
bkVuZCA9IHZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgSW5wdXRFbGVtZW50KiBtX2lucHV0RWxl
bWVudDsKKyAgICBFbGVtZW50KiBtX2VsZW1lbnQ7CisgICAgYm9vbCBtX3BsYWNlaG9sZGVyU2hv
dWxkQmVWaXNpYmxlOworICAgIEF0b21pY1N0cmluZyBtX25hbWU7CisgICAgU3RyaW5nIG1fdmFs
dWU7CisgICAgaW50IG1fc2l6ZTsKKyAgICBpbnQgbV9tYXhMZW5ndGg7CisgICAgaW50IG1fY2Fj
aGVkU2VsZWN0aW9uU3RhcnQ7CisgICAgaW50IG1fY2FjaGVkU2VsZWN0aW9uRW5kOworfTsKKwor
SW5wdXRFbGVtZW50KiBpbnB1dEVsZW1lbnRGb3JFbGVtZW50KEVsZW1lbnQqKTsKKworfQorCisj
ZW5kaWYKSW5kZXg6IGh0bWwvSFRNTElucHV0RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRt
bC9IVE1MSW5wdXRFbGVtZW50LmNwcAkocmV2aXNpb24gNDAwNjMpCisrKyBodG1sL0hUTUxJbnB1
dEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgogCi0jaW5jbHVkZSAiQmVm
b3JlVGV4dEluc2VydGVkRXZlbnQuaCIKICNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKICNpbmNs
dWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKQEAgLTUzLDEw
ICs1Miw3IEBACiAjaW5jbHVkZSAiUmVuZGVyVGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlclRleHRD
b250cm9sU2luZ2xlTGluZS5oIgogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCi0jaW5jbHVkZSAi
U2VsZWN0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIlRleHRCcmVha0l0ZXJhdG9yLmgiCiAj
aW5jbHVkZSAiVGV4dEV2ZW50LmgiCi0jaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVk
ZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtNjcsNzkg
KzYzLDI0IEBAIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKIGNvbnN0IGludCBtYXhTYXZl
ZFJlc3VsdHMgPSAyNTY7CiAKLS8vIEZJWE1FOiBBY2NvcmRpbmcgdG8gSFRNTDQsIHRoZSBsZW5n
dGggYXR0cmlidXRlJ3MgdmFsdWUgY2FuIGJlIGFyYml0cmFyaWx5Ci0vLyBsYXJnZS4gSG93ZXZl
ciwgZHVlIHRvIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWdzLmNnaT9pZD0xNDUzNiB0
aGluZ3MKLS8vIGdldCByYXRoZXIgc2x1Z2dpc2ggd2hlbiBhIHRleHQgZmllbGQgaGFzIGEgbGFy
Z2VyIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYW4KLS8vIHRoaXMsIGV2ZW4gd2hlbiBqdXN0IGNs
aWNraW5nIGluIHRoZSB0ZXh0IGZpZWxkLgotc3RhdGljIGNvbnN0IGludCBjTWF4TGVuID0gNTI0
Mjg4OwotCi1zdGF0aWMgaW50IG51bUdyYXBoZW1lQ2x1c3RlcnMoU3RyaW5nSW1wbCogcykKLXsK
LSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgVGV4dEJyZWFrSXRlcmF0b3Iq
IGl0ID0gY2hhcmFjdGVyQnJlYWtJdGVyYXRvcihzLT5jaGFyYWN0ZXJzKCksIHMtPmxlbmd0aCgp
KTsKLSAgICBpZiAoIWl0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBpbnQgbnVtID0gMDsKLSAg
ICB3aGlsZSAodGV4dEJyZWFrTmV4dChpdCkgIT0gVGV4dEJyZWFrRG9uZSkKLSAgICAgICAgKytu
dW07Ci0gICAgcmV0dXJuIG51bTsKLX0KLQotc3RhdGljIGludCBudW1DaGFyYWN0ZXJzSW5HcmFw
aGVtZUNsdXN0ZXJzKFN0cmluZ0ltcGwqIHMsIGludCBudW1HcmFwaGVtZUNsdXN0ZXJzKQotewot
ICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBUZXh0QnJlYWtJdGVyYXRvciog
aXQgPSBjaGFyYWN0ZXJCcmVha0l0ZXJhdG9yKHMtPmNoYXJhY3RlcnMoKSwgcy0+bGVuZ3RoKCkp
OwotICAgIGlmICghaXQpCi0gICAgICAgIHJldHVybiAwOwotICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbnVtR3JhcGhlbWVDbHVzdGVyczsgKytpKQotICAgICAgICBpZiAodGV4dEJyZWFrTmV4dChp
dCkgPT0gVGV4dEJyZWFrRG9uZSkKLSAgICAgICAgICAgIHJldHVybiBzLT5sZW5ndGgoKTsKLSAg
ICByZXR1cm4gdGV4dEJyZWFrQ3VycmVudChpdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBu
b3RpZnlGb3JtU3RhdGVDaGFuZ2VkKGNvbnN0IEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQpCi17
Ci0gICAgRnJhbWUqIGZyYW1lID0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBp
ZiAoIWZyYW1lKQotICAgICAgICByZXR1cm47Ci0gICAgZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCkt
PmNsaWVudCgpLT5mb3JtU3RhdGVEaWRDaGFuZ2UoZWxlbWVudCk7Ci19Ci0KIEhUTUxJbnB1dEVs
ZW1lbnQ6OkhUTUxJbnB1dEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9j
dW1lbnQqIGRvYywgSFRNTEZvcm1FbGVtZW50KiBmKQogICAgIDogSFRNTEZvcm1Db250cm9sRWxl
bWVudFdpdGhTdGF0ZSh0YWdOYW1lLCBkb2MsIGYpCisgICAgLCBtX2RhdGEodGhpcywgdGhpcykK
KyAgICAsIG1feFBvcygwKQorICAgICwgbV95UG9zKDApCisgICAgLCBtX21heFJlc3VsdHMoLTEp
CisgICAgLCBtX3R5cGUoVEVYVCkKKyAgICAsIG1fY2hlY2tlZChmYWxzZSkKKyAgICAsIG1fZGVm
YXVsdENoZWNrZWQoZmFsc2UpCisgICAgLCBtX3VzZURlZmF1bHRDaGVja2VkKHRydWUpCisgICAg
LCBtX2luZGV0ZXJtaW5hdGUoZmFsc2UpCisgICAgLCBtX2hhdmVUeXBlKGZhbHNlKQorICAgICwg
bV9hY3RpdmVTdWJtaXQoZmFsc2UpCisgICAgLCBtX2F1dG9jb21wbGV0ZShVbmluaXRpYWxpemVk
KQorICAgICwgbV9hdXRvZmlsbGVkKGZhbHNlKQorICAgICwgbV9pbml0ZWQoZmFsc2UpCiB7CiAg
ICAgQVNTRVJUKGhhc1RhZ05hbWUoaW5wdXRUYWcpIHx8IGhhc1RhZ05hbWUoaXNpbmRleFRhZykp
OwotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1MSW5wdXRFbGVtZW50Ojppbml0KCkKLXsKLSAg
ICBtX3R5cGUgPSBURVhUOwotICAgIG1fbWF4TGVuID0gY01heExlbjsKLSAgICBtX3NpemUgPSAy
MDsKLSAgICBtX2NoZWNrZWQgPSBmYWxzZTsKLSAgICBtX2RlZmF1bHRDaGVja2VkID0gZmFsc2U7
Ci0gICAgbV91c2VEZWZhdWx0Q2hlY2tlZCA9IHRydWU7Ci0gICAgbV9pbmRldGVybWluYXRlID0g
ZmFsc2U7Ci0KLSAgICBtX2hhdmVUeXBlID0gZmFsc2U7Ci0gICAgbV9hY3RpdmVTdWJtaXQgPSBm
YWxzZTsKLSAgICBtX2F1dG9jb21wbGV0ZSA9IFVuaW5pdGlhbGl6ZWQ7Ci0gICAgbV9pbml0ZWQg
PSBmYWxzZTsKLSAgICBtX2F1dG9maWxsZWQgPSBmYWxzZTsKLSAgICBtX3BsYWNlaG9sZGVyU2hv
dWxkQmVWaXNpYmxlID0gZmFsc2U7Ci0gICAgCi0gICAgeFBvcyA9IDA7Ci0gICAgeVBvcyA9IDA7
Ci0gICAgCi0gICAgY2FjaGVkU2VsU3RhcnQgPSAtMTsKLSAgICBjYWNoZWRTZWxFbmQgPSAtMTsK
LQotICAgIG1fbWF4UmVzdWx0cyA9IC0xOwogfQogCiBIVE1MSW5wdXRFbGVtZW50Ojp+SFRNTElu
cHV0RWxlbWVudCgpCkBAIC0xNTYsNyArOTcsNyBAQCBIVE1MSW5wdXRFbGVtZW50Ojp+SFRNTElu
cHV0RWxlbWVudCgpCiAKIGNvbnN0IEF0b21pY1N0cmluZyYgSFRNTElucHV0RWxlbWVudDo6bmFt
ZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fbmFtZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IG1f
bmFtZTsKKyAgICByZXR1cm4gbV9kYXRhLm5hbWUoKTsKIH0KIAogYm9vbCBIVE1MSW5wdXRFbGVt
ZW50OjphdXRvQ29tcGxldGUoKSBjb25zdApAQCAtMjE5LDIzICsxNjAsMTUgQEAgYm9vbCBIVE1M
SW5wdXRFbGVtZW50Ojppc01vdXNlRm9jdXNhYmxlKAogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6
OnVwZGF0ZUZvY3VzQXBwZWFyYW5jZShib29sIHJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbikKIHsg
ICAgICAgIAotICAgIGlmIChpc1RleHRGaWVsZCgpKSB7Ci0gICAgICAgIGlmICghcmVzdG9yZVBy
ZXZpb3VzU2VsZWN0aW9uIHx8IGNhY2hlZFNlbFN0YXJ0ID09IC0xKQotICAgICAgICAgICAgc2Vs
ZWN0KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNhY2hlZCBz
ZWxlY3Rpb24uCi0gICAgICAgICAgICBzZXRTZWxlY3Rpb25SYW5nZShjYWNoZWRTZWxTdGFydCwg
Y2FjaGVkU2VsRW5kKTsgCi0gICAgICAgIAotICAgICAgICBpZiAoZG9jdW1lbnQoKSAmJiBkb2N1
bWVudCgpLT5mcmFtZSgpKQotICAgICAgICAgICAgZG9jdW1lbnQoKS0+ZnJhbWUoKS0+cmV2ZWFs
U2VsZWN0aW9uKCk7Ci0gICAgfSBlbHNlCisgICAgaWYgKGlzVGV4dEZpZWxkKCkpCisgICAgICAg
IElucHV0RWxlbWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlKG1fZGF0YSwgZG9jdW1lbnQoKSwg
cmVzdG9yZVByZXZpb3VzU2VsZWN0aW9uKTsKKyAgICBlbHNlCiAgICAgICAgIEhUTUxGb3JtQ29u
dHJvbEVsZW1lbnRXaXRoU3RhdGU6OnVwZGF0ZUZvY3VzQXBwZWFyYW5jZShyZXN0b3JlUHJldmlv
dXNTZWxlY3Rpb24pOwogfQogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmFib3V0VG9VbmxvYWQo
KQogewotICAgIGlmIChpc1RleHRGaWVsZCgpICYmIGZvY3VzZWQoKSAmJiBkb2N1bWVudCgpLT5m
cmFtZSgpKQotICAgICAgICBkb2N1bWVudCgpLT5mcmFtZSgpLT50ZXh0RmllbGREaWRFbmRFZGl0
aW5nKHRoaXMpOworICAgIElucHV0RWxlbWVudDo6YWJvdXRUb1VubG9hZChtX2RhdGEsIGRvY3Vt
ZW50KCkpOwogfQogCiBib29sIEhUTUxJbnB1dEVsZW1lbnQ6OnNob3VsZFVzZUlucHV0TWV0aG9k
KCkgY29uc3QKQEAgLTI0NSwyMyArMTc4LDE3IEBAIGJvb2wgSFRNTElucHV0RWxlbWVudDo6c2hv
dWxkVXNlSW5wdXRNZXQKIAogdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZl
bnQoKQogewotICAgIGlmIChpc1RleHRGaWVsZCgpKSB7Ci0gICAgICAgIHNldEF1dG9maWxsZWQo
ZmFsc2UpOwotICAgICAgICB1cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkoKTsKLSAgICAgICAg
aWYgKGlucHV0VHlwZSgpID09IFBBU1NXT1JEICYmIGRvY3VtZW50KCktPmZyYW1lKCkpCi0gICAg
ICAgICAgICBkb2N1bWVudCgpLT5zZXRVc2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2ZSh0
cnVlKTsKLSAgICB9CisgICAgSW5wdXRFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQobV9kYXRh
LCBkb2N1bWVudCgpKTsKKworICAgIGlmIChpc1RleHRGaWVsZCgpKQorICAgICAgICBtX2F1dG9m
aWxsZWQgPSBmYWxzZTsKKwogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6OmRp
c3BhdGNoRm9jdXNFdmVudCgpOwogfQogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmRpc3BhdGNo
Qmx1ckV2ZW50KCkKIHsKLSAgICBpZiAoaXNUZXh0RmllbGQoKSAmJiBkb2N1bWVudCgpLT5mcmFt
ZSgpKSB7Ci0gICAgICAgIHVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSgpOwotICAgICAgICBp
ZiAoaW5wdXRUeXBlKCkgPT0gUEFTU1dPUkQpCi0gICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRV
c2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2ZShmYWxzZSk7Ci0gICAgICAgIGRvY3VtZW50
KCktPmZyYW1lKCktPnRleHRGaWVsZERpZEVuZEVkaXRpbmcodGhpcyk7Ci0gICAgfQorICAgIElu
cHV0RWxlbWVudDo6ZGlzcGF0Y2hCbHVyRXZlbnQobV9kYXRhLCBkb2N1bWVudCgpKTsKICAgICBI
VE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjpkaXNwYXRjaEJsdXJFdmVudCgpOwogfQog
CkBAIC0zMzEsMTQgKzI1OCwxNCBAQCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnNldElucHV0VHlw
ZShjb25zCiAgICAgICAgICAgICBib29sIGlzUGFzc3dvcmRGaWVsZCA9IGlucHV0VHlwZSgpID09
IFBBU1NXT1JEOwogICAgICAgICAgICAgYm9vbCB3aWxsUmVzcGVjdEhlaWdodEFuZFdpZHRoID0g
cmVzcGVjdEhlaWdodEFuZFdpZHRoQXR0cnMoKTsKIAotICAgICAgICAgICAgaWYgKGRpZFN0b3Jl
VmFsdWUgJiYgIXdpbGxTdG9yZVZhbHVlICYmICFtX3ZhbHVlLmlzTnVsbCgpKSB7Ci0gICAgICAg
ICAgICAgICAgc2V0QXR0cmlidXRlKHZhbHVlQXR0ciwgbV92YWx1ZSk7Ci0gICAgICAgICAgICAg
ICAgbV92YWx1ZSA9IFN0cmluZygpOworICAgICAgICAgICAgaWYgKGRpZFN0b3JlVmFsdWUgJiYg
IXdpbGxTdG9yZVZhbHVlICYmICFtX2RhdGEudmFsdWUoKS5pc051bGwoKSkgeworICAgICAgICAg
ICAgICAgIHNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIsIG1fZGF0YS52YWx1ZSgpKTsKKyAgICAgICAg
ICAgICAgICBtX2RhdGEuc2V0VmFsdWUoU3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAg
ICAgICAgaWYgKCFkaWRTdG9yZVZhbHVlICYmIHdpbGxTdG9yZVZhbHVlKQotICAgICAgICAgICAg
ICAgIG1fdmFsdWUgPSBjb25zdHJhaW5WYWx1ZShnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKSk7Cisg
ICAgICAgICAgICAgICAgbV9kYXRhLnNldFZhbHVlKGNvbnN0cmFpblZhbHVlKGdldEF0dHJpYnV0
ZSh2YWx1ZUF0dHIpKSk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVjaGVj
a1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgSW5wdXRFbGVtZW50Ojp1cGRhdGVWYWx1ZUlmTmVl
ZGVkKG1fZGF0YSk7CiAKICAgICAgICAgICAgIGlmICh3YXNQYXNzd29yZEZpZWxkICYmICFpc1Bh
c3N3b3JkRmllbGQpCiAgICAgICAgICAgICAgICAgdW5yZWdpc3RlckZvckFjdGl2YXRpb25DYWxs
YmFja0lmTmVlZGVkKCk7CkBAIC0zNjQsNyArMjkxLDcgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50
OjpzZXRJbnB1dFR5cGUoY29ucwogICAgICAgICAgICAgY2hlY2tlZFJhZGlvQnV0dG9ucyh0aGlz
KS5hZGRCdXR0b24odGhpcyk7CiAgICAgICAgIH0KIAotICAgICAgICBub3RpZnlGb3JtU3RhdGVD
aGFuZ2VkKHRoaXMpOworICAgICAgICBJbnB1dEVsZW1lbnQ6Om5vdGlmeUZvcm1TdGF0ZUNoYW5n
ZWQobV9kYXRhLCBkb2N1bWVudCgpKTsKICAgICB9CiAgICAgbV9oYXZlVHlwZSA9IHRydWU7CiAK
QEAgLTUwMCw4ICs0MjcsOCBAQCBpbnQgSFRNTElucHV0RWxlbWVudDo6c2VsZWN0aW9uU3RhcnQo
KSBjCiB7CiAgICAgaWYgKCFpc1RleHRGaWVsZCgpKQogICAgICAgICByZXR1cm4gMDsKLSAgICBp
ZiAoZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSAhPSB0aGlzICYmIGNhY2hlZFNlbFN0YXJ0ICE9
IC0xKQotICAgICAgICByZXR1cm4gY2FjaGVkU2VsU3RhcnQ7CisgICAgaWYgKGRvY3VtZW50KCkt
PmZvY3VzZWROb2RlKCkgIT0gdGhpcyAmJiBtX2RhdGEuY2FjaGVkU2VsZWN0aW9uU3RhcnQoKSAh
PSAtMSkKKyAgICAgICAgcmV0dXJuIG1fZGF0YS5jYWNoZWRTZWxlY3Rpb25TdGFydCgpOwogICAg
IGlmICghcmVuZGVyZXIoKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PFJlbmRlclRleHRDb250cm9sKj4ocmVuZGVyZXIoKSktPnNlbGVjdGlvblN0YXJ0KCk7CkBA
IC01MTEsOCArNDM4LDggQEAgaW50IEhUTUxJbnB1dEVsZW1lbnQ6OnNlbGVjdGlvbkVuZCgpIGNv
bgogewogICAgIGlmICghaXNUZXh0RmllbGQoKSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYg
KGRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkgIT0gdGhpcyAmJiBjYWNoZWRTZWxFbmQgIT0gLTEp
Ci0gICAgICAgIHJldHVybiBjYWNoZWRTZWxFbmQ7CisgICAgaWYgKGRvY3VtZW50KCktPmZvY3Vz
ZWROb2RlKCkgIT0gdGhpcyAmJiBtX2RhdGEuY2FjaGVkU2VsZWN0aW9uRW5kKCkgIT0gLTEpCisg
ICAgICAgIHJldHVybiBtX2RhdGEuY2FjaGVkU2VsZWN0aW9uRW5kKCk7CiAgICAgaWYgKCFyZW5k
ZXJlcigpKQogICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dENvbnRyb2wqPihyZW5kZXJlcigpKS0+c2VsZWN0aW9uRW5kKCk7CkBAIC01NDcsMTEgKzQ3
NCw3IEBAIHZvaWQgSFRNTElucHV0RWxlbWVudDo6c2VsZWN0KCkKIAogdm9pZCBIVE1MSW5wdXRF
bGVtZW50OjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpCiB7Ci0gICAgaWYg
KCFpc1RleHRGaWVsZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFyZW5kZXJlcigpKQot
ICAgICAgICByZXR1cm47Ci0gICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5k
ZXJlcigpKS0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7CisgICAgSW5wdXRFbGVtZW50
Ojp1cGRhdGVTZWxlY3Rpb25SYW5nZShtX2RhdGEsIHN0YXJ0LCBlbmQpOwogfQogCiB2b2lkIEhU
TUxJbnB1dEVsZW1lbnQ6OmFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0FueUVsZW1lbnQpCkBA
IC02MDYsNyArNTI5LDcgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJp
YgogewogICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKICAgICAgICAgY2hlY2tl
ZFJhZGlvQnV0dG9ucyh0aGlzKS5yZW1vdmVCdXR0b24odGhpcyk7Ci0gICAgICAgIG1fbmFtZSA9
IGF0dHItPnZhbHVlKCk7CisgICAgICAgIG1fZGF0YS5zZXROYW1lKGF0dHItPnZhbHVlKCkpOwog
ICAgICAgICBjaGVja2VkUmFkaW9CdXR0b25zKHRoaXMpLmFkZEJ1dHRvbih0aGlzKTsKICAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhdXRvY29tcGxldGVBdHRyKSB7CiAgICAgICAgIGlm
IChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAib2ZmIikpIHsKQEAgLTYyNCw3ICs1
NDcsNyBAQCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmliCiAgICAgICAg
IHNldElucHV0VHlwZShhdHRyLT52YWx1ZSgpKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSB2YWx1ZUF0dHIpIHsKICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHNldENoYW5nZWQg
aWYgdGhlIGZvcm0gaXMgbG9va2luZyBhdCB0aGUgZGVmYXVsdCB2YWx1ZSByaWdodCBub3cuCi0g
ICAgICAgIGlmIChtX3ZhbHVlLmlzTnVsbCgpKQorICAgICAgICBpZiAobV9kYXRhLnZhbHVlKCku
aXNOdWxsKCkpCiAgICAgICAgICAgICBzZXRDaGFuZ2VkKCk7CiAgICAgICAgIHNldFZhbHVlTWF0
Y2hlc1JlbmRlcmVyKGZhbHNlKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjaGVj
a2VkQXR0cikgewpAQCAtNjMzLDE5ICs1NTYsMTEgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50Ojpw
YXJzZU1hcHBlZEF0dHJpYgogICAgICAgICAgICAgc2V0Q2hlY2tlZChtX2RlZmF1bHRDaGVja2Vk
KTsKICAgICAgICAgICAgIG1fdXNlRGVmYXVsdENoZWNrZWQgPSB0cnVlOwogICAgICAgICB9Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWF4bGVuZ3RoQXR0cikgewotICAgICAgICBp
bnQgb2xkTWF4TGVuID0gbV9tYXhMZW47Ci0gICAgICAgIG1fbWF4TGVuID0gIWF0dHItPmlzTnVs
bCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogY01heExlbjsKLSAgICAgICAgaWYgKG1fbWF4
TGVuIDw9IDAgfHwgbV9tYXhMZW4gPiBjTWF4TGVuKQotICAgICAgICAgICAgbV9tYXhMZW4gPSBj
TWF4TGVuOwotICAgICAgICBpZiAob2xkTWF4TGVuICE9IG1fbWF4TGVuKQotICAgICAgICAgICAg
cmVjaGVja1ZhbHVlKCk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBzaXplQXR0cikgewotICAgICAgICBtX3NpemUgPSAhYXR0ci0+aXNOdWxs
KCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAyMDsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkp
Ci0gICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNh
bGMoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbHRBdHRyKSB7CisgICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWF4bGVuZ3RoQXR0cikKKyAgICAgICAgSW5wdXRFbGVt
ZW50OjpwYXJzZU1heExlbmd0aEF0dHJpYnV0ZShtX2RhdGEsIGF0dHIpOworICAgIGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBzaXplQXR0cikKKyAgICAgICAgSW5wdXRFbGVtZW50OjpwYXJzZVNp
emVBdHRyaWJ1dGUobV9kYXRhLCBhdHRyKTsKKyAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
YWx0QXR0cikgewogICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiBpbnB1dFR5cGUoKSA9PSBJTUFH
RSkKICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckltYWdlKj4ocmVuZGVyZXIoKSktPnVw
ZGF0ZUFsdFRleHQoKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKSB7
CkBAIC02OTksMTMgKzYxNCwxMyBAQCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnBhcnNlTWFwcGVk
QXR0cmliCiAgICAgICAgIHNldENoYW5nZWQoKTsKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBwbGFjZWhvbGRlckF0dHIpIHsKICAgICAgICAgaWYgKGlzVGV4dEZpZWxkKCkpCi0gICAg
ICAgICAgICB1cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkodHJ1ZSk7CisgICAgICAgICAgICBJ
bnB1dEVsZW1lbnQ6OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eShtX2RhdGEsIGRvY3VtZW50
KCksIHRydWUpOwogICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGF1dG9zYXZlQXR0ciB8
fAotICAgICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IGluY3JlbWVudGFsQXR0ciB8fAotICAg
ICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIgfHwKLSAgICAgICAgICAgICAgIGF0
dHItPm5hbWUoKSA9PSBtYXhBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0g
bXVsdGlwbGVBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lzaW9u
QXR0cikKKyAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gaW5jcmVtZW50YWxBdHRyIHx8Cisg
ICAgICAgICAgICAgYXR0ci0+bmFtZSgpID09IG1pbkF0dHIgfHwKKyAgICAgICAgICAgICBhdHRy
LT5uYW1lKCkgPT0gbWF4QXR0ciB8fAorICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBtdWx0
aXBsZUF0dHIgfHwKKyAgICAgICAgICAgICBhdHRyLT5uYW1lKCkgPT0gcHJlY2lzaW9uQXR0cikK
ICAgICAgICAgc2V0Q2hhbmdlZCgpOwogICAgIGVsc2UKICAgICAgICAgSFRNTEZvcm1Db250cm9s
RWxlbWVudFdpdGhTdGF0ZTo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7CkBAIC04NTksOCAr
Nzc0LDggQEAgYm9vbCBIVE1MSW5wdXRFbGVtZW50OjphcHBlbmRGb3JtRGF0YShGbwogCiAgICAg
ICAgIGNhc2UgSU1BR0U6CiAgICAgICAgICAgICBpZiAobV9hY3RpdmVTdWJtaXQpIHsKLSAgICAg
ICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKS5pc0VtcHR5KCkgPyAieCIgOiAo
bmFtZSgpICsgIi54IiksIHhQb3MpOwotICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVuZERh
dGEobmFtZSgpLmlzRW1wdHkoKSA/ICJ5IiA6IChuYW1lKCkgKyAiLnkiKSwgeVBvcyk7CisgICAg
ICAgICAgICAgICAgZW5jb2RpbmcuYXBwZW5kRGF0YShuYW1lKCkuaXNFbXB0eSgpID8gIngiIDog
KG5hbWUoKSArICIueCIpLCBtX3hQb3MpOworICAgICAgICAgICAgICAgIGVuY29kaW5nLmFwcGVu
ZERhdGEobmFtZSgpLmlzRW1wdHkoKSA/ICJ5IiA6IChuYW1lKCkgKyAiLnkiKSwgbV95UG9zKTsK
ICAgICAgICAgICAgICAgICBpZiAoIW5hbWUoKS5pc0VtcHR5KCkgJiYgIXZhbHVlKCkuaXNFbXB0
eSgpKQogICAgICAgICAgICAgICAgICAgICBlbmNvZGluZy5hcHBlbmREYXRhKG5hbWUoKSwgdmFs
dWUoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC05NDQsMTQgKzg1OSwxOSBA
QCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnNldEluZGV0ZXJtaW5hdGUoCiAgICAgICAgIHRoZW1l
KCktPnN0YXRlQ2hhbmdlZChyZW5kZXJlcigpLCBDaGVja2VkU3RhdGUpOwogfQogCi12b2lkIEhU
TUxJbnB1dEVsZW1lbnQ6OmNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnQg
KnNvdXJjZSkKK2ludCBIVE1MSW5wdXRFbGVtZW50OjpzaXplKCkgY29uc3QKIHsKLSAgICBjb25z
dCBIVE1MSW5wdXRFbGVtZW50ICpzb3VyY2VFbGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElu
cHV0RWxlbWVudCAqPihzb3VyY2UpOworICAgIHJldHVybiBtX2RhdGEuc2l6ZSgpOworfQorCit2
b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0IEVs
ZW1lbnQqIHNvdXJjZSkKK3sKKyAgICBjb25zdCBIVE1MSW5wdXRFbGVtZW50KiBzb3VyY2VFbGVt
ZW50ID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElucHV0RWxlbWVudCo+KHNvdXJjZSk7CisKKyAg
ICBtX2RhdGEuc2V0VmFsdWUoc291cmNlRWxlbWVudC0+bV9kYXRhLnZhbHVlKCkpOworICAgIG1f
Y2hlY2tlZCA9IHNvdXJjZUVsZW1lbnQtPm1fY2hlY2tlZDsKKyAgICBtX2luZGV0ZXJtaW5hdGUg
PSBzb3VyY2VFbGVtZW50LT5tX2luZGV0ZXJtaW5hdGU7CiAKLSAgICBtX3ZhbHVlID0gc291cmNl
RWxlbS0+bV92YWx1ZTsKLSAgICBtX2NoZWNrZWQgPSBzb3VyY2VFbGVtLT5tX2NoZWNrZWQ7Ci0g
ICAgbV9pbmRldGVybWluYXRlID0gc291cmNlRWxlbS0+bV9pbmRldGVybWluYXRlOwotICAgIAog
ICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6OmNvcHlOb25BdHRyaWJ1dGVQcm9w
ZXJ0aWVzKHNvdXJjZSk7CiB9CiAKQEAgLTk2NSw3ICs4ODUsNyBAQCBTdHJpbmcgSFRNTElucHV0
RWxlbWVudDo6dmFsdWUoKSBjb25zdAogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgfQog
Ci0gICAgU3RyaW5nIHZhbHVlID0gbV92YWx1ZTsKKyAgICBTdHJpbmcgdmFsdWUgPSBtX2RhdGEu
dmFsdWUoKTsKICAgICBpZiAodmFsdWUuaXNOdWxsKCkpIHsKICAgICAgICAgdmFsdWUgPSBjb25z
dHJhaW5WYWx1ZShnZXRBdHRyaWJ1dGUodmFsdWVBdHRyKSk7CiAKQEAgLTEwMTQsMTQgKzkzNCwx
NCBAQCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnNldFZhbHVlKGNvbnN0IFN0CiAgICAgICAgIHJl
dHVybjsKIAogICAgIGlmIChpc1RleHRGaWVsZCgpKQotICAgICAgICB1cGRhdGVQbGFjZWhvbGRl
clZpc2liaWxpdHkoKTsKLSAgICAKKyAgICAgICAgSW5wdXRFbGVtZW50Ojp1cGRhdGVQbGFjZWhv
bGRlclZpc2liaWxpdHkobV9kYXRhLCBkb2N1bWVudCgpKTsKKwogICAgIHNldFZhbHVlTWF0Y2hl
c1JlbmRlcmVyKGZhbHNlKTsKICAgICBpZiAoc3RvcmVzVmFsdWVTZXBhcmF0ZUZyb21BdHRyaWJ1
dGUoKSkgewogICAgICAgICBpZiAoaW5wdXRUeXBlKCkgPT0gRklMRSkKICAgICAgICAgICAgIG1f
ZmlsZUxpc3QtPmNsZWFyKCk7CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgbV92YWx1ZSA9
IGNvbnN0cmFpblZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIG1fZGF0YS5zZXRWYWx1ZShjb25z
dHJhaW5WYWx1ZSh2YWx1ZSkpOwogICAgICAgICAgICAgaWYgKGlzVGV4dEZpZWxkKCkgJiYgaW5E
b2N1bWVudCgpKQogICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnVwZGF0ZVJlbmRlcmluZygp
OwogICAgICAgICB9CkBAIC0xMDMyLDQyICs5NTIsMzAgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50
OjpzZXRWYWx1ZShjb25zdCBTdAogICAgICAgICBzZXRBdHRyaWJ1dGUodmFsdWVBdHRyLCBjb25z
dHJhaW5WYWx1ZSh2YWx1ZSkpOwogICAgIAogICAgIGlmIChpc1RleHRGaWVsZCgpKSB7Ci0gICAg
ICAgIHVuc2lnbmVkIG1heCA9IG1fdmFsdWUubGVuZ3RoKCk7CisgICAgICAgIHVuc2lnbmVkIG1h
eCA9IG1fZGF0YS52YWx1ZSgpLmxlbmd0aCgpOwogICAgICAgICBpZiAoZG9jdW1lbnQoKS0+Zm9j
dXNlZE5vZGUoKSA9PSB0aGlzKQotICAgICAgICAgICAgc2V0U2VsZWN0aW9uUmFuZ2UobWF4LCBt
YXgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNhY2hlZFNlbFN0YXJ0ID0gbWF4Owot
ICAgICAgICAgICAgY2FjaGVkU2VsRW5kID0gbWF4OwotICAgICAgICB9CisgICAgICAgICAgICBJ
bnB1dEVsZW1lbnQ6OnVwZGF0ZVNlbGVjdGlvblJhbmdlKG1fZGF0YSwgbWF4LCBtYXgpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBjYWNoZVNlbGVjdGlvbihtYXgsIG1heCk7CiAgICAgfQot
ICAgIG5vdGlmeUZvcm1TdGF0ZUNoYW5nZWQodGhpcyk7CisgICAgSW5wdXRFbGVtZW50Ojpub3Rp
ZnlGb3JtU3RhdGVDaGFuZ2VkKG1fZGF0YSwgZG9jdW1lbnQoKSk7CiB9CiAKLXZvaWQgSFRNTElu
cHV0RWxlbWVudDo6c2V0VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgU3RyaW5nJiB2YWx1ZSkKK1N0
cmluZyBIVE1MSW5wdXRFbGVtZW50OjpwbGFjZWhvbGRlclZhbHVlKCkgY29uc3QKIHsKLSAgICAv
LyBSZW5kZXJlciBhbmQgb3VyIGV2ZW50IGhhbmRsZXIgYXJlIHJlc3BvbnNpYmxlIGZvciBjb25z
dHJhaW5pbmcgdmFsdWVzLgotICAgIEFTU0VSVCh2YWx1ZSA9PSBjb25zdHJhaW5WYWx1ZSh2YWx1
ZSkgfHwgY29uc3RyYWluVmFsdWUodmFsdWUpLmlzRW1wdHkoKSk7Ci0KLSAgICAvLyBGaWxlIHVw
bG9hZCBjb250cm9scyB3aWxsIGFsd2F5cyB1c2Ugc2V0RmlsZUxpc3RGcm9tUmVuZGVyZXIuCi0g
ICAgQVNTRVJUIChpbnB1dFR5cGUoKSAhPSBGSUxFKTsKLQotICAgIGlmIChpc1RleHRGaWVsZCgp
KQotICAgICAgICB1cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkoKTsKLSAgICAKLSAgICAvLyBX
b3JrYXJvdW5kIGZvciBidWcgd2hlcmUgdHJhaWxpbmcgXG4gaXMgaW5jbHVkZWQgaW4gdGhlIHJl
c3VsdCBvZiB0ZXh0Q29udGVudC4KLSAgICAvLyBUaGUgYXNzZXJ0IG1hY3JvIGFib3ZlIG1heSBh
bHNvIGJlIHNpbXBsaWZpZWQgdG86ICB2YWx1ZSA9PSBjb25zdHJhaW5WYWx1ZSh2YWx1ZSkKLSAg
ICAvLyBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NjYxCi0gICAgaWYg
KHZhbHVlID09ICJcbiIpCi0gICAgICAgIG1fdmFsdWUgPSAiIjsKLSAgICBlbHNlCi0gICAgICAg
IG1fdmFsdWUgPSB2YWx1ZTsKLQotICAgIHNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCk7CisgICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShwbGFjZWhvbGRlckF0dHIpLnN0cmluZygpOworfQogCi0gICAg
Ly8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAgZGlzcGF0Y2hFdmVudEZvclR5cGUo
ZXZlbnROYW1lcygpLmlucHV0RXZlbnQsIHRydWUsIGZhbHNlKTsKK2Jvb2wgSFRNTElucHV0RWxl
bWVudDo6c2VhcmNoRXZlbnRzU2hvdWxkQmVEaXNwYXRjaGVkKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gaGFzQXR0cmlidXRlKGluY3JlbWVudGFsQXR0cik7Cit9CiAKLSAgICBub3RpZnlGb3JtU3Rh
dGVDaGFuZ2VkKHRoaXMpOwordm9pZCBIVE1MSW5wdXRFbGVtZW50OjpzZXRWYWx1ZUZyb21SZW5k
ZXJlcihjb25zdCBTdHJpbmcmIHZhbHVlKQoreworICAgIC8vIEZpbGUgdXBsb2FkIGNvbnRyb2xz
IHdpbGwgYWx3YXlzIHVzZSBzZXRGaWxlTGlzdEZyb21SZW5kZXJlci4KKyAgICBBU1NFUlQoaW5w
dXRUeXBlKCkgIT0gRklMRSk7CisgICAgSW5wdXRFbGVtZW50OjpzZXRWYWx1ZUZyb21SZW5kZXJl
cihtX2RhdGEsIGRvY3VtZW50KCksIHZhbHVlKTsKIH0KIAogdm9pZCBIVE1MSW5wdXRFbGVtZW50
OjpzZXRGaWxlTGlzdEZyb21SZW5kZXJlcihjb25zdCBWZWN0b3I8U3RyaW5nPiYgcGF0aHMpCkBA
IC0xMDc4LDcgKzk4Niw3IEBAIHZvaWQgSFRNTElucHV0RWxlbWVudDo6c2V0RmlsZUxpc3RGcm9t
UmUKICAgICAgICAgbV9maWxlTGlzdC0+YXBwZW5kKEZpbGU6OmNyZWF0ZShwYXRoc1tpXSkpOwog
CiAgICAgc2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoKTsKLSAgICBub3RpZnlGb3JtU3RhdGVDaGFu
Z2VkKHRoaXMpOworICAgIElucHV0RWxlbWVudDo6bm90aWZ5Rm9ybVN0YXRlQ2hhbmdlZChtX2Rh
dGEsIGRvY3VtZW50KCkpOwogfQogCiBib29sIEhUTUxJbnB1dEVsZW1lbnQ6OnN0b3Jlc1ZhbHVl
U2VwYXJhdGVGcm9tQXR0cmlidXRlKCkgY29uc3QKQEAgLTExODUsMjQgKzEwOTMsMjQgQEAgdm9p
ZCBIVE1MSW5wdXRFbGVtZW50OjpkZWZhdWx0RXZlbnRIYW5kbAogICAgICAgICAvLyBGSVhNRTog
V2UgY291bGQganVzdCBjYWxsIG9mZnNldFgoKSBhbmQgb2Zmc2V0WSgpIG9uIHRoZSBldmVudCwK
ICAgICAgICAgLy8gYnV0IHRoYXQncyBjdXJyZW50bHkgYnJva2VuLCBzbyBmb3Igbm93IGRvIHRo
ZSBjb21wdXRhdGlvbiBoZXJlLgogICAgICAgICBpZiAobWUtPmlzU2ltdWxhdGVkKCkgfHwgIXJl
bmRlcmVyKCkpIHsKLSAgICAgICAgICAgIHhQb3MgPSAwOwotICAgICAgICAgICAgeVBvcyA9IDA7
CisgICAgICAgICAgICBtX3hQb3MgPSAwOworICAgICAgICAgICAgbV95UG9zID0gMDsKICAgICAg
ICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGRvZXNuJ3Qgd29yayBjb3Jy
ZWN0bHkgd2l0aCB0cmFuc2Zvcm1zLgogICAgICAgICAgICAgSW50UG9pbnQgYWJzT2Zmc2V0ID0g
cm91bmRlZEludFBvaW50KHJlbmRlcmVyKCktPmxvY2FsVG9BYnNvbHV0ZSgpKTsKLSAgICAgICAg
ICAgIHhQb3MgPSBtZS0+cGFnZVgoKSAtIGFic09mZnNldC54KCk7Ci0gICAgICAgICAgICB5UG9z
ID0gbWUtPnBhZ2VZKCkgLSBhYnNPZmZzZXQueSgpOworICAgICAgICAgICAgbV94UG9zID0gbWUt
PnBhZ2VYKCkgLSBhYnNPZmZzZXQueCgpOworICAgICAgICAgICAgbV95UG9zID0gbWUtPnBhZ2VZ
KCkgLSBhYnNPZmZzZXQueSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGlzVGV4dEZp
ZWxkKCkgJiYgZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleWRvd25FdmVudCAmJiBldnQt
PmlzS2V5Ym9hcmRFdmVudCgpICYmIGZvY3VzZWQoKSAmJiBkb2N1bWVudCgpLT5mcmFtZSgpCi0g
ICAgICAgICAgICAgICAgJiYgZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZG9UZXh0RmllbGRDb21tYW5k
RnJvbUV2ZW50KHRoaXMsIHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldnQpKSkgeworICAg
ICAgICAmJiBkb2N1bWVudCgpLT5mcmFtZSgpLT5kb1RleHRGaWVsZENvbW1hbmRGcm9tRXZlbnQo
dGhpcywgc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2dCkpKSB7CiAgICAgICAgIGV2dC0+
c2V0RGVmYXVsdEhhbmRsZWQoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmIChp
bnB1dFR5cGUoKSA9PSBSQURJTyAmJiBldnQtPmlzTW91c2VFdmVudCgpCi0gICAgICAgICAgICAm
JiBldnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkuY2xpY2tFdmVudCAmJiBzdGF0aWNfY2FzdDxN
b3VzZUV2ZW50Kj4oZXZ0KS0+YnV0dG9uKCkgPT0gTGVmdEJ1dHRvbikgeworICAgICAgICAmJiBl
dnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkuY2xpY2tFdmVudCAmJiBzdGF0aWNfY2FzdDxNb3Vz
ZUV2ZW50Kj4oZXZ0KS0+YnV0dG9uKCkgPT0gTGVmdEJ1dHRvbikgewogICAgICAgICBldnQtPnNl
dERlZmF1bHRIYW5kbGVkKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMjI2LDEzICsx
MTM0LDEzIEBAIHZvaWQgSFRNTElucHV0RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGwKICAgICAg
ICAgICAgICAgICBmb3JtKCktPnJlc2V0KCk7CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAg
ICAgICAgICBtX2FjdGl2ZVN1Ym1pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6
IFdvdWxkIGJlIGNsZWFuZXIgdG8gZ2V0IHhQb3MgYW5kIHlQb3Mgb3V0IG9mIHRoZSB1bmRlcmx5
aW5nIG1vdXNlCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdvdWxkIGJlIGNsZWFuZXIgdG8g
Z2V0IG1feFBvcyBhbmQgbV95UG9zIG91dCBvZiB0aGUgdW5kZXJseWluZyBtb3VzZQogICAgICAg
ICAgICAgICAgIC8vIGV2ZW50IChpZiBhbnkpIGhlcmUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRo
ZSB2YXJpYWJsZXMgc2V0IGFib3ZlIHdoZW4KICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5n
IHRoZSBjbGljayBldmVudC4gRXZlbiBiZXR0ZXIsIGFwcGVuZEZvcm1EYXRhIGNvdWxkIHBhc3Mg
dGhlCi0gICAgICAgICAgICAgICAgLy8gZXZlbnQgaW4sIGFuZCB0aGVuIHdlIGNvdWxkIGdldCBy
aWQgb2YgeFBvcyBhbmQgeVBvcyBhbHRvZ2V0aGVyIQorICAgICAgICAgICAgICAgIC8vIGV2ZW50
IGluLCBhbmQgdGhlbiB3ZSBjb3VsZCBnZXQgcmlkIG9mIG1feFBvcyBhbmQgbV95UG9zIGFsdG9n
ZXRoZXIhCiAgICAgICAgICAgICAgICAgaWYgKCFmb3JtKCktPnByZXBhcmVTdWJtaXQoZXZ0KSkg
ewotICAgICAgICAgICAgICAgICAgICB4UG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgeVBv
cyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1feFBvcyA9IDA7CisgICAgICAgICAgICAgICAg
ICAgIG1feVBvcyA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1fYWN0
aXZlU3VibWl0ID0gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xNDExLDE4ICsxMzE5LDggQEAg
dm9pZCBIVE1MSW5wdXRFbGVtZW50OjpkZWZhdWx0RXZlbnRIYW5kbAogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgaWYgKGV2dC0+aXNCZWZvcmVUZXh0SW5zZXJ0ZWRFdmVudCgpKSB7Ci0g
ICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0IHRvIGJlIGluc2VydGVkIHdpbGwgbm90
IHZpb2xhdGUgdGhlIG1heExlbmd0aC4KLSAgICAgICAgaW50IG9sZExlbiA9IG51bUdyYXBoZW1l
Q2x1c3RlcnModmFsdWUoKS5pbXBsKCkpOwotICAgICAgICBBU1NFUlQob2xkTGVuIDw9IG1heExl
bmd0aCgpKTsKLSAgICAgICAgaW50IHNlbGVjdGlvbkxlbiA9IG51bUdyYXBoZW1lQ2x1c3RlcnMo
cGxhaW5UZXh0KGRvY3VtZW50KCktPmZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKS50
b1JhbmdlKCkuZ2V0KCkpLmltcGwoKSk7Ci0gICAgICAgIEFTU0VSVChvbGRMZW4gPj0gc2VsZWN0
aW9uTGVuKTsKLSAgICAgICAgaW50IG1heE5ld0xlbiA9IG1heExlbmd0aCgpIC0gKG9sZExlbiAt
IHNlbGVjdGlvbkxlbik7Ci0KLSAgICAgICAgLy8gVHJ1bmNhdGUgdGhlIGluc2VydGVkIHRleHQg
dG8gYXZvaWQgdmlvbGF0aW5nIHRoZSBtYXhMZW5ndGggYW5kIG90aGVyIGNvbnN0cmFpbnRzLgot
ICAgICAgICBCZWZvcmVUZXh0SW5zZXJ0ZWRFdmVudCogdGV4dEV2ZW50ID0gc3RhdGljX2Nhc3Q8
QmVmb3JlVGV4dEluc2VydGVkRXZlbnQqPihldnQpOwotICAgICAgICB0ZXh0RXZlbnQtPnNldFRl
eHQoY29uc3RyYWluVmFsdWUodGV4dEV2ZW50LT50ZXh0KCksIG1heE5ld0xlbikpOwotICAgIH0K
KyAgICBpZiAoZXZ0LT5pc0JlZm9yZVRleHRJbnNlcnRlZEV2ZW50KCkpCisgICAgICAgIElucHV0
RWxlbWVudDo6aGFuZGxlQmVmb3JlVGV4dEluc2VydGVkRXZlbnQobV9kYXRhLCBkb2N1bWVudCgp
LCBldnQpOwogCiAgICAgaWYgKGlzVGV4dEZpZWxkKCkgJiYgcmVuZGVyZXIoKSAmJiAoZXZ0LT5p
c01vdXNlRXZlbnQoKSB8fCBldnQtPmlzRHJhZ0V2ZW50KCkgfHwgZXZ0LT5pc1doZWVsRXZlbnQo
KSB8fCBldnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkuYmx1ckV2ZW50IHx8IGV2dC0+dHlwZSgp
ID09IGV2ZW50TmFtZXMoKS5mb2N1c0V2ZW50KSkKICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lKj4ocmVuZGVyZXIoKSktPmZvcndhcmRFdmVudChldnQpOwpA
QCAtMTQ2OCw2ICsxMzY2LDExIEBAIHZvaWQgSFRNTElucHV0RWxlbWVudDo6c2V0RGVmYXVsdENo
ZWNrZWQKICAgICBzZXRBdHRyaWJ1dGUoY2hlY2tlZEF0dHIsIGRlZmF1bHRDaGVja2VkID8gIiIg
OiAwKTsKIH0KIAordm9pZCBIVE1MSW5wdXRFbGVtZW50OjpzZXREZWZhdWx0TmFtZShjb25zdCBB
dG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAgbV9kYXRhLnNldE5hbWUobmFtZSk7Cit9CisKIFN0
cmluZyBIVE1MSW5wdXRFbGVtZW50OjphY2NlcHQoKSBjb25zdAogewogICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoYWNjZXB0QXR0cik7CkBAIC0xNTA4LDYgKzE0MTEsMTEgQEAgdm9pZCBIVE1MSW5w
dXRFbGVtZW50OjpzZXRBbHQoY29uc3QgU3RyaQogICAgIHNldEF0dHJpYnV0ZShhbHRBdHRyLCB2
YWx1ZSk7CiB9CiAKK2ludCBIVE1MSW5wdXRFbGVtZW50OjptYXhMZW5ndGgoKSBjb25zdAorewor
ICAgIHJldHVybiBtX2RhdGEubWF4TGVuZ3RoKCk7Cit9CisKIHZvaWQgSFRNTElucHV0RWxlbWVu
dDo6c2V0TWF4TGVuZ3RoKGludCBfbWF4TGVuZ3RoKQogewogICAgIHNldEF0dHJpYnV0ZShtYXhs
ZW5ndGhBdHRyLCBTdHJpbmc6Om51bWJlcihfbWF4TGVuZ3RoKSk7CkBAIC0xNTU2LDE1ICsxNDY0
LDcgQEAgRmlsZUxpc3QqIEhUTUxJbnB1dEVsZW1lbnQ6OmZpbGVzKCkKIAogU3RyaW5nIEhUTUxJ
bnB1dEVsZW1lbnQ6OmNvbnN0cmFpblZhbHVlKGNvbnN0IFN0cmluZyYgcHJvcG9zZWRWYWx1ZSkg
Y29uc3QKIHsKLSAgICByZXR1cm4gY29uc3RyYWluVmFsdWUocHJvcG9zZWRWYWx1ZSwgbV9tYXhM
ZW4pOwotfQotCi12b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnJlY2hlY2tWYWx1ZSgpCi17Ci0gICAg
U3RyaW5nIG9sZFZhbHVlID0gdmFsdWUoKTsKLSAgICBTdHJpbmcgbmV3VmFsdWUgPSBjb25zdHJh
aW5WYWx1ZShvbGRWYWx1ZSk7Ci0gICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKQotICAgICAg
ICBzZXRWYWx1ZShuZXdWYWx1ZSk7CisgICAgcmV0dXJuIElucHV0RWxlbWVudDo6Y29uc3RyYWlu
VmFsdWUobV9kYXRhLCBwcm9wb3NlZFZhbHVlLCBtX2RhdGEubWF4TGVuZ3RoKCkpOwogfQogCiBi
b29sIEhUTUxJbnB1dEVsZW1lbnQ6Om5lZWRzQWN0aXZhdGlvbkNhbGxiYWNrKCkKQEAgLTE1ODQs
NDAgKzE0ODQsMTAgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50Ojp1bnJlZ2lzdGVyRm9yQWN0aQog
ICAgICAgICBkb2N1bWVudCgpLT51bnJlZ2lzdGVyRm9yRG9jdW1lbnRBY3RpdmF0aW9uQ2FsbGJh
Y2tzKHRoaXMpOwogfQogCi12b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnVwZGF0ZVBsYWNlaG9sZGVy
VmlzaWJpbGl0eShib29sIHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2VkKQordm9pZCBIVE1MSW5wdXRF
bGVtZW50OjpjYWNoZVNlbGVjdGlvbihpbnQgc3RhcnQsIGludCBlbmQpCiB7Ci0gICAgQVNTRVJU
KGlzVGV4dEZpZWxkKCkpOwotCi0gICAgYm9vbCBvbGRQbGFjZWhvbGRlclNob3VsZEJlVmlzaWJs
ZSA9IG1fcGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGU7Ci0KLSAgICBtX3BsYWNlaG9sZGVyU2hv
dWxkQmVWaXNpYmxlID0gdmFsdWUoKS5pc0VtcHR5KCkgCi0gICAgICAgICYmIGRvY3VtZW50KCkt
PmZvY3VzZWROb2RlKCkgIT0gdGhpcwotICAgICAgICAmJiAhZ2V0QXR0cmlidXRlKHBsYWNlaG9s
ZGVyQXR0cikuaXNFbXB0eSgpOwotCi0gICAgaWYgKChvbGRQbGFjZWhvbGRlclNob3VsZEJlVmlz
aWJsZSAhPSBtX3BsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlIHx8IHBsYWNlaG9sZGVyVmFsdWVD
aGFuZ2VkKSAmJiByZW5kZXJlcigpKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmUqPihyZW5kZXJlcigpKS0+dXBkYXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5
KCk7Ci19Ci0KLVN0cmluZyBIVE1MSW5wdXRFbGVtZW50Ojpjb25zdHJhaW5WYWx1ZShjb25zdCBT
dHJpbmcmIHByb3Bvc2VkVmFsdWUsIGludCBtYXhMZW4pIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHN0
cmluZyA9IHByb3Bvc2VkVmFsdWU7Ci0gICAgaWYgKGlzVGV4dEZpZWxkKCkpIHsKLSAgICAgICAg
c3RyaW5nLnJlcGxhY2UoIlxyXG4iLCAiICIpOwotICAgICAgICBzdHJpbmcucmVwbGFjZSgnXHIn
LCAnICcpOwotICAgICAgICBzdHJpbmcucmVwbGFjZSgnXG4nLCAnICcpOwotICAgICAgICBTdHJp
bmdJbXBsKiBzID0gc3RyaW5nLmltcGwoKTsKLSAgICAgICAgaW50IG5ld0xlbiA9IG51bUNoYXJh
Y3RlcnNJbkdyYXBoZW1lQ2x1c3RlcnMocywgbWF4TGVuKTsKLSAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBuZXdMZW47ICsraSkgewotICAgICAgICAgICAgY29uc3QgVUNoYXIgY3VycmVudCA9
ICgqcylbaV07Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA8ICcgJyAmJiBjdXJyZW50ICE9ICdc
dCcpIHsKLSAgICAgICAgICAgICAgICBuZXdMZW4gPSBpOwotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXdMZW4gPCBzdGF0aWNf
Y2FzdDxpbnQ+KHN0cmluZy5sZW5ndGgoKSkpCi0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1
YnN0cmluZygwLCBuZXdMZW4pOwotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nOworICAgIG1fZGF0
YS5zZXRDYWNoZWRTZWxlY3Rpb25TdGFydChzdGFydCk7CisgICAgbV9kYXRhLnNldENhY2hlZFNl
bGVjdGlvbkVuZChlbmQpOwogfQogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OmFkZFNlYXJjaFJl
c3VsdCgpCkBAIC0xNjM3LDkgKzE1MDcsOSBAQCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6Om9uU2Vh
cmNoKCkKIAogU2VsZWN0aW9uIEhUTUxJbnB1dEVsZW1lbnQ6OnNlbGVjdGlvbigpIGNvbnN0CiB7
Ci0gICBpZiAoIXJlbmRlcmVyKCkgfHwgIWlzVGV4dEZpZWxkKCkgfHwgY2FjaGVkU2VsU3RhcnQg
PT0gLTEgfHwgY2FjaGVkU2VsRW5kID09IC0xKQorICAgaWYgKCFyZW5kZXJlcigpIHx8ICFpc1Rl
eHRGaWVsZCgpIHx8IG1fZGF0YS5jYWNoZWRTZWxlY3Rpb25TdGFydCgpID09IC0xIHx8IG1fZGF0
YS5jYWNoZWRTZWxlY3Rpb25FbmQoKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbigp
OwotICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250cm9sKj4ocmVuZGVyZXIoKSkt
PnNlbGVjdGlvbihjYWNoZWRTZWxTdGFydCwgY2FjaGVkU2VsRW5kKTsKKyAgIHJldHVybiBzdGF0
aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+KHJlbmRlcmVyKCkpLT5zZWxlY3Rpb24obV9kYXRh
LmNhY2hlZFNlbGVjdGlvblN0YXJ0KCksIG1fZGF0YS5jYWNoZWRTZWxlY3Rpb25FbmQoKSk7CiB9
CiAKIHZvaWQgSFRNTElucHV0RWxlbWVudDo6ZG9jdW1lbnREaWRCZWNvbWVBY3RpdmUoKQpAQCAt
MTY3OSw0ICsxNTQ5LDEwIEBAIGJvb2wgSFRNTElucHV0RWxlbWVudDo6d2lsbFZhbGlkYXRlKCkg
Y28KICAgICByZXR1cm4gSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6d2lsbFZhbGlk
YXRlKCkgJiYgaW5wdXRUeXBlKCkgIT0gSElEREVOICYmCiAgICAgICAgICAgIGlucHV0VHlwZSgp
ICE9IEJVVFRPTiAmJiBpbnB1dFR5cGUoKSAhPSBSRVNFVDsKIH0KKworYm9vbCBIVE1MSW5wdXRF
bGVtZW50OjpwbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fZGF0YS5wbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpOworfQorCiB9IC8vIG5hbWVzcGFj
ZQpJbmRleDogaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1M
SW5wdXRFbGVtZW50LmgJKHJldmlzaW9uIDQwMDYzKQorKysgaHRtbC9IVE1MSW5wdXRFbGVtZW50
LmgJKHdvcmtpbmcgY29weSkKQEAgLTI1LDYgKzI1LDcgQEAKICNkZWZpbmUgSFRNTElucHV0RWxl
bWVudF9oCiAKICNpbmNsdWRlICJIVE1MRm9ybUNvbnRyb2xFbGVtZW50LmgiCisjaW5jbHVkZSAi
SW5wdXRFbGVtZW50LmgiCiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CkBAIC0zNCw3ICszNSw3IEBAIGNsYXNzIEhUTUxJbWFnZUxvYWRlcjsKIGNsYXNzIEtV
Ukw7CiBjbGFzcyBTZWxlY3Rpb247CiAKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnQgOiBwdWJsaWMg
SFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZSB7CitjbGFzcyBIVE1MSW5wdXRFbGVtZW50
IDogcHVibGljIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUsIHB1YmxpYyBJbnB1dEVs
ZW1lbnQgewogcHVibGljOgogICAgIGVudW0gSW5wdXRUeXBlIHsKICAgICAgICAgVEVYVCwKQEAg
LTc0LDcgKzc1LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBzaG91bGRVc2VJbnB1dE1l
dGhvZCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBj
b25zdDsKLQorIAogICAgIGJvb2wgYXV0b0NvbXBsZXRlKCkgY29uc3Q7CiAKICAgICAvLyBpc0No
ZWNrZWQgaXMgdXNlZCBieSB0aGUgcmVuZGVyaW5nIHRyZWUvQ1NTIHdoaWxlIGNoZWNrZWQoKSBp
cyB1c2VkIGJ5IEpTIHRvIGRldGVybWluZSBjaGVja2VkIHN0YXRlCkBAIC04Nyw4ICs4OCw4IEBA
IHB1YmxpYzoKIAogICAgIGJvb2wgaXNUZXh0QnV0dG9uKCkgY29uc3QgeyByZXR1cm4gbV90eXBl
ID09IFNVQk1JVCB8fCBtX3R5cGUgPT0gUkVTRVQgfHwgbV90eXBlID09IEJVVFRPTjsgfQogICAg
IHZpcnR1YWwgYm9vbCBpc1JhZGlvQnV0dG9uKCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IFJB
RElPOyB9Ci0gICAgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBU
RVhUIHx8IG1fdHlwZSA9PSBQQVNTV09SRCB8fCBtX3R5cGUgPT0gU0VBUkNIIHx8IG1fdHlwZSA9
PSBJU0lOREVYOyB9Ci0gICAgYm9vbCBpc1NlYXJjaEZpZWxkKCkgY29uc3QgeyByZXR1cm4gbV90
eXBlID09IFNFQVJDSDsgfQorICAgIHZpcnR1YWwgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsg
cmV0dXJuIG1fdHlwZSA9PSBURVhUIHx8IG1fdHlwZSA9PSBQQVNTV09SRCB8fCBtX3R5cGUgPT0g
U0VBUkNIIHx8IG1fdHlwZSA9PSBJU0lOREVYOyB9CisgICAgdmlydHVhbCBib29sIGlzU2VhcmNo
RmllbGQoKSBjb25zdCB7IHJldHVybiBtX3R5cGUgPT0gU0VBUkNIOyB9CiAgICAgdmlydHVhbCBi
b29sIGlzSW5wdXRUeXBlSGlkZGVuKCkgY29uc3QgeyByZXR1cm4gbV90eXBlID09IEhJRERFTjsg
fQogICAgIHZpcnR1YWwgYm9vbCBpc1Bhc3N3b3JkRmllbGQoKSBjb25zdCB7IHJldHVybiBtX3R5
cGUgPT0gUEFTU1dPUkQ7IH0KIApAQCAtOTYsMTcgKzk3LDE5IEBAIHB1YmxpYzoKICAgICB2b2lk
IHNldENoZWNrZWQoYm9vbCwgYm9vbCBzZW5kQ2hhbmdlRXZlbnQgPSBmYWxzZSk7CiAgICAgYm9v
bCBpbmRldGVybWluYXRlKCkgY29uc3QgeyByZXR1cm4gbV9pbmRldGVybWluYXRlOyB9CiAgICAg
dm9pZCBzZXRJbmRldGVybWluYXRlKGJvb2wpOwotICAgIGludCBtYXhMZW5ndGgoKSBjb25zdCB7
IHJldHVybiBtX21heExlbjsgfQotICAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXpl
OyB9CisgICAgdmlydHVhbCBpbnQgc2l6ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgQXRv
bWljU3RyaW5nJiB0eXBlKCkgY29uc3Q7CiAgICAgdm9pZCBzZXRUeXBlKGNvbnN0IFN0cmluZyYp
OwogCi0gICAgU3RyaW5nIHZhbHVlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBT
dHJpbmcmKTsKKyAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIGNvbnN0OworICAgIHZpcnR1YWwg
dm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmKTsKKworICAgIHZpcnR1YWwgU3RyaW5nIHBsYWNl
aG9sZGVyVmFsdWUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgc2VhcmNoRXZlbnRzU2hvdWxk
QmVEaXNwYXRjaGVkKCkgY29uc3Q7CiAKICAgICBTdHJpbmcgdmFsdWVXaXRoRGVmYXVsdCgpIGNv
bnN0OwogCi0gICAgdm9pZCBzZXRWYWx1ZUZyb21SZW5kZXJlcihjb25zdCBTdHJpbmcmKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0VmFsdWVGcm9tUmVuZGVyZXIoY29uc3QgU3RyaW5nJik7CiAgICAg
dm9pZCBzZXRGaWxlTGlzdEZyb21SZW5kZXJlcihjb25zdCBWZWN0b3I8U3RyaW5nPiYpOwogCiAg
ICAgdmlydHVhbCBib29sIHNhdmVTdGF0ZShTdHJpbmcmIHZhbHVlKSBjb25zdDsKQEAgLTExOSw3
ICsxMjIsNyBAQCBwdWJsaWM6CiAgICAgaW50IHNlbGVjdGlvbkVuZCgpIGNvbnN0OwogICAgIHZv
aWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKICAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQp
OwotICAgIHZvaWQgc2VsZWN0KCk7CisgICAgdmlydHVhbCB2b2lkIHNlbGVjdCgpOwogICAgIHZv
aWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKTsKIAogICAgIHZpcnR1YWwg
dm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KTsKQEAgLTE2Myw2ICsx
NjYsOCBAQCBwdWJsaWM6CiAgICAgYm9vbCBkZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwogICAgIHZv
aWQgc2V0RGVmYXVsdENoZWNrZWQoYm9vbCk7CiAKKyAgICB2b2lkIHNldERlZmF1bHROYW1lKGNv
bnN0IEF0b21pY1N0cmluZyYpOworCiAgICAgU3RyaW5nIGFjY2VwdCgpIGNvbnN0OwogICAgIHZv
aWQgc2V0QWNjZXB0KGNvbnN0IFN0cmluZyYpOwogCkBAIC0xODAsMjMgKzE4NSwyNCBAQCBwdWJs
aWM6CiAgICAgS1VSTCBzcmMoKSBjb25zdDsKICAgICB2b2lkIHNldFNyYyhjb25zdCBTdHJpbmcm
KTsKIAorICAgIGludCBtYXhMZW5ndGgoKSBjb25zdDsKICAgICB2b2lkIHNldE1heExlbmd0aChp
bnQpOwogCiAgICAgU3RyaW5nIHVzZU1hcCgpIGNvbnN0OwogICAgIHZvaWQgc2V0VXNlTWFwKGNv
bnN0IFN0cmluZyYpOwogCi0gICAgdmlydHVhbCBib29sIGlzQXV0b2ZpbGxlZCgpIGNvbnN0IHsg
cmV0dXJuIG1fYXV0b2ZpbGxlZDsgfQotICAgIHZvaWQgc2V0QXV0b2ZpbGxlZChib29sIGIgPSB0
cnVlKTsKKyAgICBib29sIGlzQXV0b2ZpbGxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYXV0b2ZpbGxl
ZDsgfQorICAgIHZvaWQgc2V0QXV0b2ZpbGxlZChib29sIHZhbHVlID0gdHJ1ZSk7CiAKICAgICBG
aWxlTGlzdCogZmlsZXMoKTsKIAotICAgIHZvaWQgY2FjaGVTZWxlY3Rpb24oaW50IHMsIGludCBl
KSB7IGNhY2hlZFNlbFN0YXJ0ID0gczsgY2FjaGVkU2VsRW5kID0gZTsgfTsKKyAgICB2aXJ0dWFs
IHZvaWQgY2FjaGVTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKTsKICAgICB2b2lkIGFkZFNl
YXJjaFJlc3VsdCgpOwogICAgIHZvaWQgb25TZWFyY2goKTsKLSAgICAKKwogICAgIFNlbGVjdGlv
biBzZWxlY3Rpb24oKSBjb25zdDsKIAotICAgIFN0cmluZyBjb25zdHJhaW5WYWx1ZShjb25zdCBT
dHJpbmcmIHByb3Bvc2VkVmFsdWUpIGNvbnN0OworICAgIHZpcnR1YWwgU3RyaW5nIGNvbnN0cmFp
blZhbHVlKGNvbnN0IFN0cmluZyYgcHJvcG9zZWRWYWx1ZSkgY29uc3Q7CiAKICAgICB2aXJ0dWFs
IHZvaWQgZG9jdW1lbnREaWRCZWNvbWVBY3RpdmUoKTsKIApAQCAtMjA0LDM5ICsyMTAsMjUgQEAg
cHVibGljOgogICAgIAogICAgIHZpcnR1YWwgYm9vbCB3aWxsVmFsaWRhdGUoKSBjb25zdDsKIAot
ICAgIGJvb2wgcGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3Bs
YWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlOyB9CisgICAgdmlydHVhbCBib29sIHBsYWNlaG9sZGVy
U2hvdWxkQmVWaXNpYmxlKCkgY29uc3Q7CiAgICAgCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB2
b2lkIHdpbGxNb3ZlVG9OZXdPd25lckRvY3VtZW50KCk7CiAgICAgdmlydHVhbCB2b2lkIGRpZE1v
dmVUb05ld093bmVyRG9jdW1lbnQoKTsKLSAgICAKLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwog
CiBwcml2YXRlOgotICAgIHZvaWQgaW5pdCgpOwogICAgIGJvb2wgc3RvcmVzVmFsdWVTZXBhcmF0
ZUZyb21BdHRyaWJ1dGUoKSBjb25zdDsKLSAgICBTdHJpbmcgY29uc3RyYWluVmFsdWUoY29uc3Qg
U3RyaW5nJiBwcm9wb3NlZFZhbHVlLCBpbnQgbWF4TGVuKSBjb25zdDsKLSAgICB2b2lkIHJlY2hl
Y2tWYWx1ZSgpOwotICAgIAorCiAgICAgYm9vbCBuZWVkc0FjdGl2YXRpb25DYWxsYmFjaygpOwog
ICAgIHZvaWQgcmVnaXN0ZXJGb3JBY3RpdmF0aW9uQ2FsbGJhY2tJZk5lZWRlZCgpOwogICAgIHZv
aWQgdW5yZWdpc3RlckZvckFjdGl2YXRpb25DYWxsYmFja0lmTmVlZGVkKCk7CiAKLSAgICB2b2lk
IHVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eShib29sIHBsYWNlaG9sZGVyVmFsdWVDaGFuZ2Vk
ID0gZmFsc2UpOwotICAgIAotICAgIFN0cmluZyBtX3ZhbHVlOwotICAgIFN0cmluZyBtX29yaWdp
bmFsVmFsdWU7Ci0gICAgaW50IHhQb3M7Ci0gICAgaW50IHlQb3M7Ci0gICAgaW50IG1fbWF4TGVu
OwotICAgIGludCBtX3NpemU7Ci0KKyAgICBJbnB1dEVsZW1lbnREYXRhIG1fZGF0YTsKKyAgICBp
bnQgbV94UG9zOworICAgIGludCBtX3lQb3M7CiAgICAgc2hvcnQgbV9tYXhSZXN1bHRzOwotCiAg
ICAgT3duUHRyPEhUTUxJbWFnZUxvYWRlcj4gbV9pbWFnZUxvYWRlcjsKLQogICAgIFJlZlB0cjxG
aWxlTGlzdD4gbV9maWxlTGlzdDsKLQogICAgIHVuc2lnbmVkIG1fdHlwZSA6IDQ7IC8vIElucHV0
VHlwZSAKICAgICBib29sIG1fY2hlY2tlZCA6IDE7CiAgICAgYm9vbCBtX2RlZmF1bHRDaGVja2Vk
IDogMTsKQEAgLTI0NywxMCArMjM5LDYgQEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBtX2F1dG9j
b21wbGV0ZSA6IDI7IC8vIEF1dG9Db21wbGV0ZVNldHRpbmcKICAgICBib29sIG1fYXV0b2ZpbGxl
ZCA6IDE7CiAgICAgYm9vbCBtX2luaXRlZCA6IDE7Ci0gICAgYm9vbCBtX3BsYWNlaG9sZGVyU2hv
dWxkQmVWaXNpYmxlIDogMTsKLSAgICAKLSAgICBpbnQgY2FjaGVkU2VsU3RhcnQ7Ci0gICAgaW50
IGNhY2hlZFNlbEVuZDsKIH07CiAKIH0gLy9uYW1lc3BhY2UKSW5kZXg6IGh0bWwvSFRNTElzSW5k
ZXhFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxJc0luZGV4RWxlbWVudC5jcHAJ
KHJldmlzaW9uIDQwMDYzKQorKysgaHRtbC9IVE1MSXNJbmRleEVsZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNCw3ICszNCw3IEBAIEhUTUxJc0luZGV4RWxlbWVudDo6SFRNTElzSW5kZXhF
bGVtZW50KGMKICAgICA6IEhUTUxJbnB1dEVsZW1lbnQodGFnTmFtZSwgZG9jLCBmKQogewogICAg
IEFTU0VSVChoYXNUYWdOYW1lKGlzaW5kZXhUYWcpKTsKLSAgICBtX25hbWUgPSAiaXNpbmRleCI7
CisgICAgc2V0RGVmYXVsdE5hbWUoaXNpbmRleFRhZy5sb2NhbE5hbWUoKSk7CiB9CiAKIHZvaWQg
SFRNTElzSW5kZXhFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUq
IGF0dHIpCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5jcHAJKHJldmlzaW9uIDQwMDYzKQorKysg
cmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTc1LDEx
ICs1NzUsNyBAQCBIVE1MRWxlbWVudCogUmVuZGVyVGV4dENvbnRyb2w6OmlubmVyVGV4CiAKIEZv
cm1Db250cm9sRWxlbWVudCogUmVuZGVyVGV4dENvbnRyb2w6OmZvcm1Db250cm9sRWxlbWVudCgp
IGNvbnN0CiB7Ci0gICAgaWYgKG5vZGUoKS0+aXNIVE1MRWxlbWVudCgpKQotICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1Db250cm9sRWxlbWVudCo+KG5vZGUoKSk7Ci0KLSAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZm9ybUNvbnRy
b2xFbGVtZW50Rm9yRWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiB9CiAK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmUuY3BwCShyZXZpc2lvbiA0MDA2MykKKysrIHJlbmRlcmluZy9SZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAj
aW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIK
ICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJJbnB1dEVsZW1lbnQuaCIKICNpbmNs
dWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgiCiAjaW5jbHVkZSAiTW91c2VFdmVudC5oIgogI2luY2x1
ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgpAQCAtNjksNyArNzAsNyBAQCBSZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmU6On5SZW5kZXJUZXh0CiAKIGJvb2wgUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjpwbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpIGNvbnN0CiB7Ci0gICAgcmV0
dXJuIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5wbGFjZWhvbGRlclNo
b3VsZEJlVmlzaWJsZSgpOworICAgIHJldHVybiBpbnB1dEVsZW1lbnQoKS0+cGxhY2Vob2xkZXJT
aG91bGRCZVZpc2libGUoKTsKIH0KIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSgpCkBAIC05MCw2ICs5MSw3IEBAIHZvaWQgUmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjp1cGRhdGUKIAogdm9pZCBSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OmFkZFNlYXJjaFJlc3VsdCgpCiB7CisgICAgQVNTRVJUKG5vZGUoKS0+aXNI
VE1MRWxlbWVudCgpKTsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0
PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpOwogICAgIGlmIChpbnB1dC0+bWF4UmVzdWx0cygp
IDw9IDApCiAgICAgICAgIHJldHVybjsKQEAgLTEyMSwxMSArMTIzLDEzIEBAIHZvaWQgUmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjphZGRTZWEKIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmU6OnN0b3BTZWFyY2hFdmVudFRpbWVyKCkKIHsKKyAgICBBU1NFUlQobm9kZSgpLT5p
c0hUTUxFbGVtZW50KCkpOwogICAgIG1fc2VhcmNoRXZlbnRUaW1lci5zdG9wKCk7CiB9CiAKIHZv
aWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzaG93UG9wdXAoKQogeworICAgIEFTU0VS
VChub2RlKCktPmlzSFRNTEVsZW1lbnQoKSk7CiAgICAgaWYgKG1fc2VhcmNoUG9wdXBJc1Zpc2li
bGUpCiAgICAgICAgIHJldHVybjsKIApAQCAtMTU1LDYgKzE1OSw3IEBAIHZvaWQgUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lOjpzaG93UG8KIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6OmhpZGVQb3B1cCgpCiB7CisgICAgQVNTRVJUKG5vZGUoKS0+aXNIVE1MRWxlbWVudCgp
KTsKICAgICBpZiAobV9zZWFyY2hQb3B1cCkKICAgICAgICAgbV9zZWFyY2hQb3B1cC0+aGlkZSgp
OwogCkBAIC0xNjYsMjQgKzE3MSwyNCBAQCB2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGlu
ZTo6c3VidHJlCiAgICAgYm9vbCB3YXNFZGl0ZWQgPSBpc0VkaXRlZCgpOwogICAgIFJlbmRlclRl
eHRDb250cm9sOjpzdWJ0cmVlSGFzQ2hhbmdlZCgpOwogCi0gICAgSFRNTElucHV0RWxlbWVudCog
aW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBJbnB1
dEVsZW1lbnQqIGlucHV0ID0gaW5wdXRFbGVtZW50KCk7CiAgICAgaW5wdXQtPnNldFZhbHVlRnJv
bVJlbmRlcmVyKGlucHV0LT5jb25zdHJhaW5WYWx1ZSh0ZXh0KCkpKTsKIAogICAgIGlmIChSZW5k
ZXJPYmplY3QqIGNhbmNlbEJ1dHRvblJlbmRlcmVyID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNl
bEJ1dHRvbi0+cmVuZGVyZXIoKSA6IDApCiAgICAgICAgIHVwZGF0ZUNhbmNlbEJ1dHRvblZpc2li
aWxpdHkoY2FuY2VsQnV0dG9uUmVuZGVyZXItPnN0eWxlKCkpOwogCiAgICAgLy8gSWYgdGhlIGlu
Y3JlbWVudGFsIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZW4gZGlzcGF0Y2ggdGhlIHNlYXJjaCBldmVu
dAotICAgIGlmICghaW5wdXQtPmdldEF0dHJpYnV0ZShpbmNyZW1lbnRhbEF0dHIpLmlzTnVsbCgp
KQorICAgIGlmIChpbnB1dC0+c2VhcmNoRXZlbnRzU2hvdWxkQmVEaXNwYXRjaGVkKCkpCiAgICAg
ICAgIHN0YXJ0U2VhcmNoRXZlbnRUaW1lcigpOwogCi0gICAgaWYgKCF3YXNFZGl0ZWQgJiYgaW5w
dXQtPmZvY3VzZWQoKSkgeworICAgIGlmICghd2FzRWRpdGVkICYmIG5vZGUoKS0+Zm9jdXNlZCgp
KSB7CiAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAg
ICAgICAgICAgZnJhbWUtPnRleHRGaWVsZERpZEJlZ2luRWRpdGluZyhpbnB1dCk7CisgICAgICAg
ICAgICBmcmFtZS0+dGV4dEZpZWxkRGlkQmVnaW5FZGl0aW5nKHN0YXRpY19jYXN0PEVsZW1lbnQq
Pihub2RlKCkpKTsKICAgICB9CiAKLSAgICBpZiAoaW5wdXQtPmZvY3VzZWQoKSkgeworICAgIGlm
IChub2RlKCktPmZvY3VzZWQoKSkgewogICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1l
bnQoKS0+ZnJhbWUoKSkKLSAgICAgICAgICAgIGZyYW1lLT50ZXh0RGlkQ2hhbmdlSW5UZXh0Rmll
bGQoaW5wdXQpOworICAgICAgICAgICAgZnJhbWUtPnRleHREaWRDaGFuZ2VJblRleHRGaWVsZChz
dGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgfQogfQogCkBAIC0zNTksNyArMzY0
LDcgQEAgdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNhcHNMbwogICAgIGJvb2wg
c2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yID0gZmFsc2U7CiAKICAgICBpZiAoRnJhbWUqIGZy
YW1lID0gZG9jdW1lbnQoKS0+ZnJhbWUoKSkKLSAgICAgICAgc2hvdWxkRHJhd0NhcHNMb2NrSW5k
aWNhdG9yID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmlucHV0VHlw
ZSgpID09IEhUTUxJbnB1dEVsZW1lbnQ6OlBBU1NXT1JECisgICAgICAgIHNob3VsZERyYXdDYXBz
TG9ja0luZGljYXRvciA9IGlucHV0RWxlbWVudCgpLT5pc1Bhc3N3b3JkRmllbGQoKQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmcmFtZS0+c2VsZWN0aW9uKCktPmlz
Rm9jdXNlZEFuZEFjdGl2ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICYmIGRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkgPT0gbm9kZSgpCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICYmIFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6Y3VycmVudENh
cHNMb2NrU3RhdGUoKTsKQEAgLTM4OSw3ICszOTQsNyBAQCBpbnQgUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjp0ZXh0QmxvCiAKIGludCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnBy
ZWZlcnJlZENvbnRlbnRXaWR0aChmbG9hdCBjaGFyV2lkdGgpIGNvbnN0CiB7Ci0gICAgaW50IGZh
Y3RvciA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zaXplKCk7Cisg
ICAgaW50IGZhY3RvciA9IGlucHV0RWxlbWVudCgpLT5zaXplKCk7CiAgICAgaWYgKGZhY3RvciA8
PSAwKQogICAgICAgICBmYWN0b3IgPSAyMDsKIApAQCAtNDMxLDcgKzQzNiw3IEBAIHZvaWQgUmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjphZGp1c3QKIAogdm9pZCBSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OmNyZWF0ZVN1YnRyZWVJZk5lZWRlZCgpCiB7Ci0gICAgaWYgKCFzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+aXNTZWFyY2hGaWVsZCgpKSB7CisgICAg
aWYgKCFpbnB1dEVsZW1lbnQoKS0+aXNTZWFyY2hGaWVsZCgpKSB7CiAgICAgICAgIFJlbmRlclRl
eHRDb250cm9sOjpjcmVhdGVTdWJ0cmVlSWZOZWVkZWQobV9pbm5lckJsb2NrLmdldCgpKTsKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQ2OSwxNCArNDc0LDEyIEBAIHZvaWQgUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lOjp1cGRhdGUKICAgICBpZiAoUmVuZGVyT2JqZWN0KiBjYW5jZWxC
dXR0b25SZW5kZXJlciA9IG1fY2FuY2VsQnV0dG9uID8gbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVy
KCkgOiAwKQogICAgICAgICB1cGRhdGVDYW5jZWxCdXR0b25WaXNpYmlsaXR5KGNhbmNlbEJ1dHRv
blJlbmRlcmVyLT5zdHlsZSgpKTsKIAotICAgIEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQgPSBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKLQogICAgIGlmIChtX3BsYWNl
aG9sZGVyVmlzaWJsZSkgewogICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAg
aW5uZXJUZXh0RWxlbWVudCgpLT5zZXRJbm5lclRleHQoZWxlbWVudC0+Z2V0QXR0cmlidXRlKHBs
YWNlaG9sZGVyQXR0ciksIGVjKTsKLSAgICAgICAgQVNTRVJUKGVjID09IDApOworICAgICAgICBp
bm5lclRleHRFbGVtZW50KCktPnNldElubmVyVGV4dChpbnB1dEVsZW1lbnQoKS0+cGxhY2Vob2xk
ZXJWYWx1ZSgpLCBlYyk7CisgICAgICAgIEFTU0VSVCghZWMpOwogICAgIH0gZWxzZSBpZiAoIWZv
cm1Db250cm9sRWxlbWVudCgpLT52YWx1ZU1hdGNoZXNSZW5kZXJlcigpIHx8IHBsYWNlaG9sZGVy
VmlzaWJpbGl0eVNob3VsZENoYW5nZSkKLSAgICAgICAgc2V0SW5uZXJUZXh0VmFsdWUoZWxlbWVu
dC0+dmFsdWUoKSk7CisgICAgICAgIHNldElubmVyVGV4dFZhbHVlKGlucHV0RWxlbWVudCgpLT52
YWx1ZSgpKTsKIAogICAgIGlmIChtX3NlYXJjaFBvcHVwSXNWaXNpYmxlKQogICAgICAgICBtX3Nl
YXJjaFBvcHVwLT51cGRhdGVGcm9tRWxlbWVudCgpOwpAQCAtNDg0LDcgKzQ4Nyw3IEBAIHZvaWQg
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjp1cGRhdGUKIAogdm9pZCBSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmU6OmNhY2hlU2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCkKIHsKLSAg
ICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Y2FjaGVTZWxlY3Rpb24o
c3RhcnQsIGVuZCk7CisgICAgaW5wdXRFbGVtZW50KCktPmNhY2hlU2VsZWN0aW9uKHN0YXJ0LCBl
bmQpOwogfQogCiBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6OmNyZWF0ZUlubmVyVGV4dFN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxl
KSBjb25zdApAQCAtNTI3LDYgKzUzMCw4IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRl
clRleHRDb250cm8KIAogUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjpjcmVhdGVJbm5lckJsb2NrU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0
U3R5bGUpIGNvbnN0CiB7CisgICAgQVNTRVJUKG5vZGUoKS0+aXNIVE1MRWxlbWVudCgpKTsKKwog
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gaW5uZXJCbG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpOwogICAgIGlubmVyQmxvY2tTdHlsZS0+aW5oZXJpdEZyb20oc3RhcnRTdHlsZSk7CiAK
QEAgLTU0MSw2ICs1NDYsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0Q29u
dHJvCiAKIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGlu
ZTo6Y3JlYXRlUmVzdWx0c0J1dHRvblN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxl
KSBjb25zdAogeworICAgIEFTU0VSVChub2RlKCktPmlzSFRNTEVsZW1lbnQoKSk7CiAgICAgSFRN
TElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9k
ZSgpKTsKIAogICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcmVzdWx0c0Jsb2NrU3R5bGU7CkBAIC01
NjIsNiArNTY4LDcgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyVGV4dENvbnRybwog
CiBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNy
ZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25z
dAogeworICAgIEFTU0VSVChub2RlKCktPmlzSFRNTEVsZW1lbnQoKSk7CiAgICAgUmVmUHRyPFJl
bmRlclN0eWxlPiBjYW5jZWxCbG9ja1N0eWxlOwogICAgIAogICAgIGlmIChSZWZQdHI8UmVuZGVy
U3R5bGU+IHBzZXVkb1N0eWxlID0gZ2V0Q2FjaGVkUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OlNF
QVJDSF9DQU5DRUxfQlVUVE9OKSkKQEAgLTU3OSw2ICs1ODYsNyBAQCBQYXNzUmVmUHRyPFJlbmRl
clN0eWxlPiBSZW5kZXJUZXh0Q29udHJvCiAKIHZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVM
aW5lOjp1cGRhdGVDYW5jZWxCdXR0b25WaXNpYmlsaXR5KFJlbmRlclN0eWxlKiBzdHlsZSkgY29u
c3QKIHsKKyAgICBBU1NFUlQobm9kZSgpLT5pc0hUTUxFbGVtZW50KCkpOwogICAgIEhUTUxJbnB1
dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSk7
CiAgICAgc3R5bGUtPnNldFZpc2liaWxpdHkoaW5wdXQtPnZhbHVlKCkuaXNFbXB0eSgpID8gSElE
REVOIDogVklTSUJMRSk7CiB9CkBAIC01OTAsNiArNTk4LDcgQEAgY29uc3QgQXRvbWljU3RyaW5n
JiBSZW5kZXJUZXh0Q29udHJvbFNpbgogCiB2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGlu
ZTo6c3RhcnRTZWFyY2hFdmVudFRpbWVyKCkKIHsKKyAgICBBU1NFUlQobm9kZSgpLT5pc0hUTUxF
bGVtZW50KCkpOwogICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHQoKS5sZW5ndGgoKTsKIAogICAg
IC8vIElmIHRoZXJlJ3Mgbm8gdGV4dCwgZmlyZSB0aGUgZXZlbnQgcmlnaHQgYXdheS4KQEAgLTYw
NiwxMiArNjE1LDE0IEBAIHZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzdGFydFMK
IAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNlYXJjaEV2ZW50VGltZXJGaXJl
ZChUaW1lcjxSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU+KikKIHsKKyAgICBBU1NFUlQobm9k
ZSgpLT5pc0hUTUxFbGVtZW50KCkpOwogICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
Pihub2RlKCkpLT5vblNlYXJjaCgpOwogfQogCiAvLyBQb3B1cE1lbnVDbGllbnQgbWV0aG9kcwog
dm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBs
aXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50cykKIHsKKyAgICBBU1NFUlQobm9kZSgpLT5pc0hUTUxF
bGVtZW50KCkpOwogICAgIEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KGxpc3RJbmRleCkgPCBsaXN0
U2l6ZSgpKTsKICAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJ
bnB1dEVsZW1lbnQqPihub2RlKCkpOwogICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KGxpc3RJbmRl
eCkgPT0gKGxpc3RTaXplKCkgLSAxKSkgewpAQCAtNzMyLDYgKzc0Myw3IEBAIGJvb2wgUmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjppdGVtSXMKIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmU6OnNldFRleHRGcm9tSXRlbSh1bnNpZ25lZCBsaXN0SW5kZXgpCiB7CisgICAgQVNT
RVJUKG5vZGUoKS0+aXNIVE1MRWxlbWVudCgpKTsKICAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWUoaXRlbVRleHQobGlzdEluZGV4KSk7CiB9CiAKQEAg
LTc1Niw0ICs3NjgsOSBAQCBQYXNzUmVmUHRyPFNjcm9sbGJhcj4gUmVuZGVyVGV4dENvbnRyb2xT
CiAgICAgcmV0dXJuIHdpZGdldC5yZWxlYXNlKCk7CiB9CiAKK0lucHV0RWxlbWVudCogUmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjppbnB1dEVsZW1lbnQoKSBjb25zdAoreworICAgIHJldHVy
biBpbnB1dEVsZW1lbnRGb3JFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsK
K30KKwogfQpJbmRleDogcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuaAkocmV2
aXNpb24gNDAwNjMpCisrKyByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
CitjbGFzcyBJbnB1dEVsZW1lbnQ7CiBjbGFzcyBTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbkVsZW1l
bnQ7CiBjbGFzcyBTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25FbGVtZW50OwogY2xhc3MgU2VhcmNo
UG9wdXBNZW51OwpAQCAtMTA0LDYgKzEwNSw4IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCBIb3N0
V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7CiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPFNjcm9s
bGJhcj4gY3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCosIFNjcm9sbGJhck9yaWVudGF0
aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSk7CiAKKyAgICBJbnB1dEVsZW1lbnQqIGlucHV0RWxl
bWVudCgpIGNvbnN0OworCiBwcml2YXRlOgogICAgIGJvb2wgbV9wbGFjZWhvbGRlclZpc2libGU7
CiAgICAgYm9vbCBtX3NlYXJjaFBvcHVwSXNWaXNpYmxlOwo=
</data>
<flag name="review"
          id="12848"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
      

    </bug>

</bugzilla>