<?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>208759</bug_id>
          
          <creation_ts>2020-03-07 00:55:32 -0800</creation_ts>
          <short_desc>TextManipulationController should work with ARIA labels</short_desc>
          <delta_ts>2020-03-07 23:16:27 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>HTML Editing</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>cfleizach</cc>
    
    <cc>darin</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>jcraig</cc>
    
    <cc>megan_gardner</cc>
    
    <cc>mifenton</cc>
    
    <cc>wenson_hsieh</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1627190</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 00:55:32 -0800</bug_when>
    <thetext>We need to make TextManipulationController accessibility ready.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627191</commentid>
    <comment_count>1</comment_count>
      <attachid>392856</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 01:04:42 -0800</bug_when>
    <thetext>Created attachment 392856
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627192</commentid>
    <comment_count>2</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 01:04:59 -0800</bug_when>
    <thetext>&lt;rdar://problem/58092680&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627274</commentid>
    <comment_count>3</comment_count>
      <attachid>392856</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-03-07 12:51:44 -0800</bug_when>
    <thetext>Comment on attachment 392856
Patch

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

&gt; Source/WebCore/editing/TextManipulationController.cpp:232
&gt; +    static const auto attributeNames = makeNeverDestroyed(HashSet&lt;QualifiedName&gt; {
&gt; +        titleAttr,
&gt; +        altAttr,
&gt; +        placeholderAttr,
&gt; +        aria_labelAttr,
&gt; +        aria_placeholderAttr,
&gt; +        aria_roledescriptionAttr,
&gt; +        aria_valuetextAttr,
&gt; +    });
&gt; +    return attributeNames.get().contains(name);

I guess the easiest way to write this code is to use HashSet, and there’s no easy way to write code for other approaches. Seems a tiny bit unfortunate since to compare 1 pointer with 7 other pointers I suspect a linear search might be faster than hashing.

&gt; Source/WebCore/editing/TextManipulationController.cpp:239
&gt; +    ParagraphContentIterator iterator { start, end };

Unclear to me why it’s safe to make the iterator out of the Position objects, when the VisiblePosition construction might move the start and end. Do we have test cases that emphasize the stress test cases where VisiblePosition &apos;moves&quot; the Position a long way?

&gt; Source/WebCore/editing/TextManipulationController.h:138
&gt; +        QualifiedName attributeName { nullQName() };

Truly puzzled why we have a function nullQName() rather than making the QualifiedName default constructor do that.

&gt; Tools/TestWebKitAPI/Tests/WebKitCocoa/TextManipulation.mm:872
&gt; +    [webView synchronouslyLoadHTMLString:@&quot;&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;hey&lt;/title&gt;&lt;/head&gt;&quot;
&gt; +        &quot;&lt;body&gt;&lt;div&gt;&lt;span aria-label=\&quot;this is greet\&quot;&gt;hello&lt;/span&gt;&lt;img src=\&quot;apple.gif\&quot; alt=\&quot;fruit\&quot;&gt;&lt;/body&gt;&lt;/html&gt;&quot;];

This is missing a &quot;&lt;/div&gt;&quot;; I’m guessing that’s an accident, not intentional.

&gt; Tools/TestWebKitAPI/Tests/WebKitCocoa/TextManipulation.mm:906
&gt; +    EXPECT_WK_STREQ(&quot;&lt;head&gt;&lt;title&gt;Hello&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;&lt;span aria-label=\&quot;This is a greeting\&quot;&gt;hello&lt;/span&gt;&quot;
&gt; +        &quot;&lt;img src=\&quot;apple.gif\&quot; alt=\&quot;Apple\&quot;&gt;&lt;/body&gt;&quot;, [webView stringByEvaluatingJavaScript:@&quot;document.documentElement.innerHTML&quot;]);

This is missing a &quot;&lt;/div&gt;&quot;, which seems to be the reason the test is failing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627374</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 17:08:24 -0800</bug_when>
    <thetext>(In reply to Darin Adler from comment #3)
&gt; Comment on attachment 392856 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=392856&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/TextManipulationController.cpp:232
&gt; &gt; +    static const auto attributeNames = makeNeverDestroyed(HashSet&lt;QualifiedName&gt; {
&gt; &gt; +        titleAttr,
&gt; &gt; +        altAttr,
&gt; &gt; +        placeholderAttr,
&gt; &gt; +        aria_labelAttr,
&gt; &gt; +        aria_placeholderAttr,
&gt; &gt; +        aria_roledescriptionAttr,
&gt; &gt; +        aria_valuetextAttr,
&gt; &gt; +    });
&gt; &gt; +    return attributeNames.get().contains(name);
&gt; 
&gt; I guess the easiest way to write this code is to use HashSet, and there’s no
&gt; easy way to write code for other approaches. Seems a tiny bit unfortunate
&gt; since to compare 1 pointer with 7 other pointers I suspect a linear search
&gt; might be faster than hashing.

Yeah, I think 7 is right around the corner of hash map being faster compared to a linear search but I think we can use a linear search for now. Fixed.

&gt; &gt; Source/WebCore/editing/TextManipulationController.cpp:239
&gt; &gt; +    ParagraphContentIterator iterator { start, end };
&gt; 
&gt; Unclear to me why it’s safe to make the iterator out of the Position
&gt; objects, when the VisiblePosition construction might move the start and end.
&gt; Do we have test cases that emphasize the stress test cases where
&gt; VisiblePosition &apos;moves&quot; the Position a long way?

Yes. the newly added test would fail because if we had used VisiblePosition, we&apos;d skip over the first aria-label as the first canonicalized position is inside the span.

&gt; &gt; Source/WebCore/editing/TextManipulationController.h:138
&gt; &gt; +        QualifiedName attributeName { nullQName() };
&gt; 
&gt; Truly puzzled why we have a function nullQName() rather than making the
&gt; QualifiedName default constructor do that.

Yeah, we should probably do that.

&gt; &gt; Tools/TestWebKitAPI/Tests/WebKitCocoa/TextManipulation.mm:872
&gt; &gt; +    [webView synchronouslyLoadHTMLString:@&quot;&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;hey&lt;/title&gt;&lt;/head&gt;&quot;
&gt; &gt; +        &quot;&lt;body&gt;&lt;div&gt;&lt;span aria-label=\&quot;this is greet\&quot;&gt;hello&lt;/span&gt;&lt;img src=\&quot;apple.gif\&quot; alt=\&quot;fruit\&quot;&gt;&lt;/body&gt;&lt;/html&gt;&quot;];
&gt; 
&gt; This is missing a &quot;&lt;/div&gt;&quot;; I’m guessing that’s an accident, not intentional.

Weird, not sure what happened here because it was passing locally. Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627375</commentid>
    <comment_count>5</comment_count>
      <attachid>392916</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 17:09:03 -0800</bug_when>
    <thetext>Created attachment 392916
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627385</commentid>
    <comment_count>6</comment_count>
      <attachid>392916</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-03-07 17:25:19 -0800</bug_when>
    <thetext>Comment on attachment 392916
Patch

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

&gt; Source/WebCore/editing/TextManipulationController.cpp:223
&gt; +    static const QualifiedName* attributeNames[] = {

Could add one more const here:

    static const QualifiedName* const attributeNames[] = {</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627386</commentid>
    <comment_count>7</comment_count>
      <attachid>392916</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-03-07 17:26:07 -0800</bug_when>
    <thetext>Comment on attachment 392916
Patch

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

&gt;&gt; Source/WebCore/editing/TextManipulationController.cpp:223
&gt;&gt; +    static const QualifiedName* attributeNames[] = {
&gt; 
&gt; Could add one more const here:
&gt; 
&gt;     static const QualifiedName* const attributeNames[] = {

Or one of these?

    static constexpr const QualifiedName* attributeNames[] = {
    static constexpr const QualifiedName* const attributeNames[] = {</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627413</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 19:09:41 -0800</bug_when>
    <thetext>(In reply to Darin Adler from comment #7)
&gt; Comment on attachment 392916 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=392916&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/editing/TextManipulationController.cpp:223
&gt; &gt;&gt; +    static const QualifiedName* attributeNames[] = {
&gt; &gt; 
&gt; &gt; Could add one more const here:
&gt; &gt; 
&gt; &gt;     static const QualifiedName* const attributeNames[] = {
&gt; 
&gt; Or one of these?
&gt; 
&gt;     static constexpr const QualifiedName* attributeNames[] = {
&gt;     static constexpr const QualifiedName* const attributeNames[] = {

I guess we can&apos;t have three const&apos;s here:

./editing/TextManipulationController.cpp:223:42: error: duplicate &apos;const&apos; declaration specifier [-Werror,-Wduplicate-decl-specifier]
    static constexpr const QualifiedName const* attributeNames[] = {
                                         ^~~~~
We can do constexpr though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627414</commentid>
    <comment_count>9</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 19:10:54 -0800</bug_when>
    <thetext>./editing/TextManipulationController.cpp:223:43: error: constexpr variable &apos;attributeNames&apos; must be initialized by a constant expression
    static constexpr const QualifiedName* attributeNames[] = {
                                          ^                  ~
./editing/TextManipulationController.cpp:224:20: note: non-constexpr function &apos;get&apos; cannot be used in a constant expression
        &amp;titleAttr.get(),
                   ^

Hm... I guess this won&apos;t quite work either. I guess we can go with const const.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627415</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 19:18:26 -0800</bug_when>
    <thetext>(In reply to Ryosuke Niwa from comment #8)
&gt; (In reply to Darin Adler from comment #7)
&gt; &gt; Comment on attachment 392916 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=392916&amp;action=review
&gt; &gt; 
&gt; &gt; &gt;&gt; Source/WebCore/editing/TextManipulationController.cpp:223
&gt; &gt; &gt;&gt; +    static const QualifiedName* attributeNames[] = {
&gt; &gt; &gt; 
&gt; &gt; &gt; Could add one more const here:
&gt; &gt; &gt; 
&gt; &gt; &gt;     static const QualifiedName* const attributeNames[] = {
&gt; &gt; 
&gt; &gt; Or one of these?
&gt; &gt; 
&gt; &gt;     static constexpr const QualifiedName* attributeNames[] = {
&gt; &gt;     static constexpr const QualifiedName* const attributeNames[] = {
&gt; 
&gt; I guess we can&apos;t have three const&apos;s here:
&gt; 
&gt; ./editing/TextManipulationController.cpp:223:42: error: duplicate &apos;const&apos;
&gt; declaration specifier [-Werror,-Wduplicate-decl-specifier]
&gt;     static constexpr const QualifiedName const* attributeNames[] = {
&gt;                                          ^~~~~
&gt; We can do constexpr though.

Oops, this is obviously wrong. It should read const QualifiedName * const</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627422</commentid>
    <comment_count>11</comment_count>
      <attachid>392916</attachid>
    <who name="Wenson Hsieh">wenson_hsieh</who>
    <bug_when>2020-03-07 19:43:41 -0800</bug_when>
    <thetext>Comment on attachment 392916
Patch

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

Looks reasonable to me.

&gt; Source/WebCore/ChangeLog:10
&gt; +        It also make observeParagraphs observe content across the entire document since canonicalizing

Nit - It also makes

&gt; Source/WebCore/ChangeLog:17
&gt; +        (WebCore::TextManipulationController::startObservingParagraphs): Now takes two Position&apos;s instead

(nit - no apostrophes after the plural nouns)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627425</commentid>
    <comment_count>12</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 19:49:47 -0800</bug_when>
    <thetext>(In reply to Wenson Hsieh from comment #11)
&gt; Comment on attachment 392916 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=392916&amp;action=review
&gt; 
&gt; Looks reasonable to me.
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:10
&gt; &gt; +        It also make observeParagraphs observe content across the entire document since canonicalizing
&gt; 
&gt; Nit - It also makes

Fixed.

&gt; &gt; Source/WebCore/ChangeLog:17
&gt; &gt; +        (WebCore::TextManipulationController::startObservingParagraphs): Now takes two Position&apos;s instead
&gt; 
&gt; (nit - no apostrophes after the plural nouns)

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627429</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 19:52:08 -0800</bug_when>
    <thetext>Committed r258093: &lt;https://trac.webkit.org/changeset/258093&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627449</commentid>
    <comment_count>14</comment_count>
      <attachid>392916</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-03-07 20:33:27 -0800</bug_when>
    <thetext>Comment on attachment 392916
Patch

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/editing/TextManipulationController.cpp:223
&gt;&gt;&gt;&gt;&gt; +    static const QualifiedName* attributeNames[] = {
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Could add one more const here:
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;     static const QualifiedName* const attributeNames[] = {
&gt;&gt;&gt; 
&gt;&gt;&gt; Or one of these?
&gt;&gt;&gt; 
&gt;&gt;&gt;     static constexpr const QualifiedName* attributeNames[] = {
&gt;&gt;&gt;     static constexpr const QualifiedName* const attributeNames[] = {
&gt;&gt; 
&gt;&gt; I guess we can&apos;t have three const&apos;s here:
&gt;&gt; 
&gt;&gt; ./editing/TextManipulationController.cpp:223:42: error: duplicate &apos;const&apos; declaration specifier [-Werror,-Wduplicate-decl-specifier]
&gt;&gt;     static constexpr const QualifiedName const* attributeNames[] = {
&gt;&gt;                                          ^~~~~
&gt;&gt; We can do constexpr though.
&gt; 
&gt; Oops, this is obviously wrong. It should read const QualifiedName * const

Did you re-try the constexpr after moving the second const to the right place?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1627473</commentid>
    <comment_count>15</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-03-07 23:16:27 -0800</bug_when>
    <thetext>(In reply to Darin Adler from comment #14)
&gt; Comment on attachment 392916 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=392916&amp;action=review
&gt; 
&gt; &gt;&gt;&gt;&gt;&gt; Source/WebCore/editing/TextManipulationController.cpp:223
&gt; &gt;&gt;&gt;&gt;&gt; +    static const QualifiedName* attributeNames[] = {
&gt; &gt;&gt;&gt;&gt; 
&gt; &gt;&gt;&gt;&gt; Could add one more const here:
&gt; &gt;&gt;&gt;&gt; 
&gt; &gt;&gt;&gt;&gt;     static const QualifiedName* const attributeNames[] = {
&gt; &gt;&gt;&gt; 
&gt; &gt;&gt;&gt; Or one of these?
&gt; &gt;&gt;&gt; 
&gt; &gt;&gt;&gt;     static constexpr const QualifiedName* attributeNames[] = {
&gt; &gt;&gt;&gt;     static constexpr const QualifiedName* const attributeNames[] = {
&gt; &gt;&gt; 
&gt; &gt;&gt; I guess we can&apos;t have three const&apos;s here:
&gt; &gt;&gt; 
&gt; &gt;&gt; ./editing/TextManipulationController.cpp:223:42: error: duplicate &apos;const&apos; declaration specifier [-Werror,-Wduplicate-decl-specifier]
&gt; &gt;&gt;     static constexpr const QualifiedName const* attributeNames[] = {
&gt; &gt;&gt;                                          ^~~~~
&gt; &gt;&gt; We can do constexpr though.
&gt; &gt; 
&gt; &gt; Oops, this is obviously wrong. It should read const QualifiedName * const
&gt; 
&gt; Did you re-try the constexpr after moving the second const to the right
&gt; place?

Yes. I think the compiler doesn’t like the get() call because it’s LazyNeverDestroyed so it has to do some work at runtime.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>392856</attachid>
            <date>2020-03-07 01:04:42 -0800</date>
            <delta_ts>2020-03-07 17:09:01 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-208759-20200307010439.patch</filename>
            <type>text/plain</type>
            <size>16917</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI1ODAzNykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMyIEBACisyMDIwLTAzLTA3ICBSeW9zdWtl
IE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIFRleHRNYW5pcHVsYXRpb25Db250
cm9sbGVyIHNob3VsZCB3b3JrIHdpdGggQVJJQSBsYWJlbHMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwODc1OQorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgVGV4dE1hbmlwdWxh
dGlvbkNvbnRyb2xsZXIgd29yayB3aXRoIGEgZmV3IEFSSUEgY29udGVudCBhdHRyaWJ1dGVzLgor
CisgICAgICAgIEl0IGFsc28gbWFrZSBvYnNlcnZlUGFyYWdyYXBocyBvYnNlcnZlIGNvbnRlbnQg
YWNyb3NzIHRoZSBlbnRpcmUgZG9jdW1lbnQgc2luY2UgY2Fub25pY2FsaXppbmcKKyAgICAgICAg
dGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGNhbiBlbmQgdXAgc2tpcHBpbmcgc29tZSBjb250ZW50IHdp
dGggQVJJQS4KKworICAgICAgICBUZXN0czogVGV4dE1hbmlwdWxhdGlvbi5TdGFydFRleHRNYW5p
cHVsYXRpb25GaW5kQXR0cmlidXRlQ29udGVudAorICAgICAgICAgICAgICAgVGV4dE1hbmlwdWxh
dGlvbi5Db21wbGV0ZVRleHRNYW5pcHVsYXRpb25TaG91bGRSZXBsYWNlQXR0cmlidXRlQ29udGVu
dAorCisgICAgICAgICogZWRpdGluZy9UZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlcjo6c3RhcnRPYnNlcnZp
bmdQYXJhZ3JhcGhzKTogTm93IHRha2VzIHR3byBQb3NpdGlvbidzIGluc3RlYWQKKyAgICAgICAg
b2YgVmlzaWJsZVBvc2l0aW9uJ3MuIAorICAgICAgICAoV2ViQ29yZTo6aXNBdHRyaWJ1dGVGb3JU
ZXh0TWFuaXB1bGF0aW9uKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpUZXh0TWFuaXB1bGF0
aW9uQ29udHJvbGxlcjo6b2JzZXJ2ZVBhcmFncmFwaHMpOiBBZGRlZCB0aGUgY29kZSB0byBmaW5k
IGVsZW1lbnRzIHdpdGgKKyAgICAgICAgQVJJQSBhdHRyaWJ1dGVzIGFuZCBhIGZldyBvdGhlciBl
bGVtZW50cyB0aGF0IGRvbid0IGdlbmVyYXRlIFJlbmRlck9iamVjdCdzLgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6OnNjaGVkdWxlT2JzZXJ2YXJ0aW9uVXBk
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjphZGRJ
dGVtKTogTm93IHRha2VzIE1hbmlwdWxhdGlvbkl0ZW1EYXRhIGluc3RlYWQgb2YgaW5kaXZpc3Vh
bAorICAgICAgICBmaWVsZHMgaW4gaXQuCisgICAgICAgIChXZWJDb3JlOjpUZXh0TWFuaXB1bGF0
aW9uQ29udHJvbGxlcjo6cmVwbGFjZSk6IEFkZGVkIHRoZSBsb2dpYyB0byBoYW5kbGUgTWFuaXB1
bGF0aW9uSXRlbURhdGEKKyAgICAgICAgdGhhdCBzcGVjaWZ5IGVsZW1lbnQgYW5kIGF0dHJpYnV0
ZU5hbWUuCisgICAgICAgICogZWRpdGluZy9UZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlci5oOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6Ok1hbmlwdWxhdGlv
bkl0ZW1EYXRhKTogQWRkZWQgZWxlbWVudCBhbmQgYXR0cmlidXRlTmFtZS4KKwogMjAyMC0wMy0w
NiAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBUZXh0TWFuaXB1
bGF0aW9uQ29udHJvbGxlciBzaG91bGQgcHJlc2VydmUgaW1hZ2VzCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL1RleHRNYW5pcHVsYXRpb25Db250cm9sbGVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRNYW5pcHVsYXRpb25Db250cm9sbGVyLmNwcAko
cmV2aXNpb24gMjU4MDM3KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0TWFuaXB1bGF0
aW9uQ29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNs
dWRlICJFZGl0aW5nLmgiCiAjaW5jbHVkZSAiRWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCIKICNp
bmNsdWRlICJFdmVudExvb3AuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJO
b2RlVHJhdmVyc2FsLmgiCiAjaW5jbHVkZSAiUHNldWRvRWxlbWVudC5oIgogI2luY2x1ZGUgIlJh
bmdlLmgiCkBAIC0xMzIsMTAgKzEzMyw3IEBAIHZvaWQgVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xs
ZXI6OnN0YXJ0T2IKICAgICBtX2NhbGxiYWNrID0gV1RGTW92ZShjYWxsYmFjayk7CiAgICAgbV9l
eGNsdXNpb25SdWxlcyA9IFdURk1vdmUoZXhjbHVzaW9uUnVsZXMpOwogCi0gICAgVmlzaWJsZVBv
c2l0aW9uIHN0YXJ0ID0gZmlyc3RQb3NpdGlvbkluTm9kZShtX2RvY3VtZW50LmdldCgpKTsKLSAg
ICBWaXNpYmxlUG9zaXRpb24gZW5kID0gbGFzdFBvc2l0aW9uSW5Ob2RlKG1fZG9jdW1lbnQuZ2V0
KCkpOwotCi0gICAgb2JzZXJ2ZVBhcmFncmFwaHMoc3RhcnQsIGVuZCk7CisgICAgb2JzZXJ2ZVBh
cmFncmFwaHMoZmlyc3RQb3NpdGlvbkluTm9kZShtX2RvY3VtZW50LmdldCgpKSwgbGFzdFBvc2l0
aW9uSW5Ob2RlKG1fZG9jdW1lbnQuZ2V0KCkpKTsKICAgICBmbHVzaFBlbmRpbmdJdGVtc0ZvckNh
bGxiYWNrKCk7CiB9CiAKQEAgLTIxOSwxNyArMjE3LDM0IEBAIHByaXZhdGU6CiAgICAgUmVmUHRy
PE5vZGU+IG1fcGFzdEVuZE5vZGU7CiB9OwogCi12b2lkIFRleHRNYW5pcHVsYXRpb25Db250cm9s
bGVyOjpvYnNlcnZlUGFyYWdyYXBocyhWaXNpYmxlUG9zaXRpb24mIHN0YXJ0LCBWaXNpYmxlUG9z
aXRpb24mIGVuZCkKK3N0YXRpYyBib29sIGlzQXR0cmlidXRlRm9yVGV4dE1hbmlwdWxhdGlvbihj
b25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKQoreworICAgIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFt
ZXM7CisgICAgc3RhdGljIGNvbnN0IGF1dG8gYXR0cmlidXRlTmFtZXMgPSBtYWtlTmV2ZXJEZXN0
cm95ZWQoSGFzaFNldDxRdWFsaWZpZWROYW1lPiB7CisgICAgICAgIHRpdGxlQXR0ciwKKyAgICAg
ICAgYWx0QXR0ciwKKyAgICAgICAgcGxhY2Vob2xkZXJBdHRyLAorICAgICAgICBhcmlhX2xhYmVs
QXR0ciwKKyAgICAgICAgYXJpYV9wbGFjZWhvbGRlckF0dHIsCisgICAgICAgIGFyaWFfcm9sZWRl
c2NyaXB0aW9uQXR0ciwKKyAgICAgICAgYXJpYV92YWx1ZXRleHRBdHRyLAorICAgIH0pOworICAg
IHJldHVybiBhdHRyaWJ1dGVOYW1lcy5nZXQoKS5jb250YWlucyhuYW1lKTsKK30KKwordm9pZCBU
ZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlcjo6b2JzZXJ2ZVBhcmFncmFwaHMoY29uc3QgUG9zaXRp
b24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewotICAgIGF1dG8gZG9jdW1lbnQgPSBt
YWtlUmVmUHRyKHN0YXJ0LmRlZXBFcXVpdmFsZW50KCkuZG9jdW1lbnQoKSk7CisgICAgYXV0byBk
b2N1bWVudCA9IG1ha2VSZWZQdHIoc3RhcnQuZG9jdW1lbnQoKSk7CiAgICAgQVNTRVJUKGRvY3Vt
ZW50KTsKLSAgICBQYXJhZ3JhcGhDb250ZW50SXRlcmF0b3IgaXRlcmF0b3IgeyBzdGFydC5kZWVw
RXF1aXZhbGVudCgpLCBlbmQuZGVlcEVxdWl2YWxlbnQoKSB9OwotICAgIGlmIChkb2N1bWVudCAh
PSBzdGFydC5kZWVwRXF1aXZhbGVudCgpLmRvY3VtZW50KCkgfHwgZG9jdW1lbnQgIT0gZW5kLmRl
ZXBFcXVpdmFsZW50KCkuZG9jdW1lbnQoKSkKKyAgICBQYXJhZ3JhcGhDb250ZW50SXRlcmF0b3Ig
aXRlcmF0b3IgeyBzdGFydCwgZW5kIH07CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFy
dCA9IHN0YXJ0OworICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kID0gZW5kOworICAgIGlm
IChkb2N1bWVudCAhPSBzdGFydC5kb2N1bWVudCgpIHx8IGRvY3VtZW50ICE9IGVuZC5kb2N1bWVu
dCgpKQogICAgICAgICByZXR1cm47IC8vIFRleHRJdGVyYXRvcidzIGNvbnN0cnVjdG9yIG1heSBo
YXZlIHVwZGF0ZWQgdGhlIGxheW91dCBhbmQgZXhlY3V0ZWQgYXJiaXRyYXJ5IHNjcmlwdHMuCiAK
ICAgICBFeGNsdXNpb25SdWxlTWF0Y2hlciBleGNsdXNpb25SdWxlTWF0Y2hlcihtX2V4Y2x1c2lv
blJ1bGVzKTsKICAgICBWZWN0b3I8TWFuaXB1bGF0aW9uVG9rZW4+IHRva2Vuc0luQ3VycmVudFBh
cmFncmFwaDsKLSAgICBQb3NpdGlvbiBzdGFydE9mQ3VycmVudFBhcmFncmFwaCA9IHN0YXJ0LmRl
ZXBFcXVpdmFsZW50KCk7CisgICAgUG9zaXRpb24gc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGggPSB2
aXNpYmxlU3RhcnQuZGVlcEVxdWl2YWxlbnQoKTsKICAgICBmb3IgKDsgIWl0ZXJhdG9yLmF0RW5k
KCk7IGl0ZXJhdG9yLmFkdmFuY2UoKSkgewogICAgICAgICBhdXRvIGNvbnRlbnQgPSBpdGVyYXRv
ci5jdXJyZW50Q29udGVudCgpOwogICAgICAgICBpZiAoY29udGVudC5ub2RlKSB7CkBAIC0yMzgs
NyArMjUzLDIzIEBAIHZvaWQgVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6Om9ic2VydmUKICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBXZSBjYW4gZXhpdCBlYXJseSBoZXJlIGJlY2F1
c2Ugc2NoZWR1bGVPYnNlcnZhcnRpb25VcGRhdGUgY2FsbHMgdGhpcyBmdW5jdGlvbiBvbiBlYWNo
IHBhcmFncmFwaCBzZXBhcmF0ZWx5LgogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAo
c3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGguaXNOdWxsKCkpCisgICAgICAgICAgICBpZiAoaXM8RWxl
bWVudD4oKmNvbnRlbnQubm9kZSkpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBjdXJyZW50RWxl
bWVudCA9IGRvd25jYXN0PEVsZW1lbnQ+KCpjb250ZW50Lm5vZGUpOworICAgICAgICAgICAgICAg
IGlmICghY29udGVudC5pc1RleHRDb250ZW50ICYmIChjb250ZW50Lm5vZGUtPmhhc1RhZ05hbWUo
SFRNTE5hbWVzOjp0aXRsZVRhZykgfHwgY29udGVudC5ub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1l
czo6b3B0aW9uVGFnKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkSXRlbShNYW5pcHVsYXRp
b25JdGVtRGF0YSB7IFBvc2l0aW9uKCksIFBvc2l0aW9uKCksIG1ha2VXZWFrUHRyKGN1cnJlbnRF
bGVtZW50KSwgbnVsbFFOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB7IE1hbmlwdWxh
dGlvblRva2VuIHsgbV90b2tlbklkZW50aWZpZXIuZ2VuZXJhdGUoKSwgY3VycmVudEVsZW1lbnQu
dGV4dENvbnRlbnQoKSB9IH0gfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGlmIChjdXJyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgZm9yIChhdXRvJiBhdHRyaWJ1dGUgOiBjdXJyZW50RWxlbWVudC5hdHRyaWJ1dGVzSXRlcmF0
b3IoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXR0cmlidXRlRm9yVGV4dE1h
bmlwdWxhdGlvbihhdHRyaWJ1dGUubmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFkZEl0ZW0oTWFuaXB1bGF0aW9uSXRlbURhdGEgeyBQb3NpdGlvbigpLCBQb3NpdGlvbigp
LCBtYWtlV2Vha1B0cihjdXJyZW50RWxlbWVudCksIGF0dHJpYnV0ZS5uYW1lKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHsgTWFuaXB1bGF0aW9uVG9rZW4geyBtX3Rva2VuSWRl
bnRpZmllci5nZW5lcmF0ZSgpLCBhdHRyaWJ1dGUudmFsdWUoKSB9IH0gfSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGFydE9mQ3VycmVudFBhcmFncmFw
aC5pc051bGwoKSAmJiBjb250ZW50LmlzVGV4dENvbnRlbnQpCiAgICAgICAgICAgICAgICAgc3Rh
cnRPZkN1cnJlbnRQYXJhZ3JhcGggPSBpdGVyYXRvci5zdGFydFBvc2l0aW9uKCk7CiAgICAgICAg
IH0KIApAQCAtMjY2LDcgKzI5Nyw3IEBAIHZvaWQgVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6
Om9ic2VydmUKICAgICAgICAgICAgICAgICAgICAgZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gUG9z
aXRpb24oJnRleHROb2RlLCBvZmZzZXRPZk5leHROZXdMaW5lKTsKICAgICAgICAgICAgICAgICAg
ICAgc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGggPSBQb3NpdGlvbigmdGV4dE5vZGUsIG9mZnNldE9m
TmV4dE5ld0xpbmUgKyAxKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRk
SXRlbShzdGFydE9mQ3VycmVudFBhcmFncmFwaCwgZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBXVEZN
b3ZlKHRva2Vuc0luQ3VycmVudFBhcmFncmFwaCkpOworICAgICAgICAgICAgICAgIGFkZEl0ZW0o
TWFuaXB1bGF0aW9uSXRlbURhdGEgeyBzdGFydE9mQ3VycmVudFBhcmFncmFwaCwgZW5kT2ZDdXJy
ZW50UGFyYWdyYXBoLCBudWxscHRyLCBudWxsUU5hbWUoKSwgV1RGTW92ZSh0b2tlbnNJbkN1cnJl
bnRQYXJhZ3JhcGgpIH0pOwogICAgICAgICAgICAgICAgIHN0YXJ0T2ZDdXJyZW50UGFyYWdyYXBo
LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGFydE9mQ3VycmVudExpbmUg
PSBvZmZzZXRPZk5leHROZXdMaW5lICsgMTsKQEAgLTI3OCw3ICszMDksNyBAQCB2b2lkIFRleHRN
YW5pcHVsYXRpb25Db250cm9sbGVyOjpvYnNlcnZlCiAgICAgfQogCiAgICAgaWYgKCF0b2tlbnNJ
bkN1cnJlbnRQYXJhZ3JhcGguaXNFbXB0eSgpKQotICAgICAgICBhZGRJdGVtKHN0YXJ0T2ZDdXJy
ZW50UGFyYWdyYXBoLCBlbmQuZGVlcEVxdWl2YWxlbnQoKSwgV1RGTW92ZSh0b2tlbnNJbkN1cnJl
bnRQYXJhZ3JhcGgpKTsKKyAgICAgICAgYWRkSXRlbShNYW5pcHVsYXRpb25JdGVtRGF0YSB7IHN0
YXJ0T2ZDdXJyZW50UGFyYWdyYXBoLCB2aXNpYmxlRW5kLmRlZXBFcXVpdmFsZW50KCksIG51bGxw
dHIsIG51bGxRTmFtZSgpLCBXVEZNb3ZlKHRva2Vuc0luQ3VycmVudFBhcmFncmFwaCkgfSk7CiB9
CiAKIHZvaWQgVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6OmRpZENyZWF0ZVJlbmRlcmVyRm9y
RWxlbWVudChFbGVtZW50JiBlbGVtZW50KQpAQCAtMzQzLDEzICszNzQsMTMgQEAgdm9pZCBUZXh0
TWFuaXB1bGF0aW9uQ29udHJvbGxlcjo6c2NoZWR1bAogICAgICAgICAgICAgaWYgKCFjb250cm9s
bGVyKQogICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRmluZGluZyB0aGUgc3RhcnQvZW5kIG9m
IHBhcmFncmFwaCBtYXkgaGF2ZSB1cGRhdGVkIGxheW91dCAmIGV4ZWN1dGVkIGFyYml0cmFyeSBz
Y3JpcHRzLgogCi0gICAgICAgICAgICBjb250cm9sbGVyLT5vYnNlcnZlUGFyYWdyYXBocyhzdGFy
dCwgZW5kKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXItPm9ic2VydmVQYXJhZ3JhcGhzKHN0YXJ0
LmRlZXBFcXVpdmFsZW50KCksIGVuZC5kZWVwRXF1aXZhbGVudCgpKTsKICAgICAgICAgfQogICAg
ICAgICBjb250cm9sbGVyLT5mbHVzaFBlbmRpbmdJdGVtc0ZvckNhbGxiYWNrKCk7CiAgICAgfSk7
CiB9CiAKLXZvaWQgVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6OmFkZEl0ZW0oY29uc3QgUG9z
aXRpb24mIHN0YXJ0T2ZQYXJhZ3JhcGgsIGNvbnN0IFBvc2l0aW9uJiBlbmRPZlBhcmFncmFwaCwg
VmVjdG9yPE1hbmlwdWxhdGlvblRva2VuPiYmIHRva2VucykKK3ZvaWQgVGV4dE1hbmlwdWxhdGlv
bkNvbnRyb2xsZXI6OmFkZEl0ZW0oTWFuaXB1bGF0aW9uSXRlbURhdGEmJiBpdGVtRGF0YSkKIHsK
ICAgICBjb25zdCB1bnNpZ25lZCBpdGVtQ2FsbGJhY2tCYXRjaGluZ1NpemUgPSAxMjg7CiAKQEAg
LTM1Nyw5ICszODgsOSBAQCB2b2lkIFRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjphZGRJdGVt
CiAgICAgYXV0byBuZXdJRCA9IG1faXRlbUlkZW50aWZpZXIuZ2VuZXJhdGUoKTsKICAgICBtX3Bl
bmRpbmdJdGVtc0ZvckNhbGxiYWNrLmFwcGVuZChNYW5pcHVsYXRpb25JdGVtIHsKICAgICAgICAg
bmV3SUQsCi0gICAgICAgIHRva2Vucy5tYXAoW10oYXV0byYgdG9rZW4pIHsgcmV0dXJuIHRva2Vu
OyB9KQorICAgICAgICBpdGVtRGF0YS50b2tlbnMubWFwKFtdKGF1dG8mIHRva2VuKSB7IHJldHVy
biB0b2tlbjsgfSkKICAgICB9KTsKLSAgICBtX2l0ZW1zLmFkZChuZXdJRCwgTWFuaXB1bGF0aW9u
SXRlbURhdGEgeyBzdGFydE9mUGFyYWdyYXBoLCBlbmRPZlBhcmFncmFwaCwgV1RGTW92ZSh0b2tl
bnMpIH0pOworICAgIG1faXRlbXMuYWRkKG5ld0lELCBXVEZNb3ZlKGl0ZW1EYXRhKSk7CiAKICAg
ICBpZiAobV9wZW5kaW5nSXRlbXNGb3JDYWxsYmFjay5zaXplKCkgPj0gaXRlbUNhbGxiYWNrQmF0
Y2hpbmdTaXplKQogICAgICAgICBmbHVzaFBlbmRpbmdJdGVtc0ZvckNhbGxiYWNrKCk7CkBAIC00
MjQsNiArNDU1LDI2IEBAIGF1dG8gVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6OnJlcGxhY2UK
ICAgICBzaXplX3QgY3VycmVudFRva2VuSW5kZXggPSAwOwogICAgIEhhc2hNYXA8VG9rZW5JZGVu
dGlmaWVyLCBUb2tlbkV4Y2hhbmdlRGF0YT4gdG9rZW5FeGNoYW5nZU1hcDsKIAorICAgIGlmIChp
dGVtLnN0YXJ0LmlzTnVsbCgpICYmIGl0ZW0uZW5kLmlzTnVsbCgpKSB7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKGl0ZW0udG9rZW5zLnNpemUoKSA9PSAxKTsKKyAgICAgICAgYXV0byBlbGVtZW50
ID0gbWFrZVJlZlB0cihpdGVtLmVsZW1lbnQuZ2V0KCkpOworICAgICAgICBpZiAoIWVsZW1lbnQp
CisgICAgICAgICAgICByZXR1cm4gTWFuaXB1bGF0aW9uRmFpbHVyZVR5cGU6OkNvbnRlbnRDaGFu
Z2VkOworICAgICAgICBpZiAocmVwbGFjZW1lbnRUb2tlbnMuc2l6ZSgpID4gMSkKKyAgICAgICAg
ICAgIHJldHVybiBNYW5pcHVsYXRpb25GYWlsdXJlVHlwZTo6SW52YWxpZFRva2VuOworICAgICAg
ICBTdHJpbmcgbmV3VmFsdWU7CisgICAgICAgIGlmICghcmVwbGFjZW1lbnRUb2tlbnMuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRUb2tlbnNbMF0uaWRlbnRpZmllciAh
PSBpdGVtLnRva2Vuc1swXS5pZGVudGlmaWVyKQorICAgICAgICAgICAgICAgIHJldHVybiBNYW5p
cHVsYXRpb25GYWlsdXJlVHlwZTo6SW52YWxpZFRva2VuOworICAgICAgICAgICAgbmV3VmFsdWUg
PSByZXBsYWNlbWVudFRva2Vuc1swXS5jb250ZW50OworICAgICAgICB9CisgICAgICAgIGlmIChp
dGVtLmF0dHJpYnV0ZU5hbWUgPT0gbnVsbFFOYW1lKCkpCisgICAgICAgICAgICBlbGVtZW50LT5z
ZXRUZXh0Q29udGVudChuZXdWYWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVsZW1l
bnQtPnNldEF0dHJpYnV0ZShpdGVtLmF0dHJpYnV0ZU5hbWUsIG5ld1ZhbHVlKTsKKyAgICAgICAg
cmV0dXJuIFdURjo6bnVsbG9wdDsKKyAgICB9CisKICAgICBSZWZQdHI8Tm9kZT4gY29tbW9uQW5j
ZXN0b3I7CiAgICAgUGFyYWdyYXBoQ29udGVudEl0ZXJhdG9yIGl0ZXJhdG9yIHsgaXRlbS5zdGFy
dCwgaXRlbS5lbmQgfTsKICAgICBIYXNoU2V0PFJlZjxOb2RlPj4gZXhjbHVkZWROb2RlczsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRNYW5pcHVsYXRpb25Db250
cm9sbGVyLmgJKHJldmlzaW9uIDI1ODAzNikKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVGV4
dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsNiArMjYsNyBA
QAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlICJQb3NpdGlvbi5oIgorI2luY2x1ZGUgIlF1YWxp
ZmllZE5hbWUuaCIKICNpbmNsdWRlIDx3dGYvQ29tcGxldGlvbkhhbmRsZXIuaD4KICNpbmNsdWRl
IDx3dGYvRW51bVRyYWl0cy5oPgogI2luY2x1ZGUgPHd0Zi9PYmplY3RJZGVudGlmaWVyLmg+CkBA
IC0xMjYsMTYgKzEyNywyMCBAQCBwdWJsaWM6CiAKIHByaXZhdGU6CiAgICAgYm9vbCBpc0luTWFu
aXB1bGF0ZWRFbGVtZW50KEVsZW1lbnQmKTsKLSAgICB2b2lkIG9ic2VydmVQYXJhZ3JhcGhzKFZp
c2libGVQb3NpdGlvbiYgc3RhcnQsIFZpc2libGVQb3NpdGlvbiYgZW5kKTsKKyAgICB2b2lkIG9i
c2VydmVQYXJhZ3JhcGhzKGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVu
ZCk7CiAgICAgdm9pZCBzY2hlZHVsZU9ic2VydmFydGlvblVwZGF0ZSgpOwogCiAgICAgc3RydWN0
IE1hbmlwdWxhdGlvbkl0ZW1EYXRhIHsKICAgICAgICAgUG9zaXRpb24gc3RhcnQ7CiAgICAgICAg
IFBvc2l0aW9uIGVuZDsKKworICAgICAgICBXZWFrUHRyPEVsZW1lbnQ+IGVsZW1lbnQ7CisgICAg
ICAgIFF1YWxpZmllZE5hbWUgYXR0cmlidXRlTmFtZSB7IG51bGxRTmFtZSgpIH07CisKICAgICAg
ICAgVmVjdG9yPE1hbmlwdWxhdGlvblRva2VuPiB0b2tlbnM7CiAgICAgfTsKIAotICAgIHZvaWQg
YWRkSXRlbShjb25zdCBQb3NpdGlvbiYgc3RhcnRPZlBhcmFncmFwaCwgY29uc3QgUG9zaXRpb24m
IGVuZE9mUGFyYWdyYXBoLCBWZWN0b3I8TWFuaXB1bGF0aW9uVG9rZW4+JiYpOworICAgIHZvaWQg
YWRkSXRlbShNYW5pcHVsYXRpb25JdGVtRGF0YSYmKTsKICAgICB2b2lkIGZsdXNoUGVuZGluZ0l0
ZW1zRm9yQ2FsbGJhY2soKTsKICAgICBPcHRpb25hbDxNYW5pcHVsYXRpb25GYWlsdXJlVHlwZT4g
cmVwbGFjZShjb25zdCBNYW5pcHVsYXRpb25JdGVtRGF0YSYsIGNvbnN0IFZlY3RvcjxNYW5pcHVs
YXRpb25Ub2tlbj4mKTsKIApJbmRleDogVG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0NoYW5nZUxvZwkocmV2aXNpb24gMjU4MDY2KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMjAtMDMtMDcgIFJ5b3N1a2UgTml3YSAgPHJu
aXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXIgc2hv
dWxkIHdvcmsgd2l0aCBBUklBIGxhYmVscworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NzU5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdENvY29hL1RleHRN
YW5pcHVsYXRpb24ubW06CisgICAgICAgIChUZXh0TWFuaXB1bGF0aW9uLlN0YXJ0VGV4dE1hbmlw
dWxhdGlvbkZpbmRBdHRyaWJ1dGVDb250ZW50KTogQWRkZWQuCisgICAgICAgIChUZXh0TWFuaXB1
bGF0aW9uLkNvbXBsZXRlVGV4dE1hbmlwdWxhdGlvblNob3VsZFByZXNlcnZlT3JkZXJPZkJsb2Nr
SW1hZ2UpOiBVcGRhdGVkCisgICAgICAgIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgdG9rZW5zIGZv
ciB0aGUgZmlyc3QgaXRlbSBhcyB0aGUgdmVyeSBmaXJzdCBpbWFnZSBpcyBjb3JyZWN0bHkKKyAg
ICAgICAgZGV0ZWN0ZWQgcGVyIHRoZSBjb2RlIGNoYW5nZS4gCisgICAgICAgIChUZXh0TWFuaXB1
bGF0aW9uLkNvbXBsZXRlVGV4dE1hbmlwdWxhdGlvblNob3VsZFJlcGxhY2VBdHRyaWJ1dGVDb250
ZW50KTogQWRkZWQuCisKIDIwMjAtMDMtMDYgIFBlciBBcm5lIFZvbGxhbiAgPHB2b2xsYW5AYXBw
bGUuY29tPgogCiAgICAgICAgIFtDb2NvYV0gUmUtZW5hYmxlIENGUHJlZnMgZGlyZWN0IG1vZGUK
SW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Q29jb2EvVGV4dE1hbmlwdWxh
dGlvbi5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdENv
Y29hL1RleHRNYW5pcHVsYXRpb24ubW0JKHJldmlzaW9uIDI1ODAzNykKKysrIFRvb2xzL1Rlc3RX
ZWJLaXRBUEkvVGVzdHMvV2ViS2l0Q29jb2EvVGV4dE1hbmlwdWxhdGlvbi5tbQkod29ya2luZyBj
b3B5KQpAQCAtMjE2LDYgKzIxNiw0MiBAQCBURVNUKFRleHRNYW5pcHVsYXRpb24sIFN0YXJ0VGV4
dE1hbmlwdWxhCiAgICAgRVhQRUNUX1NUUkVRKCJLaXQiLCBpdGVtc1sxXS50b2tlbnNbMV0uY29u
dGVudC5VVEY4U3RyaW5nKTsKIH0KIAorVEVTVChUZXh0TWFuaXB1bGF0aW9uLCBTdGFydFRleHRN
YW5pcHVsYXRpb25GaW5kQXR0cmlidXRlQ29udGVudCkKK3sKKyAgICBhdXRvIGRlbGVnYXRlID0g
YWRvcHROUyhbW1RleHRNYW5pcHVsYXRpb25EZWxlZ2F0ZSBhbGxvY10gaW5pdF0pOworICAgIGF1
dG8gd2ViVmlldyA9IGFkb3B0TlMoW1tUZXN0V0tXZWJWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1l
Ok5TTWFrZVJlY3QoMCwgMCwgNDAwLCA0MDApXSk7CisgICAgW3dlYlZpZXcgX3NldFRleHRNYW5p
cHVsYXRpb25EZWxlZ2F0ZTpkZWxlZ2F0ZS5nZXQoKV07CisKKyAgICBbd2ViVmlldyBzeW5jaHJv
bm91c2x5TG9hZEhUTUxTdHJpbmc6QCI8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD48dGl0bGU+
aGV5PC90aXRsZT48L2hlYWQ+IgorICAgICAgICAiPGJvZHk+PGRpdj48c3BhbiBhcmlhLWxhYmVs
PVwidGhpcyBpcyBncmVldFwiPmhlbGxvPC9zcGFuPjxpbWcgc3JjPVwiYXBwbGUuZ2lmXCIgYWx0
PVwiZnJ1aXRcIj48L2JvZHk+PC9odG1sPiJdOworCisgICAgZG9uZSA9IGZhbHNlOworICAgIFt3
ZWJWaWV3IF9zdGFydFRleHRNYW5pcHVsYXRpb25zV2l0aENvbmZpZ3VyYXRpb246bmlsIGNvbXBs
ZXRpb246XnsKKyAgICAgICAgZG9uZSA9IHRydWU7CisgICAgfV07CisgICAgVGVzdFdlYktpdEFQ
STo6VXRpbDo6cnVuKCZkb25lKTsKKworICAgIGF1dG8gKml0ZW1zID0gW2RlbGVnYXRlIGl0ZW1z
XTsKKyAgICBFWFBFQ1RfRVEoaXRlbXMuY291bnQsIDRVTCk7CisgICAgRVhQRUNUX0VRKGl0ZW1z
WzBdLnRva2Vucy5jb3VudCwgMVVMKTsKKyAgICBFWFBFQ1RfU1RSRVEoImhleSIsIGl0ZW1zWzBd
LnRva2Vuc1swXS5jb250ZW50LlVURjhTdHJpbmcpOworICAgIEVYUEVDVF9GQUxTRShpdGVtc1sw
XS50b2tlbnNbMF0uaXNFeGNsdWRlZCk7CisKKyAgICBFWFBFQ1RfRVEoaXRlbXNbMV0udG9rZW5z
LmNvdW50LCAxVUwpOworICAgIEVYUEVDVF9TVFJFUSgidGhpcyBpcyBncmVldCIsIGl0ZW1zWzFd
LnRva2Vuc1swXS5jb250ZW50LlVURjhTdHJpbmcpOworICAgIEVYUEVDVF9GQUxTRShpdGVtc1sx
XS50b2tlbnNbMF0uaXNFeGNsdWRlZCk7CisKKyAgICBFWFBFQ1RfRVEoaXRlbXNbMl0udG9rZW5z
LmNvdW50LCAxVUwpOworICAgIEVYUEVDVF9TVFJFUSgiZnJ1aXQiLCBpdGVtc1syXS50b2tlbnNb
MF0uY29udGVudC5VVEY4U3RyaW5nKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXRlbXNbMl0udG9rZW5z
WzBdLmlzRXhjbHVkZWQpOworCisgICAgRVhQRUNUX0VRKGl0ZW1zWzNdLnRva2Vucy5jb3VudCwg
MlVMKTsKKyAgICBFWFBFQ1RfU1RSRVEoImhlbGxvIiwgaXRlbXNbM10udG9rZW5zWzBdLmNvbnRl
bnQuVVRGOFN0cmluZyk7CisgICAgRVhQRUNUX0ZBTFNFKGl0ZW1zWzNdLnRva2Vuc1swXS5pc0V4
Y2x1ZGVkKTsKKyAgICBFWFBFQ1RfU1RSRVEoIltdIiwgaXRlbXNbM10udG9rZW5zWzFdLmNvbnRl
bnQuVVRGOFN0cmluZyk7CisgICAgRVhQRUNUX1RSVUUoaXRlbXNbM10udG9rZW5zWzFdLmlzRXhj
bHVkZWQpOworfQorCiBURVNUKFRleHRNYW5pcHVsYXRpb24sIFN0YXJ0VGV4dE1hbmlwdWxhdGlv
blN1cHBvcnRzTGVnYWN5RGVsZWdhdGVDYWxsYmFjaykKIHsKICAgICBhdXRvIGRlbGVnYXRlID0g
YWRvcHROUyhbW0xlZ2FjeVRleHRNYW5pcHVsYXRpb25EZWxlZ2F0ZSBhbGxvY10gaW5pdF0pOwpA
QCAtODAwLDkgKzgzNiwxMSBAQCBURVNUKFRleHRNYW5pcHVsYXRpb24sIENvbXBsZXRlVGV4dE1h
bmlwCiAKICAgICBhdXRvICppdGVtcyA9IFtkZWxlZ2F0ZSBpdGVtc107CiAgICAgRVhQRUNUX0VR
KGl0ZW1zLmNvdW50LCAyVUwpOwotICAgIEVYUEVDVF9FUShpdGVtc1swXS50b2tlbnMuY291bnQs
IDFVTCk7CisgICAgRVhQRUNUX0VRKGl0ZW1zWzBdLnRva2Vucy5jb3VudCwgMlVMKTsKICAgICBF
WFBFQ1RfU1RSRVEoIltdIiwgaXRlbXNbMF0udG9rZW5zWzBdLmNvbnRlbnQuVVRGOFN0cmluZyk7
CiAgICAgRVhQRUNUX1RSVUUoaXRlbXNbMF0udG9rZW5zWzBdLmlzRXhjbHVkZWQpOworICAgIEVY
UEVDVF9TVFJFUSgiW10iLCBpdGVtc1swXS50b2tlbnNbMV0uY29udGVudC5VVEY4U3RyaW5nKTsK
KyAgICBFWFBFQ1RfVFJVRShpdGVtc1swXS50b2tlbnNbMV0uaXNFeGNsdWRlZCk7CiAKICAgICBh
dXRvICp0b2tlbnMgPSBpdGVtc1sxXS50b2tlbnM7CiAgICAgRVhQRUNUX0VRKHRva2Vucy5jb3Vu
dCwgMVVMKTsKQEAgLTgyNCw2ICs4NjIsNTAgQEAgVEVTVChUZXh0TWFuaXB1bGF0aW9uLCBDb21w
bGV0ZVRleHRNYW5pcAogICAgICAgICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2Ny
aXB0OkAiZG9jdW1lbnQuYm9keS5pbm5lckhUTUwiXSk7CiB9CiAKK1RFU1QoVGV4dE1hbmlwdWxh
dGlvbiwgQ29tcGxldGVUZXh0TWFuaXB1bGF0aW9uU2hvdWxkUmVwbGFjZUF0dHJpYnV0ZUNvbnRl
bnQpCit7CisgICAgYXV0byBkZWxlZ2F0ZSA9IGFkb3B0TlMoW1tUZXh0TWFuaXB1bGF0aW9uRGVs
ZWdhdGUgYWxsb2NdIGluaXRdKTsKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdL
V2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDQwMCwgNDAwKV0p
OworICAgIFt3ZWJWaWV3IF9zZXRUZXh0TWFuaXB1bGF0aW9uRGVsZWdhdGU6ZGVsZWdhdGUuZ2V0
KCldOworCisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOkAiPCFET0NU
WVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHRpdGxlPmhleTwvdGl0bGU+PC9oZWFkPiIKKyAgICAgICAg
Ijxib2R5PjxkaXY+PHNwYW4gYXJpYS1sYWJlbD1cInRoaXMgaXMgZ3JlZXRcIj5oZWxsbzwvc3Bh
bj48aW1nIHNyYz1cImFwcGxlLmdpZlwiIGFsdD1cImZydWl0XCI+PC9ib2R5PjwvaHRtbD4iXTsK
KworICAgIGRvbmUgPSBmYWxzZTsKKyAgICBbd2ViVmlldyBfc3RhcnRUZXh0TWFuaXB1bGF0aW9u
c1dpdGhDb25maWd1cmF0aW9uOm5pbCBjb21wbGV0aW9uOl57CisgICAgICAgIGRvbmUgPSB0cnVl
OworICAgIH1dOworICAgIFRlc3RXZWJLaXRBUEk6OlV0aWw6OnJ1bigmZG9uZSk7CisKKyAgICBh
dXRvICppdGVtcyA9IFtkZWxlZ2F0ZSBpdGVtc107CisgICAgRVhQRUNUX0VRKGl0ZW1zLmNvdW50
LCA0VUwpOworICAgIEVYUEVDVF9FUShpdGVtc1swXS50b2tlbnMuY291bnQsIDFVTCk7CisgICAg
RVhQRUNUX1NUUkVRKCJoZXkiLCBpdGVtc1swXS50b2tlbnNbMF0uY29udGVudC5VVEY4U3RyaW5n
KTsKKworICAgIEVYUEVDVF9FUShpdGVtc1sxXS50b2tlbnMuY291bnQsIDFVTCk7CisgICAgRVhQ
RUNUX1NUUkVRKCJ0aGlzIGlzIGdyZWV0IiwgaXRlbXNbMV0udG9rZW5zWzBdLmNvbnRlbnQuVVRG
OFN0cmluZyk7CisKKyAgICBFWFBFQ1RfRVEoaXRlbXNbMl0udG9rZW5zLmNvdW50LCAxVUwpOwor
ICAgIEVYUEVDVF9TVFJFUSgiZnJ1aXQiLCBpdGVtc1syXS50b2tlbnNbMF0uY29udGVudC5VVEY4
U3RyaW5nKTsKKworICAgIEVYUEVDVF9FUShpdGVtc1szXS50b2tlbnMuY291bnQsIDJVTCk7Cisg
ICAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIGl0ZW1zWzNdLnRva2Vuc1swXS5jb250ZW50LlVURjhT
dHJpbmcpOworICAgIEVYUEVDVF9TVFJFUSgiW10iLCBpdGVtc1szXS50b2tlbnNbMV0uY29udGVu
dC5VVEY4U3RyaW5nKTsKKworICAgIGRvbmUgPSBmYWxzZTsKKyAgICBbd2ViVmlldyBfY29tcGxl
dGVUZXh0TWFuaXB1bGF0aW9uRm9ySXRlbXM6QFsKKyAgICAgICAgKF9XS1RleHRNYW5pcHVsYXRp
b25JdGVtICopY3JlYXRlSXRlbShpdGVtc1swXS5pZGVudGlmaWVyLCB7IHsgaXRlbXNbMF0udG9r
ZW5zWzBdLmlkZW50aWZpZXIsIEAiSGVsbG8iIH0gfSksCisgICAgICAgIChfV0tUZXh0TWFuaXB1
bGF0aW9uSXRlbSAqKWNyZWF0ZUl0ZW0oaXRlbXNbMV0uaWRlbnRpZmllciwgeyB7IGl0ZW1zWzFd
LnRva2Vuc1swXS5pZGVudGlmaWVyLCBAIlRoaXMgaXMgYSBncmVldGluZyIgfSB9KSwKKyAgICAg
ICAgKF9XS1RleHRNYW5pcHVsYXRpb25JdGVtICopY3JlYXRlSXRlbShpdGVtc1syXS5pZGVudGlm
aWVyLCB7IHsgaXRlbXNbMl0udG9rZW5zWzBdLmlkZW50aWZpZXIsIEAiQXBwbGUiIH0gfSksCisg
ICAgXSBjb21wbGV0aW9uOl4oTlNBcnJheTxOU0Vycm9yICo+ICplcnJvcnMpIHsKKyAgICAgICAg
RVhQRUNUX0VRKGVycm9ycywgbmlsKTsKKyAgICAgICAgZG9uZSA9IHRydWU7CisgICAgfV07Cisg
ICAgVGVzdFdlYktpdEFQSTo6VXRpbDo6cnVuKCZkb25lKTsKKyAgICBFWFBFQ1RfV0tfU1RSRVEo
IjxoZWFkPjx0aXRsZT5IZWxsbzwvdGl0bGU+PC9oZWFkPjxib2R5PjxkaXY+PHNwYW4gYXJpYS1s
YWJlbD1cIlRoaXMgaXMgYSBncmVldGluZ1wiPmhlbGxvPC9zcGFuPiIKKyAgICAgICAgIjxpbWcg
c3JjPVwiYXBwbGUuZ2lmXCIgYWx0PVwiQXBwbGVcIj48L2JvZHk+IiwgW3dlYlZpZXcgc3RyaW5n
QnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5pbm5lckhU
TUwiXSk7Cit9CisKIFRFU1QoVGV4dE1hbmlwdWxhdGlvbiwgQ29tcGxldGVUZXh0TWFuaXB1bGF0
aW9uU2hvdWxkQmF0Y2hJdGVtQ2FsbGJhY2spCiB7CiAgICAgYXV0byBkZWxlZ2F0ZSA9IGFkb3B0
TlMoW1tUZXh0TWFuaXB1bGF0aW9uRGVsZWdhdGUgYWxsb2NdIGluaXRdKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>392916</attachid>
            <date>2020-03-07 17:09:03 -0800</date>
            <delta_ts>2020-03-07 19:43:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-208759-20200307170901.patch</filename>
            <type>text/plain</type>
            <size>17035</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI1ODAzNykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMyIEBACisyMDIwLTAzLTA3ICBSeW9zdWtl
IE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIFRleHRNYW5pcHVsYXRpb25Db250
cm9sbGVyIHNob3VsZCB3b3JrIHdpdGggQVJJQSBsYWJlbHMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwODc1OQorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgVGV4dE1hbmlwdWxh
dGlvbkNvbnRyb2xsZXIgd29yayB3aXRoIGEgZmV3IEFSSUEgY29udGVudCBhdHRyaWJ1dGVzLgor
CisgICAgICAgIEl0IGFsc28gbWFrZSBvYnNlcnZlUGFyYWdyYXBocyBvYnNlcnZlIGNvbnRlbnQg
YWNyb3NzIHRoZSBlbnRpcmUgZG9jdW1lbnQgc2luY2UgY2Fub25pY2FsaXppbmcKKyAgICAgICAg
dGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGNhbiBlbmQgdXAgc2tpcHBpbmcgc29tZSBjb250ZW50IHdp
dGggQVJJQS4KKworICAgICAgICBUZXN0czogVGV4dE1hbmlwdWxhdGlvbi5TdGFydFRleHRNYW5p
cHVsYXRpb25GaW5kQXR0cmlidXRlQ29udGVudAorICAgICAgICAgICAgICAgVGV4dE1hbmlwdWxh
dGlvbi5Db21wbGV0ZVRleHRNYW5pcHVsYXRpb25TaG91bGRSZXBsYWNlQXR0cmlidXRlQ29udGVu
dAorCisgICAgICAgICogZWRpdGluZy9UZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlcjo6c3RhcnRPYnNlcnZp
bmdQYXJhZ3JhcGhzKTogTm93IHRha2VzIHR3byBQb3NpdGlvbidzIGluc3RlYWQKKyAgICAgICAg
b2YgVmlzaWJsZVBvc2l0aW9uJ3MuIAorICAgICAgICAoV2ViQ29yZTo6aXNBdHRyaWJ1dGVGb3JU
ZXh0TWFuaXB1bGF0aW9uKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpUZXh0TWFuaXB1bGF0
aW9uQ29udHJvbGxlcjo6b2JzZXJ2ZVBhcmFncmFwaHMpOiBBZGRlZCB0aGUgY29kZSB0byBmaW5k
IGVsZW1lbnRzIHdpdGgKKyAgICAgICAgQVJJQSBhdHRyaWJ1dGVzIGFuZCBhIGZldyBvdGhlciBl
bGVtZW50cyB0aGF0IGRvbid0IGdlbmVyYXRlIFJlbmRlck9iamVjdCdzLgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6OnNjaGVkdWxlT2JzZXJ2YXJ0aW9uVXBk
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjphZGRJ
dGVtKTogTm93IHRha2VzIE1hbmlwdWxhdGlvbkl0ZW1EYXRhIGluc3RlYWQgb2YgaW5kaXZpc3Vh
bAorICAgICAgICBmaWVsZHMgaW4gaXQuCisgICAgICAgIChXZWJDb3JlOjpUZXh0TWFuaXB1bGF0
aW9uQ29udHJvbGxlcjo6cmVwbGFjZSk6IEFkZGVkIHRoZSBsb2dpYyB0byBoYW5kbGUgTWFuaXB1
bGF0aW9uSXRlbURhdGEKKyAgICAgICAgdGhhdCBzcGVjaWZ5IGVsZW1lbnQgYW5kIGF0dHJpYnV0
ZU5hbWUuCisgICAgICAgICogZWRpdGluZy9UZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlci5oOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xsZXI6Ok1hbmlwdWxhdGlv
bkl0ZW1EYXRhKTogQWRkZWQgZWxlbWVudCBhbmQgYXR0cmlidXRlTmFtZS4KKwogMjAyMC0wMy0w
NiAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBUZXh0TWFuaXB1
bGF0aW9uQ29udHJvbGxlciBzaG91bGQgcHJlc2VydmUgaW1hZ2VzCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL1RleHRNYW5pcHVsYXRpb25Db250cm9sbGVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRNYW5pcHVsYXRpb25Db250cm9sbGVyLmNwcAko
cmV2aXNpb24gMjU4MDM3KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0TWFuaXB1bGF0
aW9uQ29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNs
dWRlICJFZGl0aW5nLmgiCiAjaW5jbHVkZSAiRWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCIKICNp
bmNsdWRlICJFdmVudExvb3AuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJO
b2RlVHJhdmVyc2FsLmgiCiAjaW5jbHVkZSAiUHNldWRvRWxlbWVudC5oIgogI2luY2x1ZGUgIlJh
bmdlLmgiCkBAIC0xMzIsMTAgKzEzMyw3IEBAIHZvaWQgVGV4dE1hbmlwdWxhdGlvbkNvbnRyb2xs
ZXI6OnN0YXJ0T2IKICAgICBtX2NhbGxiYWNrID0gV1RGTW92ZShjYWxsYmFjayk7CiAgICAgbV9l
eGNsdXNpb25SdWxlcyA9IFdURk1vdmUoZXhjbHVzaW9uUnVsZXMpOwogCi0gICAgVmlzaWJsZVBv
c2l0aW9uIHN0YXJ0ID0gZmlyc3RQb3NpdGlvbkluTm9kZShtX2RvY3VtZW50LmdldCgpKTsKLSAg
ICBWaXNpYmxlUG9zaXRpb24gZW5kID0gbGFzdFBvc2l0aW9uSW5Ob2RlKG1fZG9jdW1lbnQuZ2V0
KCkpOwotCi0gICAgb2JzZXJ2ZVBhcmFncmFwaHMoc3RhcnQsIGVuZCk7CisgICAgb2JzZXJ2ZVBh
cmFncmFwaHMoZmlyc3RQb3NpdGlvbkluTm9kZShtX2RvY3VtZW50LmdldCgpKSwgbGFzdFBvc2l0
aW9uSW5Ob2RlKG1fZG9jdW1lbnQuZ2V0KCkpKTsKICAgICBmbHVzaFBlbmRpbmdJdGVtc0ZvckNh
bGxiYWNrKCk7CiB9CiAKQEAgLTIxOSwxNyArMjE3LDM4IEBAIHByaXZhdGU6CiAgICAgUmVmUHRy
PE5vZGU+IG1fcGFzdEVuZE5vZGU7CiB9OwogCi12b2lkIFRleHRNYW5pcHVsYXRpb25Db250cm9s
bGVyOjpvYnNlcnZlUGFyYWdyYXBocyhWaXNpYmxlUG9zaXRpb24mIHN0YXJ0LCBWaXNpYmxlUG9z
aXRpb24mIGVuZCkKK3N0YXRpYyBib29sIGlzQXR0cmlidXRlRm9yVGV4dE1hbmlwdWxhdGlvbihj
b25zdCBRdWFsaWZpZWROYW1lJiBuYW1lVG9DaGVjaykKK3sKKyAgICB1c2luZyBuYW1lc3BhY2Ug
SFRNTE5hbWVzOworICAgIHN0YXRpYyBjb25zdCBRdWFsaWZpZWROYW1lKiBhdHRyaWJ1dGVOYW1l
c1tdID0geworICAgICAgICAmdGl0bGVBdHRyLmdldCgpLAorICAgICAgICAmYWx0QXR0ci5nZXQo
KSwKKyAgICAgICAgJnBsYWNlaG9sZGVyQXR0ci5nZXQoKSwKKyAgICAgICAgJmFyaWFfbGFiZWxB
dHRyLmdldCgpLAorICAgICAgICAmYXJpYV9wbGFjZWhvbGRlckF0dHIuZ2V0KCksCisgICAgICAg
ICZhcmlhX3JvbGVkZXNjcmlwdGlvbkF0dHIuZ2V0KCksCisgICAgICAgICZhcmlhX3ZhbHVldGV4
dEF0dHIuZ2V0KCksCisgICAgfTsKKyAgICBmb3IgKGF1dG8mIGVudHJ5IDogYXR0cmlidXRlTmFt
ZXMpIHsKKyAgICAgICAgaWYgKCplbnRyeSA9PSBuYW1lVG9DaGVjaykKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVGV4dE1hbmlw
dWxhdGlvbkNvbnRyb2xsZXI6Om9ic2VydmVQYXJhZ3JhcGhzKGNvbnN0IFBvc2l0aW9uJiBzdGFy
dCwgY29uc3QgUG9zaXRpb24mIGVuZCkKIHsKLSAgICBhdXRvIGRvY3VtZW50ID0gbWFrZVJlZlB0
cihzdGFydC5kZWVwRXF1aXZhbGVudCgpLmRvY3VtZW50KCkpOworICAgIGF1dG8gZG9jdW1lbnQg
PSBtYWtlUmVmUHRyKHN0YXJ0LmRvY3VtZW50KCkpOwogICAgIEFTU0VSVChkb2N1bWVudCk7Ci0g
ICAgUGFyYWdyYXBoQ29udGVudEl0ZXJhdG9yIGl0ZXJhdG9yIHsgc3RhcnQuZGVlcEVxdWl2YWxl
bnQoKSwgZW5kLmRlZXBFcXVpdmFsZW50KCkgfTsKLSAgICBpZiAoZG9jdW1lbnQgIT0gc3RhcnQu
ZGVlcEVxdWl2YWxlbnQoKS5kb2N1bWVudCgpIHx8IGRvY3VtZW50ICE9IGVuZC5kZWVwRXF1aXZh
bGVudCgpLmRvY3VtZW50KCkpCisgICAgUGFyYWdyYXBoQ29udGVudEl0ZXJhdG9yIGl0ZXJhdG9y
IHsgc3RhcnQsIGVuZCB9OworICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlU3RhcnQgPSBzdGFy
dDsKKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVuZCA9IGVuZDsKKyAgICBpZiAoZG9jdW1l
bnQgIT0gc3RhcnQuZG9jdW1lbnQoKSB8fCBkb2N1bWVudCAhPSBlbmQuZG9jdW1lbnQoKSkKICAg
ICAgICAgcmV0dXJuOyAvLyBUZXh0SXRlcmF0b3IncyBjb25zdHJ1Y3RvciBtYXkgaGF2ZSB1cGRh
dGVkIHRoZSBsYXlvdXQgYW5kIGV4ZWN1dGVkIGFyYml0cmFyeSBzY3JpcHRzLgogCiAgICAgRXhj
bHVzaW9uUnVsZU1hdGNoZXIgZXhjbHVzaW9uUnVsZU1hdGNoZXIobV9leGNsdXNpb25SdWxlcyk7
CiAgICAgVmVjdG9yPE1hbmlwdWxhdGlvblRva2VuPiB0b2tlbnNJbkN1cnJlbnRQYXJhZ3JhcGg7
Ci0gICAgUG9zaXRpb24gc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGggPSBzdGFydC5kZWVwRXF1aXZh
bGVudCgpOworICAgIFBvc2l0aW9uIHN0YXJ0T2ZDdXJyZW50UGFyYWdyYXBoID0gdmlzaWJsZVN0
YXJ0LmRlZXBFcXVpdmFsZW50KCk7CiAgICAgZm9yICg7ICFpdGVyYXRvci5hdEVuZCgpOyBpdGVy
YXRvci5hZHZhbmNlKCkpIHsKICAgICAgICAgYXV0byBjb250ZW50ID0gaXRlcmF0b3IuY3VycmVu
dENvbnRlbnQoKTsKICAgICAgICAgaWYgKGNvbnRlbnQubm9kZSkgewpAQCAtMjM4LDcgKzI1Nywy
MyBAQCB2b2lkIFRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjpvYnNlcnZlCiAgICAgICAgICAg
ICAgICAgICAgIHJldHVybjsgLy8gV2UgY2FuIGV4aXQgZWFybHkgaGVyZSBiZWNhdXNlIHNjaGVk
dWxlT2JzZXJ2YXJ0aW9uVXBkYXRlIGNhbGxzIHRoaXMgZnVuY3Rpb24gb24gZWFjaCBwYXJhZ3Jh
cGggc2VwYXJhdGVseS4KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHN0YXJ0T2ZD
dXJyZW50UGFyYWdyYXBoLmlzTnVsbCgpKQorICAgICAgICAgICAgaWYgKGlzPEVsZW1lbnQ+KCpj
b250ZW50Lm5vZGUpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgY3VycmVudEVsZW1lbnQgPSBk
b3duY2FzdDxFbGVtZW50PigqY29udGVudC5ub2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNv
bnRlbnQuaXNUZXh0Q29udGVudCAmJiAoY29udGVudC5ub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1l
czo6dGl0bGVUYWcpIHx8IGNvbnRlbnQubm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Om9wdGlv
blRhZykpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZEl0ZW0oTWFuaXB1bGF0aW9uSXRlbURh
dGEgeyBQb3NpdGlvbigpLCBQb3NpdGlvbigpLCBtYWtlV2Vha1B0cihjdXJyZW50RWxlbWVudCks
IG51bGxRTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgeyBNYW5pcHVsYXRpb25Ub2tl
biB7IG1fdG9rZW5JZGVudGlmaWVyLmdlbmVyYXRlKCksIGN1cnJlbnRFbGVtZW50LnRleHRDb250
ZW50KCkgfSB9IH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3Vy
cmVudEVsZW1lbnQuaGFzQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAo
YXV0byYgYXR0cmlidXRlIDogY3VycmVudEVsZW1lbnQuYXR0cmlidXRlc0l0ZXJhdG9yKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0F0dHJpYnV0ZUZvclRleHRNYW5pcHVsYXRp
b24oYXR0cmlidXRlLm5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRJ
dGVtKE1hbmlwdWxhdGlvbkl0ZW1EYXRhIHsgUG9zaXRpb24oKSwgUG9zaXRpb24oKSwgbWFrZVdl
YWtQdHIoY3VycmVudEVsZW1lbnQpLCBhdHRyaWJ1dGUubmFtZSgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB7IE1hbmlwdWxhdGlvblRva2VuIHsgbV90b2tlbklkZW50aWZpZXIu
Z2VuZXJhdGUoKSwgYXR0cmlidXRlLnZhbHVlKCkgfSB9IH0pOworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGguaXNOdWxs
KCkgJiYgY29udGVudC5pc1RleHRDb250ZW50KQogICAgICAgICAgICAgICAgIHN0YXJ0T2ZDdXJy
ZW50UGFyYWdyYXBoID0gaXRlcmF0b3Iuc3RhcnRQb3NpdGlvbigpOwogICAgICAgICB9CiAKQEAg
LTI2Niw3ICszMDEsNyBAQCB2b2lkIFRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjpvYnNlcnZl
CiAgICAgICAgICAgICAgICAgICAgIGVuZE9mQ3VycmVudFBhcmFncmFwaCA9IFBvc2l0aW9uKCZ0
ZXh0Tm9kZSwgb2Zmc2V0T2ZOZXh0TmV3TGluZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0
T2ZDdXJyZW50UGFyYWdyYXBoID0gUG9zaXRpb24oJnRleHROb2RlLCBvZmZzZXRPZk5leHROZXdM
aW5lICsgMSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZEl0ZW0oc3Rh
cnRPZkN1cnJlbnRQYXJhZ3JhcGgsIGVuZE9mQ3VycmVudFBhcmFncmFwaCwgV1RGTW92ZSh0b2tl
bnNJbkN1cnJlbnRQYXJhZ3JhcGgpKTsKKyAgICAgICAgICAgICAgICBhZGRJdGVtKE1hbmlwdWxh
dGlvbkl0ZW1EYXRhIHsgc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGgsIGVuZE9mQ3VycmVudFBhcmFn
cmFwaCwgbnVsbHB0ciwgbnVsbFFOYW1lKCksIFdURk1vdmUodG9rZW5zSW5DdXJyZW50UGFyYWdy
YXBoKSB9KTsKICAgICAgICAgICAgICAgICBzdGFydE9mQ3VycmVudFBhcmFncmFwaC5jbGVhcigp
OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhcnRPZkN1cnJlbnRMaW5lID0gb2Zmc2V0
T2ZOZXh0TmV3TGluZSArIDE7CkBAIC0yNzgsNyArMzEzLDcgQEAgdm9pZCBUZXh0TWFuaXB1bGF0
aW9uQ29udHJvbGxlcjo6b2JzZXJ2ZQogICAgIH0KIAogICAgIGlmICghdG9rZW5zSW5DdXJyZW50
UGFyYWdyYXBoLmlzRW1wdHkoKSkKLSAgICAgICAgYWRkSXRlbShzdGFydE9mQ3VycmVudFBhcmFn
cmFwaCwgZW5kLmRlZXBFcXVpdmFsZW50KCksIFdURk1vdmUodG9rZW5zSW5DdXJyZW50UGFyYWdy
YXBoKSk7CisgICAgICAgIGFkZEl0ZW0oTWFuaXB1bGF0aW9uSXRlbURhdGEgeyBzdGFydE9mQ3Vy
cmVudFBhcmFncmFwaCwgdmlzaWJsZUVuZC5kZWVwRXF1aXZhbGVudCgpLCBudWxscHRyLCBudWxs
UU5hbWUoKSwgV1RGTW92ZSh0b2tlbnNJbkN1cnJlbnRQYXJhZ3JhcGgpIH0pOwogfQogCiB2b2lk
IFRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjpkaWRDcmVhdGVSZW5kZXJlckZvckVsZW1lbnQo
RWxlbWVudCYgZWxlbWVudCkKQEAgLTM0MywxMyArMzc4LDEzIEBAIHZvaWQgVGV4dE1hbmlwdWxh
dGlvbkNvbnRyb2xsZXI6OnNjaGVkdWwKICAgICAgICAgICAgIGlmICghY29udHJvbGxlcikKICAg
ICAgICAgICAgICAgICByZXR1cm47IC8vIEZpbmRpbmcgdGhlIHN0YXJ0L2VuZCBvZiBwYXJhZ3Jh
cGggbWF5IGhhdmUgdXBkYXRlZCBsYXlvdXQgJiBleGVjdXRlZCBhcmJpdHJhcnkgc2NyaXB0cy4K
IAotICAgICAgICAgICAgY29udHJvbGxlci0+b2JzZXJ2ZVBhcmFncmFwaHMoc3RhcnQsIGVuZCk7
CisgICAgICAgICAgICBjb250cm9sbGVyLT5vYnNlcnZlUGFyYWdyYXBocyhzdGFydC5kZWVwRXF1
aXZhbGVudCgpLCBlbmQuZGVlcEVxdWl2YWxlbnQoKSk7CiAgICAgICAgIH0KICAgICAgICAgY29u
dHJvbGxlci0+Zmx1c2hQZW5kaW5nSXRlbXNGb3JDYWxsYmFjaygpOwogICAgIH0pOwogfQogCi12
b2lkIFRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjphZGRJdGVtKGNvbnN0IFBvc2l0aW9uJiBz
dGFydE9mUGFyYWdyYXBoLCBjb25zdCBQb3NpdGlvbiYgZW5kT2ZQYXJhZ3JhcGgsIFZlY3RvcjxN
YW5pcHVsYXRpb25Ub2tlbj4mJiB0b2tlbnMpCit2b2lkIFRleHRNYW5pcHVsYXRpb25Db250cm9s
bGVyOjphZGRJdGVtKE1hbmlwdWxhdGlvbkl0ZW1EYXRhJiYgaXRlbURhdGEpCiB7CiAgICAgY29u
c3QgdW5zaWduZWQgaXRlbUNhbGxiYWNrQmF0Y2hpbmdTaXplID0gMTI4OwogCkBAIC0zNTcsOSAr
MzkyLDkgQEAgdm9pZCBUZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlcjo6YWRkSXRlbQogICAgIGF1
dG8gbmV3SUQgPSBtX2l0ZW1JZGVudGlmaWVyLmdlbmVyYXRlKCk7CiAgICAgbV9wZW5kaW5nSXRl
bXNGb3JDYWxsYmFjay5hcHBlbmQoTWFuaXB1bGF0aW9uSXRlbSB7CiAgICAgICAgIG5ld0lELAot
ICAgICAgICB0b2tlbnMubWFwKFtdKGF1dG8mIHRva2VuKSB7IHJldHVybiB0b2tlbjsgfSkKKyAg
ICAgICAgaXRlbURhdGEudG9rZW5zLm1hcChbXShhdXRvJiB0b2tlbikgeyByZXR1cm4gdG9rZW47
IH0pCiAgICAgfSk7Ci0gICAgbV9pdGVtcy5hZGQobmV3SUQsIE1hbmlwdWxhdGlvbkl0ZW1EYXRh
IHsgc3RhcnRPZlBhcmFncmFwaCwgZW5kT2ZQYXJhZ3JhcGgsIFdURk1vdmUodG9rZW5zKSB9KTsK
KyAgICBtX2l0ZW1zLmFkZChuZXdJRCwgV1RGTW92ZShpdGVtRGF0YSkpOwogCiAgICAgaWYgKG1f
cGVuZGluZ0l0ZW1zRm9yQ2FsbGJhY2suc2l6ZSgpID49IGl0ZW1DYWxsYmFja0JhdGNoaW5nU2l6
ZSkKICAgICAgICAgZmx1c2hQZW5kaW5nSXRlbXNGb3JDYWxsYmFjaygpOwpAQCAtNDI0LDYgKzQ1
OSwyNiBAQCBhdXRvIFRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyOjpyZXBsYWNlCiAgICAgc2l6
ZV90IGN1cnJlbnRUb2tlbkluZGV4ID0gMDsKICAgICBIYXNoTWFwPFRva2VuSWRlbnRpZmllciwg
VG9rZW5FeGNoYW5nZURhdGE+IHRva2VuRXhjaGFuZ2VNYXA7CiAKKyAgICBpZiAoaXRlbS5zdGFy
dC5pc051bGwoKSAmJiBpdGVtLmVuZC5pc051bGwoKSkgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VChpdGVtLnRva2Vucy5zaXplKCkgPT0gMSk7CisgICAgICAgIGF1dG8gZWxlbWVudCA9IG1ha2VS
ZWZQdHIoaXRlbS5lbGVtZW50LmdldCgpKTsKKyAgICAgICAgaWYgKCFlbGVtZW50KQorICAgICAg
ICAgICAgcmV0dXJuIE1hbmlwdWxhdGlvbkZhaWx1cmVUeXBlOjpDb250ZW50Q2hhbmdlZDsKKyAg
ICAgICAgaWYgKHJlcGxhY2VtZW50VG9rZW5zLnNpemUoKSA+IDEpCisgICAgICAgICAgICByZXR1
cm4gTWFuaXB1bGF0aW9uRmFpbHVyZVR5cGU6OkludmFsaWRUb2tlbjsKKyAgICAgICAgU3RyaW5n
IG5ld1ZhbHVlOworICAgICAgICBpZiAoIXJlcGxhY2VtZW50VG9rZW5zLmlzRW1wdHkoKSkgewor
ICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50VG9rZW5zWzBdLmlkZW50aWZpZXIgIT0gaXRlbS50
b2tlbnNbMF0uaWRlbnRpZmllcikKKyAgICAgICAgICAgICAgICByZXR1cm4gTWFuaXB1bGF0aW9u
RmFpbHVyZVR5cGU6OkludmFsaWRUb2tlbjsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gcmVwbGFj
ZW1lbnRUb2tlbnNbMF0uY29udGVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbS5hdHRy
aWJ1dGVOYW1lID09IG51bGxRTmFtZSgpKQorICAgICAgICAgICAgZWxlbWVudC0+c2V0VGV4dENv
bnRlbnQobmV3VmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbGVtZW50LT5zZXRB
dHRyaWJ1dGUoaXRlbS5hdHRyaWJ1dGVOYW1lLCBuZXdWYWx1ZSk7CisgICAgICAgIHJldHVybiBX
VEY6Om51bGxvcHQ7CisgICAgfQorCiAgICAgUmVmUHRyPE5vZGU+IGNvbW1vbkFuY2VzdG9yOwog
ICAgIFBhcmFncmFwaENvbnRlbnRJdGVyYXRvciBpdGVyYXRvciB7IGl0ZW0uc3RhcnQsIGl0ZW0u
ZW5kIH07CiAgICAgSGFzaFNldDxSZWY8Tm9kZT4+IGV4Y2x1ZGVkTm9kZXM7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL1RleHRNYW5pcHVsYXRpb25Db250cm9sbGVyLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0TWFuaXB1bGF0aW9uQ29udHJvbGxlci5o
CShyZXZpc2lvbiAyNTgwMzYpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRNYW5pcHVs
YXRpb25Db250cm9sbGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYgKzI2LDcgQEAKICNwcmFn
bWEgb25jZQogCiAjaW5jbHVkZSAiUG9zaXRpb24uaCIKKyNpbmNsdWRlICJRdWFsaWZpZWROYW1l
LmgiCiAjaW5jbHVkZSA8d3RmL0NvbXBsZXRpb25IYW5kbGVyLmg+CiAjaW5jbHVkZSA8d3RmL0Vu
dW1UcmFpdHMuaD4KICNpbmNsdWRlIDx3dGYvT2JqZWN0SWRlbnRpZmllci5oPgpAQCAtMTI2LDE2
ICsxMjcsMjAgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIGJvb2wgaXNJbk1hbmlwdWxhdGVk
RWxlbWVudChFbGVtZW50Jik7Ci0gICAgdm9pZCBvYnNlcnZlUGFyYWdyYXBocyhWaXNpYmxlUG9z
aXRpb24mIHN0YXJ0LCBWaXNpYmxlUG9zaXRpb24mIGVuZCk7CisgICAgdm9pZCBvYnNlcnZlUGFy
YWdyYXBocyhjb25zdCBQb3NpdGlvbiYgc3RhcnQsIGNvbnN0IFBvc2l0aW9uJiBlbmQpOwogICAg
IHZvaWQgc2NoZWR1bGVPYnNlcnZhcnRpb25VcGRhdGUoKTsKIAogICAgIHN0cnVjdCBNYW5pcHVs
YXRpb25JdGVtRGF0YSB7CiAgICAgICAgIFBvc2l0aW9uIHN0YXJ0OwogICAgICAgICBQb3NpdGlv
biBlbmQ7CisKKyAgICAgICAgV2Vha1B0cjxFbGVtZW50PiBlbGVtZW50OworICAgICAgICBRdWFs
aWZpZWROYW1lIGF0dHJpYnV0ZU5hbWUgeyBudWxsUU5hbWUoKSB9OworCiAgICAgICAgIFZlY3Rv
cjxNYW5pcHVsYXRpb25Ub2tlbj4gdG9rZW5zOwogICAgIH07CiAKLSAgICB2b2lkIGFkZEl0ZW0o
Y29uc3QgUG9zaXRpb24mIHN0YXJ0T2ZQYXJhZ3JhcGgsIGNvbnN0IFBvc2l0aW9uJiBlbmRPZlBh
cmFncmFwaCwgVmVjdG9yPE1hbmlwdWxhdGlvblRva2VuPiYmKTsKKyAgICB2b2lkIGFkZEl0ZW0o
TWFuaXB1bGF0aW9uSXRlbURhdGEmJik7CiAgICAgdm9pZCBmbHVzaFBlbmRpbmdJdGVtc0ZvckNh
bGxiYWNrKCk7CiAgICAgT3B0aW9uYWw8TWFuaXB1bGF0aW9uRmFpbHVyZVR5cGU+IHJlcGxhY2Uo
Y29uc3QgTWFuaXB1bGF0aW9uSXRlbURhdGEmLCBjb25zdCBWZWN0b3I8TWFuaXB1bGF0aW9uVG9r
ZW4+Jik7CiAKSW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFu
Z2VMb2cJKHJldmlzaW9uIDI1ODA2NikKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDE3IEBACisyMDIwLTAzLTA3ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJr
aXQub3JnPgorCisgICAgICAgIFRleHRNYW5pcHVsYXRpb25Db250cm9sbGVyIHNob3VsZCB3b3Jr
IHdpdGggQVJJQSBsYWJlbHMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIwODc1OQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgICogVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2NvYS9UZXh0TWFuaXB1bGF0
aW9uLm1tOgorICAgICAgICAoVGV4dE1hbmlwdWxhdGlvbi5TdGFydFRleHRNYW5pcHVsYXRpb25G
aW5kQXR0cmlidXRlQ29udGVudCk6IEFkZGVkLgorICAgICAgICAoVGV4dE1hbmlwdWxhdGlvbi5D
b21wbGV0ZVRleHRNYW5pcHVsYXRpb25TaG91bGRQcmVzZXJ2ZU9yZGVyT2ZCbG9ja0ltYWdlKTog
VXBkYXRlZAorICAgICAgICB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHRva2VucyBmb3IgdGhlIGZp
cnN0IGl0ZW0gYXMgdGhlIHZlcnkgZmlyc3QgaW1hZ2UgaXMgY29ycmVjdGx5CisgICAgICAgIGRl
dGVjdGVkIHBlciB0aGUgY29kZSBjaGFuZ2UuIAorICAgICAgICAoVGV4dE1hbmlwdWxhdGlvbi5D
b21wbGV0ZVRleHRNYW5pcHVsYXRpb25TaG91bGRSZXBsYWNlQXR0cmlidXRlQ29udGVudCk6IEFk
ZGVkLgorCiAyMDIwLTAzLTA2ICBQZXIgQXJuZSBWb2xsYW4gIDxwdm9sbGFuQGFwcGxlLmNvbT4K
IAogICAgICAgICBbQ29jb2FdIFJlLWVuYWJsZSBDRlByZWZzIGRpcmVjdCBtb2RlCkluZGV4OiBU
b29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdENvY29hL1RleHRNYW5pcHVsYXRpb24ubW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2NvYS9UZXh0
TWFuaXB1bGF0aW9uLm1tCShyZXZpc2lvbiAyNTgwMzcpCisrKyBUb29scy9UZXN0V2ViS2l0QVBJ
L1Rlc3RzL1dlYktpdENvY29hL1RleHRNYW5pcHVsYXRpb24ubW0JKHdvcmtpbmcgY29weSkKQEAg
LTIxNiw2ICsyMTYsNDIgQEAgVEVTVChUZXh0TWFuaXB1bGF0aW9uLCBTdGFydFRleHRNYW5pcHVs
YQogICAgIEVYUEVDVF9TVFJFUSgiS2l0IiwgaXRlbXNbMV0udG9rZW5zWzFdLmNvbnRlbnQuVVRG
OFN0cmluZyk7CiB9CiAKK1RFU1QoVGV4dE1hbmlwdWxhdGlvbiwgU3RhcnRUZXh0TWFuaXB1bGF0
aW9uRmluZEF0dHJpYnV0ZUNvbnRlbnQpCit7CisgICAgYXV0byBkZWxlZ2F0ZSA9IGFkb3B0TlMo
W1tUZXh0TWFuaXB1bGF0aW9uRGVsZWdhdGUgYWxsb2NdIGluaXRdKTsKKyAgICBhdXRvIHdlYlZp
ZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VS
ZWN0KDAsIDAsIDQwMCwgNDAwKV0pOworICAgIFt3ZWJWaWV3IF9zZXRUZXh0TWFuaXB1bGF0aW9u
RGVsZWdhdGU6ZGVsZWdhdGUuZ2V0KCldOworCisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxv
YWRIVE1MU3RyaW5nOkAiPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHRpdGxlPmhleTwvdGl0
bGU+PC9oZWFkPiIKKyAgICAgICAgIjxib2R5PjxkaXY+PHNwYW4gYXJpYS1sYWJlbD1cInRoaXMg
aXMgZ3JlZXRcIj5oZWxsbzwvc3Bhbj48aW1nIHNyYz1cImFwcGxlLmdpZlwiIGFsdD1cImZydWl0
XCI+PC9ib2R5PjwvaHRtbD4iXTsKKworICAgIGRvbmUgPSBmYWxzZTsKKyAgICBbd2ViVmlldyBf
c3RhcnRUZXh0TWFuaXB1bGF0aW9uc1dpdGhDb25maWd1cmF0aW9uOm5pbCBjb21wbGV0aW9uOl57
CisgICAgICAgIGRvbmUgPSB0cnVlOworICAgIH1dOworICAgIFRlc3RXZWJLaXRBUEk6OlV0aWw6
OnJ1bigmZG9uZSk7CisKKyAgICBhdXRvICppdGVtcyA9IFtkZWxlZ2F0ZSBpdGVtc107CisgICAg
RVhQRUNUX0VRKGl0ZW1zLmNvdW50LCA0VUwpOworICAgIEVYUEVDVF9FUShpdGVtc1swXS50b2tl
bnMuY291bnQsIDFVTCk7CisgICAgRVhQRUNUX1NUUkVRKCJoZXkiLCBpdGVtc1swXS50b2tlbnNb
MF0uY29udGVudC5VVEY4U3RyaW5nKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXRlbXNbMF0udG9rZW5z
WzBdLmlzRXhjbHVkZWQpOworCisgICAgRVhQRUNUX0VRKGl0ZW1zWzFdLnRva2Vucy5jb3VudCwg
MVVMKTsKKyAgICBFWFBFQ1RfU1RSRVEoInRoaXMgaXMgZ3JlZXQiLCBpdGVtc1sxXS50b2tlbnNb
MF0uY29udGVudC5VVEY4U3RyaW5nKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXRlbXNbMV0udG9rZW5z
WzBdLmlzRXhjbHVkZWQpOworCisgICAgRVhQRUNUX0VRKGl0ZW1zWzJdLnRva2Vucy5jb3VudCwg
MVVMKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZydWl0IiwgaXRlbXNbMl0udG9rZW5zWzBdLmNvbnRl
bnQuVVRGOFN0cmluZyk7CisgICAgRVhQRUNUX0ZBTFNFKGl0ZW1zWzJdLnRva2Vuc1swXS5pc0V4
Y2x1ZGVkKTsKKworICAgIEVYUEVDVF9FUShpdGVtc1szXS50b2tlbnMuY291bnQsIDJVTCk7Cisg
ICAgRVhQRUNUX1NUUkVRKCJoZWxsbyIsIGl0ZW1zWzNdLnRva2Vuc1swXS5jb250ZW50LlVURjhT
dHJpbmcpOworICAgIEVYUEVDVF9GQUxTRShpdGVtc1szXS50b2tlbnNbMF0uaXNFeGNsdWRlZCk7
CisgICAgRVhQRUNUX1NUUkVRKCJbXSIsIGl0ZW1zWzNdLnRva2Vuc1sxXS5jb250ZW50LlVURjhT
dHJpbmcpOworICAgIEVYUEVDVF9UUlVFKGl0ZW1zWzNdLnRva2Vuc1sxXS5pc0V4Y2x1ZGVkKTsK
K30KKwogVEVTVChUZXh0TWFuaXB1bGF0aW9uLCBTdGFydFRleHRNYW5pcHVsYXRpb25TdXBwb3J0
c0xlZ2FjeURlbGVnYXRlQ2FsbGJhY2spCiB7CiAgICAgYXV0byBkZWxlZ2F0ZSA9IGFkb3B0TlMo
W1tMZWdhY3lUZXh0TWFuaXB1bGF0aW9uRGVsZWdhdGUgYWxsb2NdIGluaXRdKTsKQEAgLTgwMCw5
ICs4MzYsMTEgQEAgVEVTVChUZXh0TWFuaXB1bGF0aW9uLCBDb21wbGV0ZVRleHRNYW5pcAogCiAg
ICAgYXV0byAqaXRlbXMgPSBbZGVsZWdhdGUgaXRlbXNdOwogICAgIEVYUEVDVF9FUShpdGVtcy5j
b3VudCwgMlVMKTsKLSAgICBFWFBFQ1RfRVEoaXRlbXNbMF0udG9rZW5zLmNvdW50LCAxVUwpOwor
ICAgIEVYUEVDVF9FUShpdGVtc1swXS50b2tlbnMuY291bnQsIDJVTCk7CiAgICAgRVhQRUNUX1NU
UkVRKCJbXSIsIGl0ZW1zWzBdLnRva2Vuc1swXS5jb250ZW50LlVURjhTdHJpbmcpOwogICAgIEVY
UEVDVF9UUlVFKGl0ZW1zWzBdLnRva2Vuc1swXS5pc0V4Y2x1ZGVkKTsKKyAgICBFWFBFQ1RfU1RS
RVEoIltdIiwgaXRlbXNbMF0udG9rZW5zWzFdLmNvbnRlbnQuVVRGOFN0cmluZyk7CisgICAgRVhQ
RUNUX1RSVUUoaXRlbXNbMF0udG9rZW5zWzFdLmlzRXhjbHVkZWQpOwogCiAgICAgYXV0byAqdG9r
ZW5zID0gaXRlbXNbMV0udG9rZW5zOwogICAgIEVYUEVDVF9FUSh0b2tlbnMuY291bnQsIDFVTCk7
CkBAIC04MjQsNiArODYyLDUwIEBAIFRFU1QoVGV4dE1hbmlwdWxhdGlvbiwgQ29tcGxldGVUZXh0
TWFuaXAKICAgICAgICAgW3dlYlZpZXcgc3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImRv
Y3VtZW50LmJvZHkuaW5uZXJIVE1MIl0pOwogfQogCitURVNUKFRleHRNYW5pcHVsYXRpb24sIENv
bXBsZXRlVGV4dE1hbmlwdWxhdGlvblNob3VsZFJlcGxhY2VBdHRyaWJ1dGVDb250ZW50KQorewor
ICAgIGF1dG8gZGVsZWdhdGUgPSBhZG9wdE5TKFtbVGV4dE1hbmlwdWxhdGlvbkRlbGVnYXRlIGFs
bG9jXSBpbml0XSk7CisgICAgYXV0byB3ZWJWaWV3ID0gYWRvcHROUyhbW1Rlc3RXS1dlYlZpZXcg
YWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCA0MDAsIDQwMCldKTsKKyAgICBb
d2ViVmlldyBfc2V0VGV4dE1hbmlwdWxhdGlvbkRlbGVnYXRlOmRlbGVnYXRlLmdldCgpXTsKKwor
ICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzpAIjwhRE9DVFlQRSBodG1s
PjxodG1sPjxoZWFkPjx0aXRsZT5oZXk8L3RpdGxlPjwvaGVhZD4iCisgICAgICAgICI8Ym9keT48
ZGl2PjxzcGFuIGFyaWEtbGFiZWw9XCJ0aGlzIGlzIGdyZWV0XCI+aGVsbG88L3NwYW4+PGltZyBz
cmM9XCJhcHBsZS5naWZcIiBhbHQ9XCJmcnVpdFwiPjwvZGl2PjwvYm9keT48L2h0bWw+Il07CisK
KyAgICBkb25lID0gZmFsc2U7CisgICAgW3dlYlZpZXcgX3N0YXJ0VGV4dE1hbmlwdWxhdGlvbnNX
aXRoQ29uZmlndXJhdGlvbjpuaWwgY29tcGxldGlvbjpeeworICAgICAgICBkb25lID0gdHJ1ZTsK
KyAgICB9XTsKKyAgICBUZXN0V2ViS2l0QVBJOjpVdGlsOjpydW4oJmRvbmUpOworCisgICAgYXV0
byAqaXRlbXMgPSBbZGVsZWdhdGUgaXRlbXNdOworICAgIEVYUEVDVF9FUShpdGVtcy5jb3VudCwg
NFVMKTsKKyAgICBFWFBFQ1RfRVEoaXRlbXNbMF0udG9rZW5zLmNvdW50LCAxVUwpOworICAgIEVY
UEVDVF9TVFJFUSgiaGV5IiwgaXRlbXNbMF0udG9rZW5zWzBdLmNvbnRlbnQuVVRGOFN0cmluZyk7
CisKKyAgICBFWFBFQ1RfRVEoaXRlbXNbMV0udG9rZW5zLmNvdW50LCAxVUwpOworICAgIEVYUEVD
VF9TVFJFUSgidGhpcyBpcyBncmVldCIsIGl0ZW1zWzFdLnRva2Vuc1swXS5jb250ZW50LlVURjhT
dHJpbmcpOworCisgICAgRVhQRUNUX0VRKGl0ZW1zWzJdLnRva2Vucy5jb3VudCwgMVVMKTsKKyAg
ICBFWFBFQ1RfU1RSRVEoImZydWl0IiwgaXRlbXNbMl0udG9rZW5zWzBdLmNvbnRlbnQuVVRGOFN0
cmluZyk7CisKKyAgICBFWFBFQ1RfRVEoaXRlbXNbM10udG9rZW5zLmNvdW50LCAyVUwpOworICAg
IEVYUEVDVF9TVFJFUSgiaGVsbG8iLCBpdGVtc1szXS50b2tlbnNbMF0uY29udGVudC5VVEY4U3Ry
aW5nKTsKKyAgICBFWFBFQ1RfU1RSRVEoIltdIiwgaXRlbXNbM10udG9rZW5zWzFdLmNvbnRlbnQu
VVRGOFN0cmluZyk7CisKKyAgICBkb25lID0gZmFsc2U7CisgICAgW3dlYlZpZXcgX2NvbXBsZXRl
VGV4dE1hbmlwdWxhdGlvbkZvckl0ZW1zOkBbCisgICAgICAgIChfV0tUZXh0TWFuaXB1bGF0aW9u
SXRlbSAqKWNyZWF0ZUl0ZW0oaXRlbXNbMF0uaWRlbnRpZmllciwgeyB7IGl0ZW1zWzBdLnRva2Vu
c1swXS5pZGVudGlmaWVyLCBAIkhlbGxvIiB9IH0pLAorICAgICAgICAoX1dLVGV4dE1hbmlwdWxh
dGlvbkl0ZW0gKiljcmVhdGVJdGVtKGl0ZW1zWzFdLmlkZW50aWZpZXIsIHsgeyBpdGVtc1sxXS50
b2tlbnNbMF0uaWRlbnRpZmllciwgQCJUaGlzIGlzIGEgZ3JlZXRpbmciIH0gfSksCisgICAgICAg
IChfV0tUZXh0TWFuaXB1bGF0aW9uSXRlbSAqKWNyZWF0ZUl0ZW0oaXRlbXNbMl0uaWRlbnRpZmll
ciwgeyB7IGl0ZW1zWzJdLnRva2Vuc1swXS5pZGVudGlmaWVyLCBAIkFwcGxlIiB9IH0pLAorICAg
IF0gY29tcGxldGlvbjpeKE5TQXJyYXk8TlNFcnJvciAqPiAqZXJyb3JzKSB7CisgICAgICAgIEVY
UEVDVF9FUShlcnJvcnMsIG5pbCk7CisgICAgICAgIGRvbmUgPSB0cnVlOworICAgIH1dOworICAg
IFRlc3RXZWJLaXRBUEk6OlV0aWw6OnJ1bigmZG9uZSk7CisgICAgRVhQRUNUX1dLX1NUUkVRKCI8
aGVhZD48dGl0bGU+SGVsbG88L3RpdGxlPjwvaGVhZD48Ym9keT48ZGl2PjxzcGFuIGFyaWEtbGFi
ZWw9XCJUaGlzIGlzIGEgZ3JlZXRpbmdcIj5oZWxsbzwvc3Bhbj4iCisgICAgICAgICI8aW1nIHNy
Yz1cImFwcGxlLmdpZlwiIGFsdD1cIkFwcGxlXCI+PC9kaXY+PC9ib2R5PiIsIFt3ZWJWaWV3IHN0
cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5u
ZXJIVE1MIl0pOworfQorCiBURVNUKFRleHRNYW5pcHVsYXRpb24sIENvbXBsZXRlVGV4dE1hbmlw
dWxhdGlvblNob3VsZEJhdGNoSXRlbUNhbGxiYWNrKQogewogICAgIGF1dG8gZGVsZWdhdGUgPSBh
ZG9wdE5TKFtbVGV4dE1hbmlwdWxhdGlvbkRlbGVnYXRlIGFsbG9jXSBpbml0XSk7Cg==
</data>
<flag name="review"
          id="408313"
          type_id="1"
          status="+"
          setter="wenson_hsieh"
    />
          </attachment>
      

    </bug>

</bugzilla>