<?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>43936</bug_id>
          
          <creation_ts>2010-08-12 15:32:06 -0700</creation_ts>
          <short_desc>Group functions in markup.cpp into MarkupAccumulatorWrapper</short_desc>
          <delta_ts>2010-08-18 20:31:57 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>43834</dependson>
          <blocked>44229</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>darin</cc>
    
    <cc>enrica</cc>
    
    <cc>eric</cc>
    
    <cc>justin.garcia</cc>
    
    <cc>ojan</cc>
    
    <cc>tkent</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>264032</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-12 15:32:06 -0700</bug_when>
    <thetext>This is a cleanup bug to make functions in markup.cpp private member functions of MarkupAccumulator.  We should also rename MarkupAccumulatorWrapper to MarkupAccumulator since the original accumulator has been removed as of http://trac.webkit.org/changeset/65265.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264038</commentid>
    <comment_count>1</comment_count>
      <attachid>64273</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-12 15:39:43 -0700</bug_when>
    <thetext>Created attachment 64273
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266190</commentid>
    <comment_count>2</comment_count>
      <attachid>64723</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-18 10:10:23 -0700</bug_when>
    <thetext>Created attachment 64723
Removed unnecessary cleanups</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266243</commentid>
    <comment_count>3</comment_count>
      <attachid>64723</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-08-18 10:53:28 -0700</bug_when>
    <thetext>Comment on attachment 64723
Removed unnecessary cleanups

&gt; +    MarkupAccumulator(Vector&lt;Node*&gt;* nodes)
&gt; +    : m_nodes(nodes)
&gt; +    {
&gt; +    }

This does not have the correct formatting. The &quot;:&quot; line should be indented one tab stop.

&gt; +    void insertString(const String&amp; s);

You should omit the letter &quot;s&quot; here. It adds no value.

&gt; +    void appendAttributeValue(Vector&lt;UChar&gt;&amp; result, const String&amp; attr, bool escapeNBSP);

Please consider using the word &quot;attribute&quot; rather than &quot;attr&quot; for the name here.

&gt; +    String escapeContentText(const String&amp; in, bool escapeNBSP);

I don&apos;t think the word &quot;in&quot; here as an attribute value adds any clarity.

&gt; +    pair&lt;const UChar*, size_t&gt; ucharRange(const Node*, const Range *);

The name ucharRange is quite strange. It&apos;s also not our normal style to leave a space after Range before &quot;*&quot;.

&gt; +    void appendUCharRange(Vector&lt;UChar&gt;&amp; result, const pair&lt;const UChar*, size_t&gt; range);

Naming the vector &quot;result&quot; is a little strange since it&apos;s an in/out argument. The pair argument should probably be a const pair&amp; rather than just a const pair.

It might be better to have a typedef for the pair.

&gt; +    bool shouldAddNamespaceElem(const Element*);

Please don&apos;t abbreviate &quot;element&quot; as &quot;elem&quot; in the name of this. Also, why take a const Element* rather than an Element*? Since these classes are in a tree, it&apos;s rarely useful to use a const* rather than just a *.

&gt; +    bool shouldAddNamespaceAttr(const Attribute*, HashMap&lt;AtomicStringImpl*, AtomicStringImpl*&gt;&amp; namespaces);

Please don&apos;t abbreviate &quot;attribute&quot; as &quot;attr&quot; in the name of this. Same comment about const Element*.

It might be better to have a typedef for the map type.

&gt; +    void appendNamespace(Vector&lt;UChar&gt;&amp; result, const AtomicString&amp; prefix, const AtomicString&amp; ns, HashMap&lt;AtomicStringImpl*, AtomicStringImpl*&gt;&amp; namespaces);

Please don&apos;t abbreviate &quot;namespace&quot; to &quot;ns&quot;. But since you can&apos;t use &quot;namespace&quot; because it&apos;s a reserved word you probably need to say namespaceURI or something like that. Whatever QualifiedName.h uses.

&gt; +    void appendDocumentType(Vector&lt;UChar&gt;&amp; result, const DocumentType*);

Same comment about &quot;result&quot;.

&gt; +    void appendStartMarkup(Vector&lt;UChar&gt;&amp; result, const Node*, const Range*, EAnnotateForInterchange, EAbsoluteURLs, bool convertBlocksToInlines, HashMap&lt;AtomicStringImpl*, AtomicStringImpl*&gt;* namespaces, RangeFullySelectsNode);

Same comment abouve &quot;result&quot;.

&gt; +    bool shouldSelfClose(const Node *node);

Should just be Node*. No need to include the name &quot;node&quot;, and the * is in the wrong place, and const doesn&apos;t help here.

&gt; +    void appendEndMarkup(Vector&lt;UChar&gt;&amp; result, const Node*);

Same comments about &quot;result&quot; and &quot;const&quot;.

&gt; +    Vector&lt;Node*&gt;* m_nodes;
&gt; +    Vector&lt;String&gt; preMarkups;
&gt; +    Vector&lt;String&gt; postMarkups;

In a new class it doesn&apos;t make sense to mix naming styles. If members need an &quot;m_&quot; prefix, then all three should have it. Also, the names &quot;pre markups&quot; and &quot;post markups&quot; aren&apos;t really clear data member names. We should choose names that are more normal language that you might use when talking to someone. Even &quot;prefix strings&quot; and &quot;suffix strings&quot; would be better, I think.

&gt; +void MarkupAccumulator::insertString(const String&amp; s)
&gt; +{
&gt; +    postMarkups.append(s);
&gt; +}

I don&apos;t understand why we use &quot;insert&quot; to mean &quot;add to the end&quot;. Normally we use the word &quot;append&quot; for that. Or if we want to be vague it could be &quot;add&quot;. But &quot;insert&quot; almost always means to add something somewhere other than the end.

Also, please use the word &quot;string&quot; rather than the letter &quot;s&quot;.

&gt; +void MarkupAccumulator::insertOpenTag(const Node* node, const Range* range, EAnnotateForInterchange annotate, EAbsoluteURLs absoluteURLs, bool convertBlocksToInlines, HashMap&lt;AtomicStringImpl*, AtomicStringImpl*&gt;* namespaces, RangeFullySelectsNode rangeFullySelectsNode)

Calling the enum value &quot;absolute URLs&quot; isn&apos;t great. The argument indicates how URLs should be handled, and is not actually a set of URLs. So the name could be &quot;absoluteURLPolicy&quot; or something along those lines.

I think &quot;add&quot; or &quot;append&quot; would be better than &quot;insert&quot;.

&gt; +    if (m_nodes)
&gt; +        m_nodes-&gt;append(const_cast&lt;Node*&gt;(node));

Use of const_cast like this indicates a design mistake. We should not be using const pointers at all. If there is an existing mistake of using them, we should put the const_cast right at the entry point to the outer functions, and then fix the entry point later.

&gt; +void MarkupAccumulator::insertEndTag(const Node* node)

I think &quot;add&quot; or &quot;append&quot; would be better than &quot;insert&quot;.

&gt; +static bool propertyMissingOrEqualToNone(CSSStyleDeclaration* style, int propertyID);

This declaration should be at the top of the file, not in the middle. The name &quot;style&quot; should be omitted.

I don&apos;t have time to review the rest of this patch right now, although I would like to.

review- because I want you to fix some of the things I mentioned</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266395</commentid>
    <comment_count>4</comment_count>
      <attachid>64776</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-18 14:53:22 -0700</bug_when>
    <thetext>Created attachment 64776
fixed per Darin&apos;s comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266396</commentid>
    <comment_count>5</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-18 14:53:38 -0700</bug_when>
    <thetext>Thanks for the detailed review.  I wonder why check-webkit-style didn&apos;t catch any of that.

(In reply to comment #3)
&gt; (From update of attachment 64723 [details])
&gt; &gt; +    MarkupAccumulator(Vector&lt;Node*&gt;* nodes)
&gt; &gt; +    : m_nodes(nodes)
&gt; &gt; +    {
&gt; &gt; +    }
&gt; 
&gt; This does not have the correct formatting. The &quot;:&quot; line should be indented one tab stop.
Fixed.

&gt; &gt; +    void insertString(const String&amp; s);
&gt; 
&gt; You should omit the letter &quot;s&quot; here. It adds no value.

Done.

&gt; &gt; +    void appendAttributeValue(Vector&lt;UChar&gt;&amp; result, const String&amp; attr, bool escapeNBSP);
&gt; 
&gt; Please consider using the word &quot;attribute&quot; rather than &quot;attr&quot; for the name here.

Done.

&gt; &gt; +    String escapeContentText(const String&amp; in, bool escapeNBSP);
&gt; 
&gt; I don&apos;t think the word &quot;in&quot; here as an attribute value adds any clarity.

Removed.

&gt; &gt; +    pair&lt;const UChar*, size_t&gt; ucharRange(const Node*, const Range *);
&gt; 
&gt; The name ucharRange is quite strange. It&apos;s also not our normal style to leave a space after Range before &quot;*&quot;.
&gt; 
&gt; &gt; +    void appendUCharRange(Vector&lt;UChar&gt;&amp; result, const pair&lt;const UChar*, size_t&gt; range);
&gt; 
&gt; Naming the vector &quot;result&quot; is a little strange since it&apos;s an in/out argument. The pair argument should probably be a const pair&amp; rather than just a const pair.
&gt; 
&gt; It might be better to have a typedef for the pair.

Right, all of this needs to be fixed but I&apos;d like to postpone that for the sake of keeping the patch focused on grouping functions.  I&apos;m planning to to do more cleanup afterwards.  Namely, ucharRange is called only in appendStartMarkup where it calls appendUCharRange and appendEscapedContent for Node::TEXT_Node.  I should be able to come up with a better way to pass information from ucharRange to appendEscapedContent and cleanup the whole mess there.

&gt; &gt; +    bool shouldAddNamespaceElem(const Element*);
&gt; 
&gt; Please don&apos;t abbreviate &quot;element&quot; as &quot;elem&quot; in the name of this. Also, why take a const Element* rather than an Element*? Since these classes are in a tree, it&apos;s rarely useful to use a const* rather than just a *.

Fixed.  Removing const requires modifying a bunch of places so I&apos;ll leave it as const for now.

&gt; &gt; +    bool shouldAddNamespaceAttr(const Attribute*, HashMap&lt;AtomicStringImpl*, AtomicStringImpl*&gt;&amp; namespaces);
&gt; 
&gt; Please don&apos;t abbreviate &quot;attribute&quot; as &quot;attr&quot; in the name of this. Same comment about const Element*.

Fixed.

&gt; It might be better to have a typedef for the map type.

Good idea.

&gt; &gt; +    void appendNamespace(Vector&lt;UChar&gt;&amp; result, const AtomicString&amp; prefix, const AtomicString&amp; ns, HashMap&lt;AtomicStringImpl*, AtomicStringImpl*&gt;&amp; namespaces);
&gt; 
&gt; Please don&apos;t abbreviate &quot;namespace&quot; to &quot;ns&quot;. But since you can&apos;t use &quot;namespace&quot; because it&apos;s a reserved word you probably need to say namespaceURI or something like that. Whatever QualifiedName.h uses.

Fixed.

&gt; &gt; +    void appendDocumentType(Vector&lt;UChar&gt;&amp; result, const DocumentType*);
&gt; 
&gt; Same comment about &quot;result&quot;.

Renaming result requires a lot of modification in the code, and I&apos;d like to postpone it until when I clean up each method.  But if you&apos;re taking about just the class declaration, then I&apos;m more than happy to change it to whatever you&apos;d like to call it.

&gt; &gt; +    bool shouldSelfClose(const Node *node);
&gt; 
&gt; Should just be Node*. No need to include the name &quot;node&quot;, and the * is in the wrong place, and const doesn&apos;t help here.

Fixed.

&gt; &gt; +    void appendEndMarkup(Vector&lt;UChar&gt;&amp; result, const Node*);
&gt; 
&gt; Same comments about &quot;result&quot; and &quot;const&quot;.

Removing const here requires a lot of code change.  I&apos;d like to postpone this as well.

&gt; &gt; +    Vector&lt;Node*&gt;* m_nodes;
&gt; &gt; +    Vector&lt;String&gt; preMarkups;
&gt; &gt; +    Vector&lt;String&gt; postMarkups;
&gt; 
&gt; In a new class it doesn&apos;t make sense to mix naming styles. If members need an &quot;m_&quot; prefix, then all three should have it. Also, the names &quot;pre markups&quot; and &quot;post markups&quot; aren&apos;t really clear data member names. We should choose names that are more normal language that you might use when talking to someone. Even &quot;prefix strings&quot; and &quot;suffix strings&quot; would be better, I think.

I agree it&apos;s very confusing because preMarkups has markup in the reversed order.  It has the outermost element at the end and we&apos;re reversing the order in takeResults. Renamed them to m_reversedPreceedingMarkup and m_succeedingMarkup.

&gt; &gt; +void MarkupAccumulator::insertString(const String&amp; s)
&gt; &gt; +{
&gt; &gt; +    postMarkups.append(s);
&gt; &gt; +}
&gt; 
&gt; I don&apos;t understand why we use &quot;insert&quot; to mean &quot;add to the end&quot;. Normally we use the word &quot;append&quot; for that. Or if we want to be vague it could be &quot;add&quot;. But &quot;insert&quot; almost always means to add something somewhere other than the end.

Good point, fixed.

&gt; Also, please use the word &quot;string&quot; rather than the letter &quot;s&quot;.

Right, fixed.

&gt; &gt; +void MarkupAccumulator::insertOpenTag(const Node* node, const Range* range, EAnnotateForInterchange annotate, EAbsoluteURLs absoluteURLs, bool convertBlocksToInlines, HashMap&lt;AtomicStringImpl*, AtomicStringImpl*&gt;* namespaces, RangeFullySelectsNode rangeFullySelectsNode)
&gt; 
&gt; Calling the enum value &quot;absolute URLs&quot; isn&apos;t great. The argument indicates how URLs should be handled, and is not actually a set of URLs. So the name could be &quot;absoluteURLPolicy&quot; or something along those lines.

Renamed to shouldResolveURLs.

&gt; &gt; +    if (m_nodes)
&gt; &gt; +        m_nodes-&gt;append(const_cast&lt;Node*&gt;(node));
&gt; 
&gt; Use of const_cast like this indicates a design mistake. We should not be using const pointers at all. If there is an existing mistake of using them, we should put the const_cast right at the entry point to the outer functions, and then fix the entry point later.

Fixed.  createMarkup (node version) takes in const Node* so added a const_cast where it calls serializeNodesWithNamespaces

&gt; &gt; +void MarkupAccumulator::insertEndTag(const Node* node)
&gt; 
&gt; I think &quot;add&quot; or &quot;append&quot; would be better than &quot;insert&quot;.

Fixed.

&gt; &gt; +static bool propertyMissingOrEqualToNone(CSSStyleDeclaration* style, int propertyID);
&gt; 
&gt; This declaration should be at the top of the file, not in the middle. The name &quot;style&quot; should be omitted.

Moved.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266444</commentid>
    <comment_count>6</comment_count>
      <attachid>64776</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-08-18 16:22:58 -0700</bug_when>
    <thetext>Comment on attachment 64776
fixed per Darin&apos;s comment

&gt; +    Vector&lt;String&gt; m_reversedPreceedingMarkup;

There&apos;s a spelling mistake here. It&apos;s &quot;preceding&quot; rather than &quot;preceeding&quot;.

&gt; +void MarkupAccumulator::appendStartTag(Node* node, const Range* range, EAnnotateForInterchange annotate, EAbsoluteURLs shouldResolveURLs, bool convertBlocksToInlines, Namespaces* namespaces, RangeFullySelectsNode rangeFullySelectsNode)
&gt; +{
&gt; +    Vector&lt;UChar&gt; result;
&gt; +    appendStartMarkup(result, node, range, annotate, shouldResolveURLs, convertBlocksToInlines, namespaces, rangeFullySelectsNode);
&gt; +    m_succeedingMarkup.append(String::adopt(result));
&gt; +    if (m_nodes)
&gt; +        m_nodes-&gt;append(const_cast&lt;Node*&gt;(node));

There is no need for const_cast here.

&gt; +void MarkupAccumulator::wrapWithNode(Node* node, const Range* range, EAnnotateForInterchange annotate, EAbsoluteURLs shouldResolveURLs, bool convertBlocksToInlines, Namespaces* namespaces, RangeFullySelectsNode rangeFullySelectsNode)
&gt; +{
&gt; +    Vector&lt;UChar&gt; result;
&gt; +    appendStartMarkup(result, node, range, annotate, shouldResolveURLs, convertBlocksToInlines, namespaces, rangeFullySelectsNode);
&gt; +    m_reversedPreceedingMarkup.append(String::adopt(result));
&gt; +    appendEndTag(node);
&gt; +    if (m_nodes)
&gt; +        m_nodes-&gt;append(const_cast&lt;Node*&gt;(node));

There is no need for const_cast here.

&gt; +    WTF::append(openTag, isBlock ? divStyle : styleSpanOpen);

Do you really need to explicitly qualify WTF::append with the namespace here? Doesn&apos;t just calling append work due to argument-depedendent lookup?

&gt; +    size_t preCount = m_reversedPreceedingMarkup.size();
&gt; +    for (size_t i = 0; i &lt; preCount; ++i)
&gt; +        length += m_reversedPreceedingMarkup[i].length();
&gt; +    
&gt; +    size_t postCount = m_succeedingMarkup.size();
&gt; +    for (size_t i = 0; i &lt; postCount; ++i)
&gt; +        length += m_succeedingMarkup[i].length();

If you added a helper function here you could just call it twice.

&gt; +    for (size_t i = preCount; i &gt; 0; --i)
&gt; +        WTF::append(result, m_reversedPreceedingMarkup[i - 1]);
&gt; +    
&gt; +    for (size_t i = 0; i &lt; postCount; ++i)
&gt; +        WTF::append(result, m_succeedingMarkup[i]);

Same here. You could make an append function that handled the entire vector.

&gt; +    const UChar* uchars = attribute.characters();

The name &quot;uchars&quot; is not so great. I think &quot;characters&quot; would be better.

&gt; +    unsigned len = attribute.length();

Could you use the name &quot;length&quot; instead of &quot;len&quot;?

I guess those names are in the existing code, so you can fix this later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266488</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-18 17:53:25 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 64776 [details])
&gt; &gt; +    Vector&lt;String&gt; m_reversedPreceedingMarkup;
&gt; 
&gt; There&apos;s a spelling mistake here. It&apos;s &quot;preceding&quot; rather than &quot;preceeding&quot;.

Will fix.

&gt; &gt; +void MarkupAccumulator::appendStartTag(Node* node, const Range* range, EAnnotateForInterchange annotate, EAbsoluteURLs shouldResolveURLs, bool convertBlocksToInlines, Namespaces* namespaces, RangeFullySelectsNode rangeFullySelectsNode)
&gt; &gt; +{
&gt; &gt; +    Vector&lt;UChar&gt; result;
&gt; &gt; +    appendStartMarkup(result, node, range, annotate, shouldResolveURLs, convertBlocksToInlines, namespaces, rangeFullySelectsNode);
&gt; &gt; +    m_succeedingMarkup.append(String::adopt(result));
&gt; &gt; +    if (m_nodes)
&gt; &gt; +        m_nodes-&gt;append(const_cast&lt;Node*&gt;(node));
&gt; 
&gt; There is no need for const_cast here.

Will fix.

&gt; &gt; +void MarkupAccumulator::wrapWithNode(Node* node, const Range* range, EAnnotateForInterchange annotate, EAbsoluteURLs shouldResolveURLs, bool convertBlocksToInlines, Namespaces* namespaces, RangeFullySelectsNode rangeFullySelectsNode)
&gt; &gt; +{
&gt; &gt; +    Vector&lt;UChar&gt; result;
&gt; &gt; +    appendStartMarkup(result, node, range, annotate, shouldResolveURLs, convertBlocksToInlines, namespaces, rangeFullySelectsNode);
&gt; &gt; +    m_reversedPreceedingMarkup.append(String::adopt(result));
&gt; &gt; +    appendEndTag(node);
&gt; &gt; +    if (m_nodes)
&gt; &gt; +        m_nodes-&gt;append(const_cast&lt;Node*&gt;(node));
&gt; 
&gt; There is no need for const_cast here.

Will fix.

&gt; &gt; +    WTF::append(openTag, isBlock ? divStyle : styleSpanOpen);
&gt; 
&gt; Do you really need to explicitly qualify WTF::append with the namespace here? Doesn&apos;t just calling append work due to argument-depedendent lookup?

No. It&apos;s a left over from old days.  Will fix.

&gt; &gt; +    size_t preCount = m_reversedPreceedingMarkup.size();
&gt; &gt; +    for (size_t i = 0; i &lt; preCount; ++i)
&gt; &gt; +        length += m_reversedPreceedingMarkup[i].length();
&gt; &gt; +    
&gt; &gt; +    size_t postCount = m_succeedingMarkup.size();
&gt; &gt; +    for (size_t i = 0; i &lt; postCount; ++i)
&gt; &gt; +        length += m_succeedingMarkup[i].length();
&gt; 
&gt; If you added a helper function here you could just call it twice.
&gt; 
&gt; &gt; +    for (size_t i = preCount; i &gt; 0; --i)
&gt; &gt; +        WTF::append(result, m_reversedPreceedingMarkup[i - 1]);
&gt; &gt; +    
&gt; &gt; +    for (size_t i = 0; i &lt; postCount; ++i)
&gt; &gt; +        WTF::append(result, m_succeedingMarkup[i]);
&gt; 
&gt; Same here. You could make an append function that handled the entire vector.

Right but as the comment above indicates, I&apos;m intending to rewrite the whole method, or the way we accumulate markups.
So I&apos;ll postpone creating helper functions until then.

&gt; &gt; +    const UChar* uchars = attribute.characters();
&gt; 
&gt; The name &quot;uchars&quot; is not so great. I think &quot;characters&quot; would be better.
&gt; 
&gt; &gt; +    unsigned len = attribute.length();
&gt; 
&gt; Could you use the name &quot;length&quot; instead of &quot;len&quot;?
&gt; 
&gt; I guess those names are in the existing code, so you can fix this later.

Will do when I cleanup those functions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266490</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-18 18:04:40 -0700</bug_when>
    <thetext>Committed r65647: &lt;http://trac.webkit.org/changeset/65647&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266497</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-18 18:40:42 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/65647 might have broken SnowLeopard Intel Release (Tests)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64273</attachid>
            <date>2010-08-12 15:39:43 -0700</date>
            <delta_ts>2010-08-18 10:10:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-43936-20100812153941.patch</filename>
            <type>text/plain</type>
            <size>25065</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NTI3MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTAgQEAKKzIwMTAtMDgtMTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgR3Jv
dXAgZnVuY3Rpb25zIGluIG1hcmt1cC5jcHAgaW50byBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQzOTM2CisK
KyAgICAgICAgUmVuYW1lZCBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIgdG8gTWFya3VwQWNjdW11
bGF0b3IgYW5kIG1vdmVkIHRoZSBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIKKyAgICAgICAgdG8g
dGhlIHRvcCBvZiBtYXJrdXAuY3BwLiBNYWRlIHZhcmlvdXMgZnVuY3Rpb25zIHByaXZhdGUgbWVt
YmVyIGZ1bmN0aW9ucyBvZiBNYXJrdXBBY2N1bXVsYXRvci4KKworICAgICAgICBBbHNvIG1vdmVk
IEF0dHJpYnV0ZUNoYW5nZSBhbmQgY29tcGxldGVVUkxzIHJpZ2h0IGFib3ZlIGNyZWF0ZUZyYWdt
ZW50RnJvbU1hcmt1cAorICAgICAgICBiZWNhdXNlIEF0dHJpYnV0ZUNoYW5nZSBhbmQgY29tcGxl
dGVVUkxzIGFyZSBvbmx5IHVzZWQgaW4gY3JlYXRlRnJhZ21lbnRGcm9tTWFya3VwLgorCisgICAg
ICAgIE5vIG5ldyB0ZXN0cyBhZGRlZCBzaW5jZSB0aGlzIGlzIGEgY2xlYW51cC4KKworICAgICAg
ICAqIGVkaXRpbmcvbWFya3VwLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxh
dG9yOjopOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Ok1hcmt1cEFjY3Vt
dWxhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjppbnNlcnRTdHJp
bmcpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Omluc2VydE9wZW5UYWcp
OgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Omluc2VydEVuZFRhZyk6Cisg
ICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6d3JhcFdpdGhOb2RlKToKKyAgICAg
ICAgKFdlYkNvcmU6OnByb3BlcnR5TWlzc2luZ09yRXF1YWxUb05vbmUpOgorICAgICAgICAoV2Vi
Q29yZTo6TWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoU3R5bGVOb2RlKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjp0YWtlUmVzdWx0cyk6CisgICAgICAgIChXZWJDb3Jl
OjpNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kQXR0cmlidXRlVmFsdWUpOgorICAgICAgICAoV2Vi
Q29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmVzY2FwZUNvbnRlbnRUZXh0KToKKyAgICAgICAgKFdl
YkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRRdW90ZWRVUkxBdHRyaWJ1dGVWYWx1ZSk6
CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6c3RyaW5nVmFsdWVGb3JSYW5n
ZSk6CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6dWNoYXJSYW5nZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kVUNoYXJSYW5nZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRUZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VFbGVtKToK
KyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VB
dHRyKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmROYW1lc3Bh
Y2UpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZERvY3VtZW50
VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6cmVtb3ZlRXh0ZXJp
b3JTdHlsZXMpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0
YXJ0TWFya3VwKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRT
ZWxmQ2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZEVu
ZE1hcmt1cCk6CisgICAgICAgIChXZWJDb3JlOjpzZXJpYWxpemVOb2Rlcyk6CisgICAgICAgIChX
ZWJDb3JlOjpjcmVhdGVNYXJrdXApOgorICAgICAgICAoV2ViQ29yZTo6QXR0cmlidXRlQ2hhbmdl
OjpBdHRyaWJ1dGVDaGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QXR0cmlidXRlQ2hhbmdlOjph
cHBseSk6CisgICAgICAgIChXZWJDb3JlOjpjb21wbGV0ZVVSTHMpOgorICAgICAgICAoV2ViQ29y
ZTo6c2VyaWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyk6CisKIDIwMTAtMDgtMTIgIEppYW4gTGkg
IDxqaWFubGlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIEZpeCBxdCBidWlsZCBicmVhay4KSW5k
ZXg6IFdlYkNvcmUvZWRpdGluZy9tYXJrdXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRp
dGluZy9tYXJrdXAuY3BwCShyZXZpc2lvbiA2NTI2NSkKKysrIFdlYkNvcmUvZWRpdGluZy9tYXJr
dXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NiwzMiArNjYsMTMyIEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotc3RhdGljIGlubGluZSBib29s
IHNob3VsZFNlbGZDbG9zZShjb25zdCBOb2RlICpub2RlKTsKLQotY2xhc3MgQXR0cmlidXRlQ2hh
bmdlIHsKK2NsYXNzIE1hcmt1cEFjY3VtdWxhdG9yIHsKIHB1YmxpYzoKLSAgICBBdHRyaWJ1dGVD
aGFuZ2UoKQotICAgICAgICA6IG1fbmFtZShudWxsQXRvbSwgbnVsbEF0b20sIG51bGxBdG9tKQot
ICAgIHsKLSAgICB9Ci0KLSAgICBBdHRyaWJ1dGVDaGFuZ2UoUGFzc1JlZlB0cjxFbGVtZW50PiBl
bGVtZW50LCBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQot
ICAgICAgICA6IG1fZWxlbWVudChlbGVtZW50KSwgbV9uYW1lKG5hbWUpLCBtX3ZhbHVlKHZhbHVl
KQotICAgIHsKLSAgICB9CisgICAgZW51bSBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgeyBEb2VzRnVs
bHlTZWxlY3ROb2RlLCBEb2VzTm90RnVsbHlTZWxlY3ROb2RlIH07CiAKLSAgICB2b2lkIGFwcGx5
KCkKKyAgICBNYXJrdXBBY2N1bXVsYXRvcihWZWN0b3I8Tm9kZSo+KiBub2RlcykKKyAgICA6IG1f
bm9kZXMobm9kZXMpCiAgICAgewotICAgICAgICBtX2VsZW1lbnQtPnNldEF0dHJpYnV0ZShtX25h
bWUsIG1fdmFsdWUpOwogICAgIH0KKyAgICB2b2lkIGluc2VydFN0cmluZyhjb25zdCBTdHJpbmcm
IHMpOworICAgIHZvaWQgaW5zZXJ0T3BlblRhZyhjb25zdCBOb2RlKiwgY29uc3QgUmFuZ2UqLCBF
QW5ub3RhdGVGb3JJbnRlcmNoYW5nZSwgRUFic29sdXRlVVJMcywgYm9vbCBjb252ZXJ0QmxvY2tz
VG9JbmxpbmVzID0gZmFsc2UsIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEF0b21pY1N0cmlu
Z0ltcGwqPiogbmFtZXNwYWNlcyA9IDAsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSA9IERvZXNGdWxs
eVNlbGVjdE5vZGUpOworICAgIHZvaWQgaW5zZXJ0RW5kVGFnKGNvbnN0IE5vZGUqKTsKKyAgICB2
b2lkIHdyYXBXaXRoTm9kZShjb25zdCBOb2RlKiwgY29uc3QgUmFuZ2UqLCBFQW5ub3RhdGVGb3JJ
bnRlcmNoYW5nZSwgRUFic29sdXRlVVJMcywgYm9vbCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzID0g
ZmFsc2UsIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEF0b21pY1N0cmluZ0ltcGwqPiogbmFt
ZXNwYWNlcyA9IDAsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSA9IERvZXNGdWxseVNlbGVjdE5vZGUp
OworICAgIHZvaWQgd3JhcFdpdGhTdHlsZU5vZGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiosIERvY3Vt
ZW50KiwgYm9vbCBpc0Jsb2NrID0gZmFsc2UpOworICAgIFN0cmluZyB0YWtlUmVzdWx0cygpOwog
CiBwcml2YXRlOgotICAgIFJlZlB0cjxFbGVtZW50PiBtX2VsZW1lbnQ7Ci0gICAgUXVhbGlmaWVk
TmFtZSBtX25hbWU7Ci0gICAgU3RyaW5nIG1fdmFsdWU7CisgICAgdm9pZCBhcHBlbmRBdHRyaWJ1
dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYgYXR0ciwgYm9vbCBl
c2NhcGVOQlNQKTsKKyAgICBTdHJpbmcgZXNjYXBlQ29udGVudFRleHQoY29uc3QgU3RyaW5nJiBp
biwgYm9vbCBlc2NhcGVOQlNQKTsKKyAgICB2b2lkIGFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZh
bHVlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworICAg
IFN0cmluZyBzdHJpbmdWYWx1ZUZvclJhbmdlKGNvbnN0IE5vZGUqLCBjb25zdCBSYW5nZSopOwor
ICAgIHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHVjaGFyUmFuZ2UoY29uc3QgTm9kZSosIGNv
bnN0IFJhbmdlICopOworICAgIHZvaWQgYXBwZW5kVUNoYXJSYW5nZShWZWN0b3I8VUNoYXI+JiBy
ZXN1bHQsIGNvbnN0IHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHJhbmdlKTsKKyAgICBTdHJp
bmcgcmVuZGVyZWRUZXh0KGNvbnN0IE5vZGUqLCBjb25zdCBSYW5nZSopOworICAgIGJvb2wgc2hv
dWxkQWRkTmFtZXNwYWNlRWxlbShjb25zdCBFbGVtZW50Kik7CisgICAgYm9vbCBzaG91bGRBZGRO
YW1lc3BhY2VBdHRyKGNvbnN0IEF0dHJpYnV0ZSosIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCos
IEF0b21pY1N0cmluZ0ltcGwqPiYgbmFtZXNwYWNlcyk7CisgICAgdm9pZCBhcHBlbmROYW1lc3Bh
Y2UoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCwgY29u
c3QgQXRvbWljU3RyaW5nJiBucywgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3Ry
aW5nSW1wbCo+JiBuYW1lc3BhY2VzKTsKKyAgICB2b2lkIGFwcGVuZERvY3VtZW50VHlwZShWZWN0
b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IERvY3VtZW50VHlwZSopOworICAgIHZvaWQgcmVtb3Zl
RXh0ZXJpb3JTdHlsZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qKTsKKyAgICB2b2lkIGFw
cGVuZFN0YXJ0TWFya3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgTm9kZSosIGNvbnN0
IFJhbmdlKiwgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UsIEVBYnNvbHV0ZVVSTHMsIGJvb2wgY29u
dmVydEJsb2Nrc1RvSW5saW5lcywgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3Ry
aW5nSW1wbCo+KiBuYW1lc3BhY2VzLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUpOworICAgIGJvb2wg
c2hvdWxkU2VsZkNsb3NlKGNvbnN0IE5vZGUgKm5vZGUpOworICAgIHZvaWQgYXBwZW5kRW5kTWFy
a3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgTm9kZSopOworCisgICAgVmVjdG9yPE5v
ZGUqPiogbV9ub2RlczsKKyAgICBWZWN0b3I8U3RyaW5nPiBwcmVNYXJrdXBzOworICAgIFZlY3Rv
cjxTdHJpbmc+IHBvc3RNYXJrdXBzOwogfTsKIAotc3RhdGljIHZvaWQgYXBwZW5kQXR0cmlidXRl
VmFsdWUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBTdHJpbmcmIGF0dHIsIGJvb2wgZXNj
YXBlTkJTUCkKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6Omluc2VydFN0cmluZyhjb25zdCBTdHJp
bmcmIHMpCit7CisgICAgcG9zdE1hcmt1cHMuYXBwZW5kKHMpOworfQorCit2b2lkIE1hcmt1cEFj
Y3VtdWxhdG9yOjppbnNlcnRPcGVuVGFnKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiBy
YW5nZSwgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJz
b2x1dGVVUkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIEhhc2hNYXA8QXRvbWljU3Ry
aW5nSW1wbCosIEF0b21pY1N0cmluZ0ltcGwqPiogbmFtZXNwYWNlcywgUmFuZ2VGdWxseVNlbGVj
dHNOb2RlIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSkKK3sKKyAgICBWZWN0b3I8VUNoYXI+IHJlc3Vs
dDsKKyAgICBhcHBlbmRTdGFydE1hcmt1cChyZXN1bHQsIG5vZGUsIHJhbmdlLCBhbm5vdGF0ZSwg
YWJzb2x1dGVVUkxzLCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBuYW1lc3BhY2VzLCByYW5nZUZ1
bGx5U2VsZWN0c05vZGUpOworICAgIHBvc3RNYXJrdXBzLmFwcGVuZChTdHJpbmc6OmFkb3B0KHJl
c3VsdCkpOworICAgIGlmIChtX25vZGVzKQorICAgICAgICBtX25vZGVzLT5hcHBlbmQoY29uc3Rf
Y2FzdDxOb2RlKj4obm9kZSkpOworfQorCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjppbnNlcnRF
bmRUYWcoY29uc3QgTm9kZSogbm9kZSkKK3sKKyAgICBWZWN0b3I8VUNoYXI+IHJlc3VsdDsKKyAg
ICBhcHBlbmRFbmRNYXJrdXAocmVzdWx0LCBub2RlKTsKKyAgICBwb3N0TWFya3Vwcy5hcHBlbmQo
U3RyaW5nOjphZG9wdChyZXN1bHQpKTsKK30KKwordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6d3Jh
cFdpdGhOb2RlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90YXRl
Rm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzLCBib29s
IGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEF0b21p
Y1N0cmluZ0ltcGwqPiogbmFtZXNwYWNlcywgUmFuZ2VGdWxseVNlbGVjdHNOb2RlIHJhbmdlRnVs
bHlTZWxlY3RzTm9kZSkKK3sKKyAgICBWZWN0b3I8VUNoYXI+IHJlc3VsdDsKKyAgICBhcHBlbmRT
dGFydE1hcmt1cChyZXN1bHQsIG5vZGUsIHJhbmdlLCBhbm5vdGF0ZSwgYWJzb2x1dGVVUkxzLCBj
b252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBuYW1lc3BhY2VzLCByYW5nZUZ1bGx5U2VsZWN0c05vZGUp
OworICAgIHByZU1hcmt1cHMuYXBwZW5kKFN0cmluZzo6YWRvcHQocmVzdWx0KSk7CisgICAgaW5z
ZXJ0RW5kVGFnKG5vZGUpOworICAgIGlmIChtX25vZGVzKQorICAgICAgICBtX25vZGVzLT5hcHBl
bmQoY29uc3RfY2FzdDxOb2RlKj4obm9kZSkpOworfQorICAgIAorc3RhdGljIGJvb2wgcHJvcGVy
dHlNaXNzaW5nT3JFcXVhbFRvTm9uZShDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSwgaW50IHBy
b3BlcnR5SUQpCit7CisgICAgaWYgKCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IFJlZlB0cjxDU1NWYWx1ZT4gdmFsdWUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShwcm9w
ZXJ0eUlEKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAo
IXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZS5nZXQoKSktPmdldElk
ZW50KCkgPT0gQ1NTVmFsdWVOb25lOworfQorICAgIAordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6
d3JhcFdpdGhTdHlsZU5vZGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUsIERvY3VtZW50KiBk
b2N1bWVudCwgYm9vbCBpc0Jsb2NrKQoreworICAgIC8vIEFsbCB0ZXh0LWRlY29yYXRpb24tcmVs
YXRlZCBlbGVtZW50cyBzaG91bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMgc3BlY2lhbCBhbmNlc3Rv
cnMKKyAgICAvLyBJZiB3ZSBldmVyIGhpdCB0aGlzIEFTU0VSVCwgd2Ugc2hvdWxkIGV4cG9ydCBT
dHlsZUNoYW5nZSBpbiBBcHBseVN0eWxlQ29tbWFuZCBhbmQgdXNlIGl0IGhlcmUKKyAgICBBU1NF
UlQocHJvcGVydHlNaXNzaW5nT3JFcXVhbFRvTm9uZShzdHlsZSwgQ1NTUHJvcGVydHlUZXh0RGVj
b3JhdGlvbikgJiYgcHJvcGVydHlNaXNzaW5nT3JFcXVhbFRvTm9uZShzdHlsZSwgQ1NTUHJvcGVy
dHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCkpOworICAgIERFRklORV9TVEFUSUNfTE9D
QUwoY29uc3QgU3RyaW5nLCBkaXZTdHlsZSwgKCI8ZGl2IHN0eWxlPVwiIikpOworICAgIERFRklO
RV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBkaXZDbG9zZSwgKCI8L2Rpdj4iKSk7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIHN0eWxlU3Bhbk9wZW4sICgiPHNwYW4g
Y2xhc3M9XCIiIEFwcGxlU3R5bGVTcGFuQ2xhc3MgIlwiIHN0eWxlPVwiIikpOworICAgIERFRklO
RV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBzdHlsZVNwYW5DbG9zZSwgKCI8L3NwYW4+Iikp
OworICAgIFZlY3RvcjxVQ2hhcj4gb3BlblRhZzsKKyAgICBXVEY6OmFwcGVuZChvcGVuVGFnLCBp
c0Jsb2NrID8gZGl2U3R5bGUgOiBzdHlsZVNwYW5PcGVuKTsKKyAgICBhcHBlbmRBdHRyaWJ1dGVW
YWx1ZShvcGVuVGFnLCBzdHlsZS0+Y3NzVGV4dCgpLCBkb2N1bWVudC0+aXNIVE1MRG9jdW1lbnQo
KSk7CisgICAgb3BlblRhZy5hcHBlbmQoJ1wiJyk7CisgICAgb3BlblRhZy5hcHBlbmQoJz4nKTsK
KyAgICBwcmVNYXJrdXBzLmFwcGVuZChTdHJpbmc6OmFkb3B0KG9wZW5UYWcpKTsKKyAgICBwb3N0
TWFya3Vwcy5hcHBlbmQoaXNCbG9jayA/IGRpdkNsb3NlIDogc3R5bGVTcGFuQ2xvc2UpOworfQor
ICAgIAorLy8gRklYTUU6IFRoaXMgaXMgYSB2ZXJ5IGluZWZmaWNpZW50IHdheSBvZiBhY2N1bXVs
YXRpbmcgdGhlIG1hcmt1cC4KKy8vIFdlJ3JlIGNvbnZlcnRpbmcgcmVzdWx0cyBvZiBhcHBlbmRT
dGFydE1hcmt1cCBhbmQgYXBwZW5kRW5kTWFya3VwIGZyb20gVmVjdG9yPFVDaGFyPiB0byBTdHJp
bmcKKy8vIGFuZCB0aGVuIGJhY2sgdG8gVmVjdG9yPFVDaGFyPiBhbmQgYWdhaW4gdG8gU3RyaW5n
IGhlcmUuCitTdHJpbmcgTWFya3VwQWNjdW11bGF0b3I6OnRha2VSZXN1bHRzKCkKK3sKKyAgICBz
aXplX3QgbGVuZ3RoID0gMDsKKyAgICAKKyAgICBzaXplX3QgcHJlQ291bnQgPSBwcmVNYXJrdXBz
LnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZUNvdW50OyArK2kpCisgICAg
ICAgIGxlbmd0aCArPSBwcmVNYXJrdXBzW2ldLmxlbmd0aCgpOworICAgIAorICAgIHNpemVfdCBw
b3N0Q291bnQgPSBwb3N0TWFya3Vwcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBwb3N0Q291bnQ7ICsraSkKKyAgICAgICAgbGVuZ3RoICs9IHBvc3RNYXJrdXBzW2ldLmxlbmd0
aCgpOworICAgIAorICAgIFZlY3RvcjxVQ2hhcj4gcmVzdWx0OworICAgIHJlc3VsdC5yZXNlcnZl
SW5pdGlhbENhcGFjaXR5KGxlbmd0aCk7CisgICAgCisgICAgZm9yIChzaXplX3QgaSA9IHByZUNv
dW50OyBpID4gMDsgLS1pKQorICAgICAgICBXVEY6OmFwcGVuZChyZXN1bHQsIHByZU1hcmt1cHNb
aSAtIDFdKTsKKyAgICAKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvc3RDb3VudDsgKytp
KQorICAgICAgICBXVEY6OmFwcGVuZChyZXN1bHQsIHBvc3RNYXJrdXBzW2ldKTsKKyAgICAKKyAg
ICByZXR1cm4gU3RyaW5nOjphZG9wdChyZXN1bHQpOworfQorCit2b2lkIE1hcmt1cEFjY3VtdWxh
dG9yOjphcHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0
cmluZyYgYXR0ciwgYm9vbCBlc2NhcGVOQlNQKQogewogICAgIGNvbnN0IFVDaGFyKiB1Y2hhcnMg
PSBhdHRyLmNoYXJhY3RlcnMoKTsKICAgICB1bnNpZ25lZCBsZW4gPSBhdHRyLmxlbmd0aCgpOwpA
QCAtMTgxLDE0ICsyODEsMTQgQEAgc3RhdGljIHZvaWQgYXBwZW5kRXNjYXBlZENvbnRlbnQoVmVj
dG9yPAogICAgIHJlc3VsdC5hcHBlbmQodWNoYXJzICsgbGFzdENvcGllZEZyb20sIGxlbiAtIGxh
c3RDb3BpZWRGcm9tKTsKIH0gICAgCiAKLXN0YXRpYyBTdHJpbmcgZXNjYXBlQ29udGVudFRleHQo
Y29uc3QgU3RyaW5nJiBpbiwgYm9vbCBlc2NhcGVOQlNQKQorU3RyaW5nIE1hcmt1cEFjY3VtdWxh
dG9yOjplc2NhcGVDb250ZW50VGV4dChjb25zdCBTdHJpbmcmIGluLCBib29sIGVzY2FwZU5CU1Ap
CiB7CiAgICAgVmVjdG9yPFVDaGFyPiBidWZmZXI7CiAgICAgYXBwZW5kRXNjYXBlZENvbnRlbnQo
YnVmZmVyLCBtYWtlX3BhaXIoaW4uY2hhcmFjdGVycygpLCBpbi5sZW5ndGgoKSksIGVzY2FwZU5C
U1ApOwogICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KGJ1ZmZlcik7CiB9Ci0gICAgCi1zdGF0aWMg
dm9pZCBhcHBlbmRRdW90ZWRVUkxBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQs
IGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKQorCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBl
bmRRdW90ZWRVUkxBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0
cmluZyYgdXJsU3RyaW5nKQogewogICAgIFVDaGFyIHF1b3RlQ2hhciA9ICdcIic7CiAgICAgU3Ry
aW5nIHN0cmlwcGVkVVJMU3RyaW5nID0gdXJsU3RyaW5nLnN0cmlwV2hpdGVTcGFjZSgpOwpAQCAt
MjExLDggKzMxMSw4IEBAIHN0YXRpYyB2b2lkIGFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZhbHUK
ICAgICBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShyZXN1bHQsIHVybFN0cmluZywgZmFsc2UpOwogICAg
IHJlc3VsdC5hcHBlbmQocXVvdGVDaGFyKTsgICAgCiB9Ci0gICAgCi1zdGF0aWMgU3RyaW5nIHN0
cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9kZSogbm9kZSwgY29uc3QgUmFuZ2UqIHJhbmdlKQor
CitTdHJpbmcgTWFya3VwQWNjdW11bGF0b3I6OnN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgTm9k
ZSogbm9kZSwgY29uc3QgUmFuZ2UqIHJhbmdlKQogewogICAgIGlmICghcmFuZ2UpCiAgICAgICAg
IHJldHVybiBub2RlLT5ub2RlVmFsdWUoKTsKQEAgLTIyNiw3ICszMjYsNyBAQCBzdGF0aWMgU3Ry
aW5nIHN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29uc3QgCiAgICAgcmV0dXJuIHN0cjsKIH0KIAotc3Rh
dGljIGlubGluZSBwYWlyPGNvbnN0IFVDaGFyKiwgc2l6ZV90PiB1Y2hhclJhbmdlKGNvbnN0IE5v
ZGUgKm5vZGUsIGNvbnN0IFJhbmdlICpyYW5nZSkKK3BhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+
IE1hcmt1cEFjY3VtdWxhdG9yOjp1Y2hhclJhbmdlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJh
bmdlKiByYW5nZSkKIHsKICAgICBTdHJpbmcgc3RyID0gbm9kZS0+bm9kZVZhbHVlKCk7CiAgICAg
Y29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSBzdHIuY2hhcmFjdGVycygpOwpAQCAtMjQ1LDEzICsz
NDUsMTMgQEAgc3RhdGljIGlubGluZSBwYWlyPGNvbnN0IFVDaGFyKiwgc2l6ZV90PgogICAgIAog
ICAgIHJldHVybiBtYWtlX3BhaXIoY2hhcmFjdGVycywgbGVuZ3RoKTsKIH0KLSAgICAKLXN0YXRp
YyBpbmxpbmUgdm9pZCBhcHBlbmRVQ2hhclJhbmdlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29u
c3QgcGFpcjxjb25zdCBVQ2hhciosIHNpemVfdD4gcmFuZ2UpCisKK3ZvaWQgTWFya3VwQWNjdW11
bGF0b3I6OmFwcGVuZFVDaGFyUmFuZ2UoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBwYWly
PGNvbnN0IFVDaGFyKiwgc2l6ZV90PiByYW5nZSkKIHsKICAgICByZXN1bHQuYXBwZW5kKHJhbmdl
LmZpcnN0LCByYW5nZS5zZWNvbmQpOwogfQotICAgIAotc3RhdGljIFN0cmluZyByZW5kZXJlZFRl
eHQoY29uc3QgTm9kZSogbm9kZSwgY29uc3QgUmFuZ2UqIHJhbmdlKQorCitTdHJpbmcgTWFya3Vw
QWNjdW11bGF0b3I6OnJlbmRlcmVkVGV4dChjb25zdCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSog
cmFuZ2UpCiB7CiAgICAgaWYgKCFub2RlLT5pc1RleHROb2RlKCkpCiAgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKQEAgLTMwNCw3ICs0MDQsNyBAQCBzdGF0aWMgdm9pZCByZW1vdmVEZWZhdWx0U3R5
bGVzKENTU011dGFiCiAgICAgcHJlcGFyZUVkaXRpbmdTdHlsZVRvQXBwbHlBdChzdHlsZSwgUG9z
aXRpb24oZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpLCAwKSk7CiB9CiAKLXN0YXRpYyBib29s
IHNob3VsZEFkZE5hbWVzcGFjZUVsZW0oY29uc3QgRWxlbWVudCogZWxlbSkKK2Jvb2wgTWFya3Vw
QWNjdW11bGF0b3I6OnNob3VsZEFkZE5hbWVzcGFjZUVsZW0oY29uc3QgRWxlbWVudCogZWxlbSkK
IHsKICAgICAvLyBEb24ndCBhZGQgbmFtZXNwYWNlIGF0dHJpYnV0ZSBpZiBpdCBpcyBhbHJlYWR5
IGRlZmluZWQgZm9yIHRoaXMgZWxlbS4KICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCA9
IGVsZW0tPnByZWZpeCgpOwpAQCAtMzEyLDcgKzQxMiw3IEBAIHN0YXRpYyBib29sIHNob3VsZEFk
ZE5hbWVzcGFjZUVsZW0oY29uc3QKICAgICByZXR1cm4gIWVsZW0tPmhhc0F0dHJpYnV0ZShhdHRy
KTsKIH0KIAotc3RhdGljIGJvb2wgc2hvdWxkQWRkTmFtZXNwYWNlQXR0cihjb25zdCBBdHRyaWJ1
dGUqIGF0dHIsIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEF0b21pY1N0cmluZ0ltcGwqPiYg
bmFtZXNwYWNlcykKK2Jvb2wgTWFya3VwQWNjdW11bGF0b3I6OnNob3VsZEFkZE5hbWVzcGFjZUF0
dHIoY29uc3QgQXR0cmlidXRlKiBhdHRyLCBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9t
aWNTdHJpbmdJbXBsKj4mIG5hbWVzcGFjZXMpCiB7CiAgICAgbmFtZXNwYWNlcy5jaGVja0NvbnNp
c3RlbmN5KCk7CiAKQEAgLTMzMSw3ICs0MzEsNyBAQCBzdGF0aWMgYm9vbCBzaG91bGRBZGROYW1l
c3BhY2VBdHRyKGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGFwcGVu
ZE5hbWVzcGFjZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IEF0b21pY1N0cmluZyYgcHJl
Zml4LCBjb25zdCBBdG9taWNTdHJpbmcmIG5zLCBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBB
dG9taWNTdHJpbmdJbXBsKj4mIG5hbWVzcGFjZXMpCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjph
cHBlbmROYW1lc3BhY2UoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBBdG9taWNTdHJpbmcm
IHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5nJiBucywgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBs
KiwgQXRvbWljU3RyaW5nSW1wbCo+JiBuYW1lc3BhY2VzKQogewogICAgIG5hbWVzcGFjZXMuY2hl
Y2tDb25zaXN0ZW5jeSgpOwogICAgIGlmIChucy5pc0VtcHR5KCkpCkBAIC0zNTYsNyArNDU2LDcg
QEAgc3RhdGljIHZvaWQgYXBwZW5kTmFtZXNwYWNlKFZlY3RvcjxVQ2hhcgogICAgIH0KIH0KIAot
c3RhdGljIHZvaWQgYXBwZW5kRG9jdW1lbnRUeXBlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29u
c3QgRG9jdW1lbnRUeXBlKiBuKQordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kRG9jdW1l
bnRUeXBlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgRG9jdW1lbnRUeXBlKiBuKQogewog
ICAgIGlmIChuLT5uYW1lKCkuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CkBAIC0zODUsMTQg
KzQ4NSwxMiBAQCBzdGF0aWMgdm9pZCBhcHBlbmREb2N1bWVudFR5cGUoVmVjdG9yPFVDCiAgICAg
YXBwZW5kKHJlc3VsdCwgIj4iKTsKIH0KIAotc3RhdGljIHZvaWQgcmVtb3ZlRXh0ZXJpb3JTdHls
ZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIHN0eWxlKQordm9pZCBNYXJrdXBBY2N1bXVs
YXRvcjo6cmVtb3ZlRXh0ZXJpb3JTdHlsZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIHN0
eWxlKQogewogICAgIHN0eWxlLT5yZW1vdmVQcm9wZXJ0eShDU1NQcm9wZXJ0eUZsb2F0KTsKIH0K
IAotZW51bSBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgeyBEb2VzRnVsbHlTZWxlY3ROb2RlLCBEb2Vz
Tm90RnVsbHlTZWxlY3ROb2RlIH07Ci0KLXN0YXRpYyB2b2lkIGFwcGVuZFN0YXJ0TWFya3VwKFZl
Y3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgTm9kZSogbm9kZSwgY29uc3QgUmFuZ2UqIHJhbmdl
LCBFQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwgRUFic29sdXRlVVJMcyBhYnNvbHV0
ZVVSTHMsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcywgSGFzaE1hcDxBdG9taWNTdHJpbmdJ
bXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2VzLCBSYW5nZUZ1bGx5U2VsZWN0c05v
ZGUgcmFuZ2VGdWxseVNlbGVjdHNOb2RlID0gRG9lc0Z1bGx5U2VsZWN0Tm9kZSkKK3ZvaWQgTWFy
a3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0YXJ0TWFya3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwg
Y29uc3QgTm9kZSogbm9kZSwgY29uc3QgUmFuZ2UqIHJhbmdlLCBFQW5ub3RhdGVGb3JJbnRlcmNo
YW5nZSBhbm5vdGF0ZSwgRUFic29sdXRlVVJMcyBhYnNvbHV0ZVVSTHMsIGJvb2wgY29udmVydEJs
b2Nrc1RvSW5saW5lcywgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1w
bCo+KiBuYW1lc3BhY2VzLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgcmFuZ2VGdWxseVNlbGVjdHNO
b2RlKQogewogICAgIGlmIChuYW1lc3BhY2VzKQogICAgICAgICBuYW1lc3BhY2VzLT5jaGVja0Nv
bnNpc3RlbmN5KCk7CkBAIC01NjksNyArNjY3LDcgQEAgc3RhdGljIGlubGluZSBib29sIGRvZXNI
VE1MRm9yYmlkRW5kVGFnKAogLy8gMi4gRWxlbWVudHMgdy8gY2hpbGRyZW4gbmV2ZXIgc2VsZi1j
bG9zZSBiZWNhdXNlIHRoZXkgdXNlIGEgc2VwYXJhdGUgZW5kIHRhZy4KIC8vIDMuIEhUTUwgZWxl
bWVudHMgd2hpY2ggZG8gbm90IGhhdmUgYSAiZm9yYmlkZGVuIiBlbmQgdGFnIHdpbGwgY2xvc2Ug
d2l0aCBhIHNlcGFyYXRlIGVuZCB0YWcuCiAvLyA0LiBPdGhlciBlbGVtZW50cyBzZWxmLWNsb3Nl
Lgotc3RhdGljIGlubGluZSBib29sIHNob3VsZFNlbGZDbG9zZShjb25zdCBOb2RlICpub2RlKQor
Ym9vbCBNYXJrdXBBY2N1bXVsYXRvcjo6c2hvdWxkU2VsZkNsb3NlKGNvbnN0IE5vZGUgKm5vZGUp
CiB7CiAgICAgaWYgKG5vZGUtPmRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpCiAgICAgICAg
IHJldHVybiBmYWxzZTsKQEAgLTU4MCw3ICs2NzgsNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc2hv
dWxkU2VsZkNsb3NlKGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGFw
cGVuZEVuZE1hcmt1cChWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IE5vZGUqIG5vZGUpCit2
b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbmRNYXJrdXAoVmVjdG9yPFVDaGFyPiYgcmVz
dWx0LCBjb25zdCBOb2RlKiBub2RlKQogewogICAgIGlmICghbm9kZS0+aXNFbGVtZW50Tm9kZSgp
IHx8IHNob3VsZFNlbGZDbG9zZShub2RlKSB8fCAoIW5vZGUtPmhhc0NoaWxkTm9kZXMoKSAmJiBk
b2VzSFRNTEZvcmJpZEVuZFRhZyhub2RlKSkpCiAgICAgICAgIHJldHVybjsKQEAgLTU5MSwzMSAr
Njg5LDYgQEAgc3RhdGljIHZvaWQgYXBwZW5kRW5kTWFya3VwKFZlY3RvcjxVQ2hhcgogICAgIHJl
c3VsdC5hcHBlbmQoJz4nKTsKIH0KIAotc3RhdGljIHZvaWQgY29tcGxldGVVUkxzKE5vZGUqIG5v
ZGUsIGNvbnN0IFN0cmluZyYgYmFzZVVSTCkKLXsKLSAgICBWZWN0b3I8QXR0cmlidXRlQ2hhbmdl
PiBjaGFuZ2VzOwotCi0gICAgS1VSTCBwYXJzZWRCYXNlVVJMKFBhcnNlZFVSTFN0cmluZywgYmFz
ZVVSTCk7Ci0KLSAgICBOb2RlKiBlbmQgPSBub2RlLT50cmF2ZXJzZU5leHRTaWJsaW5nKCk7Ci0g
ICAgZm9yIChOb2RlKiBuID0gbm9kZTsgbiAhPSBlbmQ7IG4gPSBuLT50cmF2ZXJzZU5leHROb2Rl
KCkpIHsKLSAgICAgICAgaWYgKG4tPmlzRWxlbWVudE5vZGUoKSkgewotICAgICAgICAgICAgRWxl
bWVudCogZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihuKTsKLSAgICAgICAgICAgIE5hbWVkTm9k
ZU1hcCogYXR0cnMgPSBlLT5hdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsZW5n
dGggPSBhdHRycy0+bGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUqIGF0dHIgPSBhdHRy
cy0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgICAgICBpZiAoZS0+aXNVUkxBdHRyaWJ1
dGUoYXR0cikpCi0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuYXBwZW5kKEF0dHJpYnV0ZUNo
YW5nZShlLCBhdHRyLT5uYW1lKCksIEtVUkwocGFyc2VkQmFzZVVSTCwgYXR0ci0+dmFsdWUoKSku
c3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNpemVf
dCBudW1DaGFuZ2VzID0gY2hhbmdlcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBudW1DaGFuZ2VzOyArK2kpCi0gICAgICAgIGNoYW5nZXNbaV0uYXBwbHkoKTsKLX0KLQogc3Rh
dGljIGJvb2wgbmVlZEludGVyY2hhbmdlTmV3bGluZUFmdGVyKGNvbnN0IFZpc2libGVQb3NpdGlv
biYgdikKIHsKICAgICBWaXNpYmxlUG9zaXRpb24gbmV4dCA9IHYubmV4dCgpOwpAQCAtNjM5LDE4
ICs3MTIsNiBAQCBzdGF0aWMgUGFzc1JlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhCiAgICAg
cmV0dXJuIHN0eWxlLnJlbGVhc2UoKTsKIH0KIAotc3RhdGljIGJvb2wgcHJvcGVydHlNaXNzaW5n
T3JFcXVhbFRvTm9uZShDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSwgaW50IHByb3BlcnR5SUQp
Ci17Ci0gICAgaWYgKCFzdHlsZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFJlZlB0cjxD
U1NWYWx1ZT4gdmFsdWUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wZXJ0eUlEKTsK
LSAgICBpZiAoIXZhbHVlKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIXZhbHVlLT5p
c1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZS5nZXQoKSktPmdldElkZW50KCkgPT0g
Q1NTVmFsdWVOb25lOwotfQotCiBzdGF0aWMgYm9vbCBpc0VsZW1lbnRQcmVzZW50YXRpb25hbChj
b25zdCBOb2RlKiBub2RlKQogewogICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKHVUYWcpIHx8IG5v
ZGUtPmhhc1RhZ05hbWUoc1RhZykgfHwgbm9kZS0+aGFzVGFnTmFtZShzdHJpa2VUYWcpIHx8CkBA
IC02ODksOTYgKzc1MCw3IEBAIHN0YXRpYyBib29sIHNob3VsZEluY2x1ZGVXcmFwcGVyRm9yRnVs
bHkKICAgICAgICAgICAgc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kQ29sb3IpOwogfQogCi1jbGFzcyBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIgewotcHVi
bGljOgotICAgIE1hcmt1cEFjY3VtdWxhdG9yV3JhcHBlcihWZWN0b3I8Tm9kZSo+KiBub2RlcykK
LSAgICA6IG1fbm9kZXMobm9kZXMpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgaW5zZXJ0U3Ry
aW5nKGNvbnN0IFN0cmluZyYgcykKLSAgICB7Ci0gICAgICAgIHBvc3RNYXJrdXBzLmFwcGVuZChz
KTsKLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydE9wZW5UYWcoY29uc3QgTm9kZSogbm9kZSwgY29u
c3QgUmFuZ2UqIHJhbmdlLCBFQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwgRUFic29s
dXRlVVJMcyBhYnNvbHV0ZVVSTHMsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcyA9IGZhbHNl
LCBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4qIG5hbWVzcGFj
ZXMgPSAwLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgcmFuZ2VGdWxseVNlbGVjdHNOb2RlID0gRG9l
c0Z1bGx5U2VsZWN0Tm9kZSkKLSAgICB7Ci0gICAgICAgIFZlY3RvcjxVQ2hhcj4gcmVzdWx0Owot
ICAgICAgICBhcHBlbmRTdGFydE1hcmt1cChyZXN1bHQsIG5vZGUsIHJhbmdlLCBhbm5vdGF0ZSwg
YWJzb2x1dGVVUkxzLCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBuYW1lc3BhY2VzLCByYW5nZUZ1
bGx5U2VsZWN0c05vZGUpOwotICAgICAgICBwb3N0TWFya3Vwcy5hcHBlbmQoU3RyaW5nOjphZG9w
dChyZXN1bHQpKTsKLSAgICAgICAgaWYgKG1fbm9kZXMpCi0gICAgICAgICAgICBtX25vZGVzLT5h
cHBlbmQoY29uc3RfY2FzdDxOb2RlKj4obm9kZSkpOwotICAgIH0KLQotICAgIHZvaWQgaW5zZXJ0
RW5kVGFnKGNvbnN0IE5vZGUqIG5vZGUpCi0gICAgewotICAgICAgICBWZWN0b3I8VUNoYXI+IHJl
c3VsdDsKLSAgICAgICAgYXBwZW5kRW5kTWFya3VwKHJlc3VsdCwgbm9kZSk7Ci0gICAgICAgIHBv
c3RNYXJrdXBzLmFwcGVuZChTdHJpbmc6OmFkb3B0KHJlc3VsdCkpOwotICAgIH0KLQotICAgIHZv
aWQgd3JhcFdpdGhOb2RlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFu
bm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxz
LCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMgPSBmYWxzZSwgSGFzaE1hcDxBdG9taWNTdHJp
bmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2VzID0gMCwgUmFuZ2VGdWxseVNl
bGVjdHNOb2RlIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSA9IERvZXNGdWxseVNlbGVjdE5vZGUpCi0g
ICAgewotICAgICAgICBWZWN0b3I8VUNoYXI+IHJlc3VsdDsKLSAgICAgICAgYXBwZW5kU3RhcnRN
YXJrdXAocmVzdWx0LCBub2RlLCByYW5nZSwgYW5ub3RhdGUsIGFic29sdXRlVVJMcywgY29udmVy
dEJsb2Nrc1RvSW5saW5lcywgbmFtZXNwYWNlcywgcmFuZ2VGdWxseVNlbGVjdHNOb2RlKTsKLSAg
ICAgICAgcHJlTWFya3Vwcy5hcHBlbmQoU3RyaW5nOjphZG9wdChyZXN1bHQpKTsKLSAgICAgICAg
aW5zZXJ0RW5kVGFnKG5vZGUpOwotICAgICAgICBpZiAobV9ub2RlcykKLSAgICAgICAgICAgIG1f
bm9kZXMtPmFwcGVuZChjb25zdF9jYXN0PE5vZGUqPihub2RlKSk7Ci0gICAgfQotCi0gICAgdm9p
ZCB3cmFwV2l0aFN0eWxlTm9kZShDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSwgRG9jdW1lbnQq
IGRvY3VtZW50LCBib29sIGlzQmxvY2sgPSBmYWxzZSkKLSAgICB7Ci0gICAgICAgIC8vIEFsbCB0
ZXh0LWRlY29yYXRpb24tcmVsYXRlZCBlbGVtZW50cyBzaG91bGQgaGF2ZSBiZWVuIHRyZWF0ZWQg
YXMgc3BlY2lhbCBhbmNlc3RvcnMKLSAgICAgICAgLy8gSWYgd2UgZXZlciBoaXQgdGhpcyBBU1NF
UlQsIHdlIHNob3VsZCBleHBvcnQgU3R5bGVDaGFuZ2UgaW4gQXBwbHlTdHlsZUNvbW1hbmQgYW5k
IHVzZSBpdCBoZXJlCi0gICAgICAgIEFTU0VSVChwcm9wZXJ0eU1pc3NpbmdPckVxdWFsVG9Ob25l
KHN0eWxlLCBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uKSAmJiBwcm9wZXJ0eU1pc3NpbmdPckVx
dWFsVG9Ob25lKHN0eWxlLCBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0
KSk7Ci0gICAgICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBkaXZTdHlsZSwg
KCI8ZGl2IHN0eWxlPVwiIikpOwotICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0
cmluZywgZGl2Q2xvc2UsICgiPC9kaXY+IikpOwotICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KGNvbnN0IFN0cmluZywgc3R5bGVTcGFuT3BlbiwgKCI8c3BhbiBjbGFzcz1cIiIgQXBwbGVTdHls
ZVNwYW5DbGFzcyAiXCIgc3R5bGU9XCIiKSk7Ci0gICAgICAgIERFRklORV9TVEFUSUNfTE9DQUwo
Y29uc3QgU3RyaW5nLCBzdHlsZVNwYW5DbG9zZSwgKCI8L3NwYW4+IikpOwotICAgICAgICBWZWN0
b3I8VUNoYXI+IG9wZW5UYWc7Ci0gICAgICAgIFdURjo6YXBwZW5kKG9wZW5UYWcsIGlzQmxvY2sg
PyBkaXZTdHlsZSA6IHN0eWxlU3Bhbk9wZW4pOwotICAgICAgICBhcHBlbmRBdHRyaWJ1dGVWYWx1
ZShvcGVuVGFnLCBzdHlsZS0+Y3NzVGV4dCgpLCBkb2N1bWVudC0+aXNIVE1MRG9jdW1lbnQoKSk7
Ci0gICAgICAgIG9wZW5UYWcuYXBwZW5kKCdcIicpOwotICAgICAgICBvcGVuVGFnLmFwcGVuZCgn
PicpOwotICAgICAgICBwcmVNYXJrdXBzLmFwcGVuZChTdHJpbmc6OmFkb3B0KG9wZW5UYWcpKTsK
LSAgICAgICAgcG9zdE1hcmt1cHMuYXBwZW5kKGlzQmxvY2sgPyBkaXZDbG9zZSA6IHN0eWxlU3Bh
bkNsb3NlKTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBhIHZlcnkgaW5lZmZpY2ll
bnQgd2F5IG9mIGFjY3VtdWxhdGluZyB0aGUgbWFya3VwLgotICAgIC8vIFdlJ3JlIGNvbnZlcnRp
bmcgcmVzdWx0cyBvZiBhcHBlbmRTdGFydE1hcmt1cCBhbmQgYXBwZW5kRW5kTWFya3VwIGZyb20g
VmVjdG9yPFVDaGFyPiB0byBTdHJpbmcKLSAgICAvLyBhbmQgdGhlbiBiYWNrIHRvIFZlY3RvcjxV
Q2hhcj4gYW5kIGFnYWluIHRvIFN0cmluZyBoZXJlLgotICAgIFN0cmluZyB0YWtlUmVzdWx0cygp
Ci0gICAgewotICAgICAgICBzaXplX3QgbGVuZ3RoID0gMDsKLQotICAgICAgICBzaXplX3QgcHJl
Q291bnQgPSBwcmVNYXJrdXBzLnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBwcmVDb3VudDsgKytpKQotICAgICAgICAgICAgbGVuZ3RoICs9IHByZU1hcmt1cHNbaV0ubGVu
Z3RoKCk7Ci0KLSAgICAgICAgc2l6ZV90IHBvc3RDb3VudCA9IHBvc3RNYXJrdXBzLnNpemUoKTsK
LSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3N0Q291bnQ7ICsraSkKLSAgICAgICAg
ICAgIGxlbmd0aCArPSBwb3N0TWFya3Vwc1tpXS5sZW5ndGgoKTsKLQotICAgICAgICBWZWN0b3I8
VUNoYXI+IHJlc3VsdDsKLSAgICAgICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobGVu
Z3RoKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gcHJlQ291bnQ7IGkgPiAwOyAtLWkpCi0g
ICAgICAgICAgICBXVEY6OmFwcGVuZChyZXN1bHQsIHByZU1hcmt1cHNbaSAtIDFdKTsKLQotICAg
ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvc3RDb3VudDsgKytpKQotICAgICAgICAgICAg
V1RGOjphcHBlbmQocmVzdWx0LCBwb3N0TWFya3Vwc1tpXSk7Ci0KLSAgICAgICAgcmV0dXJuIFN0
cmluZzo6YWRvcHQocmVzdWx0KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPE5vZGUq
PiogbV9ub2RlczsKLSAgICBWZWN0b3I8U3RyaW5nPiBwcmVNYXJrdXBzOwotICAgIFZlY3RvcjxT
dHJpbmc+IHBvc3RNYXJrdXBzOwotfTsKLQotc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVzKE1h
cmt1cEFjY3VtdWxhdG9yV3JhcHBlciYgYWNjdW11bGF0b3IsIE5vZGUqIHN0YXJ0Tm9kZSwgTm9k
ZSogcGFzdEVuZCwgY29uc3QgUmFuZ2UqIHJhbmdlLCBFQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSBh
bm5vdGF0ZSwgRUFic29sdXRlVVJMcyBhYnNvbHV0ZVVSTHMpCitzdGF0aWMgTm9kZSogc2VyaWFs
aXplTm9kZXMoTWFya3VwQWNjdW11bGF0b3ImIGFjY3VtdWxhdG9yLCBOb2RlKiBzdGFydE5vZGUs
IE5vZGUqIHBhc3RFbmQsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90YXRlRm9ySW50ZXJjaGFu
Z2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzKQogewogICAgIFZlY3RvcjxO
b2RlKj4gYW5jZXN0b3JzVG9DbG9zZTsKICAgICBOb2RlKiBuZXh0OwpAQCAtODg4LDcgKzg2MCw3
IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3QgUmFuZ2UqIHJhbmdlLCAKIAogICAgIGRvY3Vt
ZW50LT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKIAotICAgIE1hcmt1
cEFjY3VtdWxhdG9yV3JhcHBlciBhY2N1bXVsYXRvcihub2Rlcyk7CisgICAgTWFya3VwQWNjdW11
bGF0b3IgYWNjdW11bGF0b3Iobm9kZXMpOwogICAgIE5vZGUqIHBhc3RFbmQgPSB1cGRhdGVkUmFu
Z2UtPnBhc3RMYXN0Tm9kZSgpOwogCiAgICAgTm9kZSogc3RhcnROb2RlID0gdXBkYXRlZFJhbmdl
LT5maXJzdE5vZGUoKTsKQEAgLTk4Niw3ICs5NTgsNyBAQCBTdHJpbmcgY3JlYXRlTWFya3VwKGNv
bnN0IFJhbmdlKiByYW5nZSwgCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAg
IC8vIFNpbmNlIHRoaXMgbm9kZSBhbmQgYWxsIHRoZSBvdGhlciBhbmNlc3RvcnMgYXJlIG5vdCBp
biB0aGUgc2VsZWN0aW9uIHdlIHdhbnQgdG8gc2V0IFJhbmdlRnVsbHlTZWxlY3RzTm9kZSB0byBE
b2VzTm90RnVsbHlTZWxlY3ROb2RlCiAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBzdHlsZXMg
dGhhdCBhZmZlY3QgdGhlIGV4dGVyaW9yIG9mIHRoZSBub2RlIGFyZSBub3QgaW5jbHVkZWQuCi0g
ICAgICAgICAgICAgICAgYWNjdW11bGF0b3Iud3JhcFdpdGhOb2RlKGFuY2VzdG9yLCB1cGRhdGVk
UmFuZ2UuZ2V0KCksIGFubm90YXRlLCBhYnNvbHV0ZVVSTHMsIGNvbnZlcnRCbG9ja3NUb0lubGlu
ZXMsIDAsIERvZXNOb3RGdWxseVNlbGVjdE5vZGUpOworICAgICAgICAgICAgICAgIGFjY3VtdWxh
dG9yLndyYXBXaXRoTm9kZShhbmNlc3RvciwgdXBkYXRlZFJhbmdlLmdldCgpLCBhbm5vdGF0ZSwg
YWJzb2x1dGVVUkxzLCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCAwLCBNYXJrdXBBY2N1bXVsYXRv
cjo6RG9lc05vdEZ1bGx5U2VsZWN0Tm9kZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBp
ZiAobm9kZXMpCiAgICAgICAgICAgICAgICAgbm9kZXMtPmFwcGVuZChhbmNlc3Rvcik7CkBAIC0x
MDQxLDYgKzEwMTMsNTQgQEAgU3RyaW5nIGNyZWF0ZU1hcmt1cChjb25zdCBSYW5nZSogcmFuZ2Us
IAogICAgIHJldHVybiBhY2N1bXVsYXRvci50YWtlUmVzdWx0cygpOwogfQogCitjbGFzcyBBdHRy
aWJ1dGVDaGFuZ2UgeworcHVibGljOgorICAgIEF0dHJpYnV0ZUNoYW5nZSgpCisgICAgOiBtX25h
bWUobnVsbEF0b20sIG51bGxBdG9tLCBudWxsQXRvbSkKKyAgICB7CisgICAgfQorCisgICAgQXR0
cmlidXRlQ2hhbmdlKFBhc3NSZWZQdHI8RWxlbWVudD4gZWxlbWVudCwgY29uc3QgUXVhbGlmaWVk
TmFtZSYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKKyAgICA6IG1fZWxlbWVudChlbGVtZW50
KSwgbV9uYW1lKG5hbWUpLCBtX3ZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lk
IGFwcGx5KCkKKyAgICB7CisgICAgICAgIG1fZWxlbWVudC0+c2V0QXR0cmlidXRlKG1fbmFtZSwg
bV92YWx1ZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlZlB0cjxFbGVtZW50PiBtX2VsZW1l
bnQ7CisgICAgUXVhbGlmaWVkTmFtZSBtX25hbWU7CisgICAgU3RyaW5nIG1fdmFsdWU7Cit9Owor
CitzdGF0aWMgdm9pZCBjb21wbGV0ZVVSTHMoTm9kZSogbm9kZSwgY29uc3QgU3RyaW5nJiBiYXNl
VVJMKQoreworICAgIFZlY3RvcjxBdHRyaWJ1dGVDaGFuZ2U+IGNoYW5nZXM7CisKKyAgICBLVVJM
IHBhcnNlZEJhc2VVUkwoUGFyc2VkVVJMU3RyaW5nLCBiYXNlVVJMKTsKKworICAgIE5vZGUqIGVu
ZCA9IG5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoKTsKKyAgICBmb3IgKE5vZGUqIG4gPSBub2Rl
OyBuICE9IGVuZDsgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSkgeworICAgICAgICBpZiAobi0+
aXNFbGVtZW50Tm9kZSgpKSB7CisgICAgICAgICAgICBFbGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8
RWxlbWVudCo+KG4pOworICAgICAgICAgICAgTmFtZWROb2RlTWFwKiBhdHRycyA9IGUtPmF0dHJp
YnV0ZXMoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGF0dHJzLT5sZW5ndGgoKTsK
KyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAg
ICAgICAgICAgICAgIEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJzLT5hdHRyaWJ1dGVJdGVtKGkpOwor
ICAgICAgICAgICAgICAgIGlmIChlLT5pc1VSTEF0dHJpYnV0ZShhdHRyKSkKKyAgICAgICAgICAg
ICAgICAgICAgY2hhbmdlcy5hcHBlbmQoQXR0cmlidXRlQ2hhbmdlKGUsIGF0dHItPm5hbWUoKSwg
S1VSTChwYXJzZWRCYXNlVVJMLCBhdHRyLT52YWx1ZSgpKS5zdHJpbmcoKSkpOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG51bUNoYW5nZXMgPSBjaGFuZ2Vz
LnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNoYW5nZXM7ICsraSkKKyAg
ICAgICAgY2hhbmdlc1tpXS5hcHBseSgpOworfQorICAgIAogUGFzc1JlZlB0cjxEb2N1bWVudEZy
YWdtZW50PiBjcmVhdGVGcmFnbWVudEZyb21NYXJrdXAoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25z
dCBTdHJpbmcmIG1hcmt1cCwgY29uc3QgU3RyaW5nJiBiYXNlVVJMLCBGcmFnbWVudFNjcmlwdGlu
Z1Blcm1pc3Npb24gc2NyaXB0aW5nUGVybWlzc2lvbikKIHsKICAgICBSZWZQdHI8RG9jdW1lbnRG
cmFnbWVudD4gZnJhZ21lbnQgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCktPmNyZWF0ZUNv
bnRleHR1YWxGcmFnbWVudChtYXJrdXAsIHNjcmlwdGluZ1Blcm1pc3Npb24pOwpAQCAtMTA1MSw3
ICsxMDcxLDcgQEAgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBjcmVhdGVGcmFnbQogICAg
IHJldHVybiBmcmFnbWVudC5yZWxlYXNlKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlcmlhbGl6ZU5v
ZGVzV2l0aE5hbWVzcGFjZXMoTWFya3VwQWNjdW11bGF0b3JXcmFwcGVyJiBhY2N1bXVsYXRvciwg
Y29uc3QgTm9kZSogbm9kZSwgTm9kZSogbm9kZVRvU2tpcCwgRUNoaWxkcmVuT25seSBjaGlsZHJl
bk9ubHksIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzLCBjb25zdCBIYXNoTWFwPEF0b21pY1N0
cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4qIG5hbWVzcGFjZXMpCitzdGF0aWMgdm9pZCBz
ZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKE1hcmt1cEFjY3VtdWxhdG9yJiBhY2N1bXVsYXRv
ciwgY29uc3QgTm9kZSogbm9kZSwgTm9kZSogbm9kZVRvU2tpcCwgRUNoaWxkcmVuT25seSBjaGls
ZHJlbk9ubHksIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzLCBjb25zdCBIYXNoTWFwPEF0b21p
Y1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4qIG5hbWVzcGFjZXMpCiB7CiAgICAgaWYg
KG5vZGUgPT0gbm9kZVRvU2tpcCkKICAgICAgICAgcmV0dXJuOwpAQCAtMTA4NCw3ICsxMTA0LDcg
QEAgU3RyaW5nIGNyZWF0ZU1hcmt1cChjb25zdCBOb2RlKiBub2RlLCBFQwogICAgICAgICAgICAg
cmV0dXJuICIiOwogICAgIH0KIAotICAgIE1hcmt1cEFjY3VtdWxhdG9yV3JhcHBlciBhY2N1bXVs
YXRvcihub2Rlcyk7CisgICAgTWFya3VwQWNjdW11bGF0b3IgYWNjdW11bGF0b3Iobm9kZXMpOwog
ICAgIHNlcmlhbGl6ZU5vZGVzV2l0aE5hbWVzcGFjZXMoYWNjdW11bGF0b3IsIG5vZGUsIGRlbGV0
ZUJ1dHRvbkNvbnRhaW5lckVsZW1lbnQsIGNoaWxkcmVuT25seSwgYWJzb2x1dGVVUkxzLCAwKTsK
ICAgICByZXR1cm4gYWNjdW11bGF0b3IudGFrZVJlc3VsdHMoKTsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64723</attachid>
            <date>2010-08-18 10:10:23 -0700</date>
            <delta_ts>2010-08-18 14:53:18 -0700</delta_ts>
            <desc>Removed unnecessary cleanups</desc>
            <filename>bug-43936-20100818101021.patch</filename>
            <type>text/plain</type>
            <size>20989</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NTYxMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDMgQEAKKzIwMTAtMDgtMTggIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgR3Jv
dXAgZnVuY3Rpb25zIGluIG1hcmt1cC5jcHAgaW50byBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQzOTM2CisK
KyAgICAgICAgUmVuYW1lZCBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIgdG8gTWFya3VwQWNjdW11
bGF0b3IgYW5kIG1vdmVkIHRoZSBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIKKyAgICAgICAgdG8g
dGhlIHRvcCBvZiBtYXJrdXAuY3BwLiBNYWRlIHZhcmlvdXMgZnVuY3Rpb25zIHByaXZhdGUgbWVt
YmVyIGZ1bmN0aW9ucyBvZiBNYXJrdXBBY2N1bXVsYXRvci4KKworICAgICAgICBObyBuZXcgdGVz
dHMgYXJlIGFkZGVkIHNpbmNlIHRoaXMgaXMgYSBjbGVhbnVwLgorCisgICAgICAgICogZWRpdGlu
Zy9tYXJrdXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Oik6Cisg
ICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6TWFya3VwQWNjdW11bGF0b3IpOgor
ICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Omluc2VydFN0cmluZyk6CisgICAg
ICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6aW5zZXJ0T3BlblRhZyk6CisgICAgICAg
IChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6aW5zZXJ0RW5kVGFnKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjp3cmFwV2l0aE5vZGUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoU3R5bGVOb2RlKToKKyAgICAgICAgKFdlYkNv
cmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjp0YWtlUmVzdWx0cyk6CisgICAgICAgIChXZWJDb3JlOjpN
YXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kQXR0cmlidXRlVmFsdWUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWFya3VwQWNjdW11bGF0b3I6OmVzY2FwZUNvbnRlbnRUZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRRdW90ZWRVUkxBdHRyaWJ1dGVWYWx1ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6c3RyaW5nVmFsdWVGb3JSYW5nZSk6
CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6dWNoYXJSYW5nZSk6CisgICAg
ICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kVUNoYXJSYW5nZSk6CisgICAg
ICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRUZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VFbGVtKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VBdHRy
KToKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmROYW1lc3BhY2Up
OgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZERvY3VtZW50VHlw
ZSk6CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6cmVtb3ZlRXh0ZXJpb3JT
dHlsZXMpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0YXJ0
TWFya3VwKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRTZWxm
Q2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZEVuZE1h
cmt1cCk6CisgICAgICAgIChXZWJDb3JlOjpzZXJpYWxpemVOb2Rlcyk6CisgICAgICAgIChXZWJD
b3JlOjpjcmVhdGVNYXJrdXApOgorICAgICAgICAoV2ViQ29yZTo6c2VyaWFsaXplTm9kZXNXaXRo
TmFtZXNwYWNlcyk6CisKIDIwMTAtMDgtMTggIEdpcmlzaCBSYW1ha3Jpc2huYW4gIDxnaXJpc2hA
Zm9yd2FyZGJpYXMuaW4+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSb2hkZSBDaHJp
c3RpYW5zZW4uCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAkocmV2aXNpb24gNjU2MTIpCisrKyBXZWJDb3Jl
L2VkaXRpbmcvbWFya3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjYsOCArNjYsNiBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLXN0YXRpYyBp
bmxpbmUgYm9vbCBzaG91bGRTZWxmQ2xvc2UoY29uc3QgTm9kZSAqbm9kZSk7Ci0KIGNsYXNzIEF0
dHJpYnV0ZUNoYW5nZSB7CiBwdWJsaWM6CiAgICAgQXR0cmlidXRlQ2hhbmdlKCkKQEAgLTkxLDcg
Kzg5LDEyMiBAQCBwcml2YXRlOgogICAgIFN0cmluZyBtX3ZhbHVlOwogfTsKIAotc3RhdGljIHZv
aWQgYXBwZW5kQXR0cmlidXRlVmFsdWUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBTdHJp
bmcmIGF0dHIsIGJvb2wgZXNjYXBlTkJTUCkKK2NsYXNzIE1hcmt1cEFjY3VtdWxhdG9yIHsKK3B1
YmxpYzoKKyAgICBlbnVtIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSB7IERvZXNGdWxseVNlbGVjdE5v
ZGUsIERvZXNOb3RGdWxseVNlbGVjdE5vZGUgfTsKKworICAgIE1hcmt1cEFjY3VtdWxhdG9yKFZl
Y3RvcjxOb2RlKj4qIG5vZGVzKQorICAgIDogbV9ub2Rlcyhub2RlcykKKyAgICB7CisgICAgfQor
ICAgIHZvaWQgaW5zZXJ0U3RyaW5nKGNvbnN0IFN0cmluZyYgcyk7CisgICAgdm9pZCBpbnNlcnRP
cGVuVGFnKGNvbnN0IE5vZGUqLCBjb25zdCBSYW5nZSosIEVBbm5vdGF0ZUZvckludGVyY2hhbmdl
LCBFQWJzb2x1dGVVUkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMgPSBmYWxzZSwgSGFz
aE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2VzID0g
MCwgUmFuZ2VGdWxseVNlbGVjdHNOb2RlID0gRG9lc0Z1bGx5U2VsZWN0Tm9kZSk7CisgICAgdm9p
ZCBpbnNlcnRFbmRUYWcoY29uc3QgTm9kZSopOworICAgIHZvaWQgd3JhcFdpdGhOb2RlKGNvbnN0
IE5vZGUqLCBjb25zdCBSYW5nZSosIEVBbm5vdGF0ZUZvckludGVyY2hhbmdlLCBFQWJzb2x1dGVV
UkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMgPSBmYWxzZSwgSGFzaE1hcDxBdG9taWNT
dHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2VzID0gMCwgUmFuZ2VGdWxs
eVNlbGVjdHNOb2RlID0gRG9lc0Z1bGx5U2VsZWN0Tm9kZSk7CisgICAgdm9pZCB3cmFwV2l0aFN0
eWxlTm9kZShDU1NTdHlsZURlY2xhcmF0aW9uKiwgRG9jdW1lbnQqLCBib29sIGlzQmxvY2sgPSBm
YWxzZSk7CisgICAgU3RyaW5nIHRha2VSZXN1bHRzKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBh
cHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYg
YXR0ciwgYm9vbCBlc2NhcGVOQlNQKTsKKyAgICBTdHJpbmcgZXNjYXBlQ29udGVudFRleHQoY29u
c3QgU3RyaW5nJiBpbiwgYm9vbCBlc2NhcGVOQlNQKTsKKyAgICB2b2lkIGFwcGVuZFF1b3RlZFVS
TEF0dHJpYnV0ZVZhbHVlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxT
dHJpbmcpOworICAgIFN0cmluZyBzdHJpbmdWYWx1ZUZvclJhbmdlKGNvbnN0IE5vZGUqLCBjb25z
dCBSYW5nZSopOworICAgIHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHVjaGFyUmFuZ2UoY29u
c3QgTm9kZSosIGNvbnN0IFJhbmdlICopOworICAgIHZvaWQgYXBwZW5kVUNoYXJSYW5nZShWZWN0
b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHJhbmdl
KTsKKyAgICBTdHJpbmcgcmVuZGVyZWRUZXh0KGNvbnN0IE5vZGUqLCBjb25zdCBSYW5nZSopOwor
ICAgIGJvb2wgc2hvdWxkQWRkTmFtZXNwYWNlRWxlbShjb25zdCBFbGVtZW50Kik7CisgICAgYm9v
bCBzaG91bGRBZGROYW1lc3BhY2VBdHRyKGNvbnN0IEF0dHJpYnV0ZSosIEhhc2hNYXA8QXRvbWlj
U3RyaW5nSW1wbCosIEF0b21pY1N0cmluZ0ltcGwqPiYgbmFtZXNwYWNlcyk7CisgICAgdm9pZCBh
cHBlbmROYW1lc3BhY2UoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBBdG9taWNTdHJpbmcm
IHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5nJiBucywgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBs
KiwgQXRvbWljU3RyaW5nSW1wbCo+JiBuYW1lc3BhY2VzKTsKKyAgICB2b2lkIGFwcGVuZERvY3Vt
ZW50VHlwZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IERvY3VtZW50VHlwZSopOworICAg
IHZvaWQgcmVtb3ZlRXh0ZXJpb3JTdHlsZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qKTsK
KyAgICB2b2lkIGFwcGVuZFN0YXJ0TWFya3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3Qg
Tm9kZSosIGNvbnN0IFJhbmdlKiwgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UsIEVBYnNvbHV0ZVVS
THMsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcywgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBs
KiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2VzLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUp
OworICAgIGJvb2wgc2hvdWxkU2VsZkNsb3NlKGNvbnN0IE5vZGUgKm5vZGUpOworICAgIHZvaWQg
YXBwZW5kRW5kTWFya3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgTm9kZSopOworCisg
ICAgVmVjdG9yPE5vZGUqPiogbV9ub2RlczsKKyAgICBWZWN0b3I8U3RyaW5nPiBwcmVNYXJrdXBz
OworICAgIFZlY3RvcjxTdHJpbmc+IHBvc3RNYXJrdXBzOworfTsKKwordm9pZCBNYXJrdXBBY2N1
bXVsYXRvcjo6aW5zZXJ0U3RyaW5nKGNvbnN0IFN0cmluZyYgcykKK3sKKyAgICBwb3N0TWFya3Vw
cy5hcHBlbmQocyk7Cit9CisKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6Omluc2VydE9wZW5UYWco
Y29uc3QgTm9kZSogbm9kZSwgY29uc3QgUmFuZ2UqIHJhbmdlLCBFQW5ub3RhdGVGb3JJbnRlcmNo
YW5nZSBhbm5vdGF0ZSwgRUFic29sdXRlVVJMcyBhYnNvbHV0ZVVSTHMsIGJvb2wgY29udmVydEJs
b2Nrc1RvSW5saW5lcywgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1w
bCo+KiBuYW1lc3BhY2VzLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgcmFuZ2VGdWxseVNlbGVjdHNO
b2RlKQoreworICAgIFZlY3RvcjxVQ2hhcj4gcmVzdWx0OworICAgIGFwcGVuZFN0YXJ0TWFya3Vw
KHJlc3VsdCwgbm9kZSwgcmFuZ2UsIGFubm90YXRlLCBhYnNvbHV0ZVVSTHMsIGNvbnZlcnRCbG9j
a3NUb0lubGluZXMsIG5hbWVzcGFjZXMsIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSk7CisgICAgcG9z
dE1hcmt1cHMuYXBwZW5kKFN0cmluZzo6YWRvcHQocmVzdWx0KSk7CisgICAgaWYgKG1fbm9kZXMp
CisgICAgICAgIG1fbm9kZXMtPmFwcGVuZChjb25zdF9jYXN0PE5vZGUqPihub2RlKSk7Cit9CisK
K3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6Omluc2VydEVuZFRhZyhjb25zdCBOb2RlKiBub2RlKQor
eworICAgIFZlY3RvcjxVQ2hhcj4gcmVzdWx0OworICAgIGFwcGVuZEVuZE1hcmt1cChyZXN1bHQs
IG5vZGUpOworICAgIHBvc3RNYXJrdXBzLmFwcGVuZChTdHJpbmc6OmFkb3B0KHJlc3VsdCkpOwor
fQorCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjp3cmFwV2l0aE5vZGUoY29uc3QgTm9kZSogbm9k
ZSwgY29uc3QgUmFuZ2UqIHJhbmdlLCBFQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwg
RUFic29sdXRlVVJMcyBhYnNvbHV0ZVVSTHMsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcywg
SGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2Vz
LCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgcmFuZ2VGdWxseVNlbGVjdHNOb2RlKQoreworICAgIFZl
Y3RvcjxVQ2hhcj4gcmVzdWx0OworICAgIGFwcGVuZFN0YXJ0TWFya3VwKHJlc3VsdCwgbm9kZSwg
cmFuZ2UsIGFubm90YXRlLCBhYnNvbHV0ZVVSTHMsIGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIG5h
bWVzcGFjZXMsIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSk7CisgICAgcHJlTWFya3Vwcy5hcHBlbmQo
U3RyaW5nOjphZG9wdChyZXN1bHQpKTsKKyAgICBpbnNlcnRFbmRUYWcobm9kZSk7CisgICAgaWYg
KG1fbm9kZXMpCisgICAgICAgIG1fbm9kZXMtPmFwcGVuZChjb25zdF9jYXN0PE5vZGUqPihub2Rl
KSk7Cit9CisgICAgCitzdGF0aWMgYm9vbCBwcm9wZXJ0eU1pc3NpbmdPckVxdWFsVG9Ob25lKENT
U1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlLCBpbnQgcHJvcGVydHlJRCk7CisgICAgCit2b2lkIE1h
cmt1cEFjY3VtdWxhdG9yOjp3cmFwV2l0aFN0eWxlTm9kZShDU1NTdHlsZURlY2xhcmF0aW9uKiBz
dHlsZSwgRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIGlzQmxvY2spCit7CisgICAgLy8gQWxsIHRl
eHQtZGVjb3JhdGlvbi1yZWxhdGVkIGVsZW1lbnRzIHNob3VsZCBoYXZlIGJlZW4gdHJlYXRlZCBh
cyBzcGVjaWFsIGFuY2VzdG9ycworICAgIC8vIElmIHdlIGV2ZXIgaGl0IHRoaXMgQVNTRVJULCB3
ZSBzaG91bGQgZXhwb3J0IFN0eWxlQ2hhbmdlIGluIEFwcGx5U3R5bGVDb21tYW5kIGFuZCB1c2Ug
aXQgaGVyZQorICAgIEFTU0VSVChwcm9wZXJ0eU1pc3NpbmdPckVxdWFsVG9Ob25lKHN0eWxlLCBD
U1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uKSAmJiBwcm9wZXJ0eU1pc3NpbmdPckVxdWFsVG9Ob25l
KHN0eWxlLCBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0KSk7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGRpdlN0eWxlLCAoIjxkaXYgc3R5bGU9
XCIiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGRpdkNsb3NlLCAo
IjwvZGl2PiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgc3R5bGVT
cGFuT3BlbiwgKCI8c3BhbiBjbGFzcz1cIiIgQXBwbGVTdHlsZVNwYW5DbGFzcyAiXCIgc3R5bGU9
XCIiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIHN0eWxlU3BhbkNs
b3NlLCAoIjwvc3Bhbj4iKSk7CisgICAgVmVjdG9yPFVDaGFyPiBvcGVuVGFnOworICAgIFdURjo6
YXBwZW5kKG9wZW5UYWcsIGlzQmxvY2sgPyBkaXZTdHlsZSA6IHN0eWxlU3Bhbk9wZW4pOworICAg
IGFwcGVuZEF0dHJpYnV0ZVZhbHVlKG9wZW5UYWcsIHN0eWxlLT5jc3NUZXh0KCksIGRvY3VtZW50
LT5pc0hUTUxEb2N1bWVudCgpKTsKKyAgICBvcGVuVGFnLmFwcGVuZCgnXCInKTsKKyAgICBvcGVu
VGFnLmFwcGVuZCgnPicpOworICAgIHByZU1hcmt1cHMuYXBwZW5kKFN0cmluZzo6YWRvcHQob3Bl
blRhZykpOworICAgIHBvc3RNYXJrdXBzLmFwcGVuZChpc0Jsb2NrID8gZGl2Q2xvc2UgOiBzdHls
ZVNwYW5DbG9zZSk7Cit9CisgICAgCisvLyBGSVhNRTogVGhpcyBpcyBhIHZlcnkgaW5lZmZpY2ll
bnQgd2F5IG9mIGFjY3VtdWxhdGluZyB0aGUgbWFya3VwLgorLy8gV2UncmUgY29udmVydGluZyBy
ZXN1bHRzIG9mIGFwcGVuZFN0YXJ0TWFya3VwIGFuZCBhcHBlbmRFbmRNYXJrdXAgZnJvbSBWZWN0
b3I8VUNoYXI+IHRvIFN0cmluZworLy8gYW5kIHRoZW4gYmFjayB0byBWZWN0b3I8VUNoYXI+IGFu
ZCBhZ2FpbiB0byBTdHJpbmcgaGVyZS4KK1N0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6dGFrZVJl
c3VsdHMoKQoreworICAgIHNpemVfdCBsZW5ndGggPSAwOworICAgIAorICAgIHNpemVfdCBwcmVD
b3VudCA9IHByZU1hcmt1cHMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJl
Q291bnQ7ICsraSkKKyAgICAgICAgbGVuZ3RoICs9IHByZU1hcmt1cHNbaV0ubGVuZ3RoKCk7Cisg
ICAgCisgICAgc2l6ZV90IHBvc3RDb3VudCA9IHBvc3RNYXJrdXBzLnNpemUoKTsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHBvc3RDb3VudDsgKytpKQorICAgICAgICBsZW5ndGggKz0gcG9z
dE1hcmt1cHNbaV0ubGVuZ3RoKCk7CisgICAgCisgICAgVmVjdG9yPFVDaGFyPiByZXN1bHQ7Cisg
ICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobGVuZ3RoKTsKKyAgICAKKyAgICBmb3Ig
KHNpemVfdCBpID0gcHJlQ291bnQ7IGkgPiAwOyAtLWkpCisgICAgICAgIFdURjo6YXBwZW5kKHJl
c3VsdCwgcHJlTWFya3Vwc1tpIC0gMV0pOworICAgIAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgcG9zdENvdW50OyArK2kpCisgICAgICAgIFdURjo6YXBwZW5kKHJlc3VsdCwgcG9zdE1hcmt1
cHNbaV0pOworICAgIAorICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KHJlc3VsdCk7Cit9CisKK3Zv
aWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZEF0dHJpYnV0ZVZhbHVlKFZlY3RvcjxVQ2hhcj4m
IHJlc3VsdCwgY29uc3QgU3RyaW5nJiBhdHRyLCBib29sIGVzY2FwZU5CU1ApCiB7CiAgICAgY29u
c3QgVUNoYXIqIHVjaGFycyA9IGF0dHIuY2hhcmFjdGVycygpOwogICAgIHVuc2lnbmVkIGxlbiA9
IGF0dHIubGVuZ3RoKCk7CkBAIC0xODEsMTQgKzI5NCwxNCBAQCBzdGF0aWMgdm9pZCBhcHBlbmRF
c2NhcGVkQ29udGVudChWZWN0b3I8CiAgICAgcmVzdWx0LmFwcGVuZCh1Y2hhcnMgKyBsYXN0Q29w
aWVkRnJvbSwgbGVuIC0gbGFzdENvcGllZEZyb20pOwogfSAgICAKIAotc3RhdGljIFN0cmluZyBl
c2NhcGVDb250ZW50VGV4dChjb25zdCBTdHJpbmcmIGluLCBib29sIGVzY2FwZU5CU1ApCitTdHJp
bmcgTWFya3VwQWNjdW11bGF0b3I6OmVzY2FwZUNvbnRlbnRUZXh0KGNvbnN0IFN0cmluZyYgaW4s
IGJvb2wgZXNjYXBlTkJTUCkKIHsKICAgICBWZWN0b3I8VUNoYXI+IGJ1ZmZlcjsKICAgICBhcHBl
bmRFc2NhcGVkQ29udGVudChidWZmZXIsIG1ha2VfcGFpcihpbi5jaGFyYWN0ZXJzKCksIGluLmxl
bmd0aCgpKSwgZXNjYXBlTkJTUCk7CiAgICAgcmV0dXJuIFN0cmluZzo6YWRvcHQoYnVmZmVyKTsK
IH0KLSAgICAKLXN0YXRpYyB2b2lkIGFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZhbHVlKFZlY3Rv
cjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCisKK3ZvaWQgTWFya3Vw
QWNjdW11bGF0b3I6OmFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZhbHVlKFZlY3RvcjxVQ2hhcj4m
IHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCiB7CiAgICAgVUNoYXIgcXVvdGVDaGFy
ID0gJ1wiJzsKICAgICBTdHJpbmcgc3RyaXBwZWRVUkxTdHJpbmcgPSB1cmxTdHJpbmcuc3RyaXBX
aGl0ZVNwYWNlKCk7CkBAIC0yMTEsOCArMzI0LDggQEAgc3RhdGljIHZvaWQgYXBwZW5kUXVvdGVk
VVJMQXR0cmlidXRlVmFsdQogICAgIGFwcGVuZEF0dHJpYnV0ZVZhbHVlKHJlc3VsdCwgdXJsU3Ry
aW5nLCBmYWxzZSk7CiAgICAgcmVzdWx0LmFwcGVuZChxdW90ZUNoYXIpOyAgICAKIH0KLSAgICAK
LXN0YXRpYyBTdHJpbmcgc3RyaW5nVmFsdWVGb3JSYW5nZShjb25zdCBOb2RlKiBub2RlLCBjb25z
dCBSYW5nZSogcmFuZ2UpCisKK1N0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6c3RyaW5nVmFsdWVG
b3JSYW5nZShjb25zdCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSogcmFuZ2UpCiB7CiAgICAgaWYg
KCFyYW5nZSkKICAgICAgICAgcmV0dXJuIG5vZGUtPm5vZGVWYWx1ZSgpOwpAQCAtMjI2LDcgKzMz
OSw3IEBAIHN0YXRpYyBTdHJpbmcgc3RyaW5nVmFsdWVGb3JSYW5nZShjb25zdCAKICAgICByZXR1
cm4gc3RyOwogfQogCi1zdGF0aWMgaW5saW5lIHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHVj
aGFyUmFuZ2UoY29uc3QgTm9kZSAqbm9kZSwgY29uc3QgUmFuZ2UgKnJhbmdlKQorcGFpcjxjb25z
dCBVQ2hhciosIHNpemVfdD4gTWFya3VwQWNjdW11bGF0b3I6OnVjaGFyUmFuZ2UoY29uc3QgTm9k
ZSogbm9kZSwgY29uc3QgUmFuZ2UqIHJhbmdlKQogewogICAgIFN0cmluZyBzdHIgPSBub2RlLT5u
b2RlVmFsdWUoKTsKICAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IHN0ci5jaGFyYWN0ZXJz
KCk7CkBAIC0yNDUsMTMgKzM1OCwxMyBAQCBzdGF0aWMgaW5saW5lIHBhaXI8Y29uc3QgVUNoYXIq
LCBzaXplX3Q+CiAgICAgCiAgICAgcmV0dXJuIG1ha2VfcGFpcihjaGFyYWN0ZXJzLCBsZW5ndGgp
OwogfQotICAgIAotc3RhdGljIGlubGluZSB2b2lkIGFwcGVuZFVDaGFyUmFuZ2UoVmVjdG9yPFVD
aGFyPiYgcmVzdWx0LCBjb25zdCBwYWlyPGNvbnN0IFVDaGFyKiwgc2l6ZV90PiByYW5nZSkKKwor
dm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kVUNoYXJSYW5nZShWZWN0b3I8VUNoYXI+JiBy
ZXN1bHQsIGNvbnN0IHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHJhbmdlKQogewogICAgIHJl
c3VsdC5hcHBlbmQocmFuZ2UuZmlyc3QsIHJhbmdlLnNlY29uZCk7CiB9Ci0gICAgCi1zdGF0aWMg
U3RyaW5nIHJlbmRlcmVkVGV4dChjb25zdCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSogcmFuZ2Up
CisKK1N0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRUZXh0KGNvbnN0IE5vZGUqIG5v
ZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkKIHsKICAgICBpZiAoIW5vZGUtPmlzVGV4dE5vZGUoKSkK
ICAgICAgICAgcmV0dXJuIFN0cmluZygpOwpAQCAtMzA0LDcgKzQxNyw3IEBAIHN0YXRpYyB2b2lk
IHJlbW92ZURlZmF1bHRTdHlsZXMoQ1NTTXV0YWIKICAgICBwcmVwYXJlRWRpdGluZ1N0eWxlVG9B
cHBseUF0KHN0eWxlLCBQb3NpdGlvbihkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCksIDApKTsK
IH0KIAotc3RhdGljIGJvb2wgc2hvdWxkQWRkTmFtZXNwYWNlRWxlbShjb25zdCBFbGVtZW50KiBl
bGVtKQorYm9vbCBNYXJrdXBBY2N1bXVsYXRvcjo6c2hvdWxkQWRkTmFtZXNwYWNlRWxlbShjb25z
dCBFbGVtZW50KiBlbGVtKQogewogICAgIC8vIERvbid0IGFkZCBuYW1lc3BhY2UgYXR0cmlidXRl
IGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhpcyBlbGVtLgogICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgcHJlZml4ID0gZWxlbS0+cHJlZml4KCk7CkBAIC0zMTIsNyArNDI1LDcgQEAgc3Rh
dGljIGJvb2wgc2hvdWxkQWRkTmFtZXNwYWNlRWxlbShjb25zdAogICAgIHJldHVybiAhZWxlbS0+
aGFzQXR0cmlidXRlKGF0dHIpOwogfQogCi1zdGF0aWMgYm9vbCBzaG91bGRBZGROYW1lc3BhY2VB
dHRyKGNvbnN0IEF0dHJpYnV0ZSogYXR0ciwgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRv
bWljU3RyaW5nSW1wbCo+JiBuYW1lc3BhY2VzKQorYm9vbCBNYXJrdXBBY2N1bXVsYXRvcjo6c2hv
dWxkQWRkTmFtZXNwYWNlQXR0cihjb25zdCBBdHRyaWJ1dGUqIGF0dHIsIEhhc2hNYXA8QXRvbWlj
U3RyaW5nSW1wbCosIEF0b21pY1N0cmluZ0ltcGwqPiYgbmFtZXNwYWNlcykKIHsKICAgICBuYW1l
c3BhY2VzLmNoZWNrQ29uc2lzdGVuY3koKTsKIApAQCAtMzMxLDcgKzQ0NCw3IEBAIHN0YXRpYyBi
b29sIHNob3VsZEFkZE5hbWVzcGFjZUF0dHIoY29uc3QKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAot
c3RhdGljIHZvaWQgYXBwZW5kTmFtZXNwYWNlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3Qg
QXRvbWljU3RyaW5nJiBwcmVmaXgsIGNvbnN0IEF0b21pY1N0cmluZyYgbnMsIEhhc2hNYXA8QXRv
bWljU3RyaW5nSW1wbCosIEF0b21pY1N0cmluZ0ltcGwqPiYgbmFtZXNwYWNlcykKK3ZvaWQgTWFy
a3VwQWNjdW11bGF0b3I6OmFwcGVuZE5hbWVzcGFjZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNv
bnN0IEF0b21pY1N0cmluZyYgcHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIG5zLCBIYXNoTWFw
PEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4mIG5hbWVzcGFjZXMpCiB7CiAg
ICAgbmFtZXNwYWNlcy5jaGVja0NvbnNpc3RlbmN5KCk7CiAgICAgaWYgKG5zLmlzRW1wdHkoKSkK
QEAgLTM1Niw3ICs0NjksNyBAQCBzdGF0aWMgdm9pZCBhcHBlbmROYW1lc3BhY2UoVmVjdG9yPFVD
aGFyCiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhcHBlbmREb2N1bWVudFR5cGUoVmVjdG9yPFVD
aGFyPiYgcmVzdWx0LCBjb25zdCBEb2N1bWVudFR5cGUqIG4pCit2b2lkIE1hcmt1cEFjY3VtdWxh
dG9yOjphcHBlbmREb2N1bWVudFR5cGUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBEb2N1
bWVudFR5cGUqIG4pCiB7CiAgICAgaWYgKG4tPm5hbWUoKS5pc0VtcHR5KCkpCiAgICAgICAgIHJl
dHVybjsKQEAgLTM4NSwxNCArNDk4LDEyIEBAIHN0YXRpYyB2b2lkIGFwcGVuZERvY3VtZW50VHlw
ZShWZWN0b3I8VUMKICAgICBhcHBlbmQocmVzdWx0LCAiPiIpOwogfQogCi1zdGF0aWMgdm9pZCBy
ZW1vdmVFeHRlcmlvclN0eWxlcyhDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUpCit2
b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjpyZW1vdmVFeHRlcmlvclN0eWxlcyhDU1NNdXRhYmxlU3R5
bGVEZWNsYXJhdGlvbiogc3R5bGUpCiB7CiAgICAgc3R5bGUtPnJlbW92ZVByb3BlcnR5KENTU1By
b3BlcnR5RmxvYXQpOwogfQogCi1lbnVtIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSB7IERvZXNGdWxs
eVNlbGVjdE5vZGUsIERvZXNOb3RGdWxseVNlbGVjdE5vZGUgfTsKLQotc3RhdGljIHZvaWQgYXBw
ZW5kU3RhcnRNYXJrdXAoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBOb2RlKiBub2RlLCBj
b25zdCBSYW5nZSogcmFuZ2UsIEVBbm5vdGF0ZUZvckludGVyY2hhbmdlIGFubm90YXRlLCBFQWJz
b2x1dGVVUkxzIGFic29sdXRlVVJMcywgYm9vbCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBIYXNo
TWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4qIG5hbWVzcGFjZXMsIFJh
bmdlRnVsbHlTZWxlY3RzTm9kZSByYW5nZUZ1bGx5U2VsZWN0c05vZGUgPSBEb2VzRnVsbHlTZWxl
Y3ROb2RlKQordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kU3RhcnRNYXJrdXAoVmVjdG9y
PFVDaGFyPiYgcmVzdWx0LCBjb25zdCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSogcmFuZ2UsIEVB
bm5vdGF0ZUZvckludGVyY2hhbmdlIGFubm90YXRlLCBFQWJzb2x1dGVVUkxzIGFic29sdXRlVVJM
cywgYm9vbCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwq
LCBBdG9taWNTdHJpbmdJbXBsKj4qIG5hbWVzcGFjZXMsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSBy
YW5nZUZ1bGx5U2VsZWN0c05vZGUpCiB7CiAgICAgaWYgKG5hbWVzcGFjZXMpCiAgICAgICAgIG5h
bWVzcGFjZXMtPmNoZWNrQ29uc2lzdGVuY3koKTsKQEAgLTU2OSw3ICs2ODAsNyBAQCBzdGF0aWMg
aW5saW5lIGJvb2wgZG9lc0hUTUxGb3JiaWRFbmRUYWcoCiAvLyAyLiBFbGVtZW50cyB3LyBjaGls
ZHJlbiBuZXZlciBzZWxmLWNsb3NlIGJlY2F1c2UgdGhleSB1c2UgYSBzZXBhcmF0ZSBlbmQgdGFn
LgogLy8gMy4gSFRNTCBlbGVtZW50cyB3aGljaCBkbyBub3QgaGF2ZSBhICJmb3JiaWRkZW4iIGVu
ZCB0YWcgd2lsbCBjbG9zZSB3aXRoIGEgc2VwYXJhdGUgZW5kIHRhZy4KIC8vIDQuIE90aGVyIGVs
ZW1lbnRzIHNlbGYtY2xvc2UuCi1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkU2VsZkNsb3NlKGNv
bnN0IE5vZGUgKm5vZGUpCitib29sIE1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRTZWxmQ2xvc2Uo
Y29uc3QgTm9kZSAqbm9kZSkKIHsKICAgICBpZiAobm9kZS0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9j
dW1lbnQoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTgwLDcgKzY5MSw3IEBAIHN0YXRp
YyBpbmxpbmUgYm9vbCBzaG91bGRTZWxmQ2xvc2UoY29uc3QKICAgICByZXR1cm4gdHJ1ZTsKIH0K
IAotc3RhdGljIHZvaWQgYXBwZW5kRW5kTWFya3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29u
c3QgTm9kZSogbm9kZSkKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZEVuZE1hcmt1cChW
ZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IE5vZGUqIG5vZGUpCiB7CiAgICAgaWYgKCFub2Rl
LT5pc0VsZW1lbnROb2RlKCkgfHwgc2hvdWxkU2VsZkNsb3NlKG5vZGUpIHx8ICghbm9kZS0+aGFz
Q2hpbGROb2RlcygpICYmIGRvZXNIVE1MRm9yYmlkRW5kVGFnKG5vZGUpKSkKICAgICAgICAgcmV0
dXJuOwpAQCAtNjg5LDk2ICs4MDAsNyBAQCBzdGF0aWMgYm9vbCBzaG91bGRJbmNsdWRlV3JhcHBl
ckZvckZ1bGx5CiAgICAgICAgICAgIHN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU1Byb3Bl
cnR5QmFja2dyb3VuZENvbG9yKTsKIH0KIAotY2xhc3MgTWFya3VwQWNjdW11bGF0b3JXcmFwcGVy
IHsKLXB1YmxpYzoKLSAgICBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIoVmVjdG9yPE5vZGUqPiog
bm9kZXMpCi0gICAgOiBtX25vZGVzKG5vZGVzKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIGlu
c2VydFN0cmluZyhjb25zdCBTdHJpbmcmIHMpCi0gICAgewotICAgICAgICBwb3N0TWFya3Vwcy5h
cHBlbmQocyk7Ci0gICAgfQotCi0gICAgdm9pZCBpbnNlcnRPcGVuVGFnKGNvbnN0IE5vZGUqIG5v
ZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUs
IEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMg
PSBmYWxzZSwgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBu
YW1lc3BhY2VzID0gMCwgUmFuZ2VGdWxseVNlbGVjdHNOb2RlIHJhbmdlRnVsbHlTZWxlY3RzTm9k
ZSA9IERvZXNGdWxseVNlbGVjdE5vZGUpCi0gICAgewotICAgICAgICBWZWN0b3I8VUNoYXI+IHJl
c3VsdDsKLSAgICAgICAgYXBwZW5kU3RhcnRNYXJrdXAocmVzdWx0LCBub2RlLCByYW5nZSwgYW5u
b3RhdGUsIGFic29sdXRlVVJMcywgY29udmVydEJsb2Nrc1RvSW5saW5lcywgbmFtZXNwYWNlcywg
cmFuZ2VGdWxseVNlbGVjdHNOb2RlKTsKLSAgICAgICAgcG9zdE1hcmt1cHMuYXBwZW5kKFN0cmlu
Zzo6YWRvcHQocmVzdWx0KSk7Ci0gICAgICAgIGlmIChtX25vZGVzKQotICAgICAgICAgICAgbV9u
b2Rlcy0+YXBwZW5kKGNvbnN0X2Nhc3Q8Tm9kZSo+KG5vZGUpKTsKLSAgICB9Ci0KLSAgICB2b2lk
IGluc2VydEVuZFRhZyhjb25zdCBOb2RlKiBub2RlKQotICAgIHsKLSAgICAgICAgVmVjdG9yPFVD
aGFyPiByZXN1bHQ7Ci0gICAgICAgIGFwcGVuZEVuZE1hcmt1cChyZXN1bHQsIG5vZGUpOwotICAg
ICAgICBwb3N0TWFya3Vwcy5hcHBlbmQoU3RyaW5nOjphZG9wdChyZXN1bHQpKTsKLSAgICB9Ci0K
LSAgICB2b2lkIHdyYXBXaXRoTm9kZShjb25zdCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSogcmFu
Z2UsIEVBbm5vdGF0ZUZvckludGVyY2hhbmdlIGFubm90YXRlLCBFQWJzb2x1dGVVUkxzIGFic29s
dXRlVVJMcywgYm9vbCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzID0gZmFsc2UsIEhhc2hNYXA8QXRv
bWljU3RyaW5nSW1wbCosIEF0b21pY1N0cmluZ0ltcGwqPiogbmFtZXNwYWNlcyA9IDAsIFJhbmdl
RnVsbHlTZWxlY3RzTm9kZSByYW5nZUZ1bGx5U2VsZWN0c05vZGUgPSBEb2VzRnVsbHlTZWxlY3RO
b2RlKQotICAgIHsKLSAgICAgICAgVmVjdG9yPFVDaGFyPiByZXN1bHQ7Ci0gICAgICAgIGFwcGVu
ZFN0YXJ0TWFya3VwKHJlc3VsdCwgbm9kZSwgcmFuZ2UsIGFubm90YXRlLCBhYnNvbHV0ZVVSTHMs
IGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIG5hbWVzcGFjZXMsIHJhbmdlRnVsbHlTZWxlY3RzTm9k
ZSk7Ci0gICAgICAgIHByZU1hcmt1cHMuYXBwZW5kKFN0cmluZzo6YWRvcHQocmVzdWx0KSk7Ci0g
ICAgICAgIGluc2VydEVuZFRhZyhub2RlKTsKLSAgICAgICAgaWYgKG1fbm9kZXMpCi0gICAgICAg
ICAgICBtX25vZGVzLT5hcHBlbmQoY29uc3RfY2FzdDxOb2RlKj4obm9kZSkpOwotICAgIH0KLQot
ICAgIHZvaWQgd3JhcFdpdGhTdHlsZU5vZGUoQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUsIERv
Y3VtZW50KiBkb2N1bWVudCwgYm9vbCBpc0Jsb2NrID0gZmFsc2UpCi0gICAgewotICAgICAgICAv
LyBBbGwgdGV4dC1kZWNvcmF0aW9uLXJlbGF0ZWQgZWxlbWVudHMgc2hvdWxkIGhhdmUgYmVlbiB0
cmVhdGVkIGFzIHNwZWNpYWwgYW5jZXN0b3JzCi0gICAgICAgIC8vIElmIHdlIGV2ZXIgaGl0IHRo
aXMgQVNTRVJULCB3ZSBzaG91bGQgZXhwb3J0IFN0eWxlQ2hhbmdlIGluIEFwcGx5U3R5bGVDb21t
YW5kIGFuZCB1c2UgaXQgaGVyZQotICAgICAgICBBU1NFUlQocHJvcGVydHlNaXNzaW5nT3JFcXVh
bFRvTm9uZShzdHlsZSwgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbikgJiYgcHJvcGVydHlNaXNz
aW5nT3JFcXVhbFRvTm9uZShzdHlsZSwgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJ
bkVmZmVjdCkpOwotICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgZGl2
U3R5bGUsICgiPGRpdiBzdHlsZT1cIiIpKTsKLSAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChj
b25zdCBTdHJpbmcsIGRpdkNsb3NlLCAoIjwvZGl2PiIpKTsKLSAgICAgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChjb25zdCBTdHJpbmcsIHN0eWxlU3Bhbk9wZW4sICgiPHNwYW4gY2xhc3M9XCIiIEFw
cGxlU3R5bGVTcGFuQ2xhc3MgIlwiIHN0eWxlPVwiIikpOwotICAgICAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKGNvbnN0IFN0cmluZywgc3R5bGVTcGFuQ2xvc2UsICgiPC9zcGFuPiIpKTsKLSAgICAg
ICAgVmVjdG9yPFVDaGFyPiBvcGVuVGFnOwotICAgICAgICBXVEY6OmFwcGVuZChvcGVuVGFnLCBp
c0Jsb2NrID8gZGl2U3R5bGUgOiBzdHlsZVNwYW5PcGVuKTsKLSAgICAgICAgYXBwZW5kQXR0cmli
dXRlVmFsdWUob3BlblRhZywgc3R5bGUtPmNzc1RleHQoKSwgZG9jdW1lbnQtPmlzSFRNTERvY3Vt
ZW50KCkpOwotICAgICAgICBvcGVuVGFnLmFwcGVuZCgnXCInKTsKLSAgICAgICAgb3BlblRhZy5h
cHBlbmQoJz4nKTsKLSAgICAgICAgcHJlTWFya3Vwcy5hcHBlbmQoU3RyaW5nOjphZG9wdChvcGVu
VGFnKSk7Ci0gICAgICAgIHBvc3RNYXJrdXBzLmFwcGVuZChpc0Jsb2NrID8gZGl2Q2xvc2UgOiBz
dHlsZVNwYW5DbG9zZSk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgYSB2ZXJ5IGlu
ZWZmaWNpZW50IHdheSBvZiBhY2N1bXVsYXRpbmcgdGhlIG1hcmt1cC4KLSAgICAvLyBXZSdyZSBj
b252ZXJ0aW5nIHJlc3VsdHMgb2YgYXBwZW5kU3RhcnRNYXJrdXAgYW5kIGFwcGVuZEVuZE1hcmt1
cCBmcm9tIFZlY3RvcjxVQ2hhcj4gdG8gU3RyaW5nCi0gICAgLy8gYW5kIHRoZW4gYmFjayB0byBW
ZWN0b3I8VUNoYXI+IGFuZCBhZ2FpbiB0byBTdHJpbmcgaGVyZS4KLSAgICBTdHJpbmcgdGFrZVJl
c3VsdHMoKQotICAgIHsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IDA7Ci0KLSAgICAgICAgc2l6
ZV90IHByZUNvdW50ID0gcHJlTWFya3Vwcy5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgcHJlQ291bnQ7ICsraSkKLSAgICAgICAgICAgIGxlbmd0aCArPSBwcmVNYXJrdXBz
W2ldLmxlbmd0aCgpOwotCi0gICAgICAgIHNpemVfdCBwb3N0Q291bnQgPSBwb3N0TWFya3Vwcy5z
aXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9zdENvdW50OyArK2kpCi0g
ICAgICAgICAgICBsZW5ndGggKz0gcG9zdE1hcmt1cHNbaV0ubGVuZ3RoKCk7Ci0KLSAgICAgICAg
VmVjdG9yPFVDaGFyPiByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdC5yZXNlcnZlSW5pdGlhbENhcGFj
aXR5KGxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IHByZUNvdW50OyBpID4gMDsg
LS1pKQotICAgICAgICAgICAgV1RGOjphcHBlbmQocmVzdWx0LCBwcmVNYXJrdXBzW2kgLSAxXSk7
Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3N0Q291bnQ7ICsraSkKLSAgICAg
ICAgICAgIFdURjo6YXBwZW5kKHJlc3VsdCwgcG9zdE1hcmt1cHNbaV0pOwotCi0gICAgICAgIHJl
dHVybiBTdHJpbmc6OmFkb3B0KHJlc3VsdCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFZlY3Rv
cjxOb2RlKj4qIG1fbm9kZXM7Ci0gICAgVmVjdG9yPFN0cmluZz4gcHJlTWFya3VwczsKLSAgICBW
ZWN0b3I8U3RyaW5nPiBwb3N0TWFya3VwczsKLX07Ci0KLXN0YXRpYyBOb2RlKiBzZXJpYWxpemVO
b2RlcyhNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXImIGFjY3VtdWxhdG9yLCBOb2RlKiBzdGFydE5v
ZGUsIE5vZGUqIHBhc3RFbmQsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90YXRlRm9ySW50ZXJj
aGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzKQorc3RhdGljIE5vZGUq
IHNlcmlhbGl6ZU5vZGVzKE1hcmt1cEFjY3VtdWxhdG9yJiBhY2N1bXVsYXRvciwgTm9kZSogc3Rh
cnROb2RlLCBOb2RlKiBwYXN0RW5kLCBjb25zdCBSYW5nZSogcmFuZ2UsIEVBbm5vdGF0ZUZvcklu
dGVyY2hhbmdlIGFubm90YXRlLCBFQWJzb2x1dGVVUkxzIGFic29sdXRlVVJMcykKIHsKICAgICBW
ZWN0b3I8Tm9kZSo+IGFuY2VzdG9yc1RvQ2xvc2U7CiAgICAgTm9kZSogbmV4dDsKQEAgLTg4OCw3
ICs5MTAsNyBAQCBTdHJpbmcgY3JlYXRlTWFya3VwKGNvbnN0IFJhbmdlKiByYW5nZSwgCiAKICAg
ICBkb2N1bWVudC0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7CiAKLSAg
ICBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIgYWNjdW11bGF0b3Iobm9kZXMpOworICAgIE1hcmt1
cEFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKG5vZGVzKTsKICAgICBOb2RlKiBwYXN0RW5kID0gdXBk
YXRlZFJhbmdlLT5wYXN0TGFzdE5vZGUoKTsKIAogICAgIE5vZGUqIHN0YXJ0Tm9kZSA9IHVwZGF0
ZWRSYW5nZS0+Zmlyc3ROb2RlKCk7CkBAIC05ODYsNyArMTAwOCw3IEBAIFN0cmluZyBjcmVhdGVN
YXJrdXAoY29uc3QgUmFuZ2UqIHJhbmdlLCAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAg
ICAgICAgICAgLy8gU2luY2UgdGhpcyBub2RlIGFuZCBhbGwgdGhlIG90aGVyIGFuY2VzdG9ycyBh
cmUgbm90IGluIHRoZSBzZWxlY3Rpb24gd2Ugd2FudCB0byBzZXQgUmFuZ2VGdWxseVNlbGVjdHNO
b2RlIHRvIERvZXNOb3RGdWxseVNlbGVjdE5vZGUKICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0
IHN0eWxlcyB0aGF0IGFmZmVjdCB0aGUgZXh0ZXJpb3Igb2YgdGhlIG5vZGUgYXJlIG5vdCBpbmNs
dWRlZC4KLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci53cmFwV2l0aE5vZGUoYW5jZXN0b3Is
IHVwZGF0ZWRSYW5nZS5nZXQoKSwgYW5ub3RhdGUsIGFic29sdXRlVVJMcywgY29udmVydEJsb2Nr
c1RvSW5saW5lcywgMCwgRG9lc05vdEZ1bGx5U2VsZWN0Tm9kZSk7CisgICAgICAgICAgICAgICAg
YWNjdW11bGF0b3Iud3JhcFdpdGhOb2RlKGFuY2VzdG9yLCB1cGRhdGVkUmFuZ2UuZ2V0KCksIGFu
bm90YXRlLCBhYnNvbHV0ZVVSTHMsIGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIDAsIE1hcmt1cEFj
Y3VtdWxhdG9yOjpEb2VzTm90RnVsbHlTZWxlY3ROb2RlKTsKICAgICAgICAgICAgIH0KICAgICAg
ICAgICAgIGlmIChub2RlcykKICAgICAgICAgICAgICAgICBub2Rlcy0+YXBwZW5kKGFuY2VzdG9y
KTsKQEAgLTEwNDAsNyArMTA2Miw3IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3QgUmFuZ2Uq
IHJhbmdlLCAKIAogICAgIHJldHVybiBhY2N1bXVsYXRvci50YWtlUmVzdWx0cygpOwogfQotCisg
ICAgCiBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGNyZWF0ZUZyYWdtZW50RnJvbU1hcmt1
cChEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IFN0cmluZyYgbWFya3VwLCBjb25zdCBTdHJpbmcm
IGJhc2VVUkwsIEZyYWdtZW50U2NyaXB0aW5nUGVybWlzc2lvbiBzY3JpcHRpbmdQZXJtaXNzaW9u
KQogewogICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgdXNlIGRlcHJlY2F0ZWRDcmVhdGVD
b250ZXh0dWFsRnJhZ21lbnQKQEAgLTEwNTIsNyArMTA3NCw3IEBAIFBhc3NSZWZQdHI8RG9jdW1l
bnRGcmFnbWVudD4gY3JlYXRlRnJhZ20KICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOwog
fQogCi1zdGF0aWMgdm9pZCBzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKE1hcmt1cEFjY3Vt
dWxhdG9yV3JhcHBlciYgYWNjdW11bGF0b3IsIGNvbnN0IE5vZGUqIG5vZGUsIE5vZGUqIG5vZGVU
b1NraXAsIEVDaGlsZHJlbk9ubHkgY2hpbGRyZW5Pbmx5LCBFQWJzb2x1dGVVUkxzIGFic29sdXRl
VVJMcywgY29uc3QgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+
KiBuYW1lc3BhY2VzKQorc3RhdGljIHZvaWQgc2VyaWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyhN
YXJrdXBBY2N1bXVsYXRvciYgYWNjdW11bGF0b3IsIGNvbnN0IE5vZGUqIG5vZGUsIE5vZGUqIG5v
ZGVUb1NraXAsIEVDaGlsZHJlbk9ubHkgY2hpbGRyZW5Pbmx5LCBFQWJzb2x1dGVVUkxzIGFic29s
dXRlVVJMcywgY29uc3QgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1w
bCo+KiBuYW1lc3BhY2VzKQogewogICAgIGlmIChub2RlID09IG5vZGVUb1NraXApCiAgICAgICAg
IHJldHVybjsKQEAgLTEwODUsNyArMTEwNyw3IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3Qg
Tm9kZSogbm9kZSwgRUMKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKLSAgICBNYXJr
dXBBY2N1bXVsYXRvcldyYXBwZXIgYWNjdW11bGF0b3Iobm9kZXMpOworICAgIE1hcmt1cEFjY3Vt
dWxhdG9yIGFjY3VtdWxhdG9yKG5vZGVzKTsKICAgICBzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3Bh
Y2VzKGFjY3VtdWxhdG9yLCBub2RlLCBkZWxldGVCdXR0b25Db250YWluZXJFbGVtZW50LCBjaGls
ZHJlbk9ubHksIGFic29sdXRlVVJMcywgMCk7CiAgICAgcmV0dXJuIGFjY3VtdWxhdG9yLnRha2VS
ZXN1bHRzKCk7CiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64776</attachid>
            <date>2010-08-18 14:53:22 -0700</date>
            <delta_ts>2010-08-18 16:22:58 -0700</delta_ts>
            <desc>fixed per Darin&apos;s comment</desc>
            <filename>bug-43936-20100818145320.patch</filename>
            <type>text/plain</type>
            <size>26226</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NTYxMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDMgQEAKKzIwMTAtMDgtMTggIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgR3Jv
dXAgZnVuY3Rpb25zIGluIG1hcmt1cC5jcHAgaW50byBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQzOTM2CisK
KyAgICAgICAgUmVuYW1lZCBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIgdG8gTWFya3VwQWNjdW11
bGF0b3IgYW5kIG1vdmVkIHRoZSBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIKKyAgICAgICAgdG8g
dGhlIHRvcCBvZiBtYXJrdXAuY3BwLiBNYWRlIHZhcmlvdXMgZnVuY3Rpb25zIHByaXZhdGUgbWVt
YmVyIGZ1bmN0aW9ucyBvZiBNYXJrdXBBY2N1bXVsYXRvci4KKworICAgICAgICBObyBuZXcgdGVz
dHMgYXJlIGFkZGVkIHNpbmNlIHRoaXMgaXMgYSBjbGVhbnVwLgorCisgICAgICAgICogZWRpdGlu
Zy9tYXJrdXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Oik6Cisg
ICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6TWFya3VwQWNjdW11bGF0b3IpOgor
ICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6Omluc2VydFN0cmluZyk6CisgICAg
ICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6aW5zZXJ0T3BlblRhZyk6CisgICAgICAg
IChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6aW5zZXJ0RW5kVGFnKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjp3cmFwV2l0aE5vZGUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoU3R5bGVOb2RlKToKKyAgICAgICAgKFdlYkNv
cmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjp0YWtlUmVzdWx0cyk6CisgICAgICAgIChXZWJDb3JlOjpN
YXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kQXR0cmlidXRlVmFsdWUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWFya3VwQWNjdW11bGF0b3I6OmVzY2FwZUNvbnRlbnRUZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRRdW90ZWRVUkxBdHRyaWJ1dGVWYWx1ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6c3RyaW5nVmFsdWVGb3JSYW5nZSk6
CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6dWNoYXJSYW5nZSk6CisgICAg
ICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kVUNoYXJSYW5nZSk6CisgICAg
ICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6cmVuZGVyZWRUZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VFbGVtKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VBdHRy
KToKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmROYW1lc3BhY2Up
OgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZERvY3VtZW50VHlw
ZSk6CisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRvcjo6cmVtb3ZlRXh0ZXJpb3JT
dHlsZXMpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0YXJ0
TWFya3VwKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRTZWxm
Q2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZEVuZE1h
cmt1cCk6CisgICAgICAgIChXZWJDb3JlOjpzZXJpYWxpemVOb2Rlcyk6CisgICAgICAgIChXZWJD
b3JlOjpjcmVhdGVNYXJrdXApOgorICAgICAgICAoV2ViQ29yZTo6c2VyaWFsaXplTm9kZXNXaXRo
TmFtZXNwYWNlcyk6CisKIDIwMTAtMDgtMTggIEdpcmlzaCBSYW1ha3Jpc2huYW4gIDxnaXJpc2hA
Zm9yd2FyZGJpYXMuaW4+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSb2hkZSBDaHJp
c3RpYW5zZW4uCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAkocmV2aXNpb24gNjU2MTIpCisrKyBXZWJDb3Jl
L2VkaXRpbmcvbWFya3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjYsNyArNjYsNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLXN0YXRpYyBp
bmxpbmUgYm9vbCBzaG91bGRTZWxmQ2xvc2UoY29uc3QgTm9kZSAqbm9kZSk7CitzdGF0aWMgYm9v
bCBwcm9wZXJ0eU1pc3NpbmdPckVxdWFsVG9Ob25lKENTU1N0eWxlRGVjbGFyYXRpb24qLCBpbnQg
cHJvcGVydHlJRCk7CiAKIGNsYXNzIEF0dHJpYnV0ZUNoYW5nZSB7CiBwdWJsaWM6CkBAIC05MSwx
MCArOTEsMTI1IEBAIHByaXZhdGU6CiAgICAgU3RyaW5nIG1fdmFsdWU7CiB9OwogCi1zdGF0aWMg
dm9pZCBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0
cmluZyYgYXR0ciwgYm9vbCBlc2NhcGVOQlNQKQordHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmlu
Z0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4gTmFtZXNwYWNlczsKKworY2xhc3MgTWFya3VwQWNj
dW11bGF0b3IgeworcHVibGljOgorICAgIGVudW0gUmFuZ2VGdWxseVNlbGVjdHNOb2RlIHsgRG9l
c0Z1bGx5U2VsZWN0Tm9kZSwgRG9lc05vdEZ1bGx5U2VsZWN0Tm9kZSB9OworCisgICAgTWFya3Vw
QWNjdW11bGF0b3IoVmVjdG9yPE5vZGUqPiogbm9kZXMpCisgICAgICAgIDogbV9ub2Rlcyhub2Rl
cykKKyAgICB7CisgICAgfQorICAgIHZvaWQgYXBwZW5kU3RyaW5nKGNvbnN0IFN0cmluZyYpOwor
ICAgIHZvaWQgYXBwZW5kU3RhcnRUYWcoTm9kZSosIGNvbnN0IFJhbmdlKiwgRUFubm90YXRlRm9y
SW50ZXJjaGFuZ2UsIEVBYnNvbHV0ZVVSTHMsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcyA9
IGZhbHNlLCBOYW1lc3BhY2VzKiBuYW1lc3BhY2VzID0gMCwgUmFuZ2VGdWxseVNlbGVjdHNOb2Rl
ID0gRG9lc0Z1bGx5U2VsZWN0Tm9kZSk7CisgICAgdm9pZCBhcHBlbmRFbmRUYWcoTm9kZSopOwor
ICAgIHZvaWQgd3JhcFdpdGhOb2RlKE5vZGUqLCBjb25zdCBSYW5nZSosIEVBbm5vdGF0ZUZvcklu
dGVyY2hhbmdlLCBFQWJzb2x1dGVVUkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMgPSBm
YWxzZSwgTmFtZXNwYWNlcyogbmFtZXNwYWNlcyA9IDAsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSA9
IERvZXNGdWxseVNlbGVjdE5vZGUpOworICAgIHZvaWQgd3JhcFdpdGhTdHlsZU5vZGUoQ1NTU3R5
bGVEZWNsYXJhdGlvbiosIERvY3VtZW50KiwgYm9vbCBpc0Jsb2NrID0gZmFsc2UpOworICAgIFN0
cmluZyB0YWtlUmVzdWx0cygpOworCitwcml2YXRlOgorICAgIHZvaWQgYXBwZW5kQXR0cmlidXRl
VmFsdWUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBTdHJpbmcmIGF0dHJpYnV0ZSwgYm9v
bCBlc2NhcGVOQlNQKTsKKyAgICBTdHJpbmcgZXNjYXBlQ29udGVudFRleHQoY29uc3QgU3RyaW5n
JiwgYm9vbCBlc2NhcGVOQlNQKTsKKyAgICB2b2lkIGFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZh
bHVlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpOworICAg
IFN0cmluZyBzdHJpbmdWYWx1ZUZvclJhbmdlKGNvbnN0IE5vZGUqLCBjb25zdCBSYW5nZSopOwor
ICAgIHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHVjaGFyUmFuZ2UoY29uc3QgTm9kZSosIGNv
bnN0IFJhbmdlICopOworICAgIHZvaWQgYXBwZW5kVUNoYXJSYW5nZShWZWN0b3I8VUNoYXI+JiBy
ZXN1bHQsIGNvbnN0IHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+JiByYW5nZSk7CisgICAgU3Ry
aW5nIHJlbmRlcmVkVGV4dChjb25zdCBOb2RlKiwgY29uc3QgUmFuZ2UqKTsKKyAgICBib29sIHNo
b3VsZEFkZE5hbWVzcGFjZUVsZW1lbnQoY29uc3QgRWxlbWVudCopOworICAgIGJvb2wgc2hvdWxk
QWRkTmFtZXNwYWNlQXR0cmlidXRlKGNvbnN0IEF0dHJpYnV0ZSosIE5hbWVzcGFjZXMmIG5hbWVz
cGFjZXMpOworICAgIHZvaWQgYXBwZW5kTmFtZXNwYWNlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwg
Y29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNl
VVJJLCBOYW1lc3BhY2VzJiBuYW1lc3BhY2VzKTsKKyAgICB2b2lkIGFwcGVuZERvY3VtZW50VHlw
ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IERvY3VtZW50VHlwZSopOworICAgIHZvaWQg
cmVtb3ZlRXh0ZXJpb3JTdHlsZXMoQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qKTsKKyAgICB2
b2lkIGFwcGVuZFN0YXJ0TWFya3VwKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgTm9kZSos
IGNvbnN0IFJhbmdlKiwgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UsIEVBYnNvbHV0ZVVSTHMsIGJv
b2wgY29udmVydEJsb2Nrc1RvSW5saW5lcywgTmFtZXNwYWNlcyogbmFtZXNwYWNlcywgUmFuZ2VG
dWxseVNlbGVjdHNOb2RlKTsKKyAgICBib29sIHNob3VsZFNlbGZDbG9zZShjb25zdCBOb2RlKik7
CisgICAgdm9pZCBhcHBlbmRFbmRNYXJrdXAoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBO
b2RlKik7CisKKyAgICBWZWN0b3I8Tm9kZSo+KiBtX25vZGVzOworICAgIFZlY3RvcjxTdHJpbmc+
IG1fcmV2ZXJzZWRQcmVjZWVkaW5nTWFya3VwOworICAgIFZlY3RvcjxTdHJpbmc+IG1fc3VjY2Vl
ZGluZ01hcmt1cDsKK307CisKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFN0cmluZyhj
b25zdCBTdHJpbmcmIHN0cmluZykKIHsKLSAgICBjb25zdCBVQ2hhciogdWNoYXJzID0gYXR0ci5j
aGFyYWN0ZXJzKCk7Ci0gICAgdW5zaWduZWQgbGVuID0gYXR0ci5sZW5ndGgoKTsKKyAgICBtX3N1
Y2NlZWRpbmdNYXJrdXAuYXBwZW5kKHN0cmluZyk7Cit9CisKK3ZvaWQgTWFya3VwQWNjdW11bGF0
b3I6OmFwcGVuZFN0YXJ0VGFnKE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90
YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgc2hvdWxkUmVzb2x2ZVVS
THMsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcywgTmFtZXNwYWNlcyogbmFtZXNwYWNlcywg
UmFuZ2VGdWxseVNlbGVjdHNOb2RlIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSkKK3sKKyAgICBWZWN0
b3I8VUNoYXI+IHJlc3VsdDsKKyAgICBhcHBlbmRTdGFydE1hcmt1cChyZXN1bHQsIG5vZGUsIHJh
bmdlLCBhbm5vdGF0ZSwgc2hvdWxkUmVzb2x2ZVVSTHMsIGNvbnZlcnRCbG9ja3NUb0lubGluZXMs
IG5hbWVzcGFjZXMsIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSk7CisgICAgbV9zdWNjZWVkaW5nTWFy
a3VwLmFwcGVuZChTdHJpbmc6OmFkb3B0KHJlc3VsdCkpOworICAgIGlmIChtX25vZGVzKQorICAg
ICAgICBtX25vZGVzLT5hcHBlbmQoY29uc3RfY2FzdDxOb2RlKj4obm9kZSkpOworfQorCit2b2lk
IE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRFbmRUYWcoTm9kZSogbm9kZSkKK3sKKyAgICBWZWN0
b3I8VUNoYXI+IHJlc3VsdDsKKyAgICBhcHBlbmRFbmRNYXJrdXAocmVzdWx0LCBub2RlKTsKKyAg
ICBtX3N1Y2NlZWRpbmdNYXJrdXAuYXBwZW5kKFN0cmluZzo6YWRvcHQocmVzdWx0KSk7Cit9CisK
K3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoTm9kZShOb2RlKiBub2RlLCBjb25zdCBS
YW5nZSogcmFuZ2UsIEVBbm5vdGF0ZUZvckludGVyY2hhbmdlIGFubm90YXRlLCBFQWJzb2x1dGVV
UkxzIHNob3VsZFJlc29sdmVVUkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIE5hbWVz
cGFjZXMqIG5hbWVzcGFjZXMsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSByYW5nZUZ1bGx5U2VsZWN0
c05vZGUpCit7CisgICAgVmVjdG9yPFVDaGFyPiByZXN1bHQ7CisgICAgYXBwZW5kU3RhcnRNYXJr
dXAocmVzdWx0LCBub2RlLCByYW5nZSwgYW5ub3RhdGUsIHNob3VsZFJlc29sdmVVUkxzLCBjb252
ZXJ0QmxvY2tzVG9JbmxpbmVzLCBuYW1lc3BhY2VzLCByYW5nZUZ1bGx5U2VsZWN0c05vZGUpOwor
ICAgIG1fcmV2ZXJzZWRQcmVjZWVkaW5nTWFya3VwLmFwcGVuZChTdHJpbmc6OmFkb3B0KHJlc3Vs
dCkpOworICAgIGFwcGVuZEVuZFRhZyhub2RlKTsKKyAgICBpZiAobV9ub2RlcykKKyAgICAgICAg
bV9ub2Rlcy0+YXBwZW5kKGNvbnN0X2Nhc3Q8Tm9kZSo+KG5vZGUpKTsKK30KKyAgICAKK3ZvaWQg
TWFya3VwQWNjdW11bGF0b3I6OndyYXBXaXRoU3R5bGVOb2RlKENTU1N0eWxlRGVjbGFyYXRpb24q
IHN0eWxlLCBEb2N1bWVudCogZG9jdW1lbnQsIGJvb2wgaXNCbG9jaykKK3sKKyAgICAvLyBBbGwg
dGV4dC1kZWNvcmF0aW9uLXJlbGF0ZWQgZWxlbWVudHMgc2hvdWxkIGhhdmUgYmVlbiB0cmVhdGVk
IGFzIHNwZWNpYWwgYW5jZXN0b3JzCisgICAgLy8gSWYgd2UgZXZlciBoaXQgdGhpcyBBU1NFUlQs
IHdlIHNob3VsZCBleHBvcnQgU3R5bGVDaGFuZ2UgaW4gQXBwbHlTdHlsZUNvbW1hbmQgYW5kIHVz
ZSBpdCBoZXJlCisgICAgQVNTRVJUKHByb3BlcnR5TWlzc2luZ09yRXF1YWxUb05vbmUoc3R5bGUs
IENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24pICYmIHByb3BlcnR5TWlzc2luZ09yRXF1YWxUb05v
bmUoc3R5bGUsIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3QpKTsKKyAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgZGl2U3R5bGUsICgiPGRpdiBzdHls
ZT1cIiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgZGl2Q2xvc2Us
ICgiPC9kaXY+IikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBzdHls
ZVNwYW5PcGVuLCAoIjxzcGFuIGNsYXNzPVwiIiBBcHBsZVN0eWxlU3BhbkNsYXNzICJcIiBzdHls
ZT1cIiIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgc3R5bGVTcGFu
Q2xvc2UsICgiPC9zcGFuPiIpKTsKKyAgICBWZWN0b3I8VUNoYXI+IG9wZW5UYWc7CisgICAgV1RG
OjphcHBlbmQob3BlblRhZywgaXNCbG9jayA/IGRpdlN0eWxlIDogc3R5bGVTcGFuT3Blbik7Cisg
ICAgYXBwZW5kQXR0cmlidXRlVmFsdWUob3BlblRhZywgc3R5bGUtPmNzc1RleHQoKSwgZG9jdW1l
bnQtPmlzSFRNTERvY3VtZW50KCkpOworICAgIG9wZW5UYWcuYXBwZW5kKCdcIicpOworICAgIG9w
ZW5UYWcuYXBwZW5kKCc+Jyk7CisgICAgbV9yZXZlcnNlZFByZWNlZWRpbmdNYXJrdXAuYXBwZW5k
KFN0cmluZzo6YWRvcHQob3BlblRhZykpOworICAgIG1fc3VjY2VlZGluZ01hcmt1cC5hcHBlbmQo
aXNCbG9jayA/IGRpdkNsb3NlIDogc3R5bGVTcGFuQ2xvc2UpOworfQorCisvLyBGSVhNRTogVGhp
cyBpcyBhIHZlcnkgaW5lZmZpY2llbnQgd2F5IG9mIGFjY3VtdWxhdGluZyB0aGUgbWFya3VwLgor
Ly8gV2UncmUgY29udmVydGluZyByZXN1bHRzIG9mIGFwcGVuZFN0YXJ0TWFya3VwIGFuZCBhcHBl
bmRFbmRNYXJrdXAgZnJvbSBWZWN0b3I8VUNoYXI+IHRvIFN0cmluZworLy8gYW5kIHRoZW4gYmFj
ayB0byBWZWN0b3I8VUNoYXI+IGFuZCBhZ2FpbiB0byBTdHJpbmcgaGVyZS4KK1N0cmluZyBNYXJr
dXBBY2N1bXVsYXRvcjo6dGFrZVJlc3VsdHMoKQoreworICAgIHNpemVfdCBsZW5ndGggPSAwOwor
ICAgIAorICAgIHNpemVfdCBwcmVDb3VudCA9IG1fcmV2ZXJzZWRQcmVjZWVkaW5nTWFya3VwLnNp
emUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZUNvdW50OyArK2kpCisgICAgICAg
IGxlbmd0aCArPSBtX3JldmVyc2VkUHJlY2VlZGluZ01hcmt1cFtpXS5sZW5ndGgoKTsKKyAgICAK
KyAgICBzaXplX3QgcG9zdENvdW50ID0gbV9zdWNjZWVkaW5nTWFya3VwLnNpemUoKTsKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IHBvc3RDb3VudDsgKytpKQorICAgICAgICBsZW5ndGggKz0g
bV9zdWNjZWVkaW5nTWFya3VwW2ldLmxlbmd0aCgpOworICAgIAorICAgIFZlY3RvcjxVQ2hhcj4g
cmVzdWx0OworICAgIHJlc3VsdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGxlbmd0aCk7CisgICAg
CisgICAgZm9yIChzaXplX3QgaSA9IHByZUNvdW50OyBpID4gMDsgLS1pKQorICAgICAgICBXVEY6
OmFwcGVuZChyZXN1bHQsIG1fcmV2ZXJzZWRQcmVjZWVkaW5nTWFya3VwW2kgLSAxXSk7CisgICAg
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3N0Q291bnQ7ICsraSkKKyAgICAgICAgV1RG
OjphcHBlbmQocmVzdWx0LCBtX3N1Y2NlZWRpbmdNYXJrdXBbaV0pOworICAgIAorICAgIHJldHVy
biBTdHJpbmc6OmFkb3B0KHJlc3VsdCk7Cit9CisKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFw
cGVuZEF0dHJpYnV0ZVZhbHVlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiBh
dHRyaWJ1dGUsIGJvb2wgZXNjYXBlTkJTUCkKK3sKKyAgICBjb25zdCBVQ2hhciogdWNoYXJzID0g
YXR0cmlidXRlLmNoYXJhY3RlcnMoKTsKKyAgICB1bnNpZ25lZCBsZW4gPSBhdHRyaWJ1dGUubGVu
Z3RoKCk7CiAgICAgdW5zaWduZWQgbGFzdENvcGllZEZyb20gPSAwOwogCiAgICAgREVGSU5FX1NU
QVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGFtcEVudGl0eSwgKCImYW1wOyIpKTsKQEAgLTE4MSwx
NCArMjk2LDE0IEBAIHN0YXRpYyB2b2lkIGFwcGVuZEVzY2FwZWRDb250ZW50KFZlY3RvcjwKICAg
ICByZXN1bHQuYXBwZW5kKHVjaGFycyArIGxhc3RDb3BpZWRGcm9tLCBsZW4gLSBsYXN0Q29waWVk
RnJvbSk7CiB9ICAgIAogCi1zdGF0aWMgU3RyaW5nIGVzY2FwZUNvbnRlbnRUZXh0KGNvbnN0IFN0
cmluZyYgaW4sIGJvb2wgZXNjYXBlTkJTUCkKK1N0cmluZyBNYXJrdXBBY2N1bXVsYXRvcjo6ZXNj
YXBlQ29udGVudFRleHQoY29uc3QgU3RyaW5nJiBpbiwgYm9vbCBlc2NhcGVOQlNQKQogewogICAg
IFZlY3RvcjxVQ2hhcj4gYnVmZmVyOwogICAgIGFwcGVuZEVzY2FwZWRDb250ZW50KGJ1ZmZlciwg
bWFrZV9wYWlyKGluLmNoYXJhY3RlcnMoKSwgaW4ubGVuZ3RoKCkpLCBlc2NhcGVOQlNQKTsKICAg
ICByZXR1cm4gU3RyaW5nOjphZG9wdChidWZmZXIpOwogfQotICAgIAotc3RhdGljIHZvaWQgYXBw
ZW5kUXVvdGVkVVJMQXR0cmlidXRlVmFsdWUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBT
dHJpbmcmIHVybFN0cmluZykKKwordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kUXVvdGVk
VVJMQXR0cmlidXRlVmFsdWUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBTdHJpbmcmIHVy
bFN0cmluZykKIHsKICAgICBVQ2hhciBxdW90ZUNoYXIgPSAnXCInOwogICAgIFN0cmluZyBzdHJp
cHBlZFVSTFN0cmluZyA9IHVybFN0cmluZy5zdHJpcFdoaXRlU3BhY2UoKTsKQEAgLTIxMSw4ICsz
MjYsOCBAQCBzdGF0aWMgdm9pZCBhcHBlbmRRdW90ZWRVUkxBdHRyaWJ1dGVWYWx1CiAgICAgYXBw
ZW5kQXR0cmlidXRlVmFsdWUocmVzdWx0LCB1cmxTdHJpbmcsIGZhbHNlKTsKICAgICByZXN1bHQu
YXBwZW5kKHF1b3RlQ2hhcik7ICAgIAogfQotICAgIAotc3RhdGljIFN0cmluZyBzdHJpbmdWYWx1
ZUZvclJhbmdlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkKKworU3RyaW5n
IE1hcmt1cEFjY3VtdWxhdG9yOjpzdHJpbmdWYWx1ZUZvclJhbmdlKGNvbnN0IE5vZGUqIG5vZGUs
IGNvbnN0IFJhbmdlKiByYW5nZSkKIHsKICAgICBpZiAoIXJhbmdlKQogICAgICAgICByZXR1cm4g
bm9kZS0+bm9kZVZhbHVlKCk7CkBAIC0yMjYsNyArMzQxLDcgQEAgc3RhdGljIFN0cmluZyBzdHJp
bmdWYWx1ZUZvclJhbmdlKGNvbnN0IAogICAgIHJldHVybiBzdHI7CiB9CiAKLXN0YXRpYyBpbmxp
bmUgcGFpcjxjb25zdCBVQ2hhciosIHNpemVfdD4gdWNoYXJSYW5nZShjb25zdCBOb2RlICpub2Rl
LCBjb25zdCBSYW5nZSAqcmFuZ2UpCitwYWlyPGNvbnN0IFVDaGFyKiwgc2l6ZV90PiBNYXJrdXBB
Y2N1bXVsYXRvcjo6dWNoYXJSYW5nZShjb25zdCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSogcmFu
Z2UpCiB7CiAgICAgU3RyaW5nIHN0ciA9IG5vZGUtPm5vZGVWYWx1ZSgpOwogICAgIGNvbnN0IFVD
aGFyKiBjaGFyYWN0ZXJzID0gc3RyLmNoYXJhY3RlcnMoKTsKQEAgLTI0NSwxMyArMzYwLDEzIEBA
IHN0YXRpYyBpbmxpbmUgcGFpcjxjb25zdCBVQ2hhciosIHNpemVfdD4KICAgICAKICAgICByZXR1
cm4gbWFrZV9wYWlyKGNoYXJhY3RlcnMsIGxlbmd0aCk7CiB9Ci0gICAgCi1zdGF0aWMgaW5saW5l
IHZvaWQgYXBwZW5kVUNoYXJSYW5nZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IHBhaXI8
Y29uc3QgVUNoYXIqLCBzaXplX3Q+IHJhbmdlKQorCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjph
cHBlbmRVQ2hhclJhbmdlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgcGFpcjxjb25zdCBV
Q2hhciosIHNpemVfdD4mIHJhbmdlKQogewogICAgIHJlc3VsdC5hcHBlbmQocmFuZ2UuZmlyc3Qs
IHJhbmdlLnNlY29uZCk7CiB9Ci0gICAgCi1zdGF0aWMgU3RyaW5nIHJlbmRlcmVkVGV4dChjb25z
dCBOb2RlKiBub2RlLCBjb25zdCBSYW5nZSogcmFuZ2UpCisKK1N0cmluZyBNYXJrdXBBY2N1bXVs
YXRvcjo6cmVuZGVyZWRUZXh0KGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkK
IHsKICAgICBpZiAoIW5vZGUtPmlzVGV4dE5vZGUoKSkKICAgICAgICAgcmV0dXJuIFN0cmluZygp
OwpAQCAtMzA0LDQ0ICs0MTksNDQgQEAgc3RhdGljIHZvaWQgcmVtb3ZlRGVmYXVsdFN0eWxlcyhD
U1NNdXRhYgogICAgIHByZXBhcmVFZGl0aW5nU3R5bGVUb0FwcGx5QXQoc3R5bGUsIFBvc2l0aW9u
KGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKSwgMCkpOwogfQogCi1zdGF0aWMgYm9vbCBzaG91
bGRBZGROYW1lc3BhY2VFbGVtKGNvbnN0IEVsZW1lbnQqIGVsZW0pCitib29sIE1hcmt1cEFjY3Vt
dWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VFbGVtZW50KGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQp
CiB7CiAgICAgLy8gRG9uJ3QgYWRkIG5hbWVzcGFjZSBhdHRyaWJ1dGUgaWYgaXQgaXMgYWxyZWFk
eSBkZWZpbmVkIGZvciB0aGlzIGVsZW0uCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgg
PSBlbGVtLT5wcmVmaXgoKTsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCA9IGVsZW1l
bnQtPnByZWZpeCgpOwogICAgIEF0b21pY1N0cmluZyBhdHRyID0gIXByZWZpeC5pc0VtcHR5KCkg
PyAieG1sbnM6IiArIHByZWZpeCA6ICJ4bWxucyI7Ci0gICAgcmV0dXJuICFlbGVtLT5oYXNBdHRy
aWJ1dGUoYXR0cik7CisgICAgcmV0dXJuICFlbGVtZW50LT5oYXNBdHRyaWJ1dGUoYXR0cik7CiB9
CiAKLXN0YXRpYyBib29sIHNob3VsZEFkZE5hbWVzcGFjZUF0dHIoY29uc3QgQXR0cmlidXRlKiBh
dHRyLCBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4mIG5hbWVz
cGFjZXMpCitib29sIE1hcmt1cEFjY3VtdWxhdG9yOjpzaG91bGRBZGROYW1lc3BhY2VBdHRyaWJ1
dGUoY29uc3QgQXR0cmlidXRlKiBhdHRyaWJ1dGUsIE5hbWVzcGFjZXMmIG5hbWVzcGFjZXMpCiB7
CiAgICAgbmFtZXNwYWNlcy5jaGVja0NvbnNpc3RlbmN5KCk7CiAKICAgICAvLyBEb24ndCBhZGQg
bmFtZXNwYWNlIGF0dHJpYnV0ZXMgdHdpY2UKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IFhNTE5T
TmFtZXM6OnhtbG5zQXR0cikgewotICAgICAgICBuYW1lc3BhY2VzLnNldChlbXB0eUF0b20uaW1w
bCgpLCBhdHRyLT52YWx1ZSgpLmltcGwoKSk7CisgICAgaWYgKGF0dHJpYnV0ZS0+bmFtZSgpID09
IFhNTE5TTmFtZXM6OnhtbG5zQXR0cikgeworICAgICAgICBuYW1lc3BhY2VzLnNldChlbXB0eUF0
b20uaW1wbCgpLCBhdHRyaWJ1dGUtPnZhbHVlKCkuaW1wbCgpKTsKICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgIH0KICAgICAKLSAgICBRdWFsaWZpZWROYW1lIHhtbG5zUHJlZml4QXR0cih4bWxu
c0F0b20sIGF0dHItPmxvY2FsTmFtZSgpLCBYTUxOU05hbWVzOjp4bWxuc05hbWVzcGFjZVVSSSk7
Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSB4bWxuc1ByZWZpeEF0dHIpIHsKLSAgICAgICAgbmFt
ZXNwYWNlcy5zZXQoYXR0ci0+bG9jYWxOYW1lKCkuaW1wbCgpLCBhdHRyLT52YWx1ZSgpLmltcGwo
KSk7CisgICAgUXVhbGlmaWVkTmFtZSB4bWxuc1ByZWZpeEF0dHIoeG1sbnNBdG9tLCBhdHRyaWJ1
dGUtPmxvY2FsTmFtZSgpLCBYTUxOU05hbWVzOjp4bWxuc05hbWVzcGFjZVVSSSk7CisgICAgaWYg
KGF0dHJpYnV0ZS0+bmFtZSgpID09IHhtbG5zUHJlZml4QXR0cikgeworICAgICAgICBuYW1lc3Bh
Y2VzLnNldChhdHRyaWJ1dGUtPmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0cmlidXRlLT52YWx1ZSgp
LmltcGwoKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgCiAgICAgcmV0dXJu
IHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGFwcGVuZE5hbWVzcGFjZShWZWN0b3I8VUNoYXI+JiBy
ZXN1bHQsIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4LCBjb25zdCBBdG9taWNTdHJpbmcmIG5z
LCBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4mIG5hbWVzcGFj
ZXMpCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmROYW1lc3BhY2UoVmVjdG9yPFVDaGFy
PiYgcmVzdWx0LCBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCwgY29uc3QgQXRvbWljU3RyaW5n
JiBuYW1lc3BhY2VVUkksIE5hbWVzcGFjZXMmIG5hbWVzcGFjZXMpCiB7CiAgICAgbmFtZXNwYWNl
cy5jaGVja0NvbnNpc3RlbmN5KCk7Ci0gICAgaWYgKG5zLmlzRW1wdHkoKSkKKyAgICBpZiAobmFt
ZXNwYWNlVVJJLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogICAgICAgICAKICAgICAvLyBV
c2UgZW1wdHlBdG9tcydzIGltcGwoKSBmb3IgYm90aCBudWxsIGFuZCBlbXB0eSBzdHJpbmdzIHNp
bmNlIHRoZSBIYXNoTWFwIGNhbid0IGhhbmRsZSAwIGFzIGEga2V5CiAgICAgQXRvbWljU3RyaW5n
SW1wbCogcHJlID0gcHJlZml4LmlzRW1wdHkoKSA/IGVtcHR5QXRvbS5pbXBsKCkgOiBwcmVmaXgu
aW1wbCgpOwogICAgIEF0b21pY1N0cmluZ0ltcGwqIGZvdW5kTlMgPSBuYW1lc3BhY2VzLmdldChw
cmUpOwotICAgIGlmIChmb3VuZE5TICE9IG5zLmltcGwoKSkgewotICAgICAgICBuYW1lc3BhY2Vz
LnNldChwcmUsIG5zLmltcGwoKSk7CisgICAgaWYgKGZvdW5kTlMgIT0gbmFtZXNwYWNlVVJJLmlt
cGwoKSkgeworICAgICAgICBuYW1lc3BhY2VzLnNldChwcmUsIG5hbWVzcGFjZVVSSS5pbXBsKCkp
OwogICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7CiAgICAgICAgIGFwcGVuZChyZXN1bHQsIHht
bG5zQXRvbS5zdHJpbmcoKSk7CiAgICAgICAgIGlmICghcHJlZml4LmlzRW1wdHkoKSkgewpAQCAt
MzUxLDEyICs0NjYsMTIgQEAgc3RhdGljIHZvaWQgYXBwZW5kTmFtZXNwYWNlKFZlY3RvcjxVQ2hh
cgogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoJz0nKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZCgn
IicpOwotICAgICAgICBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShyZXN1bHQsIG5zLCBmYWxzZSk7Cisg
ICAgICAgIGFwcGVuZEF0dHJpYnV0ZVZhbHVlKHJlc3VsdCwgbmFtZXNwYWNlVVJJLCBmYWxzZSk7
CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyInKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGFw
cGVuZERvY3VtZW50VHlwZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IERvY3VtZW50VHlw
ZSogbikKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZERvY3VtZW50VHlwZShWZWN0b3I8
VUNoYXI+JiByZXN1bHQsIGNvbnN0IERvY3VtZW50VHlwZSogbikKIHsKICAgICBpZiAobi0+bmFt
ZSgpLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMzg1LDE0ICs1MDAsMTIgQEAgc3Rh
dGljIHZvaWQgYXBwZW5kRG9jdW1lbnRUeXBlKFZlY3RvcjxVQwogICAgIGFwcGVuZChyZXN1bHQs
ICI+Iik7CiB9CiAKLXN0YXRpYyB2b2lkIHJlbW92ZUV4dGVyaW9yU3R5bGVzKENTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uKiBzdHlsZSkKK3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OnJlbW92ZUV4
dGVyaW9yU3R5bGVzKENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkKIHsKICAgICBz
dHlsZS0+cmVtb3ZlUHJvcGVydHkoQ1NTUHJvcGVydHlGbG9hdCk7CiB9CiAKLWVudW0gUmFuZ2VG
dWxseVNlbGVjdHNOb2RlIHsgRG9lc0Z1bGx5U2VsZWN0Tm9kZSwgRG9lc05vdEZ1bGx5U2VsZWN0
Tm9kZSB9OwotCi1zdGF0aWMgdm9pZCBhcHBlbmRTdGFydE1hcmt1cChWZWN0b3I8VUNoYXI+JiBy
ZXN1bHQsIGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90YXRlRm9y
SW50ZXJjaGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzLCBib29sIGNv
bnZlcnRCbG9ja3NUb0lubGluZXMsIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEF0b21pY1N0
cmluZ0ltcGwqPiogbmFtZXNwYWNlcywgUmFuZ2VGdWxseVNlbGVjdHNOb2RlIHJhbmdlRnVsbHlT
ZWxlY3RzTm9kZSA9IERvZXNGdWxseVNlbGVjdE5vZGUpCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9y
OjphcHBlbmRTdGFydE1hcmt1cChWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IE5vZGUqIG5v
ZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUs
IEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMs
IE5hbWVzcGFjZXMqIG5hbWVzcGFjZXMsIFJhbmdlRnVsbHlTZWxlY3RzTm9kZSByYW5nZUZ1bGx5
U2VsZWN0c05vZGUpCiB7CiAgICAgaWYgKG5hbWVzcGFjZXMpCiAgICAgICAgIG5hbWVzcGFjZXMt
PmNoZWNrQ29uc2lzdGVuY3koKTsKQEAgLTQ1MSw3ICs1NjQsNyBAQCBzdGF0aWMgdm9pZCBhcHBl
bmRTdGFydE1hcmt1cChWZWN0b3I8VUNoCiAgICAgICAgICAgICBhcHBlbmQocmVzdWx0LCBlbC0+
bm9kZU5hbWVQcmVzZXJ2aW5nQ2FzZSgpKTsKICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCAqYXR0
cnMgPSBlbC0+YXR0cmlidXRlcygpOwogICAgICAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gYXR0
cnMtPmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKCFkb2N1bWVudElzSFRNTCAmJiBuYW1lc3Bh
Y2VzICYmIHNob3VsZEFkZE5hbWVzcGFjZUVsZW0oZWwpKQorICAgICAgICAgICAgaWYgKCFkb2N1
bWVudElzSFRNTCAmJiBuYW1lc3BhY2VzICYmIHNob3VsZEFkZE5hbWVzcGFjZUVsZW1lbnQoZWwp
KQogICAgICAgICAgICAgICAgIGFwcGVuZE5hbWVzcGFjZShyZXN1bHQsIGVsLT5wcmVmaXgoKSwg
ZWwtPm5hbWVzcGFjZVVSSSgpLCAqbmFtZXNwYWNlcyk7CiAKICAgICAgICAgICAgIGZvciAodW5z
aWduZWQgaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTQ4MSw3ICs1OTQsNyBAQCBz
dGF0aWMgdm9pZCBhcHBlbmRTdGFydE1hcmt1cChWZWN0b3I8VUNoCiAgICAgICAgICAgICAgICAg
ICAgIHJlc3VsdC5hcHBlbmQoJ1wiJyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAg
ICAgICAgaWYgKCFkb2N1bWVudElzSFRNTCAmJiBuYW1lc3BhY2VzICYmIHNob3VsZEFkZE5hbWVz
cGFjZUF0dHIoYXR0ciwgKm5hbWVzcGFjZXMpKQorICAgICAgICAgICAgICAgIGlmICghZG9jdW1l
bnRJc0hUTUwgJiYgbmFtZXNwYWNlcyAmJiBzaG91bGRBZGROYW1lc3BhY2VBdHRyaWJ1dGUoYXR0
ciwgKm5hbWVzcGFjZXMpKQogICAgICAgICAgICAgICAgICAgICBhcHBlbmROYW1lc3BhY2UocmVz
dWx0LCBhdHRyLT5wcmVmaXgoKSwgYXR0ci0+bmFtZXNwYWNlVVJJKCksICpuYW1lc3BhY2VzKTsK
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgIApAQCAtNTY5LDcgKzY4Miw3IEBAIHN0YXRpYyBp
bmxpbmUgYm9vbCBkb2VzSFRNTEZvcmJpZEVuZFRhZygKIC8vIDIuIEVsZW1lbnRzIHcvIGNoaWxk
cmVuIG5ldmVyIHNlbGYtY2xvc2UgYmVjYXVzZSB0aGV5IHVzZSBhIHNlcGFyYXRlIGVuZCB0YWcu
CiAvLyAzLiBIVE1MIGVsZW1lbnRzIHdoaWNoIGRvIG5vdCBoYXZlIGEgImZvcmJpZGRlbiIgZW5k
IHRhZyB3aWxsIGNsb3NlIHdpdGggYSBzZXBhcmF0ZSBlbmQgdGFnLgogLy8gNC4gT3RoZXIgZWxl
bWVudHMgc2VsZi1jbG9zZS4KLXN0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRTZWxmQ2xvc2UoY29u
c3QgTm9kZSAqbm9kZSkKK2Jvb2wgTWFya3VwQWNjdW11bGF0b3I6OnNob3VsZFNlbGZDbG9zZShj
b25zdCBOb2RlKiBub2RlKQogewogICAgIGlmIChub2RlLT5kb2N1bWVudCgpLT5pc0hUTUxEb2N1
bWVudCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01ODAsNyArNjkzLDcgQEAgc3RhdGlj
IGlubGluZSBib29sIHNob3VsZFNlbGZDbG9zZShjb25zdAogICAgIHJldHVybiB0cnVlOwogfQog
Ci1zdGF0aWMgdm9pZCBhcHBlbmRFbmRNYXJrdXAoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25z
dCBOb2RlKiBub2RlKQordm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kRW5kTWFya3VwKFZl
Y3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgTm9kZSogbm9kZSkKIHsKICAgICBpZiAoIW5vZGUt
PmlzRWxlbWVudE5vZGUoKSB8fCBzaG91bGRTZWxmQ2xvc2Uobm9kZSkgfHwgKCFub2RlLT5oYXND
aGlsZE5vZGVzKCkgJiYgZG9lc0hUTUxGb3JiaWRFbmRUYWcobm9kZSkpKQogICAgICAgICByZXR1
cm47CkBAIC02ODksOTYgKzgwMiw3IEBAIHN0YXRpYyBib29sIHNob3VsZEluY2x1ZGVXcmFwcGVy
Rm9yRnVsbHkKICAgICAgICAgICAgc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kQ29sb3IpOwogfQogCi1jbGFzcyBNYXJrdXBBY2N1bXVsYXRvcldyYXBwZXIg
ewotcHVibGljOgotICAgIE1hcmt1cEFjY3VtdWxhdG9yV3JhcHBlcihWZWN0b3I8Tm9kZSo+KiBu
b2RlcykKLSAgICA6IG1fbm9kZXMobm9kZXMpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgaW5z
ZXJ0U3RyaW5nKGNvbnN0IFN0cmluZyYgcykKLSAgICB7Ci0gICAgICAgIHBvc3RNYXJrdXBzLmFw
cGVuZChzKTsKLSAgICB9Ci0KLSAgICB2b2lkIGluc2VydE9wZW5UYWcoY29uc3QgTm9kZSogbm9k
ZSwgY29uc3QgUmFuZ2UqIHJhbmdlLCBFQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSBhbm5vdGF0ZSwg
RUFic29sdXRlVVJMcyBhYnNvbHV0ZVVSTHMsIGJvb2wgY29udmVydEJsb2Nrc1RvSW5saW5lcyA9
IGZhbHNlLCBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBsKj4qIG5h
bWVzcGFjZXMgPSAwLCBSYW5nZUZ1bGx5U2VsZWN0c05vZGUgcmFuZ2VGdWxseVNlbGVjdHNOb2Rl
ID0gRG9lc0Z1bGx5U2VsZWN0Tm9kZSkKLSAgICB7Ci0gICAgICAgIFZlY3RvcjxVQ2hhcj4gcmVz
dWx0OwotICAgICAgICBhcHBlbmRTdGFydE1hcmt1cChyZXN1bHQsIG5vZGUsIHJhbmdlLCBhbm5v
dGF0ZSwgYWJzb2x1dGVVUkxzLCBjb252ZXJ0QmxvY2tzVG9JbmxpbmVzLCBuYW1lc3BhY2VzLCBy
YW5nZUZ1bGx5U2VsZWN0c05vZGUpOwotICAgICAgICBwb3N0TWFya3Vwcy5hcHBlbmQoU3RyaW5n
OjphZG9wdChyZXN1bHQpKTsKLSAgICAgICAgaWYgKG1fbm9kZXMpCi0gICAgICAgICAgICBtX25v
ZGVzLT5hcHBlbmQoY29uc3RfY2FzdDxOb2RlKj4obm9kZSkpOwotICAgIH0KLQotICAgIHZvaWQg
aW5zZXJ0RW5kVGFnKGNvbnN0IE5vZGUqIG5vZGUpCi0gICAgewotICAgICAgICBWZWN0b3I8VUNo
YXI+IHJlc3VsdDsKLSAgICAgICAgYXBwZW5kRW5kTWFya3VwKHJlc3VsdCwgbm9kZSk7Ci0gICAg
ICAgIHBvc3RNYXJrdXBzLmFwcGVuZChTdHJpbmc6OmFkb3B0KHJlc3VsdCkpOwotICAgIH0KLQot
ICAgIHZvaWQgd3JhcFdpdGhOb2RlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5n
ZSwgRUFubm90YXRlRm9ySW50ZXJjaGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJzb2x1
dGVVUkxzLCBib29sIGNvbnZlcnRCbG9ja3NUb0lubGluZXMgPSBmYWxzZSwgSGFzaE1hcDxBdG9t
aWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2VzID0gMCwgUmFuZ2VG
dWxseVNlbGVjdHNOb2RlIHJhbmdlRnVsbHlTZWxlY3RzTm9kZSA9IERvZXNGdWxseVNlbGVjdE5v
ZGUpCi0gICAgewotICAgICAgICBWZWN0b3I8VUNoYXI+IHJlc3VsdDsKLSAgICAgICAgYXBwZW5k
U3RhcnRNYXJrdXAocmVzdWx0LCBub2RlLCByYW5nZSwgYW5ub3RhdGUsIGFic29sdXRlVVJMcywg
Y29udmVydEJsb2Nrc1RvSW5saW5lcywgbmFtZXNwYWNlcywgcmFuZ2VGdWxseVNlbGVjdHNOb2Rl
KTsKLSAgICAgICAgcHJlTWFya3Vwcy5hcHBlbmQoU3RyaW5nOjphZG9wdChyZXN1bHQpKTsKLSAg
ICAgICAgaW5zZXJ0RW5kVGFnKG5vZGUpOwotICAgICAgICBpZiAobV9ub2RlcykKLSAgICAgICAg
ICAgIG1fbm9kZXMtPmFwcGVuZChjb25zdF9jYXN0PE5vZGUqPihub2RlKSk7Ci0gICAgfQotCi0g
ICAgdm9pZCB3cmFwV2l0aFN0eWxlTm9kZShDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSwgRG9j
dW1lbnQqIGRvY3VtZW50LCBib29sIGlzQmxvY2sgPSBmYWxzZSkKLSAgICB7Ci0gICAgICAgIC8v
IEFsbCB0ZXh0LWRlY29yYXRpb24tcmVsYXRlZCBlbGVtZW50cyBzaG91bGQgaGF2ZSBiZWVuIHRy
ZWF0ZWQgYXMgc3BlY2lhbCBhbmNlc3RvcnMKLSAgICAgICAgLy8gSWYgd2UgZXZlciBoaXQgdGhp
cyBBU1NFUlQsIHdlIHNob3VsZCBleHBvcnQgU3R5bGVDaGFuZ2UgaW4gQXBwbHlTdHlsZUNvbW1h
bmQgYW5kIHVzZSBpdCBoZXJlCi0gICAgICAgIEFTU0VSVChwcm9wZXJ0eU1pc3NpbmdPckVxdWFs
VG9Ob25lKHN0eWxlLCBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uKSAmJiBwcm9wZXJ0eU1pc3Np
bmdPckVxdWFsVG9Ob25lKHN0eWxlLCBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0lu
RWZmZWN0KSk7Ci0gICAgICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBkaXZT
dHlsZSwgKCI8ZGl2IHN0eWxlPVwiIikpOwotICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNv
bnN0IFN0cmluZywgZGl2Q2xvc2UsICgiPC9kaXY+IikpOwotICAgICAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKGNvbnN0IFN0cmluZywgc3R5bGVTcGFuT3BlbiwgKCI8c3BhbiBjbGFzcz1cIiIgQXBw
bGVTdHlsZVNwYW5DbGFzcyAiXCIgc3R5bGU9XCIiKSk7Ci0gICAgICAgIERFRklORV9TVEFUSUNf
TE9DQUwoY29uc3QgU3RyaW5nLCBzdHlsZVNwYW5DbG9zZSwgKCI8L3NwYW4+IikpOwotICAgICAg
ICBWZWN0b3I8VUNoYXI+IG9wZW5UYWc7Ci0gICAgICAgIFdURjo6YXBwZW5kKG9wZW5UYWcsIGlz
QmxvY2sgPyBkaXZTdHlsZSA6IHN0eWxlU3Bhbk9wZW4pOwotICAgICAgICBhcHBlbmRBdHRyaWJ1
dGVWYWx1ZShvcGVuVGFnLCBzdHlsZS0+Y3NzVGV4dCgpLCBkb2N1bWVudC0+aXNIVE1MRG9jdW1l
bnQoKSk7Ci0gICAgICAgIG9wZW5UYWcuYXBwZW5kKCdcIicpOwotICAgICAgICBvcGVuVGFnLmFw
cGVuZCgnPicpOwotICAgICAgICBwcmVNYXJrdXBzLmFwcGVuZChTdHJpbmc6OmFkb3B0KG9wZW5U
YWcpKTsKLSAgICAgICAgcG9zdE1hcmt1cHMuYXBwZW5kKGlzQmxvY2sgPyBkaXZDbG9zZSA6IHN0
eWxlU3BhbkNsb3NlKTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBhIHZlcnkgaW5l
ZmZpY2llbnQgd2F5IG9mIGFjY3VtdWxhdGluZyB0aGUgbWFya3VwLgotICAgIC8vIFdlJ3JlIGNv
bnZlcnRpbmcgcmVzdWx0cyBvZiBhcHBlbmRTdGFydE1hcmt1cCBhbmQgYXBwZW5kRW5kTWFya3Vw
IGZyb20gVmVjdG9yPFVDaGFyPiB0byBTdHJpbmcKLSAgICAvLyBhbmQgdGhlbiBiYWNrIHRvIFZl
Y3RvcjxVQ2hhcj4gYW5kIGFnYWluIHRvIFN0cmluZyBoZXJlLgotICAgIFN0cmluZyB0YWtlUmVz
dWx0cygpCi0gICAgewotICAgICAgICBzaXplX3QgbGVuZ3RoID0gMDsKLQotICAgICAgICBzaXpl
X3QgcHJlQ291bnQgPSBwcmVNYXJrdXBzLnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBwcmVDb3VudDsgKytpKQotICAgICAgICAgICAgbGVuZ3RoICs9IHByZU1hcmt1cHNb
aV0ubGVuZ3RoKCk7Ci0KLSAgICAgICAgc2l6ZV90IHBvc3RDb3VudCA9IHBvc3RNYXJrdXBzLnNp
emUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3N0Q291bnQ7ICsraSkKLSAg
ICAgICAgICAgIGxlbmd0aCArPSBwb3N0TWFya3Vwc1tpXS5sZW5ndGgoKTsKLQotICAgICAgICBW
ZWN0b3I8VUNoYXI+IHJlc3VsdDsKLSAgICAgICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNp
dHkobGVuZ3RoKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gcHJlQ291bnQ7IGkgPiAwOyAt
LWkpCi0gICAgICAgICAgICBXVEY6OmFwcGVuZChyZXN1bHQsIHByZU1hcmt1cHNbaSAtIDFdKTsK
LQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvc3RDb3VudDsgKytpKQotICAgICAg
ICAgICAgV1RGOjphcHBlbmQocmVzdWx0LCBwb3N0TWFya3Vwc1tpXSk7Ci0KLSAgICAgICAgcmV0
dXJuIFN0cmluZzo6YWRvcHQocmVzdWx0KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9y
PE5vZGUqPiogbV9ub2RlczsKLSAgICBWZWN0b3I8U3RyaW5nPiBwcmVNYXJrdXBzOwotICAgIFZl
Y3RvcjxTdHJpbmc+IHBvc3RNYXJrdXBzOwotfTsKLQotc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5v
ZGVzKE1hcmt1cEFjY3VtdWxhdG9yV3JhcHBlciYgYWNjdW11bGF0b3IsIE5vZGUqIHN0YXJ0Tm9k
ZSwgTm9kZSogcGFzdEVuZCwgY29uc3QgUmFuZ2UqIHJhbmdlLCBFQW5ub3RhdGVGb3JJbnRlcmNo
YW5nZSBhbm5vdGF0ZSwgRUFic29sdXRlVVJMcyBhYnNvbHV0ZVVSTHMpCitzdGF0aWMgTm9kZSog
c2VyaWFsaXplTm9kZXMoTWFya3VwQWNjdW11bGF0b3ImIGFjY3VtdWxhdG9yLCBOb2RlKiBzdGFy
dE5vZGUsIE5vZGUqIHBhc3RFbmQsIGNvbnN0IFJhbmdlKiByYW5nZSwgRUFubm90YXRlRm9ySW50
ZXJjaGFuZ2UgYW5ub3RhdGUsIEVBYnNvbHV0ZVVSTHMgYWJzb2x1dGVVUkxzKQogewogICAgIFZl
Y3RvcjxOb2RlKj4gYW5jZXN0b3JzVG9DbG9zZTsKICAgICBOb2RlKiBuZXh0OwpAQCAtODA2LDEx
ICs4MzAsMTEgQEAgc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVzKE1hcmt1cEFjY3VtdQogICAg
ICAgICAgICAgICAgIG5leHQgPSBwYXN0RW5kOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBtYXJrdXAgaWYgd2UncmUgbm90IHNraXBwaW5nIHRo
ZSBkZXNjZW5kYW50cwotICAgICAgICAgICAgYWNjdW11bGF0b3IuaW5zZXJ0T3BlblRhZyhuLCBy
YW5nZSwgYW5ub3RhdGUsIGFic29sdXRlVVJMcyk7CisgICAgICAgICAgICBhY2N1bXVsYXRvci5h
cHBlbmRTdGFydFRhZyhuLCByYW5nZSwgYW5ub3RhdGUsIGFic29sdXRlVVJMcyk7CiAKICAgICAg
ICAgICAgIC8vIElmIG5vZGUgaGFzIG5vIGNoaWxkcmVuLCBjbG9zZSB0aGUgdGFnIG5vdy4KICAg
ICAgICAgICAgIGlmICghbi0+Y2hpbGROb2RlQ291bnQoKSkgewotICAgICAgICAgICAgICAgIGFj
Y3VtdWxhdG9yLmluc2VydEVuZFRhZyhuKTsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5h
cHBlbmRFbmRUYWcobik7CiAgICAgICAgICAgICAgICAgbGFzdENsb3NlZCA9IG47CiAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9wZW5lZFRhZyA9IHRydWU7CkBAIC04Mjcs
NyArODUxLDcgQEAgc3RhdGljIE5vZGUqIHNlcmlhbGl6ZU5vZGVzKE1hcmt1cEFjY3VtdQogICAg
ICAgICAgICAgICAgIGlmIChuZXh0ICE9IHBhc3RFbmQgJiYgbmV4dC0+aXNEZXNjZW5kYW50T2Yo
YW5jZXN0b3IpKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAv
LyBOb3QgYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UsIGNsb3NlIGFuY2VzdG9ycyB1cCB0byBzaWJs
aW5nIG9mIG5leHQgbm9kZS4KLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci5pbnNlcnRFbmRU
YWcoYW5jZXN0b3IpOworICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLmFwcGVuZEVuZFRhZyhh
bmNlc3Rvcik7CiAgICAgICAgICAgICAgICAgbGFzdENsb3NlZCA9IGFuY2VzdG9yOwogICAgICAg
ICAgICAgICAgIGFuY2VzdG9yc1RvQ2xvc2UucmVtb3ZlTGFzdCgpOwogICAgICAgICAgICAgfQpA
QCAtODg4LDcgKzkxMiw3IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3QgUmFuZ2UqIHJhbmdl
LCAKIAogICAgIGRvY3VtZW50LT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMo
KTsKIAotICAgIE1hcmt1cEFjY3VtdWxhdG9yV3JhcHBlciBhY2N1bXVsYXRvcihub2Rlcyk7Cisg
ICAgTWFya3VwQWNjdW11bGF0b3IgYWNjdW11bGF0b3Iobm9kZXMpOwogICAgIE5vZGUqIHBhc3RF
bmQgPSB1cGRhdGVkUmFuZ2UtPnBhc3RMYXN0Tm9kZSgpOwogCiAgICAgTm9kZSogc3RhcnROb2Rl
ID0gdXBkYXRlZFJhbmdlLT5maXJzdE5vZGUoKTsKQEAgLTkwMSw3ICs5MjUsNyBAQCBTdHJpbmcg
Y3JlYXRlTWFya3VwKGNvbnN0IFJhbmdlKiByYW5nZSwgCiAgICAgICAgICAgICByZXR1cm4gaW50
ZXJjaGFuZ2VOZXdsaW5lU3RyaW5nOwogICAgICAgICB9CiAKLSAgICAgICAgYWNjdW11bGF0b3Iu
aW5zZXJ0U3RyaW5nKGludGVyY2hhbmdlTmV3bGluZVN0cmluZyk7CisgICAgICAgIGFjY3VtdWxh
dG9yLmFwcGVuZFN0cmluZyhpbnRlcmNoYW5nZU5ld2xpbmVTdHJpbmcpOwogICAgICAgICBzdGFy
dE5vZGUgPSB2aXNpYmxlU3RhcnQubmV4dCgpLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpOwogCiAg
ICAgICAgIGlmIChwYXN0RW5kICYmIFJhbmdlOjpjb21wYXJlQm91bmRhcnlQb2ludHMoc3RhcnRO
b2RlLCAwLCBwYXN0RW5kLCAwKSA+PSAwKSB7CkBAIC05ODYsNyArMTAxMCw3IEBAIFN0cmluZyBj
cmVhdGVNYXJrdXAoY29uc3QgUmFuZ2UqIHJhbmdlLCAKICAgICAgICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBub2RlIGFuZCBhbGwgdGhlIG90aGVyIGFuY2Vz
dG9ycyBhcmUgbm90IGluIHRoZSBzZWxlY3Rpb24gd2Ugd2FudCB0byBzZXQgUmFuZ2VGdWxseVNl
bGVjdHNOb2RlIHRvIERvZXNOb3RGdWxseVNlbGVjdE5vZGUKICAgICAgICAgICAgICAgICAvLyBz
byB0aGF0IHN0eWxlcyB0aGF0IGFmZmVjdCB0aGUgZXh0ZXJpb3Igb2YgdGhlIG5vZGUgYXJlIG5v
dCBpbmNsdWRlZC4KLSAgICAgICAgICAgICAgICBhY2N1bXVsYXRvci53cmFwV2l0aE5vZGUoYW5j
ZXN0b3IsIHVwZGF0ZWRSYW5nZS5nZXQoKSwgYW5ub3RhdGUsIGFic29sdXRlVVJMcywgY29udmVy
dEJsb2Nrc1RvSW5saW5lcywgMCwgRG9lc05vdEZ1bGx5U2VsZWN0Tm9kZSk7CisgICAgICAgICAg
ICAgICAgYWNjdW11bGF0b3Iud3JhcFdpdGhOb2RlKGFuY2VzdG9yLCB1cGRhdGVkUmFuZ2UuZ2V0
KCksIGFubm90YXRlLCBhYnNvbHV0ZVVSTHMsIGNvbnZlcnRCbG9ja3NUb0lubGluZXMsIDAsIE1h
cmt1cEFjY3VtdWxhdG9yOjpEb2VzTm90RnVsbHlTZWxlY3ROb2RlKTsKICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIGlmIChub2RlcykKICAgICAgICAgICAgICAgICBub2Rlcy0+YXBwZW5kKGFu
Y2VzdG9yKTsKQEAgLTEwMzMsNyArMTA1Nyw3IEBAIFN0cmluZyBjcmVhdGVNYXJrdXAoY29uc3Qg
UmFuZ2UqIHJhbmdlLCAKIAogICAgIC8vIEZJWE1FOiBUaGUgaW50ZXJjaGFuZ2UgbmV3bGluZSBz
aG91bGQgYmUgcGxhY2VkIGluIHRoZSBibG9jayB0aGF0IGl0J3MgaW4sIG5vdCBhZnRlciBhbGwg
b2YgdGhlIGNvbnRlbnQsIHVuY29uZGl0aW9uYWxseS4KICAgICBpZiAoYW5ub3RhdGUgJiYgbmVl
ZEludGVyY2hhbmdlTmV3bGluZUFmdGVyKHZpc2libGVFbmQucHJldmlvdXMoKSkpCi0gICAgICAg
IGFjY3VtdWxhdG9yLmluc2VydFN0cmluZyhpbnRlcmNoYW5nZU5ld2xpbmVTdHJpbmcpOworICAg
ICAgICBhY2N1bXVsYXRvci5hcHBlbmRTdHJpbmcoaW50ZXJjaGFuZ2VOZXdsaW5lU3RyaW5nKTsK
IAogICAgIGlmIChkZWxldGVCdXR0b24pCiAgICAgICAgIGRlbGV0ZUJ1dHRvbi0+ZW5hYmxlKCk7
CkBAIC0xMDUyLDE3ICsxMDc2LDE3IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gY3Jl
YXRlRnJhZ20KICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOwogfQogCi1zdGF0aWMgdm9p
ZCBzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKE1hcmt1cEFjY3VtdWxhdG9yV3JhcHBlciYg
YWNjdW11bGF0b3IsIGNvbnN0IE5vZGUqIG5vZGUsIE5vZGUqIG5vZGVUb1NraXAsIEVDaGlsZHJl
bk9ubHkgY2hpbGRyZW5Pbmx5LCBFQWJzb2x1dGVVUkxzIGFic29sdXRlVVJMcywgY29uc3QgSGFz
aE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgQXRvbWljU3RyaW5nSW1wbCo+KiBuYW1lc3BhY2VzKQor
c3RhdGljIHZvaWQgc2VyaWFsaXplTm9kZXNXaXRoTmFtZXNwYWNlcyhNYXJrdXBBY2N1bXVsYXRv
ciYgYWNjdW11bGF0b3IsIE5vZGUqIG5vZGUsIE5vZGUqIG5vZGVUb1NraXAsIEVDaGlsZHJlbk9u
bHkgY2hpbGRyZW5Pbmx5LCBFQWJzb2x1dGVVUkxzIGFic29sdXRlVVJMcywgY29uc3QgTmFtZXNw
YWNlcyogbmFtZXNwYWNlcykKIHsKICAgICBpZiAobm9kZSA9PSBub2RlVG9Ta2lwKQogICAgICAg
ICByZXR1cm47CiAKLSAgICBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJ
bXBsKj4gbmFtZXNwYWNlSGFzaDsKKyAgICBOYW1lc3BhY2VzIG5hbWVzcGFjZUhhc2g7CiAgICAg
aWYgKG5hbWVzcGFjZXMpCiAgICAgICAgIG5hbWVzcGFjZUhhc2ggPSAqbmFtZXNwYWNlczsKIAog
ICAgIGlmICghY2hpbGRyZW5Pbmx5KQotICAgICAgICBhY2N1bXVsYXRvci5pbnNlcnRPcGVuVGFn
KG5vZGUsIDAsIERvTm90QW5ub3RhdGVGb3JJbnRlcmNoYW5nZSwgYWJzb2x1dGVVUkxzLCBmYWxz
ZSwgJm5hbWVzcGFjZUhhc2gpOworICAgICAgICBhY2N1bXVsYXRvci5hcHBlbmRTdGFydFRhZyhu
b2RlLCAwLCBEb05vdEFubm90YXRlRm9ySW50ZXJjaGFuZ2UsIGFic29sdXRlVVJMcywgZmFsc2Us
ICZuYW1lc3BhY2VIYXNoKTsKIAogICAgIGlmICghKG5vZGUtPmRvY3VtZW50KCktPmlzSFRNTERv
Y3VtZW50KCkgJiYgZG9lc0hUTUxGb3JiaWRFbmRUYWcobm9kZSkpKSB7CiAgICAgICAgIGZvciAo
Tm9kZSogY3VycmVudCA9IG5vZGUtPmZpcnN0Q2hpbGQoKTsgY3VycmVudDsgY3VycmVudCA9IGN1
cnJlbnQtPm5leHRTaWJsaW5nKCkpCkBAIC0xMDcwLDcgKzEwOTQsNyBAQCBzdGF0aWMgdm9pZCBz
ZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzCiAgICAgfQogCiAgICAgaWYgKCFjaGlsZHJlbk9u
bHkpCi0gICAgICAgIGFjY3VtdWxhdG9yLmluc2VydEVuZFRhZyhub2RlKTsKKyAgICAgICAgYWNj
dW11bGF0b3IuYXBwZW5kRW5kVGFnKG5vZGUpOwogfQogCiBTdHJpbmcgY3JlYXRlTWFya3VwKGNv
bnN0IE5vZGUqIG5vZGUsIEVDaGlsZHJlbk9ubHkgY2hpbGRyZW5Pbmx5LCBWZWN0b3I8Tm9kZSo+
KiBub2RlcywgRUFic29sdXRlVVJMcyBhYnNvbHV0ZVVSTHMpCkBAIC0xMDg1LDggKzExMDksOCBA
QCBTdHJpbmcgY3JlYXRlTWFya3VwKGNvbnN0IE5vZGUqIG5vZGUsIEVDCiAgICAgICAgICAgICBy
ZXR1cm4gIiI7CiAgICAgfQogCi0gICAgTWFya3VwQWNjdW11bGF0b3JXcmFwcGVyIGFjY3VtdWxh
dG9yKG5vZGVzKTsKLSAgICBzZXJpYWxpemVOb2Rlc1dpdGhOYW1lc3BhY2VzKGFjY3VtdWxhdG9y
LCBub2RlLCBkZWxldGVCdXR0b25Db250YWluZXJFbGVtZW50LCBjaGlsZHJlbk9ubHksIGFic29s
dXRlVVJMcywgMCk7CisgICAgTWFya3VwQWNjdW11bGF0b3IgYWNjdW11bGF0b3Iobm9kZXMpOwor
ICAgIHNlcmlhbGl6ZU5vZGVzV2l0aE5hbWVzcGFjZXMoYWNjdW11bGF0b3IsIGNvbnN0X2Nhc3Q8
Tm9kZSo+KG5vZGUpLCBkZWxldGVCdXR0b25Db250YWluZXJFbGVtZW50LCBjaGlsZHJlbk9ubHks
IGFic29sdXRlVVJMcywgMCk7CiAgICAgcmV0dXJuIGFjY3VtdWxhdG9yLnRha2VSZXN1bHRzKCk7
CiB9CiAK
</data>
<flag name="review"
          id="53412"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>