<?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>205142</bug_id>
          
          <creation_ts>2019-12-11 16:08:34 -0800</creation_ts>
          <short_desc>-requestDocumentContext always returns 1 text unit more granularity than requested</short_desc>
          <delta_ts>2019-12-16 10:07: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>WebKit Misc.</component>
          <version>WebKit Local 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>
          
          <blocked>196127</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Bates">dbates</reporter>
          <assigned_to name="Daniel Bates">dbates</assigned_to>
          <cc>darin</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>mifenton</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>wenson_hsieh</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1597838</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-11 16:08:34 -0800</bug_when>
    <thetext>Consider this unit test that requests 1 sentence of granularity:

[[
TEST(WebKit, DocumentEditingContextDebug2)
{
    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
    [webView synchronouslyLoadHTMLString:applyStyle(@&quot;&lt;p id=&apos;text&apos; contenteditable&gt;The first sentence. The second sentence. The third sentence.&lt;/p&gt;&quot;)];
    [webView stringByEvaluatingJavaScript:@&quot;getSelection().setBaseAndExtent(text.firstChild, text.firstChild.length, text.firstChild, text.firstChild.length)&quot;]; // Will focus &lt;p&gt;.

    auto *context = [webView synchronouslyRequestDocumentContext:makeRequest(UIWKDocumentRequestText, UITextGranularitySentence, 1)];
    EXPECT_NOT_NULL(context);
    EXPECT_NSSTRING_EQ(&quot;The second sentence.&quot;, context.contextBefore);
    EXPECT_NULL(context.selectedText);
    EXPECT_NULL(context.contextAfter);
}
]]

It fails:

[[
    TestWebKitAPI.WebKit.DocumentEditingContextDebug2
        LEAK: 1 WebProcessPool
        LEAK: 1 WebPageProxy
        
        /.../DocumentEditingContext.mm:174
        Expected equality of these values:
          &quot;The second sentence.&quot;
          (NSString *)context.contextBefore
            Which is: &quot;The second sentence. The third sentence.&quot;
]]

^^^ Two sentences were returned!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1597839</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-12-11 16:09:15 -0800</bug_when>
    <thetext>&lt;rdar://problem/57858236&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1597840</commentid>
    <comment_count>2</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-11 16:12:08 -0800</bug_when>
    <thetext>(In reply to Daniel Bates from comment #0)
&gt; Consider this unit test that requests 1 sentence of granularity:
&gt; 
&gt; [[
&gt; TEST(WebKit, DocumentEditingContextDebug2)
&gt; {
&gt;     auto webView = adoptNS([[TestWKWebView alloc]
&gt; initWithFrame:NSMakeRect(0, 0, 800, 600)]);
&gt;     [webView synchronouslyLoadHTMLString:applyStyle(@&quot;&lt;p id=&apos;text&apos;
&gt; contenteditable&gt;The first sentence. The second sentence. The third
&gt; sentence.&lt;/p&gt;&quot;)];
&gt;     [webView
&gt; stringByEvaluatingJavaScript:@&quot;getSelection().setBaseAndExtent(text.
&gt; firstChild, text.firstChild.length, text.firstChild,
&gt; text.firstChild.length)&quot;]; // Will focus &lt;p&gt;.
&gt; 
&gt;     auto *context = [webView
&gt; synchronouslyRequestDocumentContext:makeRequest(UIWKDocumentRequestText,
&gt; UITextGranularitySentence, 1)];
&gt;     EXPECT_NOT_NULL(context);
&gt;     EXPECT_NSSTRING_EQ(&quot;The second sentence.&quot;, context.contextBefore);

Typo....should be

EXPECT_NSSTRING_EQ(&quot;The third sentence.&quot;, context.contextBefore);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598414</commentid>
    <comment_count>3</comment_count>
      <attachid>385620</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-13 11:20:38 -0800</bug_when>
    <thetext>Created attachment 385620
Patch and unit tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598416</commentid>
    <comment_count>4</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-13 11:25:01 -0800</bug_when>
    <thetext>FYI (mostly for me) the fix for &lt;rdar://problem/6501422&gt; added -atBoundaryOfGranularity:</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598488</commentid>
    <comment_count>5</comment_count>
      <attachid>385620</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2019-12-13 13:53:06 -0800</bug_when>
    <thetext>Comment on attachment 385620
Patch and unit tests

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

&gt; Source/WebCore/ChangeLog:13
&gt; +        Fix up the code to actaully determine if the specified position is at a sentence
&gt; +        boundary. Currently the code will always return false when asking whether the
&gt; +        specified position is at a sentence boundary because it compares it to the position
&gt; +        of the end of the next sentence or the beginning of the current sentence when selecting
&gt; +        forward or backwards, respecitvely.

Why does this same problem not affect the other granularities?

&gt; Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:3880
&gt;  static VisiblePosition moveByGranularityRespectingWordBoundary(const VisiblePosition&amp; position, TextGranularity granularity, uint64_t granularityCount, SelectionDirection direction)

Strange to have this code in an iOS-specific source file. Does this operation only come up with implementing some iOS-specific feature?

Feels to me like a remnant of old times when we had a separate team working on an iOS overlay for WebKit. I’d love to see more of this in core code and tested on all platforms, etc. But I suppose if it’s really a unique requirement of iOS UI then that’s a different story.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598495</commentid>
    <comment_count>6</comment_count>
      <attachid>385620</attachid>
    <who name="Wenson Hsieh">wenson_hsieh</who>
    <bug_when>2019-12-13 14:15:28 -0800</bug_when>
    <thetext>Comment on attachment 385620
Patch and unit tests

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

&gt;&gt; Source/WebCore/ChangeLog:13
&gt;&gt; +        forward or backwards, respecitvely.
&gt; 
&gt; Why does this same problem not affect the other granularities?

Nit - &quot;respectively&quot;.

&gt; Source/WebKit/ChangeLog:15
&gt; +        Additionally, added assertions to ensure function invariants, including that we expect to me passed

Nit - &quot;expect to be&quot;

&gt; Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:3909
&gt; +    // Then moving 1 line of granularity forward will return the postion after the &apos;e&apos; in sentence.

Nit - &quot;the position&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598502</commentid>
    <comment_count>7</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-13 14:27:10 -0800</bug_when>
    <thetext>Thanks for the review.

(In reply to Darin Adler from comment #5)
&gt; Comment on attachment 385620 [details]
&gt; Patch and unit tests
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=385620&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:13
&gt; &gt; +        Fix up the code to actaully determine if the specified position is at a sentence
&gt; &gt; +        boundary. Currently the code will always return false when asking whether the
&gt; &gt; +        specified position is at a sentence boundary because it compares it to the position
&gt; &gt; +        of the end of the next sentence or the beginning of the current sentence when selecting
&gt; &gt; +        forward or backwards, respecitvely.
&gt; 
&gt; Why does this same problem not affect the other granularities?
&gt; 

Because those granularities may yield a position that truncates a word. This function always wants to return a position that respects word boundaries: only whole words. Sentence granularity guarantees this invariant by definition of what a sentence is. So, no need to fix things up.

&gt; &gt; Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:3880
&gt; &gt;  static VisiblePosition moveByGranularityRespectingWordBoundary(const VisiblePosition&amp; position, TextGranularity granularity, uint64_t granularityCount, SelectionDirection direction)
&gt; 
&gt; Strange to have this code in an iOS-specific source file. Does this
&gt; operation only come up with implementing some iOS-specific feature?
&gt; 

Yes, as of right now. But why it was placed here to begin with 🤷‍♂️ or agree with. I wouldn&apos;t put it here. It is not iOS-specific, but I didn&apos;t want to move it in this patch to keep it smaller and make it easier to see the changes I am already making.

&gt; Feels to me like a remnant of old times when we had a separate team working
&gt; on an iOS overlay for WebKit.

Bingo! Well moveByGranularityRespectingWordBoundary() is new code and I didn&apos;t write it or place it where it is and I wouldn&apos;t have done so. But atBoundaryOfGranularity() is old code from the the old separate team days (2009! see &lt;rdar://problem/6501422&gt;).

&gt; I’d love to see more of this in core code and
&gt; tested on all platforms, etc. But I suppose if it’s really a unique
&gt; requirement of iOS UI then that’s a different story.

Only used by iOS at the moment, but useful in general.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598503</commentid>
    <comment_count>8</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-13 14:27:22 -0800</bug_when>
    <thetext>Thanks for the review. Will fix.

(In reply to Wenson Hsieh from comment #6)
&gt; Comment on attachment 385620 [details]
&gt; Patch and unit tests
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=385620&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/ChangeLog:13
&gt; &gt;&gt; +        forward or backwards, respecitvely.
&gt; &gt; 
&gt; &gt; Why does this same problem not affect the other granularities?
&gt; 
&gt; Nit - &quot;respectively&quot;.
&gt; 
&gt; &gt; Source/WebKit/ChangeLog:15
&gt; &gt; +        Additionally, added assertions to ensure function invariants, including that we expect to me passed
&gt; 
&gt; Nit - &quot;expect to be&quot;
&gt; 
&gt; &gt; Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:3909
&gt; &gt; +    // Then moving 1 line of granularity forward will return the postion after the &apos;e&apos; in sentence.
&gt; 
&gt; Nit - &quot;the position&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598939</commentid>
    <comment_count>9</comment_count>
      <attachid>385620</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-16 09:59:14 -0800</bug_when>
    <thetext>Comment on attachment 385620
Patch and unit tests

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/ChangeLog:13
&gt;&gt;&gt;&gt;&gt; +        forward or backwards, respecitvely.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Why does this same problem not affect the other granularities?
&gt;&gt;&gt; 
&gt;&gt;&gt; Nit - &quot;respectively&quot;.
&gt;&gt; 
&gt;&gt; Because those granularities may yield a position that truncates a word. This function always wants to return a position that respects word boundaries: only whole words. Sentence granularity guarantees this invariant by definition of what a sentence is. So, no need to fix things up.
&gt; 
&gt; 

Oops! I misread your question. To answer your question: endOfSentence(), startOfSentence() doesn&apos;t take a &quot;LeftWordIfOnBoundary&quot;/&quot;RightWordIfOnBoundary&quot; like argument like endOfWord(), startOfWord() do to know what direction to look. So, this fix is effectively implementing  &quot;LeftWordIfOnBoundary&quot;/&quot;RightWordIfOnBoundary&quot;-like functionality but I&apos;m just inlining it in at the one call site. Maybe should be in those functions. 🤷‍♂️</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598942</commentid>
    <comment_count>10</comment_count>
      <attachid>385620</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-16 10:03:46 -0800</bug_when>
    <thetext>Comment on attachment 385620
Patch and unit tests

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

&gt;&gt;&gt;&gt;&gt;&gt; Source/WebCore/ChangeLog:13
&gt;&gt;&gt;&gt;&gt;&gt; +        forward or backwards, respecitvely.
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; Why does this same problem not affect the other granularities?
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Nit - &quot;respectively&quot;.
&gt;&gt;&gt; 
&gt;&gt;&gt; Because those granularities may yield a position that truncates a word. This function always wants to return a position that respects word boundaries: only whole words. Sentence granularity guarantees this invariant by definition of what a sentence is. So, no need to fix things up.
&gt;&gt; 
&gt;&gt; 
&gt; 
&gt; Oops! I misread your question. To answer your question: endOfSentence(), startOfSentence() doesn&apos;t take a &quot;LeftWordIfOnBoundary&quot;/&quot;RightWordIfOnBoundary&quot; like argument like endOfWord(), startOfWord() do to know what direction to look. So, this fix is effectively implementing  &quot;LeftWordIfOnBoundary&quot;/&quot;RightWordIfOnBoundary&quot;-like functionality but I&apos;m just inlining it in at the one call site. Maybe should be in those functions. 🤷‍♂️

I never tested document granularity. So, maybe there is a bug there. For line granularity it seems to work as-is. Maybe the affinity setting code fixes it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598945</commentid>
    <comment_count>11</comment_count>
      <attachid>385777</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-16 10:06:14 -0800</bug_when>
    <thetext>Created attachment 385777
To land</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1598946</commentid>
    <comment_count>12</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2019-12-16 10:07:27 -0800</bug_when>
    <thetext>Committed r253561: &lt;https://trac.webkit.org/changeset/253561&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>385620</attachid>
            <date>2019-12-13 11:20:38 -0800</date>
            <delta_ts>2019-12-16 10:06:13 -0800</delta_ts>
            <desc>Patch and unit tests</desc>
            <filename>bug-205142-20191213112037.patch</filename>
            <type>text/plain</type>
            <size>26572</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjUzMzM1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTMxMjk2Mzk1NDk3N2Y0
YmQxM2ZjNDdmM2MzNGNjNWQ2OWZmYzlkMi4uOGVlNDcwY2RiN2E5YzJlOTg1ZjAxMTM0Njc4MGMz
NzEzZTIzZTE4NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDE5LTEyLTEyICBEYW5p
ZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNvbT4KKworICAgICAgICAtcmVxdWVzdERvY3VtZW50
Q29udGV4dCBhbHdheXMgcmV0dXJucyAxIHRleHQgdW5pdCBtb3JlIGdyYW51bGFyaXR5IHRoYW4g
cmVxdWVzdGVkCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMDUxNDIKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzU3ODU4MjM2PgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZpeCB1cCB0aGUgY29kZSB0byBh
Y3RhdWxseSBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpcyBhdCBhIHNlbnRl
bmNlCisgICAgICAgIGJvdW5kYXJ5LiBDdXJyZW50bHkgdGhlIGNvZGUgd2lsbCBhbHdheXMgcmV0
dXJuIGZhbHNlIHdoZW4gYXNraW5nIHdoZXRoZXIgdGhlCisgICAgICAgIHNwZWNpZmllZCBwb3Np
dGlvbiBpcyBhdCBhIHNlbnRlbmNlIGJvdW5kYXJ5IGJlY2F1c2UgaXQgY29tcGFyZXMgaXQgdG8g
dGhlIHBvc2l0aW9uCisgICAgICAgIG9mIHRoZSBlbmQgb2YgdGhlIG5leHQgc2VudGVuY2Ugb3Ig
dGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBzZW50ZW5jZSB3aGVuIHNlbGVjdGluZworICAg
ICAgICBmb3J3YXJkIG9yIGJhY2t3YXJkcywgcmVzcGVjaXR2ZWx5LgorCisgICAgICAgICogZWRp
dGluZy9WaXNpYmxlVW5pdHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6YXRCb3VuZGFyeU9mR3Jh
bnVsYXJpdHkpOgorCiAyMDE5LTA5LTEzICBEYW5pZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNv
bT4KIAogICAgICAgICBTdXBwb3J0IGJ1aWxkaW5nIFdlYktpdCBmb3IgTWFjIENhdGFseXN0IGZy
b20gWGNvZGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dl
YktpdC9DaGFuZ2VMb2cKaW5kZXggNThhZDhhZWQxZjlmMDdmZDZlOTE3MmE2MGU2ZjhlYTNhYzY0
NGI2OC4uZTRiM2ExYjMwZGNmN2RmYmM4ZjY0MGUxYjZmMjczOGI3YzBlYjgyYSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cK
QEAgLTEsMyArMSwyNCBAQAorMjAxOS0xMi0xMiAgRGFuaWVsIEJhdGVzICA8ZGFiYXRlc0BhcHBs
ZS5jb20+CisKKyAgICAgICAgLXJlcXVlc3REb2N1bWVudENvbnRleHQgYWx3YXlzIHJldHVybnMg
MSB0ZXh0IHVuaXQgbW9yZSBncmFudWxhcml0eSB0aGFuIHJlcXVlc3RlZAorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA1MTQyCisgICAgICAgIDxyZGFy
Oi8vcHJvYmxlbS81Nzg1ODIzNj4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBVc2UgV2ViQ29yZTo6YXRCb3VuZGFyeU9mR3JhbnVsYXJpdHkoKSB0byBp
ZGVudGlmeSBlYWNoIGJvdW5kYXJ5IHNvIHRoYXQgd2UgcmV0dXJuIHRoZSBwb3NpdGlvbgorICAg
ICAgICBleGFjdGx5IGdyYW51bGFyaXR5Q291bnQgdGV4dCB1bml0cyBhZHZhbmNlZCBmcm9tIHRo
ZSBzcGVjaWZpZWQgcG9zaXRpb24uIFdoZW4gdXNpbmcgc2VudGVuY2UKKyAgICAgICAgZ3JhbnVs
YXJpdHksIHdlIGRvIG5vdCBuZWVkIHRvIHJvdW5kIHRoZSByZXN1bHRpbmcgcG9zaXRpb24gdG8g
dGhlIG5lYXJlc3Qgd29yZCBiZWNhdXNlIGl0IGFscmVhZHkKKyAgICAgICAgZmFsbHMgYmVmb3Jl
IHRoZSBuZXh0IHdvcmQgKGlmIHRoZXJlIGlzIG9uZSkuIEZvciBhbGwgb3RoZXIgZ3JhbnVsYXJp
dGllcyB3ZSBkbyB3aGF0IHdlIGRvIG5vdworICAgICAgICBhbmQgcm91bmQgdG8gdGhlIG5lYXJl
c3Qgd29yZCwgd2hpY2ggbWF5IGNyb3NzIHRoYXQgZ3JhbnVsYXJpdHkncyBib3VuZGFyeS4KKwor
ICAgICAgICBBZGRpdGlvbmFsbHksIGFkZGVkIGFzc2VydGlvbnMgdG8gZW5zdXJlIGZ1bmN0aW9u
IGludmFyaWFudHMsIGluY2x1ZGluZyB0aGF0IHdlIGV4cGVjdCB0byBtZSBwYXNzZWQKKyAgICAg
ICAgYSBub24temVybyBncmFudWxhcml0eSBjb3VudCBhbmQgYSBub24tbnVsbCBpbml0aWFsIHBv
c2l0aW9uLiBUaGUgZnVuY3Rpb24gdGFrZXMgYWR2YW50YWdlIG9mIHRoZXNlCisgICAgICAgIGFz
c3VtcHRpb25zIHRvIDEpIGVuc3VyZSBjb3JyZWN0IHJlc3VsdHMgYW5kIDIpIG1ha2UgdXNlIG9m
IGEgZG8td2hpbGUgbG9vcC4KKworICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2Vi
UGFnZUlPUy5tbToKKyAgICAgICAgKFdlYktpdDo6bW92ZUJ5R3JhbnVsYXJpdHlSZXNwZWN0aW5n
V29yZEJvdW5kYXJ5KToKKwogMjAxOS0xMi0xMSAgRGFuaWVsIEJhdGVzICA8ZGFiYXRlc0BhcHBs
ZS5jb20+CiAKICAgICAgICAgUmVtb3ZlIHVudXNlZCBGcmFtZSBwYXJhbWV0ZXIgZnJvbSBtb3Zl
QnlHcmFudWxhcml0eVJlc3BlY3RpbmdXb3JkQm91bmRhcnkoKSBhbmQgdGFrZSBjb25zdCBWaXNp
YmxlUG9zaXRpb24mCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVV
bml0cy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVVbml0cy5jcHAKaW5kZXgg
YjczZDg4OWU1NDE2MDQ5ZWM2NWQxMjBiOTYyZDFjM2NmNzlhMThkNC4uZjJkMjJlZTE3ODNmNDhl
ZTViODg1MmJiZGI4YTY1ZWQ2YmU5MmFlMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZWRp
dGluZy9WaXNpYmxlVW5pdHMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJs
ZVVuaXRzLmNwcApAQCAtMTU5MSw3ICsxNTkxLDcgQEAgYm9vbCBhdEJvdW5kYXJ5T2ZHcmFudWxh
cml0eShjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZwLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXIK
ICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNlbnRlbmNlR3JhbnVsYXJpdHk6Ci0gICAgICAg
IGJvdW5kYXJ5ID0gdXNlRG93bnN0cmVhbSA/IGVuZE9mU2VudGVuY2UodnApIDogc3RhcnRPZlNl
bnRlbmNlKHZwKTsKKyAgICAgICAgYm91bmRhcnkgPSB1c2VEb3duc3RyZWFtID8gZW5kT2ZTZW50
ZW5jZShwcmV2aW91c1NlbnRlbmNlUG9zaXRpb24odnApKSA6IHN0YXJ0T2ZTZW50ZW5jZShuZXh0
U2VudGVuY2VQb3NpdGlvbih2cCkpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgTGluZUdy
YW51bGFyaXR5OgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
aW9zL1dlYlBhZ2VJT1MubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9pb3Mv
V2ViUGFnZUlPUy5tbQppbmRleCBmOTdmYmM2NWU2NGRjZjhiOTMxNDc2NDhiNTkzM2Y5YTg4MTU5
M2NjLi5mZmY0OWEwYzY0MWE1OTljOTFlOGQ4OTA1NTUyMjA1NzI5N2M3ZTk2IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbQorKysg
Yi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbQpAQCAt
Mzg3OSwxNCArMzg3OSwxNSBAQCB2b2lkIFdlYlBhZ2U6OnVwZGF0ZVNlbGVjdGlvbldpdGhEZWx0
YShpbnQ2NF90IGxvY2F0aW9uRGVsdGEsIGludDY0X3QgbGVuZ3RoRGVsdAogCiBzdGF0aWMgVmlz
aWJsZVBvc2l0aW9uIG1vdmVCeUdyYW51bGFyaXR5UmVzcGVjdGluZ1dvcmRCb3VuZGFyeShjb25z
dCBWaXNpYmxlUG9zaXRpb24mIHBvc2l0aW9uLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHks
IHVpbnQ2NF90IGdyYW51bGFyaXR5Q291bnQsIFNlbGVjdGlvbkRpcmVjdGlvbiBkaXJlY3Rpb24p
CiB7CisgICAgQVNTRVJUKGdyYW51bGFyaXR5Q291bnQpOworICAgIEFTU0VSVChwb3NpdGlvbi5p
c05vdE51bGwoKSk7CiAgICAgYm9vbCBiYWNrd2FyZHMgPSBkaXJlY3Rpb24gPT0gRGlyZWN0aW9u
QmFja3dhcmQ7CiAgICAgYXV0byBmYXJ0aGVzdFBvc2l0aW9uSW5EaXJlY3Rpb24gPSBiYWNrd2Fy
ZHMgPyBzdGFydE9mRWRpdGFibGVDb250ZW50KHBvc2l0aW9uKSA6IGVuZE9mRWRpdGFibGVDb250
ZW50KHBvc2l0aW9uKTsKICAgICBpZiAocG9zaXRpb24gPT0gZmFydGhlc3RQb3NpdGlvbkluRGly
ZWN0aW9uKQogICAgICAgICByZXR1cm4gYmFja3dhcmRzID8gc3RhcnRPZldvcmQocG9zaXRpb24p
IDogZW5kT2ZXb3JkKHBvc2l0aW9uKTsKLQogICAgIFZpc2libGVQb3NpdGlvbiBjdXJyZW50UG9z
aXRpb24gPSBwb3NpdGlvbjsKICAgICBWaXNpYmxlUG9zaXRpb24gbmV4dFBvc2l0aW9uOwotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBncmFudWxhcml0eUNvdW50ICsgMTsgKytpKSB7Cisg
ICAgZG8gewogICAgICAgICBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbk9mTmV4dEJvdW5kYXJ5T2ZH
cmFudWxhcml0eShjdXJyZW50UG9zaXRpb24sIGdyYW51bGFyaXR5LCBkaXJlY3Rpb24pOwogICAg
ICAgICAvLyBGSVhNRSAoMTk2MTI3KTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gZG8gdGhpcywgYnV0
IGhhdmUgc2VlbiBwcmV2aW91c1BhcmFncmFwaFBvc2l0aW9uIGdvIGZvcndhcmRzLgogICAgICAg
ICBpZiAoKGJhY2t3YXJkcyAmJiBuZXh0UG9zaXRpb24gPiBjdXJyZW50UG9zaXRpb24pIHx8ICgh
YmFja3dhcmRzICYmIG5leHRQb3NpdGlvbiA8IGN1cnJlbnRQb3NpdGlvbikpCkBAIC0zODk0LDgg
KzM4OTUsMTggQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBtb3ZlQnlHcmFudWxhcml0eVJlc3Bl
Y3RpbmdXb3JkQm91bmRhcnkoY29uc3QgVmlzaWJsZVBvc2kKICAgICAgICAgaWYgKG5leHRQb3Np
dGlvbi5pc051bGwoKSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjdXJyZW50UG9zaXRp
b24gPSBuZXh0UG9zaXRpb247CisgICAgICAgIGlmIChhdEJvdW5kYXJ5T2ZHcmFudWxhcml0eShj
dXJyZW50UG9zaXRpb24sIGdyYW51bGFyaXR5LCBkaXJlY3Rpb24pKQorICAgICAgICAgICAgLS1n
cmFudWxhcml0eUNvdW50OworICAgIH0gd2hpbGUgKGdyYW51bGFyaXR5Q291bnQpOworICAgIGlm
IChncmFudWxhcml0eSA9PSBTZW50ZW5jZUdyYW51bGFyaXR5KSB7CisgICAgICAgIEFTU0VSVChh
dEJvdW5kYXJ5T2ZHcmFudWxhcml0eShjdXJyZW50UG9zaXRpb24sIFNlbnRlbmNlR3JhbnVsYXJp
dHksIGRpcmVjdGlvbikpOworICAgICAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOwogICAgIH0K
LQorICAgIC8vIE5vdGUgdGhhdCB0aGlzIHJvdW5kcyB0byB0aGUgbmVhcmVzdCB3b3JkLCB3aGlj
aCBtYXkgY3Jvc3MgYSBsaW5lIGJvdW5kYXJ5IHdoZW4gdXNpbmcgbGluZSBncmFudWxhcml0eS4K
KyAgICAvLyBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGUgdGV4dCBpcyBsYWlkIG91dCBhcyBmb2xs
b3dzIGFuZCB0aGUgaW5zZXJ0aW9uIHBvaW50IGlzIGF0IHw6CisgICAgLy8gICAgIHxUaGlzIGlz
IHRoZSBmaXJzdCBzZW4KKyAgICAvLyAgICAgIHRlbmNlIGluIGEgcGFyYWdyYXBoLgorICAgIC8v
IFRoZW4gbW92aW5nIDEgbGluZSBvZiBncmFudWxhcml0eSBmb3J3YXJkIHdpbGwgcmV0dXJuIHRo
ZSBwb3N0aW9uIGFmdGVyIHRoZSAnZScgaW4gc2VudGVuY2UuCiAgICAgcmV0dXJuIGJhY2t3YXJk
cyA/IHN0YXJ0T2ZXb3JkKGN1cnJlbnRQb3NpdGlvbikgOiBlbmRPZldvcmQoY3VycmVudFBvc2l0
aW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvVG9vbHMvQ2hhbmdlTG9nIGIvVG9vbHMvQ2hhbmdlTG9n
CmluZGV4IDUxZTJhN2MzOGY4NjA2YmIwNjA1OGY0Y2ZjZGE4YTIyOWIyNGQyYzMuLjY4YTI2Njlm
MjZkNWFjOTJlN2Q0ZWIyM2NiNWVhZmZjZjkwNGE2YmYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5n
ZUxvZworKysgYi9Ub29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOCBAQAorMjAxOS0xMi0xMiAg
RGFuaWVsIEJhdGVzICA8ZGFiYXRlc0BhcHBsZS5jb20+CisKKyAgICAgICAgLXJlcXVlc3REb2N1
bWVudENvbnRleHQgYWx3YXlzIHJldHVybnMgMSB0ZXh0IHVuaXQgbW9yZSBncmFudWxhcml0eSB0
aGFuIHJlcXVlc3RlZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MjA1MTQyCisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS81Nzg1ODIzNj4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgdGVzdHMgZm9yIHJl
cXVlc3RpbmcgdGV4dCBieSBjaGFyYWN0ZXIsIHNlbnRlbmNlLCBwYXJhZ3JhcGgsIGFuZCBsaW5l
IGdyYW51bGFyaXRpZXMuCisgICAgICAgIEFsc28gb3JnYW5pemVkIHRlc3RzLCBkZW1hcmNhdGlu
ZyBzZWN0aW9ucyBvZiByZWxhdGVkIHRlc3RzLCBhbmQgcmVuYW1pbmcgdGhlIGV4aXN0aW5nCisg
ICAgICAgIHdvcmQgZ3JhbnVsYXJpdHkgdGVzdHMgZm9yIGNvbnNpc3RlbmN5LgorCisgICAgICAg
ICogVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2NvYS9Eb2N1bWVudEVkaXRpbmdDb250ZXh0
Lm1tOgorICAgICAgICAoVEVTVCk6CisKIDIwMTktMTItMTEgIERhbmllbCBCYXRlcyAgPGRhYmF0
ZXNAYXBwbGUuY29tPgogCiAgICAgICAgIFVJV0tEb2N1bWVudENvbnRleHQgcmV0dXJucyAwIGNo
YXJhY3RlciByZWN0cyB3aGVuIGNhcmV0IGlzIGF0IGJlZ2lubmluZyBvciBlbmQgb2YgdGV4dApk
aWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2NvYS9Eb2N1bWVu
dEVkaXRpbmdDb250ZXh0Lm1tIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2Nv
YS9Eb2N1bWVudEVkaXRpbmdDb250ZXh0Lm1tCmluZGV4IDZkMGI2YzFiODQ2M2NjNzZlZjczM2Q2
YTg2ZjFjNWRlMDEzYTY5YzYuLjZiZjg2NWNhYWYxZDljZGI3NjVlYmViNDlmZGNhNTg4OGVhNGYz
YzQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Q29jb2EvRG9j
dW1lbnRFZGl0aW5nQ29udGV4dC5tbQorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dl
YktpdENvY29hL0RvY3VtZW50RWRpdGluZ0NvbnRleHQubW0KQEAgLTE0Niw3ICsxNDYsNyBAQCBj
b25zdGV4cHIgdW5zaWduZWQgZ2x5cGhXaWR0aCB7IDI1IH07IC8vIHBpeGVscwogCiBzdGF0aWMg
TlNTdHJpbmcgKmFwcGx5QWhlbVN0eWxlKE5TU3RyaW5nICpodG1sU3RyaW5nKQogewotICAgIHJl
dHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjxzdHlsZT5AZm9udC1mYWNlIHsgZm9u
dC1mYW1pbHk6IEFoZW07IHNyYzogdXJsKEFoZW0udHRmKTsgfSBib2R5IHsgbWFyZ2luOiAwOyBm
b250OiAldXB4LzEgQWhlbTsgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlJTsgfTwvc3R5
bGU+PG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPTk4MCwgaW5pdGlhbC1zY2Fs
ZT0xLjAnPiVAIiwgZ2x5cGhXaWR0aCwgaHRtbFN0cmluZ107CisgICAgcmV0dXJuIFtOU1N0cmlu
ZyBzdHJpbmdXaXRoRm9ybWF0OkAiPHN0eWxlPkBmb250LWZhY2UgeyBmb250LWZhbWlseTogQWhl
bTsgc3JjOiB1cmwoQWhlbS50dGYpOyB9IGJvZHkgeyBtYXJnaW46IDA7IH0gKiB7IGZvbnQ6ICV1
cHgvMSBBaGVtOyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCUlOyB9PC9zdHlsZT48bWV0
YSBuYW1lPSd2aWV3cG9ydCcgY29udGVudD0nd2lkdGg9OTgwLCBpbml0aWFsLXNjYWxlPTEuMCc+
JUAiLCBnbHlwaFdpZHRoLCBodG1sU3RyaW5nXTsKIH0KIAogVEVTVChXZWJLaXQsIERvY3VtZW50
RWRpdGluZ0NvbnRleHQpCkBAIC0yMDAsNyArMjAwLDcgQEAgVEVTVChXZWJLaXQsIERvY3VtZW50
RWRpdGluZ0NvbnRleHQpCiAgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QWZ0ZXIpOwog
CiAgICAgLy8gU3BhdGlhbCByZXF1ZXN0cy4KLSAgICBjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hy
b25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVx
dWVzdFRleHQgfCBVSVdLRG9jdW1lbnRSZXF1ZXN0U3BhdGlhbCwgVUlUZXh0R3JhbnVsYXJpdHlX
b3JkLCAxLCBDR1JlY3RNYWtlKDAsIDAsIDEwLCAxMCkpXTsKKyAgICBjb250ZXh0ID0gW3dlYlZp
ZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0Rv
Y3VtZW50UmVxdWVzdFRleHQgfCBVSVdLRG9jdW1lbnRSZXF1ZXN0U3BhdGlhbCwgVUlUZXh0R3Jh
bnVsYXJpdHlXb3JkLCAyLCBDR1JlY3RNYWtlKDAsIDAsIDEwLCAxMCkpXTsKICAgICBFWFBFQ1Rf
Tk9UX05VTEwoY29udGV4dCk7CiAgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QmVmb3Jl
KTsKICAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4dCk7CkBAIC0zOTUsMTMgKzM5
NSwxNiBAQCBURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dFNwYXRpYWxSZXF1ZXN0
SW5UZXh0RmllbGQpCiAgICAgfQogfQogCi1URVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29u
dGV4dENhcmV0QXRTdGFydE9mVGV4dCkKKy8vIE1BUks6IFRlc3RzIHVzaW5nIHdvcmQgZ3JhbnVs
YXJpdHkKKworVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0Rmlyc3RU
d29Xb3JkcykKIHsKICAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBh
bGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIC8v
IEZJWE1FOiBVc2UgYXBwbHlBaGVtU3R5bGUoKSB0byBlbnN1cmUgY29uc2lzdGVudCB0ZXh0IG1l
dHJpY3MuCiAgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOmFwcGx5U3R5
bGUoQCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBxdWljayBicm93biBmb3gganVt
cHMgb3ZlciB0aGUgbGF6eSBkb2cuPC9wPiIpXTsKICAgICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1
YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudCh0ZXh0LmZp
cnN0Q2hpbGQsIDAsIHRleHQuZmlyc3RDaGlsZCwgMCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4uCiAK
LSAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVu
dENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQgfCBVSVdLRG9jdW1l
bnRSZXF1ZXN0UmVjdHMsIFVJVGV4dEdyYW51bGFyaXR5V29yZCwgMSldOworICAgIGF1dG8gKmNv
bnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtl
UmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCB8IFVJV0tEb2N1bWVudFJlcXVlc3RSZWN0
cywgVUlUZXh0R3JhbnVsYXJpdHlXb3JkLCAyKV07CiAgICAgRVhQRUNUX05PVF9OVUxMKGNvbnRl
eHQpOwogICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuY29udGV4dEJlZm9yZSk7CiAgICAgRVhQRUNU
X05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOwpAQCAtNDIwLDkgKzQyMywxMCBAQCBURVNUKFdl
YktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dENhcmV0QXRTdGFydE9mVGV4dCkKICAgICBFWFBF
Q1RfRVEoQ0dSZWN0TWFrZSg1NiwgMCwgOSwgMTkpLCB0ZXh0UmVjdHNbOF0uQ0dSZWN0VmFsdWUp
OyAvLyBrCiB9CiAKLVRFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0Q2FyZXRBdFN0
YXJ0T2ZUZXh0V2l0aExlYWRpbmdOb25CcmVha2FibGVTcGFjZSkKK1RFU1QoV2ViS2l0LCBEb2N1
bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0VHdvV29yZFdpdGhMZWFkaW5nTm9uQnJlYWth
YmxlU3BhY2UpCiB7CiAgICAgYXV0byB3ZWJWaWV3ID0gYWRvcHROUyhbW1Rlc3RXS1dlYlZpZXcg
YWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCA4MDAsIDYwMCldKTsKKyAgICAv
LyBGSVhNRTogVXNlIGFwcGx5QWhlbVN0eWxlKCkgdG8gZW5zdXJlIGNvbnNpc3RlbnQgdGV4dCBt
ZXRyaWNzLgogICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseVN0
eWxlKEAiPHAgaWQ9J3RleHQnIGNvbnRlbnRlZGl0YWJsZT4mbmJzcDtUaGUgcXVpY2sgYnJvd24g
Zm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLjwvcD4iKV07CiAgICAgW3dlYlZpZXcgc3RyaW5n
QnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQo
dGV4dC5maXJzdENoaWxkLCAwLCB0ZXh0LmZpcnN0Q2hpbGQsIDApIl07IC8vIFdpbGwgZm9jdXMg
PHA+LgogCkBAIC00NDAsMTAgKzQ0NCwxMCBAQCBURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5n
Q29udGV4dENhcmV0QXRTdGFydE9mVGV4dFdpdGhMZWFkaW5nTm9uQnJlYWthYmxlU3BhYwogICAg
IEVYUEVDVF9FUShDR1JlY3RNYWtlKDIxLCAwLCA4LCAxOSksIHRleHRSZWN0c1szXS5DR1JlY3RW
YWx1ZSk7IC8vIGUKIH0KIAotCi1URVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dENh
cmV0QXRFbmRPZlRleHQpCitURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dFJlcXVl
c3RMYXN0V29yZCkKIHsKICAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmll
dyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAg
IC8vIEZJWE1FOiBVc2UgYXBwbHlBaGVtU3R5bGUoKSB0byBlbnN1cmUgY29uc2lzdGVudCB0ZXh0
IG1ldHJpY3MuCiAgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOmFwcGx5
U3R5bGUoQCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBxdWljayBicm93biBmb3gg
anVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuPC9wPiIpXTsKICAgICBbd2ViVmlldyBzdHJpbmdCeUV2
YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudCh0ZXh0
LmZpcnN0Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5ndGgsIHRleHQuZmlyc3RDaGlsZCwgdGV4
dC5maXJzdENoaWxkLmxlbmd0aCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4uCiAKQEAgLTQ2MSw5ICs0
NjUsMTAgQEAgVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRDYXJldEF0RW5kT2ZU
ZXh0KQogICAgIEVYUEVDVF9FUShDR1JlY3RNYWtlKDI5MiwgMCwgNSwgMTkpLCB0ZXh0UmVjdHNb
M10uQ0dSZWN0VmFsdWUpOyAvLyAuCiB9CiAKLVRFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdD
b250ZXh0Q2FyZXRBdEVuZE9mVGV4dFdpdGhUcmFpbGluZ05vbkJyZWFrYWJsZVNwYWNlKQorVEVT
VChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0TGFzdFdvcmRXaXRoVHJhaWxp
bmdOb25CcmVha2FibGVTcGFjZSkKIHsKICAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVz
dFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAw
KV0pOworICAgIC8vIEZJWE1FOiBVc2UgYXBwbHlBaGVtU3R5bGUoKSB0byBlbnN1cmUgY29uc2lz
dGVudCB0ZXh0IG1ldHJpY3MuCiAgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3Ry
aW5nOmFwcGx5U3R5bGUoQCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBxdWljayBi
cm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuJm5ic3A7PC9wPiIpXTsKICAgICBbd2Vi
VmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFz
ZUFuZEV4dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5ndGgsIHRleHQu
Zmlyc3RDaGlsZCwgdGV4dC5maXJzdENoaWxkLmxlbmd0aCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4u
CiAKQEAgLTQ4Miw0ICs0ODcsMjM4IEBAIFRFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250
ZXh0Q2FyZXRBdEVuZE9mVGV4dFdpdGhUcmFpbGluZ05vbkJyZWFrYWJsZVNwYWNlCiAgICAgRVhQ
RUNUX0VRKENHUmVjdE1ha2UoMjk2LCAwLCA1LCAxOSksIHRleHRSZWN0c1s0XS5DR1JlY3RWYWx1
ZSk7IC8vCiB9CiAKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdFR3
b1dvcmRzQXJvdW5kU2VsZWN0aW9uKQoreworICAgIGF1dG8gd2ViVmlldyA9IGFkb3B0TlMoW1tU
ZXN0V0tXZWJWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOk5TTWFrZVJlY3QoMCwgMCwgODAwLCA2
MDApXSk7CisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOmFwcGx5U3R5
bGUoQCI8c3BhbiBpZD0ndGhlJz5UaGU8L3NwYW4+IHF1aWNrIGJyb3duIGZveCA8c3BhbiBpZD0n
anVtcHMnPmp1bXBzPC9zcGFuPiBvdmVyIHRoZSBsYXp5IDxzcGFuIGlkPSdkb2cnPmRvZy48L3Nw
YW4+IildOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRT
ZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KGp1bXBzLCAwLCBqdW1wcywgMSkiXTsKKworICAg
IGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29u
dGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJp
dHlXb3JkLCAyKV07CisgICAgRVhQRUNUX05PVF9OVUxMKGNvbnRleHQpOworICAgIEVYUEVDVF9O
U1NUUklOR19FUSgiYnJvd24gZm94ICIsIGNvbnRleHQuY29udGV4dEJlZm9yZSk7CisgICAgRVhQ
RUNUX05TU1RSSU5HX0VRKCJqdW1wcyIsIGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBF
Q1RfTlNTVFJJTkdfRVEoIiBvdmVyIHRoZSIsIGNvbnRleHQuY29udGV4dEFmdGVyKTsKK30KKwor
VEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0VGhyZWVXb3Jkc0Fyb3Vu
ZFNlbGVjdGlvbikKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmll
dyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAg
IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseVN0eWxlKEAiPHNwYW4g
aWQ9J3RoZSc+VGhlPC9zcGFuPiBxdWljayBicm93biBmb3ggPHNwYW4gaWQ9J2p1bXBzJz5qdW1w
czwvc3Bhbj4gb3ZlciB0aGUgbGF6eSA8c3BhbiBpZD0nZG9nJz5kb2cuPC9zcGFuPiIpXTsKKyAg
ICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCku
c2V0QmFzZUFuZEV4dGVudChqdW1wcywgMCwganVtcHMsIDEpIl07CisKKyAgICBhdXRvICpjb250
ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJl
cXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQsIFVJVGV4dEdyYW51bGFyaXR5V29yZCwgMyld
OworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBFWFBFQ1RfTlNTVFJJTkdfRVEo
InF1aWNrIGJyb3duIGZveCAiLCBjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAgIEVYUEVDVF9O
U1NUUklOR19FUSgianVtcHMiLCBjb250ZXh0LnNlbGVjdGVkVGV4dCk7CisgICAgRVhQRUNUX05T
U1RSSU5HX0VRKCIgb3ZlciB0aGUgbGF6eSIsIGNvbnRleHQuY29udGV4dEFmdGVyKTsKK30KKwor
Ly8gTUFSSzogVGVzdHMgdXNpbmcgc2VudGVuY2UgZ3JhbnVsYXJpdHkKKworY29uc3RleHByIE5T
U3RyaW5nICogY29uc3QgdGhyZWVTZW50ZW5jZXNFeGFtcGxlID0gQCI8cCBpZD0ndGV4dCcgY29u
dGVudGVkaXRhYmxlPlRoZSBmaXJzdCBzZW50ZW5jZS4gVGhlIHNlY29uZCBzZW50ZW5jZS4gVGhl
IHRoaXJkIHNlbnRlbmNlLjwvcD4iOworCitURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29u
dGV4dFJlcXVlc3RGaXJzdFR3b1NlbnRlbmNlcykKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9w
dE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAs
IDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzph
cHBseVN0eWxlKHRocmVlU2VudGVuY2VzRXhhbXBsZSldOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5
RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KHRl
eHQuZmlyc3RDaGlsZCwgMCwgdGV4dC5maXJzdENoaWxkLCAwKSJdOyAvLyBXaWxsIGZvY3VzIDxw
Pi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERv
Y3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0
R3JhbnVsYXJpdHlTZW50ZW5jZSwgMildOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsK
KyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAgIEVYUEVDVF9OVUxM
KGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlNTVFJJTkdfRVEoIlRoZSBmaXJz
dCBzZW50ZW5jZS4gVGhlIHNlY29uZCBzZW50ZW5jZS4gIiwgY29udGV4dC5jb250ZXh0QWZ0ZXIp
OworfQorCitURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dFJlcXVlc3RGaXJzdFR3
b1NlbnRlbmNlc05vU3BhY2VzKQoreworICAgIGF1dG8gd2ViVmlldyA9IGFkb3B0TlMoW1tUZXN0
V0tXZWJWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOk5TTWFrZVJlY3QoMCwgMCwgODAwLCA2MDAp
XSk7CisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOmFwcGx5U3R5bGUo
QCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBmaXJzdCBzZW50ZW5jZS5UaGUgc2Vj
b25kIHNlbnRlbmNlLlRoZSB0aGlyZCBzZW50ZW5jZS48L3A+IildOworICAgIFt3ZWJWaWV3IHN0
cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0
ZW50KHRleHQuZmlyc3RDaGlsZCwgMCwgdGV4dC5maXJzdENoaWxkLCAwKSJdOyAvLyBXaWxsIGZv
Y3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVx
dWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCwg
VUlUZXh0R3JhbnVsYXJpdHlTZW50ZW5jZSwgMildOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250
ZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAgIEVYUEVD
VF9OVUxMKGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlNTVFJJTkdfRVEoIlRo
ZSBmaXJzdCBzZW50ZW5jZS5UaGUgc2Vjb25kIHNlbnRlbmNlLlRoZSB0aGlyZCBzZW50ZW5jZS4i
LCBjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRp
bmdDb250ZXh0UmVxdWVzdExhc3RTZW50ZW5jZSkKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9w
dE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAs
IDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzph
cHBseVN0eWxlKHRocmVlU2VudGVuY2VzRXhhbXBsZSldOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5
RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KHRl
eHQuZmlyc3RDaGlsZCwgdGV4dC5maXJzdENoaWxkLmxlbmd0aCwgdGV4dC5maXJzdENoaWxkLCB0
ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoKSJdOyAvLyBXaWxsIGZvY3VzIDxwPi4KKworICAgIGF1dG8g
KmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDpt
YWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJpdHlTZW50
ZW5jZSwgMSldOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBFWFBFQ1RfTlNT
VFJJTkdfRVEoIlRoZSB0aGlyZCBzZW50ZW5jZS4iLCBjb250ZXh0LmNvbnRleHRCZWZvcmUpOwor
ICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChj
b250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdD
b250ZXh0UmVxdWVzdExhc3RUd29TZW50ZW5jZXMpCit7CisgICAgYXV0byB3ZWJWaWV3ID0gYWRv
cHROUyhbW1Rlc3RXS1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAw
LCA4MDAsIDYwMCldKTsKKyAgICBbd2ViVmlldyBzeW5jaHJvbm91c2x5TG9hZEhUTUxTdHJpbmc6
YXBwbHlTdHlsZSh0aHJlZVNlbnRlbmNlc0V4YW1wbGUpXTsKKyAgICBbd2ViVmlldyBzdHJpbmdC
eUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudCh0
ZXh0LmZpcnN0Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5ndGgsIHRleHQuZmlyc3RDaGlsZCwg
dGV4dC5maXJzdENoaWxkLmxlbmd0aCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4uCisKKyAgICBhdXRv
ICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6
bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQsIFVJVGV4dEdyYW51bGFyaXR5U2Vu
dGVuY2UsIDIpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05T
U1RSSU5HX0VRKCJUaGUgc2Vjb25kIHNlbnRlbmNlLiBUaGUgdGhpcmQgc2VudGVuY2UuIiwgY29u
dGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4
dCk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQorCisvLyBNQVJL
OiBUZXN0cyB1c2luZyBwYXJhZ3JhcGggZ3JhbnVsYXJpdHkKKworY29uc3RleHByIE5TU3RyaW5n
ICogY29uc3QgdGhyZWVQYXJhZ3JhcGhzRXhhbXBsZSA9IEAiPHByZSBpZD0ndGV4dCcgc3R5bGU9
J3dpZHRoOiAzMmVtJyBjb250ZW50ZWRpdGFibGU+VGhlIGZpcnN0IHNlbnRlbmNlIGluIHRoZSBm
aXJzdCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIGZpcnN0IHBhcmFncmFw
aC4gVGhlIHRoaXJkIHNlbnRlbmNlIGluIHRoZSBmaXJzdCBwYXJhZ3JhcGguXG5UaGUgZmlyc3Qg
c2VudGVuY2UgaW4gdGhlIHNlY29uZCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4g
dGhlIHNlY29uZCBwYXJhZ3JhcGguIFRoZSB0aGlyZCBzZW50ZW5jZSBpbiB0aGUgc2Vjb25kIHBh
cmFncmFwaC5cblRoZSBmaXJzdCBzZW50ZW5jZSBpbiB0aGUgdGhpcmQgcGFyYWdyYXBoLiBUaGUg
c2Vjb25kIHNlbnRlbmNlIGluIHRoZSB0aGlyZCBwYXJhZ3JhcGguIFRoZSB0aGlyZCBzZW50ZW5j
ZSBpbiB0aGUgdGhpcmQgcGFyYWdyYXBoLjwvcHJlPiI7CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVu
dEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0UGFyYWdyYXBoKQoreworICAgIGF1dG8gd2ViVmll
dyA9IGFkb3B0TlMoW1tUZXN0V0tXZWJWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOk5TTWFrZVJl
Y3QoMCwgMCwgODAwLCA2MDApXSk7CisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1M
U3RyaW5nOmFwcGx5U3R5bGUodGhyZWVQYXJhZ3JhcGhzRXhhbXBsZSldOworICAgIFt3ZWJWaWV3
IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5k
RXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgMCwgdGV4dC5maXJzdENoaWxkLCAwKSJdOyAvLyBXaWxs
IGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5
UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4
dCwgVUlUZXh0R3JhbnVsYXJpdHlQYXJhZ3JhcGgsIDEpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwo
Y29udGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBF
WFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4dCk7CisgICAgRVhQRUNUX05TU1RSSU5HX0VR
KCJUaGUgZmlyc3Qgc2VudGVuY2UgaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4gVGhlIHNlY29uZCBz
ZW50ZW5jZSBpbiB0aGUgZmlyc3QgcGFyYWdyYXBoLiBUaGUgdGhpcmQgc2VudGVuY2UgaW4gdGhl
IGZpcnN0IHBhcmFncmFwaC4iLCBjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2Vi
S2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0VHdvUGFyYWdyYXBocykKK3sK
KyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdp
dGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNo
cm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseVN0eWxlKHRocmVlUGFyYWdyYXBoc0V4YW1wbGUp
XTsKKyAgICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0
aW9uKCkuc2V0QmFzZUFuZEV4dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIDAsIHRleHQuZmlyc3RDaGls
ZCwgMCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4uCisKKyAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZp
ZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0Rv
Y3VtZW50UmVxdWVzdFRleHQsIFVJVGV4dEdyYW51bGFyaXR5UGFyYWdyYXBoLCAyKV07CisgICAg
RVhQRUNUX05PVF9OVUxMKGNvbnRleHQpOworICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuY29udGV4
dEJlZm9yZSk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOworICAgIEVY
UEVDVF9OU1NUUklOR19FUSgiVGhlIGZpcnN0IHNlbnRlbmNlIGluIHRoZSBmaXJzdCBwYXJhZ3Jh
cGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4gVGhlIHRoaXJk
IHNlbnRlbmNlIGluIHRoZSBmaXJzdCBwYXJhZ3JhcGguXG5UaGUgZmlyc3Qgc2VudGVuY2UgaW4g
dGhlIHNlY29uZCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIHNlY29uZCBw
YXJhZ3JhcGguIFRoZSB0aGlyZCBzZW50ZW5jZSBpbiB0aGUgc2Vjb25kIHBhcmFncmFwaC4iLCBj
b250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdD
b250ZXh0UmVxdWVzdExhc3RQYXJhZ3JhcGgpCit7CisgICAgYXV0byB3ZWJWaWV3ID0gYWRvcHRO
UyhbW1Rlc3RXS1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCA4
MDAsIDYwMCldKTsKKyAgICBbd2ViVmlldyBzeW5jaHJvbm91c2x5TG9hZEhUTUxTdHJpbmc6YXBw
bHlTdHlsZSh0aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3RyaW5nQnlF
dmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQodGV4
dC5maXJzdENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoLCB0ZXh0LmZpcnN0Q2hpbGQsIHRl
eHQuZmlyc3RDaGlsZC5sZW5ndGgpIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisgICAgYXV0byAq
Y29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRDb250ZXh0Om1h
a2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxhcml0eVBhcmFn
cmFwaCwgMSldOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBFWFBFQ1RfTlNT
VFJJTkdfRVEoIlRoZSBmaXJzdCBzZW50ZW5jZSBpbiB0aGUgdGhpcmQgcGFyYWdyYXBoLiBUaGUg
c2Vjb25kIHNlbnRlbmNlIGluIHRoZSB0aGlyZCBwYXJhZ3JhcGguIFRoZSB0aGlyZCBzZW50ZW5j
ZSBpbiB0aGUgdGhpcmQgcGFyYWdyYXBoLiIsIGNvbnRleHQuY29udGV4dEJlZm9yZSk7CisgICAg
RVhQRUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOworICAgIEVYUEVDVF9OVUxMKGNvbnRl
eHQuY29udGV4dEFmdGVyKTsKK30KKworVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRl
eHRSZXF1ZXN0TGFzdFR3b1BhcmFncmFwaHMpCit7CisgICAgYXV0byB3ZWJWaWV3ID0gYWRvcHRO
UyhbW1Rlc3RXS1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCA4
MDAsIDYwMCldKTsKKyAgICBbd2ViVmlldyBzeW5jaHJvbm91c2x5TG9hZEhUTUxTdHJpbmc6YXBw
bHlTdHlsZSh0aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3RyaW5nQnlF
dmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQodGV4
dC5maXJzdENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoLCB0ZXh0LmZpcnN0Q2hpbGQsIHRl
eHQuZmlyc3RDaGlsZC5sZW5ndGgpIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisgICAgYXV0byAq
Y29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRDb250ZXh0Om1h
a2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxhcml0eVBhcmFn
cmFwaCwgMildOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBFWFBFQ1RfTlNT
VFJJTkdfRVEoIlRoZSBmaXJzdCBzZW50ZW5jZSBpbiB0aGUgc2Vjb25kIHBhcmFncmFwaC4gVGhl
IHNlY29uZCBzZW50ZW5jZSBpbiB0aGUgc2Vjb25kIHBhcmFncmFwaC4gVGhlIHRoaXJkIHNlbnRl
bmNlIGluIHRoZSBzZWNvbmQgcGFyYWdyYXBoLlxuVGhlIGZpcnN0IHNlbnRlbmNlIGluIHRoZSB0
aGlyZCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIHRoaXJkIHBhcmFncmFw
aC4gVGhlIHRoaXJkIHNlbnRlbmNlIGluIHRoZSB0aGlyZCBwYXJhZ3JhcGguIiwgY29udGV4dC5j
b250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4dCk7Cisg
ICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQorCisvLyBNQVJLOiBUZXN0
cyB1c2luZyBjaGFyYWN0ZXIgZ3JhbnVsYXJpdHkKKy8vIE5vdGUgdGhhdCB3ZSBhbHdheXMgcmV0
dXJuIHJlc3VsdHMgd2l0aCByZXNwZWN0IHRvIHRoZSBuZWFyZXN0IHdvcmQgYm91bmRhcnkgaW4g
dGhlIGRpcmVjdGlvbiBvZiB0aGUgc2VsZWN0aW9uLgorCitURVNUKFdlYktpdCwgRG9jdW1lbnRF
ZGl0aW5nQ29udGV4dFJlcXVlc3RGaXJzdENoYXJhY3RlcikKK3sKKyAgICBhdXRvIHdlYlZpZXcg
PSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0
KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0
cmluZzphcHBseVN0eWxlKHRocmVlUGFyYWdyYXBoc0V4YW1wbGUpXTsKKyAgICBbd2ViVmlldyBz
dHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4
dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIDAsIHRleHQuZmlyc3RDaGlsZCwgMCkiXTsgLy8gV2lsbCBm
b2N1cyA8cD4uCisKKyAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJl
cXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQs
IFVJVGV4dEdyYW51bGFyaXR5Q2hhcmFjdGVyLCAxKV07CisgICAgRVhQRUNUX05PVF9OVUxMKGNv
bnRleHQpOworICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuY29udGV4dEJlZm9yZSk7CisgICAgRVhQ
RUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOworICAgIEVYUEVDVF9OU1NUUklOR19FUSgi
VGhlIiwgY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQorCitURVNUKFdlYktpdCwgRG9jdW1lbnRF
ZGl0aW5nQ29udGV4dFJlcXVlc3RGaXJzdFdvcmRVc2luZ0NoYXJhY3RlckdyYW51bGFyaXR5KQor
eworICAgIGF1dG8gd2ViVmlldyA9IGFkb3B0TlMoW1tUZXN0V0tXZWJWaWV3IGFsbG9jXSBpbml0
V2l0aEZyYW1lOk5TTWFrZVJlY3QoMCwgMCwgODAwLCA2MDApXSk7CisgICAgW3dlYlZpZXcgc3lu
Y2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOmFwcGx5U3R5bGUodGhyZWVQYXJhZ3JhcGhzRXhhbXBs
ZSldOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxl
Y3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgMCwgdGV4dC5maXJzdENo
aWxkLCAwKSJdOyAvLyBXaWxsIGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2Vi
VmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdL
RG9jdW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJpdHlDaGFyYWN0ZXIsIDMpXTsKKyAg
ICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250
ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4dCk7CisgICAg
RVhQRUNUX05TU1RSSU5HX0VRKCJUaGUiLCBjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RF
U1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0V29yZFBsdXNUcmFp
bGluZ1NwYWNlVXNpbmdDaGFyYWN0ZXJHcmFudWxhcml0eSkKK3sKKyAgICBhdXRvIHdlYlZpZXcg
PSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0
KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0
cmluZzphcHBseVN0eWxlKHRocmVlUGFyYWdyYXBoc0V4YW1wbGUpXTsKKyAgICBbd2ViVmlldyBz
dHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4
dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIDAsIHRleHQuZmlyc3RDaGlsZCwgMCkiXTsgLy8gV2lsbCBm
b2N1cyA8cD4uCisKKyAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJl
cXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQs
IFVJVGV4dEdyYW51bGFyaXR5Q2hhcmFjdGVyLCA0KV07CisgICAgRVhQRUNUX05PVF9OVUxMKGNv
bnRleHQpOworICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuY29udGV4dEJlZm9yZSk7CisgICAgRVhQ
RUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOworICAgIEVYUEVDVF9OU1NUUklOR19FUSgi
VGhlIGZpcnN0IiwgY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQorCisvLyBNQVJLOiBUZXN0cyB1
c2luZyBsaW5lIGdyYW51bGFyaXR5CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250
ZXh0UmVxdWVzdEZpcnN0TGluZSkKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVz
dFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAw
KV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseUFoZW1T
dHlsZSh0aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3RyaW5nQnlFdmFs
dWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQodGV4dC5m
aXJzdENoaWxkLCAwLCB0ZXh0LmZpcnN0Q2hpbGQsIDApIl07IC8vIFdpbGwgZm9jdXMgPHA+Lgor
CisgICAgYXV0byAqY29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1l
bnRDb250ZXh0Om1ha2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFu
dWxhcml0eUxpbmUsIDEpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQ
RUNUX05VTEwoY29udGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0
LnNlbGVjdGVkVGV4dCk7CisgICAgRVhQRUNUX05TU1RSSU5HX0VRKCJUaGUgZmlyc3Qgc2VudGVu
Y2UgaW4gdGhlIGZpcnN0IHBhcmFncmFwaCIsIGNvbnRleHQuY29udGV4dEFmdGVyKTsKK30KKwor
VEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0Rmlyc3RUd29MaW5lcykK
K3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5p
dFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5
bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseUFoZW1TdHlsZSh0aHJlZVBhcmFncmFwaHNF
eGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImdl
dFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQodGV4dC5maXJzdENoaWxkLCAwLCB0ZXh0LmZp
cnN0Q2hpbGQsIDApIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisgICAgYXV0byAqY29udGV4dCA9
IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRDb250ZXh0Om1ha2VSZXF1ZXN0
KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxhcml0eUxpbmUsIDIpXTsKKyAg
ICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250
ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4dCk7CisgICAg
RVhQRUNUX05TU1RSSU5HX0VRKCJUaGUgZmlyc3Qgc2VudGVuY2UgaW4gdGhlIGZpcnN0IHBhcmFn
cmFwaC4gVGhlIHNlY29uZCBzZW50ZW5jZSBpbiIsIGNvbnRleHQuY29udGV4dEFmdGVyKTsKK30K
KworVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0TGFzdExpbmUpCit7
CisgICAgYXV0byB3ZWJWaWV3ID0gYWRvcHROUyhbW1Rlc3RXS1dlYlZpZXcgYWxsb2NdIGluaXRX
aXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCA4MDAsIDYwMCldKTsKKyAgICBbd2ViVmlldyBzeW5j
aHJvbm91c2x5TG9hZEhUTUxTdHJpbmc6YXBwbHlBaGVtU3R5bGUodGhyZWVQYXJhZ3JhcGhzRXhh
bXBsZSldOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRT
ZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgdGV4dC5maXJzdENo
aWxkLmxlbmd0aCwgdGV4dC5maXJzdENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoKSJdOyAv
LyBXaWxsIGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJv
bm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1
ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJpdHlMaW5lLCAxKV07CisgICAgRVhQRUNUX05PVF9OVUxM
KGNvbnRleHQpOworICAgIEVYUEVDVF9OU1NUUklOR19FUSgidGhpcmQgc2VudGVuY2UgaW4gdGhl
IHRoaXJkIHBhcmFncmFwaC4iLCBjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAgIEVYUEVDVF9O
VUxMKGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LmNvbnRl
eHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVz
dExhc3RUd29MaW5lcykKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2Vi
VmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOwor
ICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseUFoZW1TdHlsZSh0
aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3RyaW5nQnlFdmFsdWF0aW5n
SmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQodGV4dC5maXJzdENo
aWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoLCB0ZXh0LmZpcnN0Q2hpbGQsIHRleHQuZmlyc3RD
aGlsZC5sZW5ndGgpIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisgICAgYXV0byAqY29udGV4dCA9
IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRDb250ZXh0Om1ha2VSZXF1ZXN0
KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxhcml0eUxpbmUsIDIpXTsKKyAg
ICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05TU1RSSU5HX0VRKCJpbiB0
aGUgdGhpcmQgcGFyYWdyYXBoLiBUaGUgdGhpcmQgc2VudGVuY2UgaW4gdGhlIHRoaXJkIHBhcmFn
cmFwaC4iLCBjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAgIEVYUEVDVF9OVUxMKGNvbnRleHQu
c2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9
CisKICNlbmRpZiAvLyBQTEFURk9STShJT1NfRkFNSUxZKSAmJiBIQVZFKFVJX1dLX0RPQ1VNRU5U
X0NPTlRFWFQpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>385777</attachid>
            <date>2019-12-16 10:06:14 -0800</date>
            <delta_ts>2019-12-16 10:06:14 -0800</delta_ts>
            <desc>To land</desc>
            <filename>bug-205142-20191216100614.patch</filename>
            <type>text/plain</type>
            <size>26581</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjUzNTU4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggM2ZkOWM4ODNlOTM2YWUy
OWRkYTQ4NzQwZWMyZjdjZmE2N2EwMzI4YS4uNTk2NTQ0N2Y2ZDAxOTJiYjMyZTU0N2QwNjU3NDRk
NzMzZTZjMWI2NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDE5LTEyLTE2ICBEYW5p
ZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNvbT4KKworICAgICAgICAtcmVxdWVzdERvY3VtZW50
Q29udGV4dCBhbHdheXMgcmV0dXJucyAxIHRleHQgdW5pdCBtb3JlIGdyYW51bGFyaXR5IHRoYW4g
cmVxdWVzdGVkCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMDUxNDIKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzU3ODU4MjM2PgorCisgICAgICAgIFJl
dmlld2VkIGJ5IERhcmluIEFkbGVyIGFuZCBXZW5zb24gSHNpZWguCisKKyAgICAgICAgRml4IHVw
IHRoZSBjb2RlIHRvIGFjdHVhbGx5IGRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9u
IGlzIGF0IGEgc2VudGVuY2UKKyAgICAgICAgYm91bmRhcnkuIEN1cnJlbnRseSB0aGUgY29kZSB3
aWxsIGFsd2F5cyByZXR1cm4gZmFsc2Ugd2hlbiBhc2tpbmcgd2hldGhlciB0aGUKKyAgICAgICAg
c3BlY2lmaWVkIHBvc2l0aW9uIGlzIGF0IGEgc2VudGVuY2UgYm91bmRhcnkgKGkuZS4gImVuZCBv
ZiB0aGUgc2VudGVuY2UiKSBiZWNhdXNlCisgICAgICAgIGl0IGNvbXBhcmVzIGl0IHRvIHRoZSBw
b3NpdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSAqbmV4dCogc2VudGVuY2Ugb3IgdGhlIGJlZ2lubmlu
ZworICAgICAgICBvZiB0aGUgY3VycmVudCBzZW50ZW5jZSB3aGVuIHNlbGVjdGluZyBmb3J3YXJk
IG9yIGJhY2t3YXJkcywgcmVzcGVjdGl2ZWx5LgorCisgICAgICAgICogZWRpdGluZy9WaXNpYmxl
VW5pdHMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6YXRCb3VuZGFyeU9mR3JhbnVsYXJpdHkpOgor
CiAyMDE5LTEyLTE2ICBaYWxhbiBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CiAKICAgICAgICAg
W0xGQ11bSUZDXSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBsaW5lLWJyZWFrOiBhbnl3aGVyZQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L0NoYW5n
ZUxvZwppbmRleCA5MzBjYTJjMGFmNjkwMDZiZTI5YmJmOTRiNjgwMmRiZTEzMzBkZWVkLi44MzQ1
MzFiZDM4YWY1YWU2MWRhMzQ3OGJiYjhlNDE3ZGY4MWIwNDBlIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsx
LDI0IEBACisyMDE5LTEyLTE2ICBEYW5pZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNvbT4KKwor
ICAgICAgICAtcmVxdWVzdERvY3VtZW50Q29udGV4dCBhbHdheXMgcmV0dXJucyAxIHRleHQgdW5p
dCBtb3JlIGdyYW51bGFyaXR5IHRoYW4gcmVxdWVzdGVkCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDUxNDIKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVt
LzU3ODU4MjM2PgorCisgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyIGFuZCBXZW5zb24g
SHNpZWguCisKKyAgICAgICAgVXNlIFdlYkNvcmU6OmF0Qm91bmRhcnlPZkdyYW51bGFyaXR5KCkg
dG8gaWRlbnRpZnkgZWFjaCBib3VuZGFyeSBzbyB0aGF0IHdlIHJldHVybiB0aGUgcG9zaXRpb24K
KyAgICAgICAgZXhhY3RseSBncmFudWxhcml0eUNvdW50IHRleHQgdW5pdHMgYWR2YW5jZWQgZnJv
bSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBXaGVuIHVzaW5nIHNlbnRlbmNlCisgICAgICAgIGdy
YW51bGFyaXR5IHdlIGRvIG5vdCBuZWVkIHRvIHJvdW5kIHRoZSByZXN1bHRpbmcgcG9zaXRpb24g
dG8gdGhlIG5lYXJlc3Qgd29yZCBiZWNhdXNlIGl0IGFscmVhZHkKKyAgICAgICAgZmFsbHMgYmVm
b3JlIHRoZSBuZXh0IHdvcmQgKGlmIHRoZXJlIGlzIG9uZSkuIEZvciBhbGwgb3RoZXIgZ3JhbnVs
YXJpdGllcyB3ZSBkbyB3aGF0IHdlIGRvIG5vdworICAgICAgICBhbmQgcm91bmQgdG8gdGhlIG5l
YXJlc3Qgd29yZCwgd2hpY2ggbWF5IGNyb3NzIHRoYXQgZ3JhbnVsYXJpdHkncyBib3VuZGFyeS4K
KworICAgICAgICBBZGRpdGlvbmFsbHksIGFkZGVkIGFzc2VydGlvbnMgdG8gZW5zdXJlIHRoYXQg
d2UgYXJlIHBhc3NlZCBhIG5vbi16ZXJvIGdyYW51bGFyaXR5IGNvdW50IGFuZCBhIG5vbi0KKyAg
ICAgICAgbnVsbCBpbml0aWFsIHBvc2l0aW9uLiBUaGUgZnVuY3Rpb24gdGFrZXMgYWR2YW50YWdl
IG9mIHRoZXNlIGFzc3VtcHRpb25zIHRvIDEpIGVuc3VyZSBjb3JyZWN0IHJlc3VsdHMKKyAgICAg
ICAgYW5kIDIpIG1ha2UgdXNlIG9mIGEgZG8td2hpbGUgbG9vcC4KKworICAgICAgICAqIFdlYlBy
b2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbToKKyAgICAgICAgKFdlYktpdDo6bW92ZUJ5
R3JhbnVsYXJpdHlSZXNwZWN0aW5nV29yZEJvdW5kYXJ5KToKKwogMjAxOS0xMi0xNiAgRXJpYyBD
YXJsc29uICA8ZXJpYy5jYXJsc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBMb2cgd2hlbiB1bmlt
cGxlbWVudGVkIHJlbW90ZSBNZWRpYVBsYXllciBtZXRob2RzIGFyZSBjYWxsZWQKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVVuaXRzLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvVmlzaWJsZVVuaXRzLmNwcAppbmRleCBiNzNkODg5ZTU0MTYwNDllYzY1ZDEy
MGI5NjJkMWMzY2Y3OWExOGQ0Li5mMmQyMmVlMTc4M2Y0OGVlNWI4ODUyYmJkYjhhNjVlZDZiZTky
YWUwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVVbml0cy5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvZWRpdGluZy9WaXNpYmxlVW5pdHMuY3BwCkBAIC0xNTkxLDcg
KzE1OTEsNyBAQCBib29sIGF0Qm91bmRhcnlPZkdyYW51bGFyaXR5KGNvbnN0IFZpc2libGVQb3Np
dGlvbiYgdnAsIFRleHRHcmFudWxhcml0eSBncmFudWxhcgogICAgICAgICBicmVhazsKIAogICAg
IGNhc2UgU2VudGVuY2VHcmFudWxhcml0eToKLSAgICAgICAgYm91bmRhcnkgPSB1c2VEb3duc3Ry
ZWFtID8gZW5kT2ZTZW50ZW5jZSh2cCkgOiBzdGFydE9mU2VudGVuY2UodnApOworICAgICAgICBi
b3VuZGFyeSA9IHVzZURvd25zdHJlYW0gPyBlbmRPZlNlbnRlbmNlKHByZXZpb3VzU2VudGVuY2VQ
b3NpdGlvbih2cCkpIDogc3RhcnRPZlNlbnRlbmNlKG5leHRTZW50ZW5jZVBvc2l0aW9uKHZwKSk7
CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBMaW5lR3JhbnVsYXJpdHk6CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbSBiL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCmluZGV4IGI5
ZTg4ZjkyYmMwYmIwN2Q3NWU0ZWIwZGJjM2JiM2E1Y2YzOTY0MTEuLjUxODFjMDc2MTA3ZmQ5MTk3
NDg1ZTg2ODJmZDEyZWQ4NGMzYzE3ZmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCkBAIC0zODY5LDE0ICszODY5LDE1IEBAIHZv
aWQgV2ViUGFnZTo6dXBkYXRlU2VsZWN0aW9uV2l0aERlbHRhKGludDY0X3QgbG9jYXRpb25EZWx0
YSwgaW50NjRfdCBsZW5ndGhEZWx0CiAKIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gbW92ZUJ5R3Jh
bnVsYXJpdHlSZXNwZWN0aW5nV29yZEJvdW5kYXJ5KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9z
aXRpb24sIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSwgdWludDY0X3QgZ3JhbnVsYXJpdHlD
b3VudCwgU2VsZWN0aW9uRGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKKyAgICBBU1NFUlQoZ3JhbnVs
YXJpdHlDb3VudCk7CisgICAgQVNTRVJUKHBvc2l0aW9uLmlzTm90TnVsbCgpKTsKICAgICBib29s
IGJhY2t3YXJkcyA9IGRpcmVjdGlvbiA9PSBEaXJlY3Rpb25CYWNrd2FyZDsKICAgICBhdXRvIGZh
cnRoZXN0UG9zaXRpb25JbkRpcmVjdGlvbiA9IGJhY2t3YXJkcyA/IHN0YXJ0T2ZFZGl0YWJsZUNv
bnRlbnQocG9zaXRpb24pIDogZW5kT2ZFZGl0YWJsZUNvbnRlbnQocG9zaXRpb24pOwogICAgIGlm
IChwb3NpdGlvbiA9PSBmYXJ0aGVzdFBvc2l0aW9uSW5EaXJlY3Rpb24pCiAgICAgICAgIHJldHVy
biBiYWNrd2FyZHMgPyBzdGFydE9mV29yZChwb3NpdGlvbikgOiBlbmRPZldvcmQocG9zaXRpb24p
OwotCiAgICAgVmlzaWJsZVBvc2l0aW9uIGN1cnJlbnRQb3NpdGlvbiA9IHBvc2l0aW9uOwogICAg
IFZpc2libGVQb3NpdGlvbiBuZXh0UG9zaXRpb247Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGdyYW51bGFyaXR5Q291bnQgKyAxOyArK2kpIHsKKyAgICBkbyB7CiAgICAgICAgIG5leHRQ
b3NpdGlvbiA9IHBvc2l0aW9uT2ZOZXh0Qm91bmRhcnlPZkdyYW51bGFyaXR5KGN1cnJlbnRQb3Np
dGlvbiwgZ3JhbnVsYXJpdHksIGRpcmVjdGlvbik7CiAgICAgICAgIC8vIEZJWE1FICgxOTYxMjcp
OiBXZSBzaG91bGRuJ3QgbmVlZCB0byBkbyB0aGlzLCBidXQgaGF2ZSBzZWVuIHByZXZpb3VzUGFy
YWdyYXBoUG9zaXRpb24gZ28gZm9yd2FyZHMuCiAgICAgICAgIGlmICgoYmFja3dhcmRzICYmIG5l
eHRQb3NpdGlvbiA+IGN1cnJlbnRQb3NpdGlvbikgfHwgKCFiYWNrd2FyZHMgJiYgbmV4dFBvc2l0
aW9uIDwgY3VycmVudFBvc2l0aW9uKSkKQEAgLTM4ODQsOCArMzg4NSwxOCBAQCBzdGF0aWMgVmlz
aWJsZVBvc2l0aW9uIG1vdmVCeUdyYW51bGFyaXR5UmVzcGVjdGluZ1dvcmRCb3VuZGFyeShjb25z
dCBWaXNpYmxlUG9zaQogICAgICAgICBpZiAobmV4dFBvc2l0aW9uLmlzTnVsbCgpKQogICAgICAg
ICAgICAgYnJlYWs7CiAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKKyAg
ICAgICAgaWYgKGF0Qm91bmRhcnlPZkdyYW51bGFyaXR5KGN1cnJlbnRQb3NpdGlvbiwgZ3JhbnVs
YXJpdHksIGRpcmVjdGlvbikpCisgICAgICAgICAgICAtLWdyYW51bGFyaXR5Q291bnQ7CisgICAg
fSB3aGlsZSAoZ3JhbnVsYXJpdHlDb3VudCk7CisgICAgaWYgKGdyYW51bGFyaXR5ID09IFNlbnRl
bmNlR3JhbnVsYXJpdHkpIHsKKyAgICAgICAgQVNTRVJUKGF0Qm91bmRhcnlPZkdyYW51bGFyaXR5
KGN1cnJlbnRQb3NpdGlvbiwgU2VudGVuY2VHcmFudWxhcml0eSwgZGlyZWN0aW9uKSk7CisgICAg
ICAgIHJldHVybiBjdXJyZW50UG9zaXRpb247CiAgICAgfQotCisgICAgLy8gTm90ZSB0aGF0IHRo
aXMgcm91bmRzIHRvIHRoZSBuZWFyZXN0IHdvcmQsIHdoaWNoIG1heSBjcm9zcyBhIGxpbmUgYm91
bmRhcnkgd2hlbiB1c2luZyBsaW5lIGdyYW51bGFyaXR5LgorICAgIC8vIEZvciBleGFtcGxlLCBz
dXBwb3NlIHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGFzIGZvbGxvd3MgYW5kIHRoZSBpbnNlcnRpb24g
cG9pbnQgaXMgYXQgfDoKKyAgICAvLyAgICAgfFRoaXMgaXMgdGhlIGZpcnN0IHNlbgorICAgIC8v
ICAgICAgdGVuY2UgaW4gYSBwYXJhZ3JhcGguCisgICAgLy8gVGhlbiBtb3ZpbmcgMSBsaW5lIG9m
IGdyYW51bGFyaXR5IGZvcndhcmQgd2lsbCByZXR1cm4gdGhlIHBvc3Rpb24gYWZ0ZXIgdGhlICdl
JyBpbiBzZW50ZW5jZS4KICAgICByZXR1cm4gYmFja3dhcmRzID8gc3RhcnRPZldvcmQoY3VycmVu
dFBvc2l0aW9uKSA6IGVuZE9mV29yZChjdXJyZW50UG9zaXRpb24pOwogfQogCmRpZmYgLS1naXQg
YS9Ub29scy9DaGFuZ2VMb2cgYi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggOTA2YWM2Y2UwODc5NWQ4
NzY1YzZhZWY4MTIwODc0MWY2NmQwNDYzNS4uYzU1OTRiZGZmMWFhNTk1NmVjOTczZmMyYWJiYmI2
YjE4NWM0MWM5NCAxMDA2NDQKLS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5n
ZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDE5LTEyLTE2ICBEYW5pZWwgQmF0ZXMgIDxkYWJhdGVz
QGFwcGxlLmNvbT4KKworICAgICAgICAtcmVxdWVzdERvY3VtZW50Q29udGV4dCBhbHdheXMgcmV0
dXJucyAxIHRleHQgdW5pdCBtb3JlIGdyYW51bGFyaXR5IHRoYW4gcmVxdWVzdGVkCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDUxNDIKKyAgICAgICAg
PHJkYXI6Ly9wcm9ibGVtLzU3ODU4MjM2PgorCisgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFk
bGVyIGFuZCBXZW5zb24gSHNpZWguCisKKyAgICAgICAgQWRkIHRlc3RzIGZvciByZXF1ZXN0aW5n
IHRleHQgYnkgY2hhcmFjdGVyLCBzZW50ZW5jZSwgcGFyYWdyYXBoLCBhbmQgbGluZSBncmFudWxh
cml0aWVzLgorICAgICAgICBBbHNvIG9yZ2FuaXplZCB0ZXN0cywgZGVtYXJjYXRpbmcgc2VjdGlv
bnMgb2YgcmVsYXRlZCB0ZXN0cywgYW5kIHJlbmFtaW5nIHRoZSBleGlzdGluZworICAgICAgICB3
b3JkIGdyYW51bGFyaXR5IHRlc3RzIGZvciBjb25zaXN0ZW5jeS4KKworICAgICAgICAqIFRlc3RX
ZWJLaXRBUEkvVGVzdHMvV2ViS2l0Q29jb2EvRG9jdW1lbnRFZGl0aW5nQ29udGV4dC5tbToKKyAg
ICAgICAgKFRFU1QpOgorCiAyMDE5LTEyLTE2ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJj
aWFAaWdhbGlhLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkIEdUSyBnYXJkZW5pbmcuIE1hcmsg
L3dlYmtpdC9XZWJLaXRXZWJWaWV3L3BvaW50ZXItbG9jay1wZXJtaXNzaW9uLXJlcXVlc3QgYXMg
dGltZW91dApkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2Nv
YS9Eb2N1bWVudEVkaXRpbmdDb250ZXh0Lm1tIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9X
ZWJLaXRDb2NvYS9Eb2N1bWVudEVkaXRpbmdDb250ZXh0Lm1tCmluZGV4IDZkMGI2YzFiODQ2M2Nj
NzZlZjczM2Q2YTg2ZjFjNWRlMDEzYTY5YzYuLjZiZjg2NWNhYWYxZDljZGI3NjVlYmViNDlmZGNh
NTg4OGVhNGYzYzQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0
Q29jb2EvRG9jdW1lbnRFZGl0aW5nQ29udGV4dC5tbQorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJ
L1Rlc3RzL1dlYktpdENvY29hL0RvY3VtZW50RWRpdGluZ0NvbnRleHQubW0KQEAgLTE0Niw3ICsx
NDYsNyBAQCBjb25zdGV4cHIgdW5zaWduZWQgZ2x5cGhXaWR0aCB7IDI1IH07IC8vIHBpeGVscwog
CiBzdGF0aWMgTlNTdHJpbmcgKmFwcGx5QWhlbVN0eWxlKE5TU3RyaW5nICpodG1sU3RyaW5nKQog
ewotICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjxzdHlsZT5AZm9udC1m
YWNlIHsgZm9udC1mYW1pbHk6IEFoZW07IHNyYzogdXJsKEFoZW0udHRmKTsgfSBib2R5IHsgbWFy
Z2luOiAwOyBmb250OiAldXB4LzEgQWhlbTsgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAl
JTsgfTwvc3R5bGU+PG1ldGEgbmFtZT0ndmlld3BvcnQnIGNvbnRlbnQ9J3dpZHRoPTk4MCwgaW5p
dGlhbC1zY2FsZT0xLjAnPiVAIiwgZ2x5cGhXaWR0aCwgaHRtbFN0cmluZ107CisgICAgcmV0dXJu
IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPHN0eWxlPkBmb250LWZhY2UgeyBmb250LWZh
bWlseTogQWhlbTsgc3JjOiB1cmwoQWhlbS50dGYpOyB9IGJvZHkgeyBtYXJnaW46IDA7IH0gKiB7
IGZvbnQ6ICV1cHgvMSBBaGVtOyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCUlOyB9PC9z
dHlsZT48bWV0YSBuYW1lPSd2aWV3cG9ydCcgY29udGVudD0nd2lkdGg9OTgwLCBpbml0aWFsLXNj
YWxlPTEuMCc+JUAiLCBnbHlwaFdpZHRoLCBodG1sU3RyaW5nXTsKIH0KIAogVEVTVChXZWJLaXQs
IERvY3VtZW50RWRpdGluZ0NvbnRleHQpCkBAIC0yMDAsNyArMjAwLDcgQEAgVEVTVChXZWJLaXQs
IERvY3VtZW50RWRpdGluZ0NvbnRleHQpCiAgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0
QWZ0ZXIpOwogCiAgICAgLy8gU3BhdGlhbCByZXF1ZXN0cy4KLSAgICBjb250ZXh0ID0gW3dlYlZp
ZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0Rv
Y3VtZW50UmVxdWVzdFRleHQgfCBVSVdLRG9jdW1lbnRSZXF1ZXN0U3BhdGlhbCwgVUlUZXh0R3Jh
bnVsYXJpdHlXb3JkLCAxLCBDR1JlY3RNYWtlKDAsIDAsIDEwLCAxMCkpXTsKKyAgICBjb250ZXh0
ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVl
c3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQgfCBVSVdLRG9jdW1lbnRSZXF1ZXN0U3BhdGlhbCwg
VUlUZXh0R3JhbnVsYXJpdHlXb3JkLCAyLCBDR1JlY3RNYWtlKDAsIDAsIDEwLCAxMCkpXTsKICAg
ICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CiAgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250
ZXh0QmVmb3JlKTsKICAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4dCk7CkBAIC0z
OTUsMTMgKzM5NSwxNiBAQCBURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dFNwYXRp
YWxSZXF1ZXN0SW5UZXh0RmllbGQpCiAgICAgfQogfQogCi1URVNUKFdlYktpdCwgRG9jdW1lbnRF
ZGl0aW5nQ29udGV4dENhcmV0QXRTdGFydE9mVGV4dCkKKy8vIE1BUks6IFRlc3RzIHVzaW5nIHdv
cmQgZ3JhbnVsYXJpdHkKKworVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1
ZXN0Rmlyc3RUd29Xb3JkcykKIHsKICAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdL
V2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0p
OworICAgIC8vIEZJWE1FOiBVc2UgYXBwbHlBaGVtU3R5bGUoKSB0byBlbnN1cmUgY29uc2lzdGVu
dCB0ZXh0IG1ldHJpY3MuCiAgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5n
OmFwcGx5U3R5bGUoQCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBxdWljayBicm93
biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuPC9wPiIpXTsKICAgICBbd2ViVmlldyBzdHJp
bmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVu
dCh0ZXh0LmZpcnN0Q2hpbGQsIDAsIHRleHQuZmlyc3RDaGlsZCwgMCkiXTsgLy8gV2lsbCBmb2N1
cyA8cD4uCiAKLSAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVl
c3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQgfCBV
SVdLRG9jdW1lbnRSZXF1ZXN0UmVjdHMsIFVJVGV4dEdyYW51bGFyaXR5V29yZCwgMSldOworICAg
IGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29u
dGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCB8IFVJV0tEb2N1bWVudFJl
cXVlc3RSZWN0cywgVUlUZXh0R3JhbnVsYXJpdHlXb3JkLCAyKV07CiAgICAgRVhQRUNUX05PVF9O
VUxMKGNvbnRleHQpOwogICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuY29udGV4dEJlZm9yZSk7CiAg
ICAgRVhQRUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOwpAQCAtNDIwLDkgKzQyMywxMCBA
QCBURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dENhcmV0QXRTdGFydE9mVGV4dCkK
ICAgICBFWFBFQ1RfRVEoQ0dSZWN0TWFrZSg1NiwgMCwgOSwgMTkpLCB0ZXh0UmVjdHNbOF0uQ0dS
ZWN0VmFsdWUpOyAvLyBrCiB9CiAKLVRFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0
Q2FyZXRBdFN0YXJ0T2ZUZXh0V2l0aExlYWRpbmdOb25CcmVha2FibGVTcGFjZSkKK1RFU1QoV2Vi
S2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0VHdvV29yZFdpdGhMZWFkaW5n
Tm9uQnJlYWthYmxlU3BhY2UpCiB7CiAgICAgYXV0byB3ZWJWaWV3ID0gYWRvcHROUyhbW1Rlc3RX
S1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCA4MDAsIDYwMCld
KTsKKyAgICAvLyBGSVhNRTogVXNlIGFwcGx5QWhlbVN0eWxlKCkgdG8gZW5zdXJlIGNvbnNpc3Rl
bnQgdGV4dCBtZXRyaWNzLgogICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmlu
ZzphcHBseVN0eWxlKEAiPHAgaWQ9J3RleHQnIGNvbnRlbnRlZGl0YWJsZT4mbmJzcDtUaGUgcXVp
Y2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLjwvcD4iKV07CiAgICAgW3dlYlZp
ZXcgc3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VB
bmRFeHRlbnQodGV4dC5maXJzdENoaWxkLCAwLCB0ZXh0LmZpcnN0Q2hpbGQsIDApIl07IC8vIFdp
bGwgZm9jdXMgPHA+LgogCkBAIC00NDAsMTAgKzQ0NCwxMCBAQCBURVNUKFdlYktpdCwgRG9jdW1l
bnRFZGl0aW5nQ29udGV4dENhcmV0QXRTdGFydE9mVGV4dFdpdGhMZWFkaW5nTm9uQnJlYWthYmxl
U3BhYwogICAgIEVYUEVDVF9FUShDR1JlY3RNYWtlKDIxLCAwLCA4LCAxOSksIHRleHRSZWN0c1sz
XS5DR1JlY3RWYWx1ZSk7IC8vIGUKIH0KIAotCi1URVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5n
Q29udGV4dENhcmV0QXRFbmRPZlRleHQpCitURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29u
dGV4dFJlcXVlc3RMYXN0V29yZCkKIHsKICAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVz
dFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAw
KV0pOworICAgIC8vIEZJWE1FOiBVc2UgYXBwbHlBaGVtU3R5bGUoKSB0byBlbnN1cmUgY29uc2lz
dGVudCB0ZXh0IG1ldHJpY3MuCiAgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3Ry
aW5nOmFwcGx5U3R5bGUoQCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBxdWljayBi
cm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuPC9wPiIpXTsKICAgICBbd2ViVmlldyBz
dHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4
dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5ndGgsIHRleHQuZmlyc3RD
aGlsZCwgdGV4dC5maXJzdENoaWxkLmxlbmd0aCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4uCiAKQEAg
LTQ2MSw5ICs0NjUsMTAgQEAgVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRDYXJl
dEF0RW5kT2ZUZXh0KQogICAgIEVYUEVDVF9FUShDR1JlY3RNYWtlKDI5MiwgMCwgNSwgMTkpLCB0
ZXh0UmVjdHNbM10uQ0dSZWN0VmFsdWUpOyAvLyAuCiB9CiAKLVRFU1QoV2ViS2l0LCBEb2N1bWVu
dEVkaXRpbmdDb250ZXh0Q2FyZXRBdEVuZE9mVGV4dFdpdGhUcmFpbGluZ05vbkJyZWFrYWJsZVNw
YWNlKQorVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0TGFzdFdvcmRX
aXRoVHJhaWxpbmdOb25CcmVha2FibGVTcGFjZSkKIHsKICAgICBhdXRvIHdlYlZpZXcgPSBhZG9w
dE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAs
IDgwMCwgNjAwKV0pOworICAgIC8vIEZJWE1FOiBVc2UgYXBwbHlBaGVtU3R5bGUoKSB0byBlbnN1
cmUgY29uc2lzdGVudCB0ZXh0IG1ldHJpY3MuCiAgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxv
YWRIVE1MU3RyaW5nOmFwcGx5U3R5bGUoQCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRo
ZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuJm5ic3A7PC9wPiIpXTsK
ICAgICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9u
KCkuc2V0QmFzZUFuZEV4dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5n
dGgsIHRleHQuZmlyc3RDaGlsZCwgdGV4dC5maXJzdENoaWxkLmxlbmd0aCkiXTsgLy8gV2lsbCBm
b2N1cyA8cD4uCiAKQEAgLTQ4Miw0ICs0ODcsMjM4IEBAIFRFU1QoV2ViS2l0LCBEb2N1bWVudEVk
aXRpbmdDb250ZXh0Q2FyZXRBdEVuZE9mVGV4dFdpdGhUcmFpbGluZ05vbkJyZWFrYWJsZVNwYWNl
CiAgICAgRVhQRUNUX0VRKENHUmVjdE1ha2UoMjk2LCAwLCA1LCAxOSksIHRleHRSZWN0c1s0XS5D
R1JlY3RWYWx1ZSk7IC8vCiB9CiAKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0
UmVxdWVzdFR3b1dvcmRzQXJvdW5kU2VsZWN0aW9uKQoreworICAgIGF1dG8gd2ViVmlldyA9IGFk
b3B0TlMoW1tUZXN0V0tXZWJWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOk5TTWFrZVJlY3QoMCwg
MCwgODAwLCA2MDApXSk7CisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5n
OmFwcGx5U3R5bGUoQCI8c3BhbiBpZD0ndGhlJz5UaGU8L3NwYW4+IHF1aWNrIGJyb3duIGZveCA8
c3BhbiBpZD0nanVtcHMnPmp1bXBzPC9zcGFuPiBvdmVyIHRoZSBsYXp5IDxzcGFuIGlkPSdkb2cn
PmRvZy48L3NwYW4+IildOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3Jp
cHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KGp1bXBzLCAwLCBqdW1wcywgMSki
XTsKKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERv
Y3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0
R3JhbnVsYXJpdHlXb3JkLCAyKV07CisgICAgRVhQRUNUX05PVF9OVUxMKGNvbnRleHQpOworICAg
IEVYUEVDVF9OU1NUUklOR19FUSgiYnJvd24gZm94ICIsIGNvbnRleHQuY29udGV4dEJlZm9yZSk7
CisgICAgRVhQRUNUX05TU1RSSU5HX0VRKCJqdW1wcyIsIGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsK
KyAgICBFWFBFQ1RfTlNTVFJJTkdfRVEoIiBvdmVyIHRoZSIsIGNvbnRleHQuY29udGV4dEFmdGVy
KTsKK30KKworVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0VGhyZWVX
b3Jkc0Fyb3VuZFNlbGVjdGlvbikKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVz
dFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAw
KV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseVN0eWxl
KEAiPHNwYW4gaWQ9J3RoZSc+VGhlPC9zcGFuPiBxdWljayBicm93biBmb3ggPHNwYW4gaWQ9J2p1
bXBzJz5qdW1wczwvc3Bhbj4gb3ZlciB0aGUgbGF6eSA8c3BhbiBpZD0nZG9nJz5kb2cuPC9zcGFu
PiIpXTsKKyAgICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2Vs
ZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudChqdW1wcywgMCwganVtcHMsIDEpIl07CisKKyAgICBh
dXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRl
eHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQsIFVJVGV4dEdyYW51bGFyaXR5
V29yZCwgMyldOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBFWFBFQ1RfTlNT
VFJJTkdfRVEoInF1aWNrIGJyb3duIGZveCAiLCBjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAg
IEVYUEVDVF9OU1NUUklOR19FUSgianVtcHMiLCBjb250ZXh0LnNlbGVjdGVkVGV4dCk7CisgICAg
RVhQRUNUX05TU1RSSU5HX0VRKCIgb3ZlciB0aGUgbGF6eSIsIGNvbnRleHQuY29udGV4dEFmdGVy
KTsKK30KKworLy8gTUFSSzogVGVzdHMgdXNpbmcgc2VudGVuY2UgZ3JhbnVsYXJpdHkKKworY29u
c3RleHByIE5TU3RyaW5nICogY29uc3QgdGhyZWVTZW50ZW5jZXNFeGFtcGxlID0gQCI8cCBpZD0n
dGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBmaXJzdCBzZW50ZW5jZS4gVGhlIHNlY29uZCBzZW50
ZW5jZS4gVGhlIHRoaXJkIHNlbnRlbmNlLjwvcD4iOworCitURVNUKFdlYktpdCwgRG9jdW1lbnRF
ZGl0aW5nQ29udGV4dFJlcXVlc3RGaXJzdFR3b1NlbnRlbmNlcykKK3sKKyAgICBhdXRvIHdlYlZp
ZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VS
ZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRN
TFN0cmluZzphcHBseVN0eWxlKHRocmVlU2VudGVuY2VzRXhhbXBsZSldOworICAgIFt3ZWJWaWV3
IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5k
RXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgMCwgdGV4dC5maXJzdENoaWxkLCAwKSJdOyAvLyBXaWxs
IGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5
UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4
dCwgVUlUZXh0R3JhbnVsYXJpdHlTZW50ZW5jZSwgMildOworICAgIEVYUEVDVF9OT1RfTlVMTChj
b250ZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAgIEVY
UEVDVF9OVUxMKGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlNTVFJJTkdfRVEo
IlRoZSBmaXJzdCBzZW50ZW5jZS4gVGhlIHNlY29uZCBzZW50ZW5jZS4gIiwgY29udGV4dC5jb250
ZXh0QWZ0ZXIpOworfQorCitURVNUKFdlYktpdCwgRG9jdW1lbnRFZGl0aW5nQ29udGV4dFJlcXVl
c3RGaXJzdFR3b1NlbnRlbmNlc05vU3BhY2VzKQoreworICAgIGF1dG8gd2ViVmlldyA9IGFkb3B0
TlMoW1tUZXN0V0tXZWJWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOk5TTWFrZVJlY3QoMCwgMCwg
ODAwLCA2MDApXSk7CisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOmFw
cGx5U3R5bGUoQCI8cCBpZD0ndGV4dCcgY29udGVudGVkaXRhYmxlPlRoZSBmaXJzdCBzZW50ZW5j
ZS5UaGUgc2Vjb25kIHNlbnRlbmNlLlRoZSB0aGlyZCBzZW50ZW5jZS48L3A+IildOworICAgIFt3
ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRC
YXNlQW5kRXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgMCwgdGV4dC5maXJzdENoaWxkLCAwKSJdOyAv
LyBXaWxsIGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJv
bm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1
ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJpdHlTZW50ZW5jZSwgMildOworICAgIEVYUEVDVF9OT1Rf
TlVMTChjb250ZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LmNvbnRleHRCZWZvcmUpOwor
ICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlNTVFJJ
TkdfRVEoIlRoZSBmaXJzdCBzZW50ZW5jZS5UaGUgc2Vjb25kIHNlbnRlbmNlLlRoZSB0aGlyZCBz
ZW50ZW5jZS4iLCBjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1
bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdExhc3RTZW50ZW5jZSkKK3sKKyAgICBhdXRvIHdlYlZp
ZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VS
ZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRN
TFN0cmluZzphcHBseVN0eWxlKHRocmVlU2VudGVuY2VzRXhhbXBsZSldOworICAgIFt3ZWJWaWV3
IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5k
RXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgdGV4dC5maXJzdENoaWxkLmxlbmd0aCwgdGV4dC5maXJz
dENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoKSJdOyAvLyBXaWxsIGZvY3VzIDxwPi4KKwor
ICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50
Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0R3JhbnVs
YXJpdHlTZW50ZW5jZSwgMSldOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBF
WFBFQ1RfTlNTVFJJTkdfRVEoIlRoZSB0aGlyZCBzZW50ZW5jZS4iLCBjb250ZXh0LmNvbnRleHRC
ZWZvcmUpOworICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBF
Q1RfTlVMTChjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVu
dEVkaXRpbmdDb250ZXh0UmVxdWVzdExhc3RUd29TZW50ZW5jZXMpCit7CisgICAgYXV0byB3ZWJW
aWV3ID0gYWRvcHROUyhbW1Rlc3RXS1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtl
UmVjdCgwLCAwLCA4MDAsIDYwMCldKTsKKyAgICBbd2ViVmlldyBzeW5jaHJvbm91c2x5TG9hZEhU
TUxTdHJpbmc6YXBwbHlTdHlsZSh0aHJlZVNlbnRlbmNlc0V4YW1wbGUpXTsKKyAgICBbd2ViVmll
dyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFu
ZEV4dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5ndGgsIHRleHQuZmly
c3RDaGlsZCwgdGV4dC5maXJzdENoaWxkLmxlbmd0aCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4uCisK
KyAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVu
dENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQsIFVJVGV4dEdyYW51
bGFyaXR5U2VudGVuY2UsIDIpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAg
RVhQRUNUX05TU1RSSU5HX0VRKCJUaGUgc2Vjb25kIHNlbnRlbmNlLiBUaGUgdGhpcmQgc2VudGVu
Y2UuIiwgY29udGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNl
bGVjdGVkVGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQor
CisvLyBNQVJLOiBUZXN0cyB1c2luZyBwYXJhZ3JhcGggZ3JhbnVsYXJpdHkKKworY29uc3RleHBy
IE5TU3RyaW5nICogY29uc3QgdGhyZWVQYXJhZ3JhcGhzRXhhbXBsZSA9IEAiPHByZSBpZD0ndGV4
dCcgc3R5bGU9J3dpZHRoOiAzMmVtJyBjb250ZW50ZWRpdGFibGU+VGhlIGZpcnN0IHNlbnRlbmNl
IGluIHRoZSBmaXJzdCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIGZpcnN0
IHBhcmFncmFwaC4gVGhlIHRoaXJkIHNlbnRlbmNlIGluIHRoZSBmaXJzdCBwYXJhZ3JhcGguXG5U
aGUgZmlyc3Qgc2VudGVuY2UgaW4gdGhlIHNlY29uZCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2Vu
dGVuY2UgaW4gdGhlIHNlY29uZCBwYXJhZ3JhcGguIFRoZSB0aGlyZCBzZW50ZW5jZSBpbiB0aGUg
c2Vjb25kIHBhcmFncmFwaC5cblRoZSBmaXJzdCBzZW50ZW5jZSBpbiB0aGUgdGhpcmQgcGFyYWdy
YXBoLiBUaGUgc2Vjb25kIHNlbnRlbmNlIGluIHRoZSB0aGlyZCBwYXJhZ3JhcGguIFRoZSB0aGly
ZCBzZW50ZW5jZSBpbiB0aGUgdGhpcmQgcGFyYWdyYXBoLjwvcHJlPiI7CisKK1RFU1QoV2ViS2l0
LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0UGFyYWdyYXBoKQoreworICAgIGF1
dG8gd2ViVmlldyA9IGFkb3B0TlMoW1tUZXN0V0tXZWJWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1l
Ok5TTWFrZVJlY3QoMCwgMCwgODAwLCA2MDApXSk7CisgICAgW3dlYlZpZXcgc3luY2hyb25vdXNs
eUxvYWRIVE1MU3RyaW5nOmFwcGx5U3R5bGUodGhyZWVQYXJhZ3JhcGhzRXhhbXBsZSldOworICAg
IFt3ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6QCJnZXRTZWxlY3Rpb24oKS5z
ZXRCYXNlQW5kRXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgMCwgdGV4dC5maXJzdENoaWxkLCAwKSJd
OyAvLyBXaWxsIGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmlldyBzeW5j
aHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9jdW1lbnRS
ZXF1ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJpdHlQYXJhZ3JhcGgsIDEpXTsKKyAgICBFWFBFQ1Rf
Tk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QmVmb3Jl
KTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4dCk7CisgICAgRVhQRUNUX05T
U1RSSU5HX0VRKCJUaGUgZmlyc3Qgc2VudGVuY2UgaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4gVGhl
IHNlY29uZCBzZW50ZW5jZSBpbiB0aGUgZmlyc3QgcGFyYWdyYXBoLiBUaGUgdGhpcmQgc2VudGVu
Y2UgaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4iLCBjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisK
K1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0VHdvUGFyYWdy
YXBocykKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxv
Y10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJW
aWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseVN0eWxlKHRocmVlUGFyYWdyYXBo
c0V4YW1wbGUpXTsKKyAgICBbd2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAi
Z2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIDAsIHRleHQu
Zmlyc3RDaGlsZCwgMCkiXTsgLy8gV2lsbCBmb2N1cyA8cD4uCisKKyAgICBhdXRvICpjb250ZXh0
ID0gW3dlYlZpZXcgc3luY2hyb25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVl
c3QoVUlXS0RvY3VtZW50UmVxdWVzdFRleHQsIFVJVGV4dEdyYW51bGFyaXR5UGFyYWdyYXBoLCAy
KV07CisgICAgRVhQRUNUX05PVF9OVUxMKGNvbnRleHQpOworICAgIEVYUEVDVF9OVUxMKGNvbnRl
eHQuY29udGV4dEJlZm9yZSk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQp
OworICAgIEVYUEVDVF9OU1NUUklOR19FUSgiVGhlIGZpcnN0IHNlbnRlbmNlIGluIHRoZSBmaXJz
dCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4g
VGhlIHRoaXJkIHNlbnRlbmNlIGluIHRoZSBmaXJzdCBwYXJhZ3JhcGguXG5UaGUgZmlyc3Qgc2Vu
dGVuY2UgaW4gdGhlIHNlY29uZCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhl
IHNlY29uZCBwYXJhZ3JhcGguIFRoZSB0aGlyZCBzZW50ZW5jZSBpbiB0aGUgc2Vjb25kIHBhcmFn
cmFwaC4iLCBjb250ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVu
dEVkaXRpbmdDb250ZXh0UmVxdWVzdExhc3RQYXJhZ3JhcGgpCit7CisgICAgYXV0byB3ZWJWaWV3
ID0gYWRvcHROUyhbW1Rlc3RXS1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVj
dCgwLCAwLCA4MDAsIDYwMCldKTsKKyAgICBbd2ViVmlldyBzeW5jaHJvbm91c2x5TG9hZEhUTUxT
dHJpbmc6YXBwbHlTdHlsZSh0aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcg
c3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRF
eHRlbnQodGV4dC5maXJzdENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoLCB0ZXh0LmZpcnN0
Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5ndGgpIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisg
ICAgYXV0byAqY29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRD
b250ZXh0Om1ha2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxh
cml0eVBhcmFncmFwaCwgMSldOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBF
WFBFQ1RfTlNTVFJJTkdfRVEoIlRoZSBmaXJzdCBzZW50ZW5jZSBpbiB0aGUgdGhpcmQgcGFyYWdy
YXBoLiBUaGUgc2Vjb25kIHNlbnRlbmNlIGluIHRoZSB0aGlyZCBwYXJhZ3JhcGguIFRoZSB0aGly
ZCBzZW50ZW5jZSBpbiB0aGUgdGhpcmQgcGFyYWdyYXBoLiIsIGNvbnRleHQuY29udGV4dEJlZm9y
ZSk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOworICAgIEVYUEVDVF9O
VUxMKGNvbnRleHQuY29udGV4dEFmdGVyKTsKK30KKworVEVTVChXZWJLaXQsIERvY3VtZW50RWRp
dGluZ0NvbnRleHRSZXF1ZXN0TGFzdFR3b1BhcmFncmFwaHMpCit7CisgICAgYXV0byB3ZWJWaWV3
ID0gYWRvcHROUyhbW1Rlc3RXS1dlYlZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVj
dCgwLCAwLCA4MDAsIDYwMCldKTsKKyAgICBbd2ViVmlldyBzeW5jaHJvbm91c2x5TG9hZEhUTUxT
dHJpbmc6YXBwbHlTdHlsZSh0aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcg
c3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRF
eHRlbnQodGV4dC5maXJzdENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoLCB0ZXh0LmZpcnN0
Q2hpbGQsIHRleHQuZmlyc3RDaGlsZC5sZW5ndGgpIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisg
ICAgYXV0byAqY29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRD
b250ZXh0Om1ha2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxh
cml0eVBhcmFncmFwaCwgMildOworICAgIEVYUEVDVF9OT1RfTlVMTChjb250ZXh0KTsKKyAgICBF
WFBFQ1RfTlNTVFJJTkdfRVEoIlRoZSBmaXJzdCBzZW50ZW5jZSBpbiB0aGUgc2Vjb25kIHBhcmFn
cmFwaC4gVGhlIHNlY29uZCBzZW50ZW5jZSBpbiB0aGUgc2Vjb25kIHBhcmFncmFwaC4gVGhlIHRo
aXJkIHNlbnRlbmNlIGluIHRoZSBzZWNvbmQgcGFyYWdyYXBoLlxuVGhlIGZpcnN0IHNlbnRlbmNl
IGluIHRoZSB0aGlyZCBwYXJhZ3JhcGguIFRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIHRoaXJk
IHBhcmFncmFwaC4gVGhlIHRoaXJkIHNlbnRlbmNlIGluIHRoZSB0aGlyZCBwYXJhZ3JhcGguIiwg
Y29udGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVk
VGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQorCisvLyBN
QVJLOiBUZXN0cyB1c2luZyBjaGFyYWN0ZXIgZ3JhbnVsYXJpdHkKKy8vIE5vdGUgdGhhdCB3ZSBh
bHdheXMgcmV0dXJuIHJlc3VsdHMgd2l0aCByZXNwZWN0IHRvIHRoZSBuZWFyZXN0IHdvcmQgYm91
bmRhcnkgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgc2VsZWN0aW9uLgorCitURVNUKFdlYktpdCwg
RG9jdW1lbnRFZGl0aW5nQ29udGV4dFJlcXVlc3RGaXJzdENoYXJhY3RlcikKK3sKKyAgICBhdXRv
IHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpO
U01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlM
b2FkSFRNTFN0cmluZzphcHBseVN0eWxlKHRocmVlUGFyYWdyYXBoc0V4YW1wbGUpXTsKKyAgICBb
d2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0
QmFzZUFuZEV4dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIDAsIHRleHQuZmlyc3RDaGlsZCwgMCkiXTsg
Ly8gV2lsbCBmb2N1cyA8cD4uCisKKyAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hy
b25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVx
dWVzdFRleHQsIFVJVGV4dEdyYW51bGFyaXR5Q2hhcmFjdGVyLCAxKV07CisgICAgRVhQRUNUX05P
VF9OVUxMKGNvbnRleHQpOworICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuY29udGV4dEJlZm9yZSk7
CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOworICAgIEVYUEVDVF9OU1NU
UklOR19FUSgiVGhlIiwgY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQorCitURVNUKFdlYktpdCwg
RG9jdW1lbnRFZGl0aW5nQ29udGV4dFJlcXVlc3RGaXJzdFdvcmRVc2luZ0NoYXJhY3RlckdyYW51
bGFyaXR5KQoreworICAgIGF1dG8gd2ViVmlldyA9IGFkb3B0TlMoW1tUZXN0V0tXZWJWaWV3IGFs
bG9jXSBpbml0V2l0aEZyYW1lOk5TTWFrZVJlY3QoMCwgMCwgODAwLCA2MDApXSk7CisgICAgW3dl
YlZpZXcgc3luY2hyb25vdXNseUxvYWRIVE1MU3RyaW5nOmFwcGx5U3R5bGUodGhyZWVQYXJhZ3Jh
cGhzRXhhbXBsZSldOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3JpcHQ6
QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgMCwgdGV4
dC5maXJzdENoaWxkLCAwKSJdOyAvLyBXaWxsIGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRl
eHQgPSBbd2ViVmlldyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVx
dWVzdChVSVdLRG9jdW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJpdHlDaGFyYWN0ZXIs
IDMpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29u
dGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4
dCk7CisgICAgRVhQRUNUX05TU1RSSU5HX0VRKCJUaGUiLCBjb250ZXh0LmNvbnRleHRBZnRlcik7
Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0V29y
ZFBsdXNUcmFpbGluZ1NwYWNlVXNpbmdDaGFyYWN0ZXJHcmFudWxhcml0eSkKK3sKKyAgICBhdXRv
IHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpO
U01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlM
b2FkSFRNTFN0cmluZzphcHBseVN0eWxlKHRocmVlUGFyYWdyYXBoc0V4YW1wbGUpXTsKKyAgICBb
d2ViVmlldyBzdHJpbmdCeUV2YWx1YXRpbmdKYXZhU2NyaXB0OkAiZ2V0U2VsZWN0aW9uKCkuc2V0
QmFzZUFuZEV4dGVudCh0ZXh0LmZpcnN0Q2hpbGQsIDAsIHRleHQuZmlyc3RDaGlsZCwgMCkiXTsg
Ly8gV2lsbCBmb2N1cyA8cD4uCisKKyAgICBhdXRvICpjb250ZXh0ID0gW3dlYlZpZXcgc3luY2hy
b25vdXNseVJlcXVlc3REb2N1bWVudENvbnRleHQ6bWFrZVJlcXVlc3QoVUlXS0RvY3VtZW50UmVx
dWVzdFRleHQsIFVJVGV4dEdyYW51bGFyaXR5Q2hhcmFjdGVyLCA0KV07CisgICAgRVhQRUNUX05P
VF9OVUxMKGNvbnRleHQpOworICAgIEVYUEVDVF9OVUxMKGNvbnRleHQuY29udGV4dEJlZm9yZSk7
CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5zZWxlY3RlZFRleHQpOworICAgIEVYUEVDVF9OU1NU
UklOR19FUSgiVGhlIGZpcnN0IiwgY29udGV4dC5jb250ZXh0QWZ0ZXIpOworfQorCisvLyBNQVJL
OiBUZXN0cyB1c2luZyBsaW5lIGdyYW51bGFyaXR5CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVk
aXRpbmdDb250ZXh0UmVxdWVzdEZpcnN0TGluZSkKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9w
dE5TKFtbVGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAs
IDgwMCwgNjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzph
cHBseUFoZW1TdHlsZSh0aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3Ry
aW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRl
bnQodGV4dC5maXJzdENoaWxkLCAwLCB0ZXh0LmZpcnN0Q2hpbGQsIDApIl07IC8vIFdpbGwgZm9j
dXMgPHA+LgorCisgICAgYXV0byAqY29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1
ZXN0RG9jdW1lbnRDb250ZXh0Om1ha2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBV
SVRleHRHcmFudWxhcml0eUxpbmUsIDEpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7
CisgICAgRVhQRUNUX05VTEwoY29udGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVM
TChjb250ZXh0LnNlbGVjdGVkVGV4dCk7CisgICAgRVhQRUNUX05TU1RSSU5HX0VRKCJUaGUgZmly
c3Qgc2VudGVuY2UgaW4gdGhlIGZpcnN0IHBhcmFncmFwaCIsIGNvbnRleHQuY29udGV4dEFmdGVy
KTsKK30KKworVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0Rmlyc3RU
d29MaW5lcykKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtbVGVzdFdLV2ViVmlldyBh
bGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwgNjAwKV0pOworICAgIFt3
ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseUFoZW1TdHlsZSh0aHJlZVBh
cmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNj
cmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQodGV4dC5maXJzdENoaWxkLCAw
LCB0ZXh0LmZpcnN0Q2hpbGQsIDApIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisgICAgYXV0byAq
Y29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRDb250ZXh0Om1h
a2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxhcml0eUxpbmUs
IDIpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05VTEwoY29u
dGV4dC5jb250ZXh0QmVmb3JlKTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LnNlbGVjdGVkVGV4
dCk7CisgICAgRVhQRUNUX05TU1RSSU5HX0VRKCJUaGUgZmlyc3Qgc2VudGVuY2UgaW4gdGhlIGZp
cnN0IHBhcmFncmFwaC4gVGhlIHNlY29uZCBzZW50ZW5jZSBpbiIsIGNvbnRleHQuY29udGV4dEFm
dGVyKTsKK30KKworVEVTVChXZWJLaXQsIERvY3VtZW50RWRpdGluZ0NvbnRleHRSZXF1ZXN0TGFz
dExpbmUpCit7CisgICAgYXV0byB3ZWJWaWV3ID0gYWRvcHROUyhbW1Rlc3RXS1dlYlZpZXcgYWxs
b2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLCAwLCA4MDAsIDYwMCldKTsKKyAgICBbd2Vi
VmlldyBzeW5jaHJvbm91c2x5TG9hZEhUTUxTdHJpbmc6YXBwbHlBaGVtU3R5bGUodGhyZWVQYXJh
Z3JhcGhzRXhhbXBsZSldOworICAgIFt3ZWJWaWV3IHN0cmluZ0J5RXZhbHVhdGluZ0phdmFTY3Jp
cHQ6QCJnZXRTZWxlY3Rpb24oKS5zZXRCYXNlQW5kRXh0ZW50KHRleHQuZmlyc3RDaGlsZCwgdGV4
dC5maXJzdENoaWxkLmxlbmd0aCwgdGV4dC5maXJzdENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVu
Z3RoKSJdOyAvLyBXaWxsIGZvY3VzIDxwPi4KKworICAgIGF1dG8gKmNvbnRleHQgPSBbd2ViVmll
dyBzeW5jaHJvbm91c2x5UmVxdWVzdERvY3VtZW50Q29udGV4dDptYWtlUmVxdWVzdChVSVdLRG9j
dW1lbnRSZXF1ZXN0VGV4dCwgVUlUZXh0R3JhbnVsYXJpdHlMaW5lLCAxKV07CisgICAgRVhQRUNU
X05PVF9OVUxMKGNvbnRleHQpOworICAgIEVYUEVDVF9OU1NUUklOR19FUSgidGhpcmQgc2VudGVu
Y2UgaW4gdGhlIHRoaXJkIHBhcmFncmFwaC4iLCBjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAg
IEVYUEVDVF9OVUxMKGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChjb250
ZXh0LmNvbnRleHRBZnRlcik7Cit9CisKK1RFU1QoV2ViS2l0LCBEb2N1bWVudEVkaXRpbmdDb250
ZXh0UmVxdWVzdExhc3RUd29MaW5lcykKK3sKKyAgICBhdXRvIHdlYlZpZXcgPSBhZG9wdE5TKFtb
VGVzdFdLV2ViVmlldyBhbGxvY10gaW5pdFdpdGhGcmFtZTpOU01ha2VSZWN0KDAsIDAsIDgwMCwg
NjAwKV0pOworICAgIFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlMb2FkSFRNTFN0cmluZzphcHBseUFo
ZW1TdHlsZSh0aHJlZVBhcmFncmFwaHNFeGFtcGxlKV07CisgICAgW3dlYlZpZXcgc3RyaW5nQnlF
dmFsdWF0aW5nSmF2YVNjcmlwdDpAImdldFNlbGVjdGlvbigpLnNldEJhc2VBbmRFeHRlbnQodGV4
dC5maXJzdENoaWxkLCB0ZXh0LmZpcnN0Q2hpbGQubGVuZ3RoLCB0ZXh0LmZpcnN0Q2hpbGQsIHRl
eHQuZmlyc3RDaGlsZC5sZW5ndGgpIl07IC8vIFdpbGwgZm9jdXMgPHA+LgorCisgICAgYXV0byAq
Y29udGV4dCA9IFt3ZWJWaWV3IHN5bmNocm9ub3VzbHlSZXF1ZXN0RG9jdW1lbnRDb250ZXh0Om1h
a2VSZXF1ZXN0KFVJV0tEb2N1bWVudFJlcXVlc3RUZXh0LCBVSVRleHRHcmFudWxhcml0eUxpbmUs
IDIpXTsKKyAgICBFWFBFQ1RfTk9UX05VTEwoY29udGV4dCk7CisgICAgRVhQRUNUX05TU1RSSU5H
X0VRKCJpbiB0aGUgdGhpcmQgcGFyYWdyYXBoLiBUaGUgdGhpcmQgc2VudGVuY2UgaW4gdGhlIHRo
aXJkIHBhcmFncmFwaC4iLCBjb250ZXh0LmNvbnRleHRCZWZvcmUpOworICAgIEVYUEVDVF9OVUxM
KGNvbnRleHQuc2VsZWN0ZWRUZXh0KTsKKyAgICBFWFBFQ1RfTlVMTChjb250ZXh0LmNvbnRleHRB
ZnRlcik7Cit9CisKICNlbmRpZiAvLyBQTEFURk9STShJT1NfRkFNSUxZKSAmJiBIQVZFKFVJX1dL
X0RPQ1VNRU5UX0NPTlRFWFQpCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>