<?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>183558</bug_id>
          
          <creation_ts>2018-03-11 20:03:07 -0700</creation_ts>
          <short_desc>[Web Animations] Create, update and remove CSSAnimation and CSSTransition objects on the DocumentTimeline</short_desc>
          <delta_ts>2018-03-12 06:02:49 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Animations</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>183504</dup_id>
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=183504</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antoine Quint">graouts</reporter>
          <assigned_to name="Antoine Quint">graouts</assigned_to>
          <cc>dino</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1405636</commentid>
    <comment_count>0</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2018-03-11 20:03:07 -0700</bug_when>
    <thetext>[Web Animations] Create, update and remove CSSAnimation and CSSTransition objects on the DocumentTimeline</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1405640</commentid>
    <comment_count>1</comment_count>
      <attachid>335572</attachid>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2018-03-11 20:09:38 -0700</bug_when>
    <thetext>Created attachment 335572
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1405701</commentid>
    <comment_count>2</comment_count>
      <attachid>335572</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2018-03-12 04:48:00 -0700</bug_when>
    <thetext>Comment on attachment 335572
Patch

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

&gt; Source/WebCore/animation/AnimationTimeline.cpp:97
&gt;          return Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;();

Vector&lt;RefPtr&lt;WebAnimation&gt;&gt; { }

&gt; Source/WebCore/animation/AnimationTimeline.cpp:148
&gt; +        return HashMap&lt;String, RefPtr&lt;CSSAnimation&gt;&gt;();

use { } syntax

&gt; Source/WebCore/animation/AnimationTimeline.cpp:159
&gt; +            // We&apos;ve found the name of this animation in our list of previous animations, this means we&apos;ve already
&gt; +            // created a CSSAnimation object for it and need to ensure that this CSSAnimation is backed by the current
&gt; +            // animation object for this animation name.
&gt; +            if (namesOfPreviousAnimations.contains(name))
&gt; +                cssAnimationsByName.get(name)-&gt;setBackingAnimation(currentAnimation);

I think you should change AnimationList to export Ref&lt;Animation&gt;. Also I don&apos;t think setBackingAnimation needs to take a const, which would avoid the const_cast in the previous patch.

&gt; Source/WebCore/animation/AnimationTimeline.cpp:161
&gt; +            // Otherwise we are dealing with a new animation name and must create a CSSAnimation for it.
&gt; +            else if (currentAnimation.isValidAnimation())

We usually put the comment inside the if, even if it means using { }

&gt; Source/WebCore/animation/AnimationTimeline.cpp:208
&gt; +        return HashMap&lt;CSSPropertyID, RefPtr&lt;CSSTransition&gt;&gt;();

{ }

(I even wonder if you need to define the type, since it is inferred.)

&gt; Source/WebCore/animation/AnimationTimeline.h:89
&gt; +    HashMap&lt;Element*, Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;&gt; m_elementToAnimationsMap;
&gt; +    HashMap&lt;Element*, Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;&gt; m_elementToCSSAnimationsMap;
&gt; +    HashMap&lt;Element*, Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;&gt; m_elementToCSSTransitionsMap;

I&apos;m not sure if my advice to use Element* was good, but we&apos;ll see :)

&gt; Source/WebCore/animation/DocumentTimeline.cpp:166
&gt; +    if (m_document &amp;&amp; (!elementToAnimationsMap().isEmpty() || !elementToCSSAnimationsMap().isEmpty() || !elementToCSSTransitionsMap().isEmpty())) {

Make a hasAnimations() helper on AnimationTimeline

&gt; Source/WebCore/style/StyleTreeResolver.cpp:333
&gt; +    shouldRecompositeLayer = element.styleResolutionShouldRecompositeLayer() || shouldRecompositeLayer;

use |= ?

&gt; LayoutTests/webanimations/css-animations.html:26
&gt; +    test(() =&gt; {

I like _ instead of ()

&gt; LayoutTests/webanimations/css-animations.html:44
&gt; +    const animation = target.getAnimations()[0];

So does getAnimations force a style recalc?

&gt; LayoutTests/webanimations/css-animations.html:46
&gt; +    assert_true(animation instanceof CSSAnimation, &quot;The animation is a CSSAnimation.&quot;);
&gt; +    assert_true(animation instanceof Animation, &quot;The animation is an Animation.&quot;);

Should be the other way around

&gt; LayoutTests/webanimations/css-animations.html:66
&gt; +    assert_equals(computedTiming.currentIteration, 1, &quot;The animations&apos;s computed timing currentIteration property matches the properties set by CSS&quot;);

I assume this means the 2nd iteration?

&gt; LayoutTests/webanimations/css-animations.html:71
&gt; +    assert_equals(computedTiming.iterationStart, 0, &quot;The animations&apos;s computed timing iterationStart property matches the properties set by CSS&quot;);

Not sure what this means

&gt; LayoutTests/webanimations/css-animations.html:74
&gt; +    assert_equals(computedTiming.progress, 0.5, &quot;The animations&apos;s computed timing progress property matches the properties set by CSS&quot;);

Huh? Is this progress within the iteration?

&gt; LayoutTests/webanimations/css-animations.html:81
&gt; +    assert_equals(keyframes[0].offset, 0, &quot;The animation&apos;s effect&apos;s first keyframe has a 0 offset.&quot;);

Lucky we don&apos;t have a CSS property called offset.

&gt; LayoutTests/webanimations/css-animations.html:98
&gt; +targetTest(target =&gt; {
&gt; +    target.style.animationDelay = &quot;-1s&quot;;
&gt; +    target.style.animationDuration = &quot;2s&quot;;
&gt; +    target.style.animationName = &quot;animation&quot;;
&gt; +
&gt; +    assert_equals(target.getAnimations()[0].effect.timing.delay, -1000, &quot;The animation&apos;s delay matches the initial animation-delay property.&quot;);
&gt; +
&gt; +    target.style.animationDelay = 0;
&gt; +    assert_equals(target.getAnimations()[0].effect.timing.delay, 0, &quot;The animation&apos;s delay matches the updated animation-delay property.&quot;);
&gt; +}, &quot;Web Animations should reflect the animation-delay property.&quot;);

Didn&apos;t you just test this?

&gt; LayoutTests/webanimations/css-animations.html:144
&gt; +    assert_equals(target.getAnimations()[0].effect.timing.iterations, 1, &quot;The animation&apos;s duration matches the updated animation-iteration-count property.&quot;);

Add one like this too:

 189    assert_equals(target.getAnimations()[0], initialAnimation, &quot;The animation object remained the same instance throughout the test.&quot;);

&gt; LayoutTests/webanimations/css-animations.html:172
&gt; +    assert_not_equals(updatedAnimation, initialAnimation, &quot;Changing the animation-name property generates a different CSSAnimation object.&quot;);

You should test this right after getting updatedAnimation</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1405704</commentid>
    <comment_count>3</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2018-03-12 05:21:38 -0700</bug_when>
    <thetext>(In reply to Dean Jackson from comment #2)
&gt; Comment on attachment 335572 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=335572&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/animation/AnimationTimeline.cpp:97
&gt; &gt;          return Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;();
&gt; 
&gt; Vector&lt;RefPtr&lt;WebAnimation&gt;&gt; { }

Will fix.

&gt; &gt; Source/WebCore/animation/AnimationTimeline.cpp:148
&gt; &gt; +        return HashMap&lt;String, RefPtr&lt;CSSAnimation&gt;&gt;();
&gt; 
&gt; use { } syntax

Will fix.

&gt; &gt; Source/WebCore/animation/AnimationTimeline.cpp:159
&gt; &gt; +            // We&apos;ve found the name of this animation in our list of previous animations, this means we&apos;ve already
&gt; &gt; +            // created a CSSAnimation object for it and need to ensure that this CSSAnimation is backed by the current
&gt; &gt; +            // animation object for this animation name.
&gt; &gt; +            if (namesOfPreviousAnimations.contains(name))
&gt; &gt; +                cssAnimationsByName.get(name)-&gt;setBackingAnimation(currentAnimation);
&gt; 
&gt; I think you should change AnimationList to export Ref&lt;Animation&gt;. Also I
&gt; don&apos;t think setBackingAnimation needs to take a const, which would avoid the
&gt; const_cast in the previous patch.

Right. I&apos;d like to do this as a separate task. AnimationList is most likely due for a good amount of updates.

&gt; &gt; Source/WebCore/animation/AnimationTimeline.cpp:161
&gt; &gt; +            // Otherwise we are dealing with a new animation name and must create a CSSAnimation for it.
&gt; &gt; +            else if (currentAnimation.isValidAnimation())
&gt; 
&gt; We usually put the comment inside the if, even if it means using { }

Will fix.

&gt; &gt; Source/WebCore/animation/AnimationTimeline.cpp:208
&gt; &gt; +        return HashMap&lt;CSSPropertyID, RefPtr&lt;CSSTransition&gt;&gt;();
&gt; 
&gt; { }
&gt; 
&gt; (I even wonder if you need to define the type, since it is inferred.)

I tried, but we do (error: cannot deduce lambda return type from initializer list).

&gt; &gt; Source/WebCore/animation/AnimationTimeline.h:89
&gt; &gt; +    HashMap&lt;Element*, Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;&gt; m_elementToAnimationsMap;
&gt; &gt; +    HashMap&lt;Element*, Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;&gt; m_elementToCSSAnimationsMap;
&gt; &gt; +    HashMap&lt;Element*, Vector&lt;RefPtr&lt;WebAnimation&gt;&gt;&gt; m_elementToCSSTransitionsMap;
&gt; 
&gt; I&apos;m not sure if my advice to use Element* was good, but we&apos;ll see :)

:)

&gt; &gt; Source/WebCore/animation/DocumentTimeline.cpp:166
&gt; &gt; +    if (m_document &amp;&amp; (!elementToAnimationsMap().isEmpty() || !elementToCSSAnimationsMap().isEmpty() || !elementToCSSTransitionsMap().isEmpty())) {
&gt; 
&gt; Make a hasAnimations() helper on AnimationTimeline

Since these are specific to elements, I&apos;m adding this protected method:

    bool hasElementAnimations() const { return !m_elementToAnimationsMap.isEmpty() || !m_elementToCSSAnimationsMap.isEmpty() || !m_elementToCSSTransitionsMap.isEmpty(); }

&gt; &gt; Source/WebCore/style/StyleTreeResolver.cpp:333
&gt; &gt; +    shouldRecompositeLayer = element.styleResolutionShouldRecompositeLayer() || shouldRecompositeLayer;
&gt; 
&gt; use |= ?

Will fix.

&gt; &gt; LayoutTests/webanimations/css-animations.html:26
&gt; &gt; +    test(() =&gt; {
&gt; 
&gt; I like _ instead of ()

Noted, but I don&apos;t :)

&gt; &gt; LayoutTests/webanimations/css-animations.html:44
&gt; &gt; +    const animation = target.getAnimations()[0];
&gt; 
&gt; So does getAnimations force a style recalc?

Yes, it calls updateStyleIfNeeded() on the document to ensure all pending CSS updates are accounted for before returning the current list of qualifying animations.

&gt; &gt; LayoutTests/webanimations/css-animations.html:46
&gt; &gt; +    assert_true(animation instanceof CSSAnimation, &quot;The animation is a CSSAnimation.&quot;);
&gt; &gt; +    assert_true(animation instanceof Animation, &quot;The animation is an Animation.&quot;);
&gt; 
&gt; Should be the other way around

Will fix.

&gt; &gt; LayoutTests/webanimations/css-animations.html:66
&gt; &gt; +    assert_equals(computedTiming.currentIteration, 1, &quot;The animations&apos;s computed timing currentIteration property matches the properties set by CSS&quot;);
&gt; 
&gt; I assume this means the 2nd iteration?

That&apos;s right, it&apos;s 0-based.

&gt; &gt; LayoutTests/webanimations/css-animations.html:74
&gt; &gt; +    assert_equals(computedTiming.progress, 0.5, &quot;The animations&apos;s computed timing progress property matches the properties set by CSS&quot;);
&gt; 
&gt; Huh? Is this progress within the iteration?

Correct.

&gt; &gt; LayoutTests/webanimations/css-animations.html:81
&gt; &gt; +    assert_equals(keyframes[0].offset, 0, &quot;The animation&apos;s effect&apos;s first keyframe has a 0 offset.&quot;);
&gt; 
&gt; Lucky we don&apos;t have a CSS property called offset.

:)

The spec says that the &quot;offset&quot; CSS property is referred to as cssOffset when in JS objects, so at least it prepared for that.

&gt; &gt; LayoutTests/webanimations/css-animations.html:98
&gt; &gt; +targetTest(target =&gt; {
&gt; &gt; +    target.style.animationDelay = &quot;-1s&quot;;
&gt; &gt; +    target.style.animationDuration = &quot;2s&quot;;
&gt; &gt; +    target.style.animationName = &quot;animation&quot;;
&gt; &gt; +
&gt; &gt; +    assert_equals(target.getAnimations()[0].effect.timing.delay, -1000, &quot;The animation&apos;s delay matches the initial animation-delay property.&quot;);
&gt; &gt; +
&gt; &gt; +    target.style.animationDelay = 0;
&gt; &gt; +    assert_equals(target.getAnimations()[0].effect.timing.delay, 0, &quot;The animation&apos;s delay matches the updated animation-delay property.&quot;);
&gt; &gt; +}, &quot;Web Animations should reflect the animation-delay property.&quot;);
&gt; 
&gt; Didn&apos;t you just test this?

We just tested the initial value. I suppose there&apos;s some redundancy here.

&gt; &gt; LayoutTests/webanimations/css-animations.html:144
&gt; &gt; +    assert_equals(target.getAnimations()[0].effect.timing.iterations, 1, &quot;The animation&apos;s duration matches the updated animation-iteration-count property.&quot;);
&gt; 
&gt; Add one like this too:
&gt; 
&gt;  189    assert_equals(target.getAnimations()[0], initialAnimation, &quot;The
&gt; animation object remained the same instance throughout the test.&quot;);

Will fix.

&gt; &gt; LayoutTests/webanimations/css-animations.html:172
&gt; &gt; +    assert_not_equals(updatedAnimation, initialAnimation, &quot;Changing the animation-name property generates a different CSSAnimation object.&quot;);
&gt; 
&gt; You should test this right after getting updatedAnimation

OK.

Thanks for taking the time to review all this code!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1405707</commentid>
    <comment_count>4</comment_count>
    <who name="Antoine Quint">graouts</who>
    <bug_when>2018-03-12 06:02:49 -0700</bug_when>
    <thetext>

*** This bug has been marked as a duplicate of bug 183504 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>335572</attachid>
            <date>2018-03-11 20:09:38 -0700</date>
            <delta_ts>2018-03-12 04:48:00 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-183558-20180312040936.patch</filename>
            <type>text/plain</type>
            <size>52742</size>
            <attacher name="Antoine Quint">graouts</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjI5NTE5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYmQwZjE0YjczMDM0ZmI0
MzVmMjU2NzVhYjkwNjA3OTUzZjViNjJjZi4uMTU3MmE1MzU5ZTE4ZDEwZTVkMDNjYTRjMjg1NjI5
MmU0ZDE1YjU1NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDUzIEBACisyMDE4LTAzLTExICBBbnRv
aW5lIFF1aW50ICA8Z3Jhb3V0c0BhcHBsZS5jb20+CisKKyAgICAgICAgW1dlYiBBbmltYXRpb25z
XSBDcmVhdGUsIHVwZGF0ZSBhbmQgcmVtb3ZlIENTU0FuaW1hdGlvbiBhbmQgQ1NTVHJhbnNpdGlv
biBvYmplY3RzIG9uIHRoZSBEb2N1bWVudFRpbWVsaW5lCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODM1NTgKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUZXN0czogd2ViYW5pbWF0aW9ucy9jc3MtYW5pbWF0
aW9ucy5odG1sCisgICAgICAgICAgICAgICB3ZWJhbmltYXRpb25zL2Nzcy10cmFuc2l0aW9ucy5o
dG1sCisKKyAgICAgICAgVGhpcyBwYXRjaCBhZGRzLCB1cGRhdGVzIGFuZCByZW1vdmVzIENTUyBB
bmltYXRpb25zIGFuZCBDU1MgVHJhbnNpdGlvbnMgYXMgV2ViIEFuaW1hdGlvbnMgb24gdGhlIERv
Y3VtZW50VGltZWxpbmUuCisgICAgICAgIFN0eWxlVHJlZVJlc29sdmVyIG5vdyBoYXMgYSBjb2Rl
IHBhdGggdG8gYWRkIENTU0FuaW1hdGlvbiBhbmQgQ1NTVHJhbnNpdGlvbiBvYmplY3RzIG9udG8g
dGhlIERvY3VtZW50VGltZWxpbmUgdG8gYmUKKyAgICAgICAgcGlja2VkIHVwIGJ5IHRoZSBXZWIg
QW5pbWF0aW9ucyBlbmdpbmUuIFRoZSBwcmV2aW91cyBDU1NBbmltYXRpb25Db250cm9sbGVyIGNv
ZGUgcGF0aCBpcyBwcmVzZXJ2ZWQgaWYgdGhlIHJ1bnRpbWUgZmxhZworICAgICAgICBpcyBkaXNh
YmxlZC4gV2UgYWRkIHR3byBuZXcgbWV0aG9kcyBvbiBBbmltYXRpb25UaW1lbGluZSwgdXBkYXRl
Q1NTQW5pbWF0aW9uc0ZvckVsZW1lbnQoKSBhbmQgdXBkYXRlQ1NTVHJhbnNpdGlvbnNGb3JFbGVt
ZW50KCkKKyAgICAgICAgd2hpY2ggYXJlIGNhbGxlZCBmcm9tIFRyZWVSZXNvbHZlcjo6Y3JlYXRl
QW5pbWF0ZWRFbGVtZW50VXBkYXRlKCkuIFRoZXNlIGxvb2sgYXQgdGhlIEFuaW1hdGlvbkxpc3Qg
Zm9yIHRoZSBvbGQgYW5kIG5ldworICAgICAgICBSZW5kZXJTdHlsZSBvYmplY3RzIGFuZCBjcmVh
dGUsIHVwZGF0ZSBhbmQgcmVtb3ZlIG1hdGNoaW5nIENTU0FuaW1hdGlvbiBhbmQgQ1NTVHJhbnNp
dGlvbiBpbnN0YW5jZXMuCisKKyAgICAgICAgKiBhbmltYXRpb24vQW5pbWF0aW9uVGltZWxpbmUu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uVGltZWxpbmU6On5BbmltYXRpb25UaW1l
bGluZSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25UaW1lbGluZTo6cmVsZXZhbnRNYXBG
b3JBbmltYXRpb24pOiBXZSBzdG9yZSB2YXJpb3VzIHN1YmNsYXNzZXMgb2YgV2ViQW5pbWF0aW9u
IGluIGRlZGljYXRlZCBtYXBzIHNvIHdlIGNhbiBjb21wb3NpdGUKKyAgICAgICAgYW5pbWF0aW9u
cyBpbiB0aGUgY29ycmVjdCBvcmRlciB3aGVuIGFuaW1hdGluZy4gVGhpcyBmdW5jdGlvbiByZXR1
cm5zIHRoZSBjb3JyZWN0IG1hcCBmb3IgYSBnaXZlbiBhbmltYXRpb24gc3VjaCB0aGF0IGFuaW1h
dGlvbldhc0FkZGVkVG9FbGVtZW50KCkKKyAgICAgICAgYW5kIGFuaW1hdGlvbldhc1JlbW92ZWRG
cm9tRWxlbWVudCgpIG11dGF0ZSB0aGUgcmlnaHQgbWFwLgorICAgICAgICAoV2ViQ29yZTo6QW5p
bWF0aW9uVGltZWxpbmU6OmFuaW1hdGlvbldhc0FkZGVkVG9FbGVtZW50KToKKyAgICAgICAgKFdl
YkNvcmU6OkFuaW1hdGlvblRpbWVsaW5lOjphbmltYXRpb25XYXNSZW1vdmVkRnJvbUVsZW1lbnQp
OgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uVGltZWxpbmU6OmFuaW1hdGlvbnNGb3JFbGVt
ZW50KTogTWFrZSBzdXJlIHRvIGxvb2sgZm9yIGFuaW1hdGlvbnMgaW4gdGhlIGxpc3RzIG9mIENT
UyBBbmltYXRpb25zIGFuZCBDU1MgVHJhbnNpdGlvbnMgYXMgd2VsbAorICAgICAgICBhcyBXZWIg
QW5pbWF0aW9ucy4KKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblRpbWVsaW5lOjp1cGRhdGVD
U1NBbmltYXRpb25zRm9yRWxlbWVudCk6IFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBUcmVlUmVz
b2x2ZXI6OmNyZWF0ZUFuaW1hdGVkRWxlbWVudFVwZGF0ZSgpIGR1cmluZyBzdHlsZQorICAgICAg
ICByZXNvbHV0aW9uLiBJdCBjb21wYXJlcyB0aGUgQW5pbWF0aW9uTGlzdCBvZiB0aGUgcHJldmlv
dXMgc3R5bGUgYW5kIHRoZSBuZXcgc3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCwgY2hlY2tzIHRo
YXQgYW5pbWF0aW9ucyB3aXRoIGEgZ2l2ZW4gbmFtZQorICAgICAgICB0aGF0IHdlcmUgbm90IHBy
ZXNlbnQgaW4gdGhlIG9sZCBBbmltYXRpb25MaXN0IGhhdmUgYSBuZXcgbWF0Y2hpbmcgQ1NTQW5p
bWF0aW9uIG9iamVjdCBmb3IgdGhlbSBhZGRlZCB0byB0aGUgQW5pbWF0aW9uVGltZWxpbmUsIHRo
YXQgYW5pbWF0aW9ucworICAgICAgICB3aXRoIGEgZ2l2ZW4gbmFtZSB0aGF0IGFyZSBubyBsb25n
ZXIgcHJlc2VudCBpbiB0aGUgbmV3IEFuaW1hdGlvbkxpc3QgaGF2ZSB0aGVpciBtYXRjaGluZyBD
U1NBbmltYXRpb24gb2JqZWN0IHJlbW92ZWQgZnJvbSB0aGUgQW5pbWF0aW9uVGltZWxpbmUsCisg
ICAgICAgIGFuZCB0aGF0IGFuaW1hdGlvbnMgd2l0aCBhIGdpdmVuIG5hbWUgdGhhdCBhcmUgcHJl
c2VudCBpbiBib3RoIHRoZSBvbGQgYW5kIG5ldyBBbmltYXRpb25MaXN0IGhhdmUgdGhlaXIgbWF0
Y2hpbmcgQ1NTQW5pbWF0aW9uIHVwZGF0ZWQgdG8gbWF0Y2gKKyAgICAgICAgdGhlIGN1cnJlbnQg
c3RhdGUgb2YgdGhlIGFuaW1hdGlvbiBpbiB0aGUgQW5pbWF0aW9uTGlzdC4KKyAgICAgICAgKFdl
YkNvcmU6OkFuaW1hdGlvblRpbWVsaW5lOjp1cGRhdGVDU1NUcmFuc2l0aW9uc0ZvckVsZW1lbnQp
OiBTaW1pbGFybHkgdG8gdXBkYXRlQ1NTQW5pbWF0aW9uc0ZvckVsZW1lbnQoKSwgdGhpcyBtZXRo
b2QgaXMgY2FsbGVkIGR1cmluZyBzdHlsZQorICAgICAgICByZXNvbHV0aW9uIGJ5IFRyZWVSZXNv
bHZlcjo6Y3JlYXRlQW5pbWF0ZWRFbGVtZW50VXBkYXRlKCkuIEl0cyByb2xlIGlzIHRvIGNyZWF0
ZSBvciByZW1vdmUgQ1NTVHJhbnNpdGlvbiBvYmplY3RzIGJhc2VkIG9uIHRoZSBBbmltYXRpb25M
aXN0IGZvdW5kCisgICAgICAgIGluIHRoZSBvbGQgYW5kIG5ldyBzdHlsZXMgZm9yIGEgZ2l2ZW4g
ZWxlbWVudC4gSXQgZm9sbG93cyBhIHNsaWdodGx5IGRpZmZlcmVudCBsb2dpYyB0aGFuIHVwZGF0
ZUNTU0FuaW1hdGlvbnNGb3JFbGVtZW50KCkgc2luY2UgZm9yIENTUyBUcmFuc2l0aW9ucywKKyAg
ICAgICAgdGhlcmUgaXMgbm8gbmVlZCB0byB1cGRhdGUgQ1NTVHJhbnNpdGlvbiBvYmplY3RzIGZv
ciBhIENTUyBwcm9wZXJ0eSBleGlzdGluZyBpbiBib3RoIHRoZSBvbGQgYW5kIG5ldyBBbmltYXRp
b25MaXN0LCBzaW5jZSB3aGVuIGEgQ1NTIHRyYW5zaXRpb25zCisgICAgICAgIHByb3BlcnR5IGlz
IGNoYW5nZWQsIGEgd2hvbGUgbmV3IHRyYW5zaXRpb24gaXMgaW5pdGlhdGVkLiBIb3dldmVyLCBp
dCdzIGltcG9ydGFudCB0byBjaGVjayB0aGF0IGRpZmZlcmVudCBBbmltYXRpb24gb2JqZWN0cyBh
bmQgc3R5bGVzIHdvdWxkIGFjdHVhbGx5CisgICAgICAgIHJlc3VsdCBpbiBkaWZmZXJlbnQgdGlt
aW5nIHByb3BlcnRpZXMgYW5kIGJsZW5kaW5nIGtleWZyYW1lcywgc28gY2hlY2sgZm9yIHRoaXMg
YXMgd2VsbCBiZWZvcmUgY3JlYXRpbmcgbmV3IENTU1RyYW5zaXRpb24gb2JqZWN0cy4gCisgICAg
ICAgICogYW5pbWF0aW9uL0FuaW1hdGlvblRpbWVsaW5lLmg6CisgICAgICAgIChXZWJDb3JlOjpB
bmltYXRpb25UaW1lbGluZTo6ZWxlbWVudFRvQW5pbWF0aW9uc01hcCk6CisgICAgICAgIChXZWJD
b3JlOjpBbmltYXRpb25UaW1lbGluZTo6ZWxlbWVudFRvQ1NTQW5pbWF0aW9uc01hcCk6CisgICAg
ICAgIChXZWJDb3JlOjpBbmltYXRpb25UaW1lbGluZTo6ZWxlbWVudFRvQ1NTVHJhbnNpdGlvbnNN
YXApOgorICAgICAgICAqIGFuaW1hdGlvbi9Eb2N1bWVudFRpbWVsaW5lLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50VGltZWxpbmU6OnVwZGF0ZUFuaW1hdGlvbnMpOiBUcmlnZ2VyIHN0
eWxlIGludmFsaWRhdGlvbiBmb3IgZWxlbWVudHMgdGFyZ2V0ZWQgbm90IGp1c3QgYnkgV2ViQW5p
bWF0aW9uIGluc3RhbmNlcywgYnV0IGFsc28gYnkgYW55CisgICAgICAgIG9mIHRoZSBEZWNsYXJh
dGl2ZUFuaW1hdGlvbiBzdWJjbGFzc2VzLiBXZSBhbHNvIHJlbW92ZSB0aGUgY2FsbCB0byB1cGRh
dGVGaW5pc2hlZFN0YXRlKCkgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIHdoZW4gd2Ug
aW1wbGVtZW50ZWQgY29ycmVjdAorICAgICAgICBzdXBwb3J0IGZvciBhc3luY2hyb25vdXMgV2Vi
QW5pbWF0aW9uIG9wZXJhdGlvbnMuCisgICAgICAgICogc3R5bGUvU3R5bGVUcmVlUmVzb2x2ZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGU6OlRyZWVSZXNvbHZlcjo6Y3JlYXRlQW5pbWF0
ZWRFbGVtZW50VXBkYXRlKTogV2hlbiByZXNvbHZpbmcgc3R5bGVzLCBjYWxsIGludG8gdGhlIEFu
aW1hdGlvblRpbWVsaW5lIGlmIHRoZSBydW50aW1lIGZsYWcgdG8gZW5hYmxlIENTUyBBbmltYXRp
b25zIGFuZAorICAgICAgICBDU1MgVHJhbnNpdGlvbnMgYXMgV2ViIEFuaW1hdGlvbnMgaXMgb24u
IE90aGVyd2lzZSwgdXNlIENTU0FuaW1hdGlvbkNvbnRyb2xsZXIuCisKIDIwMTgtMDMtMTAgIE1l
Z2FuIEdhcmRuZXIgIDxtZWdhbl9nYXJkbmVyQGFwcGxlLmNvbT4KIAogICAgICAgICBNZWRpYSBx
dWVyeSBmb3IgZGVmYXVsdCBhcHBlYXJhbmNlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9h
bmltYXRpb24vQW5pbWF0aW9uVGltZWxpbmUuY3BwIGIvU291cmNlL1dlYkNvcmUvYW5pbWF0aW9u
L0FuaW1hdGlvblRpbWVsaW5lLmNwcAppbmRleCBmM2ExMzA1NzhhZWJlYjcxNzAzNDgyZmJhNDQz
ZmI4N2M2MDI1ZGY2Li5iMjAwYWU0Y2VkMjNkOTc3YWI4ZmQxYWJjZmFmOTBiNTM2YjdjMTQ0IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9hbmltYXRpb24vQW5pbWF0aW9uVGltZWxpbmUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2FuaW1hdGlvbi9BbmltYXRpb25UaW1lbGluZS5jcHAKQEAg
LTI3LDcgKzI3LDE2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiQW5pbWF0aW9u
VGltZWxpbmUuaCIKIAorI2luY2x1ZGUgIkFuaW1hdGlvbi5oIgorI2luY2x1ZGUgIkFuaW1hdGlv
bkxpc3QuaCIKKyNpbmNsdWRlICJDU1NBbmltYXRpb24uaCIKKyNpbmNsdWRlICJDU1NQcm9wZXJ0
eUFuaW1hdGlvbi5oIgorI2luY2x1ZGUgIkNTU1RyYW5zaXRpb24uaCIKICNpbmNsdWRlICJEb2N1
bWVudFRpbWVsaW5lLmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIktleWZyYW1l
RWZmZWN0UmVhZE9ubHkuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIlJl
bmRlclZpZXcuaCIKICNpbmNsdWRlICJXZWJBbmltYXRpb25VdGlsaXRpZXMuaCIKICNpbmNsdWRl
IDx3dGYvdGV4dC9UZXh0U3RyZWFtLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+
CkBAIC00MSw2ICs1MCwxMCBAQCBBbmltYXRpb25UaW1lbGluZTo6QW5pbWF0aW9uVGltZWxpbmUo
Q2xhc3NUeXBlIGNsYXNzVHlwZSkKIAogQW5pbWF0aW9uVGltZWxpbmU6On5BbmltYXRpb25UaW1l
bGluZSgpCiB7CisgICAgbV9lbGVtZW50VG9DU1NBbmltYXRpb25zTWFwLmNsZWFyKCk7CisgICAg
bV9lbGVtZW50VG9DU1NUcmFuc2l0aW9uc01hcC5jbGVhcigpOworICAgIG1fZWxlbWVudFRvQ1NT
QW5pbWF0aW9uQnlOYW1lLmNsZWFyKCk7CisgICAgbV9lbGVtZW50VG9DU1NUcmFuc2l0aW9uQnlD
U1NQcm9wZXJ0eUlELmNsZWFyKCk7CiB9CiAKIHZvaWQgQW5pbWF0aW9uVGltZWxpbmU6OmFkZEFu
aW1hdGlvbihSZWY8V2ViQW5pbWF0aW9uPiYmIGFuaW1hdGlvbikKQEAgLTY5LDkgKzgyLDE4IEBA
IHZvaWQgQW5pbWF0aW9uVGltZWxpbmU6OnNldEN1cnJlbnRUaW1lKFNlY29uZHMgY3VycmVudFRp
bWUpCiAgICAgdGltaW5nTW9kZWxEaWRDaGFuZ2UoKTsKIH0KIAorSGFzaE1hcDxFbGVtZW50Kiwg
VmVjdG9yPFJlZlB0cjxXZWJBbmltYXRpb24+Pj4mIEFuaW1hdGlvblRpbWVsaW5lOjpyZWxldmFu
dE1hcEZvckFuaW1hdGlvbihXZWJBbmltYXRpb24mIGFuaW1hdGlvbikKK3sKKyAgICBpZiAoYW5p
bWF0aW9uLmlzQ1NTQW5pbWF0aW9uKCkpCisgICAgICAgIHJldHVybiBtX2VsZW1lbnRUb0NTU0Fu
aW1hdGlvbnNNYXA7CisgICAgaWYgKGFuaW1hdGlvbi5pc0NTU1RyYW5zaXRpb24oKSkKKyAgICAg
ICAgcmV0dXJuIG1fZWxlbWVudFRvQ1NTVHJhbnNpdGlvbnNNYXA7CisgICAgcmV0dXJuIG1fZWxl
bWVudFRvQW5pbWF0aW9uc01hcDsKK30KKwogdm9pZCBBbmltYXRpb25UaW1lbGluZTo6YW5pbWF0
aW9uV2FzQWRkZWRUb0VsZW1lbnQoV2ViQW5pbWF0aW9uJiBhbmltYXRpb24sIEVsZW1lbnQmIGVs
ZW1lbnQpCiB7Ci0gICAgYXV0byByZXN1bHQgPSBtX2VsZW1lbnRUb0FuaW1hdGlvbnNNYXAuZW5z
dXJlKCZlbGVtZW50LCBbXSB7CisgICAgYXV0byByZXN1bHQgPSByZWxldmFudE1hcEZvckFuaW1h
dGlvbihhbmltYXRpb24pLmVuc3VyZSgmZWxlbWVudCwgW10gewogICAgICAgICByZXR1cm4gVmVj
dG9yPFJlZlB0cjxXZWJBbmltYXRpb24+PigpOwogICAgIH0pOwogICAgIHJlc3VsdC5pdGVyYXRv
ci0+dmFsdWUuYXBwZW5kKCZhbmltYXRpb24pOwpAQCAtNzksMjQgKzEwMSwxNTQgQEAgdm9pZCBB
bmltYXRpb25UaW1lbGluZTo6YW5pbWF0aW9uV2FzQWRkZWRUb0VsZW1lbnQoV2ViQW5pbWF0aW9u
JiBhbmltYXRpb24sIEVsZW0KIAogdm9pZCBBbmltYXRpb25UaW1lbGluZTo6YW5pbWF0aW9uV2Fz
UmVtb3ZlZEZyb21FbGVtZW50KFdlYkFuaW1hdGlvbiYgYW5pbWF0aW9uLCBFbGVtZW50JiBlbGVt
ZW50KQogewotICAgIGF1dG8gaXRlcmF0b3IgPSBtX2VsZW1lbnRUb0FuaW1hdGlvbnNNYXAuZmlu
ZCgmZWxlbWVudCk7Ci0gICAgaWYgKGl0ZXJhdG9yID09IG1fZWxlbWVudFRvQW5pbWF0aW9uc01h
cC5lbmQoKSkKKyAgICBhdXRvJiBtYXAgPSByZWxldmFudE1hcEZvckFuaW1hdGlvbihhbmltYXRp
b24pOworICAgIGF1dG8gaXRlcmF0b3IgPSBtYXAuZmluZCgmZWxlbWVudCk7CisgICAgaWYgKGl0
ZXJhdG9yID09IG1hcC5lbmQoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgYXV0byYgYW5pbWF0
aW9ucyA9IGl0ZXJhdG9yLT52YWx1ZTsKICAgICBhbmltYXRpb25zLnJlbW92ZUZpcnN0KCZhbmlt
YXRpb24pOwogICAgIGlmICghYW5pbWF0aW9ucy5zaXplKCkpCi0gICAgICAgIG1fZWxlbWVudFRv
QW5pbWF0aW9uc01hcC5yZW1vdmUoaXRlcmF0b3IpOworICAgICAgICBtYXAucmVtb3ZlKGl0ZXJh
dG9yKTsKIH0KIAogVmVjdG9yPFJlZlB0cjxXZWJBbmltYXRpb24+PiBBbmltYXRpb25UaW1lbGlu
ZTo6YW5pbWF0aW9uc0ZvckVsZW1lbnQoRWxlbWVudCYgZWxlbWVudCkKIHsKICAgICBWZWN0b3I8
UmVmUHRyPFdlYkFuaW1hdGlvbj4+IGFuaW1hdGlvbnM7CisgICAgaWYgKG1fZWxlbWVudFRvQ1NT
QW5pbWF0aW9uc01hcC5jb250YWlucygmZWxlbWVudCkpCisgICAgICAgIGFuaW1hdGlvbnMuYXBw
ZW5kVmVjdG9yKG1fZWxlbWVudFRvQ1NTQW5pbWF0aW9uc01hcC5nZXQoJmVsZW1lbnQpKTsKKyAg
ICBpZiAobV9lbGVtZW50VG9DU1NUcmFuc2l0aW9uc01hcC5jb250YWlucygmZWxlbWVudCkpCisg
ICAgICAgIGFuaW1hdGlvbnMuYXBwZW5kVmVjdG9yKG1fZWxlbWVudFRvQ1NTVHJhbnNpdGlvbnNN
YXAuZ2V0KCZlbGVtZW50KSk7CiAgICAgaWYgKG1fZWxlbWVudFRvQW5pbWF0aW9uc01hcC5jb250
YWlucygmZWxlbWVudCkpCi0gICAgICAgIGFuaW1hdGlvbnMgPSBtX2VsZW1lbnRUb0FuaW1hdGlv
bnNNYXAuZ2V0KCZlbGVtZW50KTsKKyAgICAgICAgYW5pbWF0aW9ucy5hcHBlbmRWZWN0b3IobV9l
bGVtZW50VG9BbmltYXRpb25zTWFwLmdldCgmZWxlbWVudCkpOwogICAgIHJldHVybiBhbmltYXRp
b25zOwogfQogCit2b2lkIEFuaW1hdGlvblRpbWVsaW5lOjp1cGRhdGVDU1NBbmltYXRpb25zRm9y
RWxlbWVudChFbGVtZW50JiBlbGVtZW50LCBjb25zdCBSZW5kZXJTdHlsZSYgbmV3U3R5bGUsIGNv
bnN0IFJlbmRlclN0eWxlKiBvbGRTdHlsZSkKK3sKKyAgICBpZiAoZWxlbWVudC5kb2N1bWVudCgp
LnBhZ2VDYWNoZVN0YXRlKCkgIT0gRG9jdW1lbnQ6Ok5vdEluUGFnZUNhY2hlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAoZWxlbWVudC5kb2N1bWVudCgpLnJlbmRlclZpZXcoKS0+cHJpbnRp
bmcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRmlyc3QsIGNvbXBpbGUgdGhlIGxpc3Qg
b2YgYW5pbWF0aW9uIG5hbWVzIHRoYXQgd2VyZSBhcHBsaWVkIHRvIHRoaXMgZWxlbWVudCB1cCB0
byB0aGlzIHBvaW50LgorICAgIEhhc2hTZXQ8U3RyaW5nPiBuYW1lc09mUHJldmlvdXNBbmltYXRp
b25zOworICAgIGlmIChvbGRTdHlsZSAmJiBvbGRTdHlsZS0+aGFzQW5pbWF0aW9ucygpKSB7Cisg
ICAgICAgIGF1dG8qIHByZXZpb3VzQW5pbWF0aW9ucyA9IG9sZFN0eWxlLT5hbmltYXRpb25zKCk7
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJldmlvdXNBbmltYXRpb25zLT5zaXpl
KCk7ICsraSkgeworICAgICAgICAgICAgYXV0byYgcHJldmlvdXNBbmltYXRpb24gPSBwcmV2aW91
c0FuaW1hdGlvbnMtPmFuaW1hdGlvbihpKTsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c0FuaW1h
dGlvbi5pc1ZhbGlkQW5pbWF0aW9uKCkpCisgICAgICAgICAgICAgICAgbmFtZXNPZlByZXZpb3Vz
QW5pbWF0aW9ucy5hZGQocHJldmlvdXNBbmltYXRpb24ubmFtZSgpKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIENyZWF0ZSBvciBnZXQgdGhlIENTU0FuaW1hdGlvbnMgYnkgYW5pbWF0aW9u
IG5hbWUgbWFwIGZvciB0aGlzIGVsZW1lbnQuCisgICAgYXV0byYgY3NzQW5pbWF0aW9uc0J5TmFt
ZSA9IG1fZWxlbWVudFRvQ1NTQW5pbWF0aW9uQnlOYW1lLmVuc3VyZSgmZWxlbWVudCwgW10gewor
ICAgICAgICByZXR1cm4gSGFzaE1hcDxTdHJpbmcsIFJlZlB0cjxDU1NBbmltYXRpb24+PigpOwor
ICAgIH0pLml0ZXJhdG9yLT52YWx1ZTsKKworICAgIGlmIChhdXRvKiBjdXJyZW50QW5pbWF0aW9u
cyA9IG5ld1N0eWxlLmFuaW1hdGlvbnMoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGN1cnJlbnRBbmltYXRpb25zLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgYXV0byYg
Y3VycmVudEFuaW1hdGlvbiA9IGN1cnJlbnRBbmltYXRpb25zLT5hbmltYXRpb24oaSk7CisgICAg
ICAgICAgICBhdXRvJiBuYW1lID0gY3VycmVudEFuaW1hdGlvbi5uYW1lKCk7CisgICAgICAgICAg
ICAvLyBXZSd2ZSBmb3VuZCB0aGUgbmFtZSBvZiB0aGlzIGFuaW1hdGlvbiBpbiBvdXIgbGlzdCBv
ZiBwcmV2aW91cyBhbmltYXRpb25zLCB0aGlzIG1lYW5zIHdlJ3ZlIGFscmVhZHkKKyAgICAgICAg
ICAgIC8vIGNyZWF0ZWQgYSBDU1NBbmltYXRpb24gb2JqZWN0IGZvciBpdCBhbmQgbmVlZCB0byBl
bnN1cmUgdGhhdCB0aGlzIENTU0FuaW1hdGlvbiBpcyBiYWNrZWQgYnkgdGhlIGN1cnJlbnQKKyAg
ICAgICAgICAgIC8vIGFuaW1hdGlvbiBvYmplY3QgZm9yIHRoaXMgYW5pbWF0aW9uIG5hbWUuCisg
ICAgICAgICAgICBpZiAobmFtZXNPZlByZXZpb3VzQW5pbWF0aW9ucy5jb250YWlucyhuYW1lKSkK
KyAgICAgICAgICAgICAgICBjc3NBbmltYXRpb25zQnlOYW1lLmdldChuYW1lKS0+c2V0QmFja2lu
Z0FuaW1hdGlvbihjdXJyZW50QW5pbWF0aW9uKTsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3
ZSBhcmUgZGVhbGluZyB3aXRoIGEgbmV3IGFuaW1hdGlvbiBuYW1lIGFuZCBtdXN0IGNyZWF0ZSBh
IENTU0FuaW1hdGlvbiBmb3IgaXQuCisgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50QW5pbWF0
aW9uLmlzVmFsaWRBbmltYXRpb24oKSkKKyAgICAgICAgICAgICAgICBjc3NBbmltYXRpb25zQnlO
YW1lLnNldChuYW1lLCBDU1NBbmltYXRpb246OmNyZWF0ZShlbGVtZW50LCBjdXJyZW50QW5pbWF0
aW9uKSk7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG5hbWUgb2YgdGhpcyBhbmltYXRpb24g
ZnJvbSBvdXIgbGlzdCBzaW5jZSBpdCdzIG5vdyBrbm93biB0byBiZSBjdXJyZW50LgorICAgICAg
ICAgICAgbmFtZXNPZlByZXZpb3VzQW5pbWF0aW9ucy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICAvLyBUaGUgYW5pbWF0aW9ucyBuYW1lcyBsZWZ0IGluIG5hbWVzT2ZQcmV2
aW91c0FuaW1hdGlvbnMgYXJlIG5vdyBrbm93biB0byBubyBsb25nZXIgYXBwbHkgc28gd2UgbmVl
ZCB0bworICAgIC8vIHJlbW92ZSB0aGUgQ1NTQW5pbWF0aW9uIG9iamVjdCBjcmVhdGVkIGZvciB0
aGVtLgorICAgIGZvciAoY29uc3QgYXV0byYgbmFtZU9mQW5pbWF0aW9uVG9SZW1vdmUgOiBuYW1l
c09mUHJldmlvdXNBbmltYXRpb25zKSB7CisgICAgICAgIGF1dG8gY3NzQW5pbWF0aW9uVG9SZW1v
dmUgPSBjc3NBbmltYXRpb25zQnlOYW1lLnRha2UobmFtZU9mQW5pbWF0aW9uVG9SZW1vdmUpOwor
ICAgICAgICBjc3NBbmltYXRpb25Ub1JlbW92ZS0+c2V0RWZmZWN0KG51bGxwdHIpOworICAgICAg
ICByZW1vdmVBbmltYXRpb24oY3NzQW5pbWF0aW9uVG9SZW1vdmUucmVsZWFzZU5vbk51bGwoKSk7
CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBtYXAgb2YgQ1NTQW5pbWF0aW9ucyBieSBhbmlt
YXRpb24gbmFtZSBmb3IgdGhpcyBlbGVtZW50IGlmIGl0J3Mgbm93IGVtcHR5LgorICAgIGlmIChj
c3NBbmltYXRpb25zQnlOYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgbV9lbGVtZW50VG9DU1NBbmlt
YXRpb25CeU5hbWUucmVtb3ZlKCZlbGVtZW50KTsKK30KKwordm9pZCBBbmltYXRpb25UaW1lbGlu
ZTo6dXBkYXRlQ1NTVHJhbnNpdGlvbnNGb3JFbGVtZW50KEVsZW1lbnQmIGVsZW1lbnQsIGNvbnN0
IFJlbmRlclN0eWxlJiBuZXdTdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKQorewor
ICAgIGlmIChlbGVtZW50LmRvY3VtZW50KCkucGFnZUNhY2hlU3RhdGUoKSAhPSBEb2N1bWVudDo6
Tm90SW5QYWdlQ2FjaGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChlbGVtZW50LmRvY3Vt
ZW50KCkucmVuZGVyVmlldygpLT5wcmludGluZygpKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBGSVhNRTogV2UgZG8gbm90IGhhbmRsZSAiYWxsIiB0cmFuc2l0aW9ucyB5ZXQuCisKKyAgICAv
LyBGaXJzdCwgY29tcGlsZSB0aGUgbGlzdCBvZiBiYWNraW5nIGFuaW1hdGlvbnMgYW5kIHByb3Bl
cnRpZXMgdGhhdCB3ZXJlIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50IHVwIHRvIHRoaXMgcG9pbnQu
CisgICAgSGFzaFNldDxDU1NQcm9wZXJ0eUlEPiBwcmV2aW91c1Byb3BlcnRpZXM7CisgICAgSGFz
aFNldDxjb25zdCBBbmltYXRpb24qPiBwcmV2aW91c0JhY2tpbmdBbmltYXRpb25zOworICAgIGlm
IChvbGRTdHlsZSAmJiBvbGRTdHlsZS0+aGFzVHJhbnNpdGlvbnMoKSkgeworICAgICAgICBhdXRv
KiBwcmV2aW91c1RyYW5zaXRpb25zID0gb2xkU3R5bGUtPnRyYW5zaXRpb25zKCk7CisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJldmlvdXNUcmFuc2l0aW9ucy0+c2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgICAgIGF1dG8mIGFuaW1hdGlvbiA9IHByZXZpb3VzVHJhbnNpdGlvbnMtPmFu
aW1hdGlvbihpKTsKKyAgICAgICAgICAgIGF1dG8gcHJldmlvdXNUcmFuc2l0aW9uUHJvcGVydHkg
PSBhbmltYXRpb24ucHJvcGVydHkoKTsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYW5zaXRp
b25Qcm9wZXJ0eSAhPSBDU1NQcm9wZXJ0eUludmFsaWQpIHsKKyAgICAgICAgICAgICAgICBwcmV2
aW91c1Byb3BlcnRpZXMuYWRkKHByZXZpb3VzVHJhbnNpdGlvblByb3BlcnR5KTsKKyAgICAgICAg
ICAgICAgICBwcmV2aW91c0JhY2tpbmdBbmltYXRpb25zLmFkZCgmYW5pbWF0aW9uKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBvciBnZXQgdGhlIENT
U1RyYW5zaXRpb25zIGJ5IENTUyBwcm9wZXJ0eSBuYW1lIG1hcCBmb3IgdGhpcyBlbGVtZW50Lgor
ICAgIGF1dG8mIGNzc1RyYW5zaXRpb25zQnlQcm9wZXJ0eSA9IG1fZWxlbWVudFRvQ1NTVHJhbnNp
dGlvbkJ5Q1NTUHJvcGVydHlJRC5lbnN1cmUoJmVsZW1lbnQsIFtdIHsKKyAgICAgICAgcmV0dXJu
IEhhc2hNYXA8Q1NTUHJvcGVydHlJRCwgUmVmUHRyPENTU1RyYW5zaXRpb24+PigpOworICAgIH0p
Lml0ZXJhdG9yLT52YWx1ZTsKKworICAgIGlmIChhdXRvKiBjdXJyZW50VHJhbnNpdGlvbnMgPSBu
ZXdTdHlsZS50cmFuc2l0aW9ucygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
Y3VycmVudFRyYW5zaXRpb25zLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgYXV0byYgYmFj
a2luZ0FuaW1hdGlvbiA9IGN1cnJlbnRUcmFuc2l0aW9ucy0+YW5pbWF0aW9uKGkpOworICAgICAg
ICAgICAgYXV0byBwcm9wZXJ0eSA9IGJhY2tpbmdBbmltYXRpb24ucHJvcGVydHkoKTsKKyAgICAg
ICAgICAgIGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUludmFsaWQpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICAvLyBXZSd2ZSBmb3VuZCBhIGJhY2tpbmcgYW5pbWF0
aW9uIHRoYXQgd2UgZGlkbid0IGtub3cgYWJvdXQgZm9yIGEgdmFsaWQgcHJvcGVydHkuCisgICAg
ICAgICAgICBpZiAoIXByZXZpb3VzQmFja2luZ0FuaW1hdGlvbnMuY29udGFpbnMoJmJhY2tpbmdB
bmltYXRpb24pKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYWQgYSBDU1NU
cmFuc2l0aW9uIGZvciB0aGlzIHByb3BlcnR5LCBjaGVjayB3aGV0aGVyIGl0cyB0aW1pbmcgcHJv
cGVydGllcyBtYXRjaCB0aGUgY3VycmVudCBiYWNraW5nCisgICAgICAgICAgICAgICAgLy8gYW5p
bWF0aW9uJ3MgcHJvcGVydGllcyBhbmQgd2hldGhlciBpdHMgYmxlbmRpbmcga2V5ZnJhbWVzIG1h
dGNoIHRoZSBvbGQgYW5kIG5ldyBzdHlsZXMuIElmIHRoZXkgZG8sIG1vdmUgb24gdG8gdGhlCisg
ICAgICAgICAgICAgICAgLy8gbmV4dCB0cmFuc2l0aW9uLCBvdGhlcndpc2UgZGVsZXRlIHRoZSBw
cmV2aW91cyBDU1NUcmFuc2l0aW9uIG9iamVjdCwgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuCisgICAg
ICAgICAgICAgICAgaWYgKGNzc1RyYW5zaXRpb25zQnlQcm9wZXJ0eS5jb250YWlucyhwcm9wZXJ0
eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzc1RyYW5zaXRpb25zQnlQcm9wZXJ0eS5n
ZXQocHJvcGVydHkpLT5tYXRjaGVzQmFja2luZ0FuaW1hdGlvbkFuZFN0eWxlcyhiYWNraW5nQW5p
bWF0aW9uLCBvbGRTdHlsZSwgbmV3U3R5bGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY3NzVHJhbnNpdGlvblRvUmVtb3ZlID0g
Y3NzVHJhbnNpdGlvbnNCeVByb3BlcnR5LnRha2UocHJvcGVydHkpOworICAgICAgICAgICAgICAg
ICAgICBjc3NUcmFuc2l0aW9uVG9SZW1vdmUtPnNldEVmZmVjdChudWxscHRyKTsKKyAgICAgICAg
ICAgICAgICAgICAgcmVtb3ZlQW5pbWF0aW9uKGNzc1RyYW5zaXRpb25Ub1JlbW92ZS5yZWxlYXNl
Tm9uTnVsbCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTm93IHdl
IGNhbiBjcmVhdGUgYSBuZXcgQ1NTVHJhbnNpdGlvbiB3aXRoIHRoZSBuZXcgYmFja2luZyBhbmlt
YXRpb24gcHJvdmlkZWQgaXQgaGFzIGEgdmFsaWQKKyAgICAgICAgICAgICAgICAvLyBkdXJhdGlv
biBhbmQgdGhlIGZyb20gYW5kIHRvIHZhbHVlcyBhcmUgZGlzdGluY3QuCisgICAgICAgICAgICAg
ICAgaWYgKGJhY2tpbmdBbmltYXRpb24uZHVyYXRpb24oKSA+IDAgJiYgb2xkU3R5bGUgJiYgIUNT
U1Byb3BlcnR5QW5pbWF0aW9uOjpwcm9wZXJ0aWVzRXF1YWwocHJvcGVydHksIG9sZFN0eWxlLCAm
bmV3U3R5bGUpKQorICAgICAgICAgICAgICAgICAgICBjc3NUcmFuc2l0aW9uc0J5UHJvcGVydHku
c2V0KHByb3BlcnR5LCBDU1NUcmFuc2l0aW9uOjpjcmVhdGUoZWxlbWVudCwgYmFja2luZ0FuaW1h
dGlvbiwgb2xkU3R5bGUsIG5ld1N0eWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBw
cmV2aW91c1Byb3BlcnRpZXMucmVtb3ZlKHByb3BlcnR5KTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBubyBsb25nZXIgY3VycmVudCBhbmQgbXVz
dCBiZSByZW1vdmVkLgorICAgIGZvciAoY29uc3QgYXV0byB0cmFuc2l0aW9uUHJvcGVydHlUb1Jl
bW92ZSA6IHByZXZpb3VzUHJvcGVydGllcykgeworICAgICAgICBpZiAoIWNzc1RyYW5zaXRpb25z
QnlQcm9wZXJ0eS5jb250YWlucyh0cmFuc2l0aW9uUHJvcGVydHlUb1JlbW92ZSkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgYXV0byBjc3NUcmFuc2l0aW9uVG9SZW1vdmUgPSBjc3NU
cmFuc2l0aW9uc0J5UHJvcGVydHkudGFrZSh0cmFuc2l0aW9uUHJvcGVydHlUb1JlbW92ZSk7Cisg
ICAgICAgIGNzc1RyYW5zaXRpb25Ub1JlbW92ZS0+c2V0RWZmZWN0KG51bGxwdHIpOworICAgICAg
ICByZW1vdmVBbmltYXRpb24oY3NzVHJhbnNpdGlvblRvUmVtb3ZlLnJlbGVhc2VOb25OdWxsKCkp
OworICAgIH0KKworICAgIC8vIFJlbW92ZSB0aGUgbWFwIG9mIENTU1RyYW5zaXRpb25zIGJ5IHBy
b3BlcnR5IGZvciB0aGlzIGVsZW1lbnQgaWYgaXQncyBub3cgZW1wdHkuCisgICAgaWYgKGNzc1Ry
YW5zaXRpb25zQnlQcm9wZXJ0eS5pc0VtcHR5KCkpCisgICAgICAgIG1fZWxlbWVudFRvQ1NTVHJh
bnNpdGlvbkJ5Q1NTUHJvcGVydHlJRC5yZW1vdmUoJmVsZW1lbnQpOworfQorCiBTdHJpbmcgQW5p
bWF0aW9uVGltZWxpbmU6OmRlc2NyaXB0aW9uKCkKIHsKICAgICBUZXh0U3RyZWFtIHN0cmVhbTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2FuaW1hdGlvbi9BbmltYXRpb25UaW1lbGluZS5o
IGIvU291cmNlL1dlYkNvcmUvYW5pbWF0aW9uL0FuaW1hdGlvblRpbWVsaW5lLmgKaW5kZXggOTI0
NmUyMzNlODQxYzU0MWJkY2EyYWY0NjFhNGI4ZGYxOWJiZWE0ZS4uYzkzZDM3ZDlkZjE0YTRjZDI3
ZTVmOGRmZTY5NTA3MDdlN2JmY2RmNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYW5pbWF0
aW9uL0FuaW1hdGlvblRpbWVsaW5lLmgKKysrIGIvU291cmNlL1dlYkNvcmUvYW5pbWF0aW9uL0Fu
aW1hdGlvblRpbWVsaW5lLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNp
bmNsdWRlICJDU1NWYWx1ZS5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCiAjaW5jbHVkZSAi
V2ViQW5pbWF0aW9uLmgiCiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYv
SGFzaE1hcC5oPgpAQCAtMzcsOCArMzksOSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2Ns
YXNzIENTU0FuaW1hdGlvbjsKK2NsYXNzIENTU1RyYW5zaXRpb247CiBjbGFzcyBFbGVtZW50Owot
Y2xhc3MgV2ViQW5pbWF0aW9uOwogCiBjbGFzcyBBbmltYXRpb25UaW1lbGluZSA6IHB1YmxpYyBS
ZWZDb3VudGVkPEFuaW1hdGlvblRpbWVsaW5lPiB7CiBwdWJsaWM6CkBAIC01OCw2ICs2MSw5IEBA
IHB1YmxpYzoKICAgICB2b2lkIGFuaW1hdGlvbldhc0FkZGVkVG9FbGVtZW50KFdlYkFuaW1hdGlv
biYsIEVsZW1lbnQmKTsKICAgICB2b2lkIGFuaW1hdGlvbldhc1JlbW92ZWRGcm9tRWxlbWVudChX
ZWJBbmltYXRpb24mLCBFbGVtZW50Jik7CiAKKyAgICB2b2lkIHVwZGF0ZUNTU0FuaW1hdGlvbnNG
b3JFbGVtZW50KEVsZW1lbnQmLCBjb25zdCBSZW5kZXJTdHlsZSYgbmV3U3R5bGUsIGNvbnN0IFJl
bmRlclN0eWxlKiBvbGRTdHlsZSk7CisgICAgdm9pZCB1cGRhdGVDU1NUcmFuc2l0aW9uc0ZvckVs
ZW1lbnQoRWxlbWVudCYsIGNvbnN0IFJlbmRlclN0eWxlJiBuZXdTdHlsZSwgY29uc3QgUmVuZGVy
U3R5bGUqIG9sZFN0eWxlKTsKKwogICAgIHZpcnR1YWwgfkFuaW1hdGlvblRpbWVsaW5lKCk7CiAK
IHByb3RlY3RlZDoKQEAgLTY5LDEzICs3NSwyMiBAQCBwcm90ZWN0ZWQ6CiAKICAgICBleHBsaWNp
dCBBbmltYXRpb25UaW1lbGluZShDbGFzc1R5cGUpOwogCi0gICAgY29uc3QgSGFzaE1hcDxSZWZQ
dHI8RWxlbWVudD4sIFZlY3RvcjxSZWZQdHI8V2ViQW5pbWF0aW9uPj4+JiBlbGVtZW50VG9Bbmlt
YXRpb25zTWFwKCkgeyByZXR1cm4gbV9lbGVtZW50VG9BbmltYXRpb25zTWFwOyB9CisgICAgY29u
c3QgSGFzaE1hcDxFbGVtZW50KiwgVmVjdG9yPFJlZlB0cjxXZWJBbmltYXRpb24+Pj4mIGVsZW1l
bnRUb0FuaW1hdGlvbnNNYXAoKSB7IHJldHVybiBtX2VsZW1lbnRUb0FuaW1hdGlvbnNNYXA7IH0K
KyAgICBjb25zdCBIYXNoTWFwPEVsZW1lbnQqLCBWZWN0b3I8UmVmUHRyPFdlYkFuaW1hdGlvbj4+
PiYgZWxlbWVudFRvQ1NTQW5pbWF0aW9uc01hcCgpIHsgcmV0dXJuIG1fZWxlbWVudFRvQ1NTQW5p
bWF0aW9uc01hcDsgfQorICAgIGNvbnN0IEhhc2hNYXA8RWxlbWVudCosIFZlY3RvcjxSZWZQdHI8
V2ViQW5pbWF0aW9uPj4+JiBlbGVtZW50VG9DU1NUcmFuc2l0aW9uc01hcCgpIHsgcmV0dXJuIG1f
ZWxlbWVudFRvQ1NTVHJhbnNpdGlvbnNNYXA7IH0KIAogcHJpdmF0ZToKKyAgICBIYXNoTWFwPEVs
ZW1lbnQqLCBWZWN0b3I8UmVmUHRyPFdlYkFuaW1hdGlvbj4+PiYgcmVsZXZhbnRNYXBGb3JBbmlt
YXRpb24oV2ViQW5pbWF0aW9uJik7CisKICAgICBDbGFzc1R5cGUgbV9jbGFzc1R5cGU7CiAgICAg
c3RkOjpvcHRpb25hbDxTZWNvbmRzPiBtX2N1cnJlbnRUaW1lOwotICAgIEhhc2hNYXA8UmVmUHRy
PEVsZW1lbnQ+LCBWZWN0b3I8UmVmUHRyPFdlYkFuaW1hdGlvbj4+PiBtX2VsZW1lbnRUb0FuaW1h
dGlvbnNNYXA7CisgICAgSGFzaE1hcDxFbGVtZW50KiwgVmVjdG9yPFJlZlB0cjxXZWJBbmltYXRp
b24+Pj4gbV9lbGVtZW50VG9BbmltYXRpb25zTWFwOworICAgIEhhc2hNYXA8RWxlbWVudCosIFZl
Y3RvcjxSZWZQdHI8V2ViQW5pbWF0aW9uPj4+IG1fZWxlbWVudFRvQ1NTQW5pbWF0aW9uc01hcDsK
KyAgICBIYXNoTWFwPEVsZW1lbnQqLCBWZWN0b3I8UmVmUHRyPFdlYkFuaW1hdGlvbj4+PiBtX2Vs
ZW1lbnRUb0NTU1RyYW5zaXRpb25zTWFwOwogICAgIEhhc2hTZXQ8UmVmUHRyPFdlYkFuaW1hdGlv
bj4+IG1fYW5pbWF0aW9uczsKKworICAgIEhhc2hNYXA8RWxlbWVudCosIEhhc2hNYXA8U3RyaW5n
LCBSZWZQdHI8Q1NTQW5pbWF0aW9uPj4+IG1fZWxlbWVudFRvQ1NTQW5pbWF0aW9uQnlOYW1lOwor
ICAgIEhhc2hNYXA8RWxlbWVudCosIEhhc2hNYXA8Q1NTUHJvcGVydHlJRCwgUmVmUHRyPENTU1Ry
YW5zaXRpb24+Pj4gbV9lbGVtZW50VG9DU1NUcmFuc2l0aW9uQnlDU1NQcm9wZXJ0eUlEOwogfTsK
IAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYW5p
bWF0aW9uL0RvY3VtZW50VGltZWxpbmUuY3BwIGIvU291cmNlL1dlYkNvcmUvYW5pbWF0aW9uL0Rv
Y3VtZW50VGltZWxpbmUuY3BwCmluZGV4IGMwMGQ2YThhOTNlNGExYzMwYWQwNTczMGIzZjY2NDkw
N2UzZjYzZjEuLjI5YmEyYWVkNDc2NjkxNjg1OGZjNWQ2MzE3YmY4MGM5Njg0ZGIyNzYgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2FuaW1hdGlvbi9Eb2N1bWVudFRpbWVsaW5lLmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9hbmltYXRpb24vRG9jdW1lbnRUaW1lbGluZS5jcHAKQEAgLTI2LDYg
KzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJEb2N1bWVudFRpbWVsaW5l
LmgiCiAKKyNpbmNsdWRlICJBbmltYXRpb25QbGF5YmFja0V2ZW50LmgiCiAjaW5jbHVkZSAiQ2hy
b21lLmgiCiAjaW5jbHVkZSAiQ2hyb21lQ2xpZW50LmgiCiAjaW5jbHVkZSAiRE9NV2luZG93Lmgi
CkBAIC0xNjIsOSArMTYzLDEzIEBAIHZvaWQgRG9jdW1lbnRUaW1lbGluZTo6YW5pbWF0aW9uUmVz
b2x1dGlvblRpbWVyRmlyZWQoKQogCiB2b2lkIERvY3VtZW50VGltZWxpbmU6OnVwZGF0ZUFuaW1h
dGlvbnMoKQogewotICAgIGlmIChtX2RvY3VtZW50ICYmICFlbGVtZW50VG9BbmltYXRpb25zTWFw
KCkuaXNFbXB0eSgpKSB7CisgICAgaWYgKG1fZG9jdW1lbnQgJiYgKCFlbGVtZW50VG9BbmltYXRp
b25zTWFwKCkuaXNFbXB0eSgpIHx8ICFlbGVtZW50VG9DU1NBbmltYXRpb25zTWFwKCkuaXNFbXB0
eSgpIHx8ICFlbGVtZW50VG9DU1NUcmFuc2l0aW9uc01hcCgpLmlzRW1wdHkoKSkpIHsKICAgICAg
ICAgZm9yIChjb25zdCBhdXRvJiBlbGVtZW50VG9BbmltYXRpb25zTWFwSXRlbSA6IGVsZW1lbnRU
b0FuaW1hdGlvbnNNYXAoKSkKICAgICAgICAgICAgIGVsZW1lbnRUb0FuaW1hdGlvbnNNYXBJdGVt
LmtleS0+aW52YWxpZGF0ZVN0eWxlQW5kTGF5ZXJDb21wb3NpdGlvbigpOworICAgICAgICBmb3Ig
KGNvbnN0IGF1dG8mIGVsZW1lbnRUb0NTU0FuaW1hdGlvbnNNYXBJdGVtIDogZWxlbWVudFRvQ1NT
QW5pbWF0aW9uc01hcCgpKQorICAgICAgICAgICAgZWxlbWVudFRvQ1NTQW5pbWF0aW9uc01hcEl0
ZW0ua2V5LT5pbnZhbGlkYXRlU3R5bGVBbmRMYXllckNvbXBvc2l0aW9uKCk7CisgICAgICAgIGZv
ciAoY29uc3QgYXV0byYgZWxlbWVudFRvQ1NTVHJhbnNpdGlvbnNNYXBJdGVtIDogZWxlbWVudFRv
Q1NTVHJhbnNpdGlvbnNNYXAoKSkKKyAgICAgICAgICAgIGVsZW1lbnRUb0NTU1RyYW5zaXRpb25z
TWFwSXRlbS5rZXktPmludmFsaWRhdGVTdHlsZUFuZExheWVyQ29tcG9zaXRpb24oKTsKICAgICAg
ICAgbV9kb2N1bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOwogICAgIH0KIApAQCAtMTcyLDkg
KzE3Nyw2IEBAIHZvaWQgRG9jdW1lbnRUaW1lbGluZTo6dXBkYXRlQW5pbWF0aW9ucygpCiAgICAg
ICAgIGFuaW1hdGlvbi0+c3RhcnRPclN0b3BBY2NlbGVyYXRlZCgpOwogICAgIG1fYWNjZWxlcmF0
ZWRBbmltYXRpb25zUGVuZGluZ1J1bm5pbmdTdGF0ZUNoYW5nZS5jbGVhcigpOwogCi0gICAgZm9y
IChjb25zdCBhdXRvJiBhbmltYXRpb24gOiBhbmltYXRpb25zKCkpCi0gICAgICAgIGFuaW1hdGlv
bi0+dXBkYXRlRmluaXNoZWRTdGF0ZShXZWJBbmltYXRpb246OkRpZFNlZWs6Ok5vLCBXZWJBbmlt
YXRpb246OlN5bmNocm9ub3VzbHlOb3RpZnk6Ok5vKTsKLQogICAgIC8vIFRpbWUgaGFzIGFkdmFu
Y2VkLCB0aGUgdGltaW5nIG1vZGVsIHJlcXVpcmVzIGludmFsaWRhdGlvbiBub3cuCiAgICAgdGlt
aW5nTW9kZWxEaWRDaGFuZ2UoKTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0eWxl
L1N0eWxlVHJlZVJlc29sdmVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0eWxlL1N0eWxlVHJlZVJl
c29sdmVyLmNwcAppbmRleCBmZmE0OTgxMzEyOWFiYmQ5MWE4ODJkYzgwNDg2NWIxYTY5NDhjOGM2
Li4yMmZmMzk0ZjBlZGQxNzAzYTk4OGEyNmE2OGUxNzdlOTZkZTYxZWJmIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9zdHlsZS9TdHlsZVRyZWVSZXNvbHZlci5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvc3R5bGUvU3R5bGVUcmVlUmVzb2x2ZXIuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAjaW5j
bHVkZSAiUGxhdGZvcm1TdHJhdGVnaWVzLmgiCiAjaW5jbHVkZSAiUmVuZGVyRWxlbWVudC5oIgog
I2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVz
LmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNsdWRlICJTaGFkb3dSb290LmgiCiAjaW5j
bHVkZSAiU3R5bGVGb250U2l6ZUZ1bmN0aW9ucy5oIgpAQCAtMjg2LDcgKzI4NywyMSBAQCBFbGVt
ZW50VXBkYXRlIFRyZWVSZXNvbHZlcjo6Y3JlYXRlQW5pbWF0ZWRFbGVtZW50VXBkYXRlKHN0ZDo6
dW5pcXVlX3B0cjxSZW5kZXJTdAogewogICAgIGF1dG8qIG9sZFN0eWxlID0gcmVuZGVyT3JEaXNw
bGF5Q29udGVudHNTdHlsZShlbGVtZW50KTsKIAotICAgIGlmIChhdXRvIHRpbWVsaW5lID0gZWxl
bWVudC5kb2N1bWVudCgpLmV4aXN0aW5nVGltZWxpbmUoKSkgeworICAgIC8vIE5ldyBjb2RlIHBh
dGggZm9yIENTUyBBbmltYXRpb25zIGFuZCBDU1MgVHJhbnNpdGlvbnMuCisgICAgaWYgKFJ1bnRp
bWVFbmFibGVkRmVhdHVyZXM6OnNoYXJlZEZlYXR1cmVzKCkuY3NzQW5pbWF0aW9uc0FuZENTU1Ry
YW5zaXRpb25zQmFja2VkQnlXZWJBbmltYXRpb25zRW5hYmxlZCgpKSB7CisgICAgICAgIC8vIEZp
cnN0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSBuZXcgQ1NTIGFuaW1hdGlvbiBvY2N1
cmluZyBvbiB0aGlzIGVsZW1lbnQgaGFzIGEgbWF0Y2hpbmcgV2ViQW5pbWF0aW9uCisgICAgICAg
IC8vIG9uIHRoZSBkb2N1bWVudCB0aW1lbGluZS4gTm90ZSB0aGF0IHdlIGdldCB0aW1lbGluZSgp
IG9uIHRoZSBEb2N1bWVudCBoZXJlIGJlY2F1c2Ugd2UgbmVlZCBhIHRpbWVsaW5lIGNyZWF0ZWQK
KyAgICAgICAgLy8gaW4gY2FzZSBubyBXZWIgQW5pbWF0aW9ucyBoYXZlIGJlZW4gY3JlYXRlZCB0
aHJvdWdoIHRoZSBKUyBBUEkuCisgICAgICAgIGlmICgob2xkU3R5bGUgJiYgb2xkU3R5bGUtPmhh
c0FuaW1hdGlvbnMoKSkgfHwgbmV3U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSkKKyAgICAgICAgICAg
IG1fZG9jdW1lbnQudGltZWxpbmUoKS51cGRhdGVDU1NBbmltYXRpb25zRm9yRWxlbWVudChlbGVt
ZW50LCAqbmV3U3R5bGUsIG9sZFN0eWxlKTsKKworICAgICAgICBpZiAoKG9sZFN0eWxlICYmIG9s
ZFN0eWxlLT5oYXNUcmFuc2l0aW9ucygpKSB8fCBuZXdTdHlsZS0+aGFzVHJhbnNpdGlvbnMoKSkK
KyAgICAgICAgICAgIG1fZG9jdW1lbnQudGltZWxpbmUoKS51cGRhdGVDU1NUcmFuc2l0aW9uc0Zv
ckVsZW1lbnQoZWxlbWVudCwgKm5ld1N0eWxlLCBvbGRTdHlsZSk7CisgICAgfQorCisgICAgaWYg
KGF1dG8gdGltZWxpbmUgPSBtX2RvY3VtZW50LmV4aXN0aW5nVGltZWxpbmUoKSkgeworICAgICAg
ICAvLyBOb3cgd2UgY2FuIHVwZGF0ZSBhbGwgV2ViIGFuaW1hdGlvbnMsIHdoaWNoIHdpbGwgaW5j
bHVkZSBDU1MgQW5pbWF0aW9ucyBhcyB3ZWxsCisgICAgICAgIC8vIGFzIGFuaW1hdGlvbnMgY3Jl
YXRlZCB2aWEgdGhlIEpTIEFQSS4KICAgICAgICAgYXV0byB3ZWJBbmltYXRpb25zID0gdGltZWxp
bmUtPmFuaW1hdGlvbnNGb3JFbGVtZW50KGVsZW1lbnQpOwogICAgICAgICBpZiAoIXdlYkFuaW1h
dGlvbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBhdXRvIGFuaW1hdGVkU3R5bGUgPSBSZW5k
ZXJTdHlsZTo6Y2xvbmVQdHIoKm5ld1N0eWxlKTsKQEAgLTI5NiwxMiArMzExLDE4IEBAIEVsZW1l
bnRVcGRhdGUgVHJlZVJlc29sdmVyOjpjcmVhdGVBbmltYXRlZEVsZW1lbnRVcGRhdGUoc3RkOjp1
bmlxdWVfcHRyPFJlbmRlclN0CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBhdXRvJiBhbmltYXRp
b25Db250cm9sbGVyID0gbV9kb2N1bWVudC5mcmFtZSgpLT5hbmltYXRpb24oKTsKKyAgICBib29s
IHNob3VsZFJlY29tcG9zaXRlTGF5ZXIgPSBmYWxzZTsKIAotICAgIGF1dG8gYW5pbWF0aW9uVXBk
YXRlID0gYW5pbWF0aW9uQ29udHJvbGxlci51cGRhdGVBbmltYXRpb25zKGVsZW1lbnQsICpuZXdT
dHlsZSwgb2xkU3R5bGUpOworICAgIC8vIE9sZCBjb2RlIHBhdGggZm9yIENTUyBBbmltYXRpb25z
IGFuZCBDU1MgVHJhbnNpdGlvbnMuCisgICAgaWYgKCFSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpz
aGFyZWRGZWF0dXJlcygpLmNzc0FuaW1hdGlvbnNBbmRDU1NUcmFuc2l0aW9uc0JhY2tlZEJ5V2Vi
QW5pbWF0aW9uc0VuYWJsZWQoKSkgeworICAgICAgICBhdXRvJiBhbmltYXRpb25Db250cm9sbGVy
ID0gbV9kb2N1bWVudC5mcmFtZSgpLT5hbmltYXRpb24oKTsKIAotICAgIGlmIChhbmltYXRpb25V
cGRhdGUuc3R5bGUpCi0gICAgICAgIG5ld1N0eWxlID0gV1RGTW92ZShhbmltYXRpb25VcGRhdGUu
c3R5bGUpOworICAgICAgICBhdXRvIGFuaW1hdGlvblVwZGF0ZSA9IGFuaW1hdGlvbkNvbnRyb2xs
ZXIudXBkYXRlQW5pbWF0aW9ucyhlbGVtZW50LCAqbmV3U3R5bGUsIG9sZFN0eWxlKTsKKyAgICAg
ICAgc2hvdWxkUmVjb21wb3NpdGVMYXllciA9IGFuaW1hdGlvblVwZGF0ZS5zdGF0ZUNoYW5nZWQ7
CisKKyAgICAgICAgaWYgKGFuaW1hdGlvblVwZGF0ZS5zdHlsZSkKKyAgICAgICAgICAgIG5ld1N0
eWxlID0gV1RGTW92ZShhbmltYXRpb25VcGRhdGUuc3R5bGUpOworICAgIH0KIAogICAgIGF1dG8g
Y2hhbmdlID0gb2xkU3R5bGUgPyBkZXRlcm1pbmVDaGFuZ2UoKm9sZFN0eWxlLCAqbmV3U3R5bGUp
IDogRGV0YWNoOwogCkBAIC0zMDksNyArMzMwLDcgQEAgRWxlbWVudFVwZGF0ZSBUcmVlUmVzb2x2
ZXI6OmNyZWF0ZUFuaW1hdGVkRWxlbWVudFVwZGF0ZShzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyU3QK
ICAgICBpZiAodmFsaWRpdHkgPj0gVmFsaWRpdHk6OlN1YnRyZWVBbmRSZW5kZXJlcnNJbnZhbGlk
IHx8IHBhcmVudENoYW5nZSA9PSBEZXRhY2gpCiAgICAgICAgIGNoYW5nZSA9IERldGFjaDsKIAot
ICAgIGJvb2wgc2hvdWxkUmVjb21wb3NpdGVMYXllciA9IGVsZW1lbnQuc3R5bGVSZXNvbHV0aW9u
U2hvdWxkUmVjb21wb3NpdGVMYXllcigpIHx8IGFuaW1hdGlvblVwZGF0ZS5zdGF0ZUNoYW5nZWQ7
CisgICAgc2hvdWxkUmVjb21wb3NpdGVMYXllciA9IGVsZW1lbnQuc3R5bGVSZXNvbHV0aW9uU2hv
dWxkUmVjb21wb3NpdGVMYXllcigpIHx8IHNob3VsZFJlY29tcG9zaXRlTGF5ZXI7CiAKICAgICBy
ZXR1cm4geyBXVEZNb3ZlKG5ld1N0eWxlKSwgY2hhbmdlLCBzaG91bGRSZWNvbXBvc2l0ZUxheWVy
IH07CiB9CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cgYi9MYXlvdXRUZXN0cy9D
aGFuZ2VMb2cKaW5kZXggYjMxNDYyZmZiN2IzZTUyNzI3NzMxZjA1NzBhNTM1MWI1NWRkNzhlNi4u
N2JmZWJhZTE2MTUzODcwY2M1NGIxNTcwNmMxYjU1MjM4NDZiZjQzMyAxMDA2NDQKLS0tIGEvTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwpAQCAtMSwzICsx
LDE4IEBACisyMDE4LTAzLTExICBBbnRvaW5lIFF1aW50ICA8Z3Jhb3V0c0BhcHBsZS5jb20+CisK
KyAgICAgICAgW1dlYiBBbmltYXRpb25zXSBDcmVhdGUsIHVwZGF0ZSBhbmQgcmVtb3ZlIENTU0Fu
aW1hdGlvbiBhbmQgQ1NTVHJhbnNpdGlvbiBvYmplY3RzIG9uIHRoZSBEb2N1bWVudFRpbWVsaW5l
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODM1NTgK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgYSBz
ZXJpZXMgb2YgbmV3IHRlc3RzIHRvIGNoZWNrIENTU0FuaW1hdGlvbiBhbmQgQ1NTVHJhbnNpdGlv
biBvYmplY3RzIGFyZSBjb3JyZWN0bHkgY3JlYXRlZCBhcyBDU1MKKyAgICAgICAgYW5pbWF0aW9u
LSogYW5kIENTUyB0cmFuc2l0aW9uLSogcHJvcGVydGllcyBhcmUgdXNlZC4KKworICAgICAgICAq
IHdlYmFuaW1hdGlvbnMvY3NzLWFuaW1hdGlvbnMtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAg
ICAgKiB3ZWJhbmltYXRpb25zL2Nzcy1hbmltYXRpb25zLmh0bWw6IEFkZGVkLgorICAgICAgICAq
IHdlYmFuaW1hdGlvbnMvY3NzLXRyYW5zaXRpb25zLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAg
ICAgICogd2ViYW5pbWF0aW9ucy9jc3MtdHJhbnNpdGlvbnMuaHRtbDogQWRkZWQuCisKIDIwMTgt
MDMtMDkgIFphbGFuIEJ1anRhcyAgPHphbGFuQGFwcGxlLmNvbT4KIAogICAgICAgICBUdXJuIG9m
ZiBvZmZzZXQqL3Njcm9sbCogb3B0aW1pemF0aW9uIGZvciBpbnB1dCBlbGVtZW50cyB3aXRoIHNo
YWRvdyBjb250ZW50CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhbmltYXRpb25zL2Nzcy1h
bmltYXRpb25zLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL3dlYmFuaW1hdGlvbnMvY3NzLWFu
aW1hdGlvbnMtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjAxNDU1MmI1NWQwMjlmNTIwZmQ3NWJm
MDRlMWMyZmNlYzVkYTlmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhbmlt
YXRpb25zL2Nzcy1hbmltYXRpb25zLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDE2IEBACisKK1BB
U1MgQSBDU1MgQW5pbWF0aW9uIHNob3VsZCBiZSByZWZsZWN0ZWQgZW50aXJlbHkgYXMgYSBDU1NB
bmltYXRpb24gb2JqZWN0IG9uIHRoZSB0aW1lbGluZS4gCitQQVNTIFdlYiBBbmltYXRpb25zIHNo
b3VsZCByZWZsZWN0IHRoZSBhbmltYXRpb24tZGVsYXkgcHJvcGVydHkuIAorUEFTUyBXZWIgQW5p
bWF0aW9ucyBzaG91bGQgcmVmbGVjdCB0aGUgYW5pbWF0aW9uLWRpcmVjdGlvbiBwcm9wZXJ0eS4g
CitQQVNTIFdlYiBBbmltYXRpb25zIHNob3VsZCByZWZsZWN0IHRoZSBhbmltYXRpb24tZHVyYXRp
b24gcHJvcGVydHkuIAorUEFTUyBXZWIgQW5pbWF0aW9ucyBzaG91bGQgcmVmbGVjdCB0aGUgYW5p
bWF0aW9uLWZpbGwtbW9kZSBwcm9wZXJ0eS4gCitQQVNTIFdlYiBBbmltYXRpb25zIHNob3VsZCBy
ZWZsZWN0IHRoZSBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50IHByb3BlcnR5LiAKK1BBU1MgV2Vi
IEFuaW1hdGlvbnMgc2hvdWxkIHJlZmxlY3QgdGhlIGFuaW1hdGlvbi1uYW1lIHByb3BlcnR5LiAK
K1BBU1MgV2ViIEFuaW1hdGlvbnMgc2hvdWxkIHJlZmxlY3QgdGhlIGFuaW1hdGlvbi1wbGF5LXN0
YXRlIHByb3BlcnR5LiAKK1BBU1MgV2ViIEFuaW1hdGlvbnMgc2hvdWxkIHJlZmxlY3QgdGhlIGFu
aW1hdGlvbi10aW1pbmctZnVuY3Rpb24gcHJvcGVydHkuIAorUEFTUyBDYWxsaW5nIGZpbmlzaCgp
IG9uIHRoZSBhbmltYXRpb24gbm8gbG9uZ2VyIGxpc3RzIHRoZSBhbmltYXRpb24gYWZ0ZXIgaXQg
aGFzIGJlZW4gcnVubmluZy4gCitQQVNTIFNlZWtpbmcgdGhlIGFuaW1hdGlvbiB0byBpdHMgZW5k
IHRpbWUgbm8gbG9uZ2VyIGxpc3RzIHRoZSBhbmltYXRpb24gYWZ0ZXIgaXQgaGFzIGJlZW4gcnVu
bmluZy4gCitQQVNTIFNlZWtpbmcgdGhlIGFuaW1hdGlvbiB0byBiZWZvcmUgaXRzIHN0YXJ0IHRp
bWUgbm8gbG9uZ2VyIGxpc3RzIHRoZSBhbmltYXRpb24gYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmlu
Zy4gCitQQVNTIFNldHRpbmcgdGhlIHRhcmdldCdzIGFuaW1hdGlvbi1uYW1lIHRvIG5vbmUgbm8g
bG9uZ2VyIGxpc3RzIHRoZSBhbmltYXRpb24gYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmluZy4gCitQ
QVNTIFNldHRpbmcgdGhlIHRhcmdldCdzIGFuaW1hdGlvbi1kdXJhdGlvbiB0byAwIG5vIGxvbmdl
ciBsaXN0cyB0aGUgYW5pbWF0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIHJ1bm5pbmcuIAorCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhbmltYXRpb25zL2Nzcy1hbmltYXRpb25zLmh0bWwgYi9M
YXlvdXRUZXN0cy93ZWJhbmltYXRpb25zL2Nzcy1hbmltYXRpb25zLmh0bWwKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YTc1ZWJlMTg4YmIxNThkY2FiOWM4NTdlN2RiYTgwNTBjODE5OTYwYgotLS0gL2Rldi9udWxsCisr
KyBiL0xheW91dFRlc3RzL3dlYmFuaW1hdGlvbnMvY3NzLWFuaW1hdGlvbnMuaHRtbApAQCAtMCww
ICsxLDIyOCBAQAorPCFET0NUWVBFIGh0bWw+PCEtLSB3ZWJraXQtdGVzdC1ydW5uZXIgWyBlbmFi
bGVDU1NBbmltYXRpb25zQW5kQ1NTVHJhbnNpdGlvbnNCYWNrZWRCeVdlYkFuaW1hdGlvbnM9dHJ1
ZSBdIC0tPgorPG1ldGEgY2hhcnNldD11dGYtOD4KKzx0aXRsZT5DU1MgQW5pbWF0aW9uczwvdGl0
bGU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgorCitAa2V5ZnJhbWVz
IGFuaW1hdGlvbiB7CisgICAgZnJvbSB7IGxlZnQ6IDUwcHg7IH0KKyAgICB0byB7IGxlZnQ6IDEw
MHB4OyB9Cit9CisKK0BrZXlmcmFtZXMgYW5pbWF0aW9uLXRvcCB7CisgICAgZnJvbSB7IHRvcDog
NTBweDsgfQorICAgIHRvIHsgdG9wOiAxMDBweDsgfQorfQorCis8L3N0eWxlPgorPGJvZHk+Cis8
c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL3Rlc3RoYXJuZXNzLmpzIj48L3NjcmlwdD4KKzxzY3Jp
cHQgc3JjPSIuLi9yZXNvdXJjZXMvdGVzdGhhcm5lc3NyZXBvcnQuanMiPjwvc2NyaXB0PgorPHNj
cmlwdD4KKworJ3VzZSBzdHJpY3QnOworCitmdW5jdGlvbiB0YXJnZXRUZXN0KHRlc3RDYWxsYmFj
aywgZGVzY3JpcHRpb24pCit7CisgICAgdGVzdCgoKSA9PiB7CisgICAgICAgIGNvbnN0IHRhcmdl
dCA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2
IikpOworICAgICAgICB0ZXN0Q2FsbGJhY2sodGFyZ2V0KTsKKyAgICAgICAgdGFyZ2V0LnJlbW92
ZSgpOworICAgIH0sIGRlc2NyaXB0aW9uKTsKK30KKwordGFyZ2V0VGVzdCh0YXJnZXQgPT4gewor
ICAgIGFzc2VydF9hcnJheV9lcXVhbHModGFyZ2V0LmdldEFuaW1hdGlvbnMoKSwgW10sICJBbiBl
bGVtZW50IHNob3VsZCBub3QgaGF2ZSBhbnkgYW5pbWF0aW9ucyBpbml0aWFsbHkuIik7CisKKyAg
ICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uRGVsYXkgPSAiLTNzIjsKKyAgICB0YXJnZXQuc3R5bGUu
YW5pbWF0aW9uRHVyYXRpb24gPSAiMnMiOworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25UaW1p
bmdGdW5jdGlvbiA9ICJsaW5lYXIiOworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25GaWxsTW9k
ZSA9ICJmb3J3YXJkcyI7CisgICAgdGFyZ2V0LnN0eWxlLmFuaW1hdGlvbkRpcmVjdGlvbiA9ICJh
bHRlcm5hdGUiOworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25JdGVyYXRpb25Db3VudCA9ICIy
IjsKKyAgICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uTmFtZSA9ICJhbmltYXRpb24iOworCisgICAg
Y29uc3QgYW5pbWF0aW9uID0gdGFyZ2V0LmdldEFuaW1hdGlvbnMoKVswXTsKKyAgICBhc3NlcnRf
dHJ1ZShhbmltYXRpb24gaW5zdGFuY2VvZiBDU1NBbmltYXRpb24sICJUaGUgYW5pbWF0aW9uIGlz
IGEgQ1NTQW5pbWF0aW9uLiIpOworICAgIGFzc2VydF90cnVlKGFuaW1hdGlvbiBpbnN0YW5jZW9m
IEFuaW1hdGlvbiwgIlRoZSBhbmltYXRpb24gaXMgYW4gQW5pbWF0aW9uLiIpOworICAgIGFzc2Vy
dF9lcXVhbHMoYW5pbWF0aW9uLnRpbWVsaW5lLCB0YXJnZXQub3duZXJEb2N1bWVudC50aW1lbGlu
ZSwgIlRoZSBhbmltYXRpb24ncyB0aW1lbGluZSBpcyBzZXQgdG8gdGhlIGVsZW1lbnQncyBkb2N1
bWVudCB0aW1lbGluZS4iKTsKKyAgICBhc3NlcnRfZXF1YWxzKGFuaW1hdGlvbi5wbGF5U3RhdGUs
ICJydW5uaW5nIiwgIlRoZSBhbmltYXRpb24gaXMgcnVubmluZyBhcyBzb29uIGFzIGl0J3MgY3Jl
YXRlZC4iKTsKKyAgICBhc3NlcnRfZXF1YWxzKGFuaW1hdGlvbi5hbmltYXRpb25OYW1lLCAiYW5p
bWF0aW9uIiwgIlRoZSBhbmltYXRpb24ncyBhbmltYXRpb25OYW1lIGlzIHNldC4iKTsKKworICAg
IGNvbnN0IGVmZmVjdCA9IGFuaW1hdGlvbi5lZmZlY3Q7CisgICAgYXNzZXJ0X3RydWUoZWZmZWN0
IGluc3RhbmNlb2YgS2V5ZnJhbWVFZmZlY3RSZWFkT25seSwgIlRoZSBhbmltYXRpb24ncyBlZmZl
Y3QgaXMgYSBLZXlmcmFtZUVmZmVjdFJlYWRPbmx5LiIpOworICAgIGFzc2VydF9mYWxzZShlZmZl
Y3QgaW5zdGFuY2VvZiBLZXlmcmFtZUVmZmVjdCwgIlRoZSBhbmltYXRpb24ncyBlZmZlY3QgaXMg
bm90IGEgS2V5ZnJhbWVFZmZlY3QuIik7CisgICAgYXNzZXJ0X2VxdWFscyhlZmZlY3QudGFyZ2V0
LCB0YXJnZXQsICJUaGUgYW5pbWF0aW9uJ3MgZWZmZWN0IGlzIHRhcmdldGluZyB0aGUgdGFyZ2V0
LiIpOworCisgICAgY29uc3QgdGltaW5nID0gYW5pbWF0aW9uLmVmZmVjdC50aW1pbmc7CisgICAg
YXNzZXJ0X2VxdWFscyh0aW1pbmcuZmlsbCwgImZvcndhcmRzIiwgIlRoZSBhbmltYXRpb24ncyBm
aWxsIHByb3BlcnR5IG1hdGNoZXMgdGhlIGFuaW1hdGlvbi1maWxsLW1vZGUgcHJvcGVydHkuIik7
CisgICAgYXNzZXJ0X2VxdWFscyh0aW1pbmcuZGVsYXksIC0zMDAwLCAiVGhlIGFuaW1hdGlvbidz
IGRlbGF5IHByb3BlcnR5IG1hdGNoZXMgdGhlIGFuaW1hdGlvbi1kZWxheSBwcm9wZXJ0eS4iKTsK
KyAgICBhc3NlcnRfZXF1YWxzKHRpbWluZy5kdXJhdGlvbiwgMjAwMCwgIlRoZSBhbmltYXRpb24n
cyBkdXJhdGlvbiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBhbmltYXRpb24tZHVyYXRpb24gcHJvcGVy
dHkuIik7CisgICAgYXNzZXJ0X2VxdWFscyh0aW1pbmcuaXRlcmF0aW9ucywgMiwgIlRoZSBhbmlt
YXRpb24ncyBpdGVyYXRpb25zIHByb3BlcnR5IG1hdGNoZXMgdGhlIGFuaW1hdGlvbi1pdGVyYXRp
b24tY291bnQgcHJvcGVydHkuIik7CisgICAgYXNzZXJ0X2VxdWFscyh0aW1pbmcuZGlyZWN0aW9u
LCAiYWx0ZXJuYXRlIiwgIlRoZSBhbmltYXRpb24ncyBkaXJlY3Rpb24gcHJvcGVydHkgbWF0Y2hl
cyB0aGUgYW5pbWF0aW9uLWRpcmVjdGlvbiBwcm9wZXJ0eS4iKTsKKyAgICBhc3NlcnRfZXF1YWxz
KHRpbWluZy5lYXNpbmcsICJsaW5lYXIiLCAiVGhlIGFuaW1hdGlvbidzIGVhc2luZyBwcm9wZXJ0
eSBtYXRjaGVzIHRoZSBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIHByb3BlcnR5LiIpOworCisg
ICAgY29uc3QgY29tcHV0ZWRUaW1pbmcgPSBhbmltYXRpb24uZWZmZWN0LmdldENvbXB1dGVkVGlt
aW5nKCk7CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWluZy5hY3RpdmVEdXJhdGlvbiwg
NDAwMCwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGltaW5nIGFjdGl2ZUR1cmF0aW9uIHBy
b3BlcnR5IG1hdGNoZXMgdGhlIHByb3BlcnRpZXMgc2V0IGJ5IENTUyIpOworICAgIGFzc2VydF9l
cXVhbHMoY29tcHV0ZWRUaW1pbmcuY3VycmVudEl0ZXJhdGlvbiwgMSwgIlRoZSBhbmltYXRpb25z
J3MgY29tcHV0ZWQgdGltaW5nIGN1cnJlbnRJdGVyYXRpb24gcHJvcGVydHkgbWF0Y2hlcyB0aGUg
cHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWlu
Zy5kZWxheSwgLTMwMDAsICJUaGUgYW5pbWF0aW9ucydzIGNvbXB1dGVkIHRpbWluZyBkZWxheSBw
cm9wZXJ0eSBtYXRjaGVzIHRoZSBwcm9wZXJ0aWVzIHNldCBieSBDU1MiKTsKKyAgICBhc3NlcnRf
ZXF1YWxzKGNvbXB1dGVkVGltaW5nLmR1cmF0aW9uLCAyMDAwLCAiVGhlIGFuaW1hdGlvbnMncyBj
b21wdXRlZCB0aW1pbmcgZHVyYXRpb24gcHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBz
ZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWluZy5lbmREZWxheSwg
MCwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGltaW5nIGVuZERlbGF5IHByb3BlcnR5IG1h
dGNoZXMgdGhlIHByb3BlcnRpZXMgc2V0IGJ5IENTUyIpOworICAgIGFzc2VydF9lcXVhbHMoY29t
cHV0ZWRUaW1pbmcuZW5kVGltZSwgMTAwMCwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGlt
aW5nIGVuZFRpbWUgcHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7
CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWluZy5pdGVyYXRpb25TdGFydCwgMCwgIlRo
ZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGltaW5nIGl0ZXJhdGlvblN0YXJ0IHByb3BlcnR5IG1h
dGNoZXMgdGhlIHByb3BlcnRpZXMgc2V0IGJ5IENTUyIpOworICAgIGFzc2VydF9lcXVhbHMoY29t
cHV0ZWRUaW1pbmcuaXRlcmF0aW9ucywgMiwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGlt
aW5nIGl0ZXJhdGlvbnMgcHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NT
Iik7CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWluZy5sb2NhbFRpbWUsIDAsICJUaGUg
YW5pbWF0aW9ucydzIGNvbXB1dGVkIHRpbWluZyBsb2NhbFRpbWUgcHJvcGVydHkgbWF0Y2hlcyB0
aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRp
bWluZy5wcm9ncmVzcywgMC41LCAiVGhlIGFuaW1hdGlvbnMncyBjb21wdXRlZCB0aW1pbmcgcHJv
Z3Jlc3MgcHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAg
YXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWluZy5maWxsLCAiZm9yd2FyZHMiLCAiVGhlIGFuaW1h
dGlvbnMncyBjb21wdXRlZCB0aW1pbmcgZmlsbCBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBwcm9wZXJ0
aWVzIHNldCBieSBDU1MiKTsKKyAgICBhc3NlcnRfZXF1YWxzKGNvbXB1dGVkVGltaW5nLmVhc2lu
ZywgImxpbmVhciIsICJUaGUgYW5pbWF0aW9ucydzIGNvbXB1dGVkIHRpbWluZyBlYXNpbmcgcHJv
cGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0X2Vx
dWFscyhjb21wdXRlZFRpbWluZy5kaXJlY3Rpb24sICJhbHRlcm5hdGUiLCAiVGhlIGFuaW1hdGlv
bnMncyBjb21wdXRlZCB0aW1pbmcgZGlyZWN0aW9uIHByb3BlcnR5IG1hdGNoZXMgdGhlIHByb3Bl
cnRpZXMgc2V0IGJ5IENTUyIpOworCisgICAgY29uc3Qga2V5ZnJhbWVzID0gYW5pbWF0aW9uLmVm
ZmVjdC5nZXRLZXlmcmFtZXMoKTsKKyAgICBhc3NlcnRfZXF1YWxzKGtleWZyYW1lcy5sZW5ndGgs
IDIsICJUaGUgYW5pbWF0aW9uJ3MgZWZmZWN0IGhhcyB0d28ga2V5ZnJhbWVzLiIpOworICAgIGFz
c2VydF9lcXVhbHMoa2V5ZnJhbWVzWzBdLm9mZnNldCwgMCwgIlRoZSBhbmltYXRpb24ncyBlZmZl
Y3QncyBmaXJzdCBrZXlmcmFtZSBoYXMgYSAwIG9mZnNldC4iKTsKKyAgICBhc3NlcnRfZXF1YWxz
KGtleWZyYW1lc1swXS5sZWZ0LCAiNTBweCIsICJUaGUgYW5pbWF0aW9uJ3MgZWZmZWN0J3MgZmly
c3Qga2V5ZnJhbWUgaGFzIGl0cyBsZWZ0IHByb3BlcnR5IHNldCB0byA1MHB4LiIpOworICAgIGFz
c2VydF9lcXVhbHMoa2V5ZnJhbWVzWzFdLm9mZnNldCwgMSwgIlRoZSBhbmltYXRpb24ncyBlZmZl
Y3QncyBmaXJzdCBrZXlmcmFtZSBoYXMgYSAxIG9mZnNldC4iKTsKKyAgICBhc3NlcnRfZXF1YWxz
KGtleWZyYW1lc1sxXS5sZWZ0LCAiMTAwcHgiLCAiVGhlIGFuaW1hdGlvbidzIGVmZmVjdCdzIGZp
cnN0IGtleWZyYW1lIGhhcyBpdHMgbGVmdCBwcm9wZXJ0eSBzZXQgdG8gMTAwcHguIik7CisKKyAg
ICBhc3NlcnRfZXF1YWxzKGdldENvbXB1dGVkU3R5bGUoZWZmZWN0LnRhcmdldCkubGVmdCwgIjc1
cHgiLCAiVGhlIGFuaW1hdGlvbidzIHRhcmdldCdzIGNvbXB1dGVkIHN0eWxlIHJlZmxlY3RzIHRo
ZSBhbmltYXRpb24gc3RhdGUuIik7Cit9LCAiQSBDU1MgQW5pbWF0aW9uIHNob3VsZCBiZSByZWZs
ZWN0ZWQgZW50aXJlbHkgYXMgYSBDU1NBbmltYXRpb24gb2JqZWN0IG9uIHRoZSB0aW1lbGluZS4i
KTsKKwordGFyZ2V0VGVzdCh0YXJnZXQgPT4geworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25E
ZWxheSA9ICItMXMiOworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9ICIycyI7
CisgICAgdGFyZ2V0LnN0eWxlLmFuaW1hdGlvbk5hbWUgPSAiYW5pbWF0aW9uIjsKKworICAgIGFz
c2VydF9lcXVhbHModGFyZ2V0LmdldEFuaW1hdGlvbnMoKVswXS5lZmZlY3QudGltaW5nLmRlbGF5
LCAtMTAwMCwgIlRoZSBhbmltYXRpb24ncyBkZWxheSBtYXRjaGVzIHRoZSBpbml0aWFsIGFuaW1h
dGlvbi1kZWxheSBwcm9wZXJ0eS4iKTsKKworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25EZWxh
eSA9IDA7CisgICAgYXNzZXJ0X2VxdWFscyh0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdLmVmZmVj
dC50aW1pbmcuZGVsYXksIDAsICJUaGUgYW5pbWF0aW9uJ3MgZGVsYXkgbWF0Y2hlcyB0aGUgdXBk
YXRlZCBhbmltYXRpb24tZGVsYXkgcHJvcGVydHkuIik7Cit9LCAiV2ViIEFuaW1hdGlvbnMgc2hv
dWxkIHJlZmxlY3QgdGhlIGFuaW1hdGlvbi1kZWxheSBwcm9wZXJ0eS4iKTsKKwordGFyZ2V0VGVz
dCh0YXJnZXQgPT4geworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9ICIycyI7
CisgICAgdGFyZ2V0LnN0eWxlLmFuaW1hdGlvbk5hbWUgPSAiYW5pbWF0aW9uIjsKKworICAgIGZv
ciAobGV0IGRpcmVjdGlvbiBvZiBbInJldmVyc2UiLCAiYWx0ZXJuYXRlIiwgIm5vcm1hbCIsICJh
bHRlcm5hdGUtcmV2ZXJzZSJdKSB7CisgICAgICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25EaXJl
Y3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIGFzc2VydF9lcXVhbHModGFyZ2V0LmdldEFuaW1h
dGlvbnMoKVswXS5lZmZlY3QudGltaW5nLmRpcmVjdGlvbiwgZGlyZWN0aW9uLCBgVGhlIGFuaW1h
dGlvbidzIGRpcmVjdGlvbiBtYXRjaGVzIHRoZSAiJHtkaXJlY3Rpb259IiBDU1MgdmFsdWUuYCk7
CisgICAgfQorCisgICAgdGFyZ2V0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJhbmltYXRpb24tZGly
ZWN0aW9uIik7CisgICAgYXNzZXJ0X2VxdWFscyh0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdLmVm
ZmVjdC50aW1pbmcuZGlyZWN0aW9uLCAibm9ybWFsIiwgIlRoZSBhbmltYXRpb24ncyBlYXNpbmcg
bWF0Y2hlcyB0aGUgZGVmYXVsdCBhbmltYXRpb24tZGlyZWN0aW9uIHZhbHVlIHdoZW4gdGhlIHBy
b3BlcnR5IGlzIG5vdCBzZXQuIik7Cit9LCAiV2ViIEFuaW1hdGlvbnMgc2hvdWxkIHJlZmxlY3Qg
dGhlIGFuaW1hdGlvbi1kaXJlY3Rpb24gcHJvcGVydHkuIik7CisKK3RhcmdldFRlc3QodGFyZ2V0
ID0+IHsKKyAgICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uRHVyYXRpb24gPSAiMnMiOworICAgIHRh
cmdldC5zdHlsZS5hbmltYXRpb25OYW1lID0gImFuaW1hdGlvbiI7CisKKyAgICBhc3NlcnRfZXF1
YWxzKHRhcmdldC5nZXRBbmltYXRpb25zKClbMF0uZWZmZWN0LnRpbWluZy5kdXJhdGlvbiwgMjAw
MCwgIlRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiBtYXRjaGVzIHRoZSBpbml0aWFsIGFuaW1hdGlv
bi1kdXJhdGlvbiBwcm9wZXJ0eS4iKTsKKworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25EdXJh
dGlvbiA9ICIxcyI7CisgICAgYXNzZXJ0X2VxdWFscyh0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBd
LmVmZmVjdC50aW1pbmcuZHVyYXRpb24sIDEwMDAsICJUaGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24g
bWF0Y2hlcyB0aGUgdXBkYXRlZCBhbmltYXRpb24tZHVyYXRpb24gcHJvcGVydHkuIik7Cit9LCAi
V2ViIEFuaW1hdGlvbnMgc2hvdWxkIHJlZmxlY3QgdGhlIGFuaW1hdGlvbi1kdXJhdGlvbiBwcm9w
ZXJ0eS4iKTsKKwordGFyZ2V0VGVzdCh0YXJnZXQgPT4geworICAgIHRhcmdldC5zdHlsZS5hbmlt
YXRpb25EdXJhdGlvbiA9ICIycyI7CisgICAgdGFyZ2V0LnN0eWxlLmFuaW1hdGlvbk5hbWUgPSAi
YW5pbWF0aW9uIjsKKworICAgIGZvciAobGV0IGZpbGxNb2RlIG9mIFsiZm9yd2FyZHMiLCAiYmFj
a3dhcmRzIiwgIm5vbmUiLCAiYm90aCJdKSB7CisgICAgICAgIHRhcmdldC5zdHlsZS5hbmltYXRp
b25GaWxsTW9kZSA9IGZpbGxNb2RlOworICAgICAgICBhc3NlcnRfZXF1YWxzKHRhcmdldC5nZXRB
bmltYXRpb25zKClbMF0uZWZmZWN0LnRpbWluZy5maWxsLCBmaWxsTW9kZSwgYFRoZSBhbmltYXRp
b24ncyBmaWxsIG1vZGUgbWF0Y2hlcyB0aGUgIiR7ZmlsbE1vZGV9IiBDU1MgdmFsdWUuYCk7Cisg
ICAgfQorCisgICAgdGFyZ2V0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJhbmltYXRpb24tZmlsbC1t
b2RlIik7CisgICAgYXNzZXJ0X2VxdWFscyh0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdLmVmZmVj
dC50aW1pbmcuZmlsbCwgIm5vbmUiLCAiVGhlIGFuaW1hdGlvbidzIGVhc2luZyBtYXRjaGVzIHRo
ZSBkZWZhdWx0IGFuaW1hdGlvbi1maWxsLW1vZGUgdmFsdWUgd2hlbiB0aGUgcHJvcGVydHkgaXMg
bm90IHNldC4iKTsKK30sICJXZWIgQW5pbWF0aW9ucyBzaG91bGQgcmVmbGVjdCB0aGUgYW5pbWF0
aW9uLWZpbGwtbW9kZSBwcm9wZXJ0eS4iKTsKKwordGFyZ2V0VGVzdCh0YXJnZXQgPT4geworICAg
IHRhcmdldC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9ICIycyI7CisgICAgdGFyZ2V0LnN0eWxl
LmFuaW1hdGlvbk5hbWUgPSAiYW5pbWF0aW9uIjsKKworICAgIHRhcmdldC5zdHlsZS5hbmltYXRp
b25JdGVyYXRpb25Db3VudCA9IDI7CisgICAgYXNzZXJ0X2VxdWFscyh0YXJnZXQuZ2V0QW5pbWF0
aW9ucygpWzBdLmVmZmVjdC50aW1pbmcuaXRlcmF0aW9ucywgMiwgIlRoZSBhbmltYXRpb24ncyBk
dXJhdGlvbiBtYXRjaGVzIHRoZSBpbml0aWFsIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQgcHJv
cGVydHkuIik7CisKKyAgICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgPSAx
OworICAgIGFzc2VydF9lcXVhbHModGFyZ2V0LmdldEFuaW1hdGlvbnMoKVswXS5lZmZlY3QudGlt
aW5nLml0ZXJhdGlvbnMsIDEsICJUaGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24gbWF0Y2hlcyB0aGUg
dXBkYXRlZCBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50IHByb3BlcnR5LiIpOworfSwgIldlYiBB
bmltYXRpb25zIHNob3VsZCByZWZsZWN0IHRoZSBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50IHBy
b3BlcnR5LiIpOworCit0YXJnZXRUZXN0KHRhcmdldCA9PiB7CisgICAgdGFyZ2V0LnN0eWxlLmFu
aW1hdGlvbkR1cmF0aW9uID0gIjJzIjsKKyAgICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uTmFtZSA9
ICJhbmltYXRpb24iOworCisgICAgY29uc3QgaW5pdGlhbEFuaW1hdGlvbiA9IHRhcmdldC5nZXRB
bmltYXRpb25zKClbMF07CisgICAgYXNzZXJ0X2VxdWFscyh0YXJnZXQuZ2V0QW5pbWF0aW9ucygp
WzBdLmFuaW1hdGlvbk5hbWUsICJhbmltYXRpb24iLCAiVGhlIGFuaW1hdGlvbidzIG5hbWUgbWF0
Y2hlcyB0aGUgaW5pdGlhbCBhbmltYXRpb24tbmFtZSBDU1MgcHJvcGVydHkuIik7CisKKyAgICBj
b25zdCBpbml0aWFsS2V5ZnJhbWVzID0gaW5pdGlhbEFuaW1hdGlvbi5lZmZlY3QuZ2V0S2V5ZnJh
bWVzKCk7CisgICAgYXNzZXJ0X2VxdWFscyhpbml0aWFsS2V5ZnJhbWVzLmxlbmd0aCwgMik7Cisg
ICAgYXNzZXJ0X2VxdWFscyhpbml0aWFsS2V5ZnJhbWVzWzBdLm9mZnNldCwgMCk7CisgICAgYXNz
ZXJ0X2VxdWFscyhpbml0aWFsS2V5ZnJhbWVzWzBdLmxlZnQsICI1MHB4Iik7CisgICAgYXNzZXJ0
X2VxdWFscyhpbml0aWFsS2V5ZnJhbWVzWzFdLm9mZnNldCwgMSk7CisgICAgYXNzZXJ0X2VxdWFs
cyhpbml0aWFsS2V5ZnJhbWVzWzFdLmxlZnQsICIxMDBweCIpOworCisgICAgdGFyZ2V0LnN0eWxl
LmFuaW1hdGlvbk5hbWUgPSAiYW5pbWF0aW9uLXRvcCI7CisgICAgY29uc3QgdXBkYXRlZEFuaW1h
dGlvbiA9IHRhcmdldC5nZXRBbmltYXRpb25zKClbMF07CisgICAgYXNzZXJ0X2VxdWFscyh1cGRh
dGVkQW5pbWF0aW9uLmFuaW1hdGlvbk5hbWUsICJhbmltYXRpb24tdG9wIiwgIlRoZSBhbmltYXRp
b24ncyBuYW1lIG1hdGNoZXMgdGhlIHVwZGF0ZWQgYW5pbWF0aW9uLW5hbWUgQ1NTIHByb3BlcnR5
LiIpOworCisgICAgY29uc3QgdXBkYXRlZEtleWZyYW1lcyA9IHVwZGF0ZWRBbmltYXRpb24uZWZm
ZWN0LmdldEtleWZyYW1lcygpOworICAgIGFzc2VydF9lcXVhbHModXBkYXRlZEtleWZyYW1lcy5s
ZW5ndGgsIDIpOworICAgIGFzc2VydF9lcXVhbHModXBkYXRlZEtleWZyYW1lc1swXS5vZmZzZXQs
IDApOworICAgIGFzc2VydF9lcXVhbHModXBkYXRlZEtleWZyYW1lc1swXS50b3AsICI1MHB4Iik7
CisgICAgYXNzZXJ0X2VxdWFscyh1cGRhdGVkS2V5ZnJhbWVzWzFdLm9mZnNldCwgMSk7CisgICAg
YXNzZXJ0X2VxdWFscyh1cGRhdGVkS2V5ZnJhbWVzWzFdLnRvcCwgIjEwMHB4Iik7CisKKyAgICBh
c3NlcnRfbm90X2VxdWFscyh1cGRhdGVkQW5pbWF0aW9uLCBpbml0aWFsQW5pbWF0aW9uLCAiQ2hh
bmdpbmcgdGhlIGFuaW1hdGlvbi1uYW1lIHByb3BlcnR5IGdlbmVyYXRlcyBhIGRpZmZlcmVudCBD
U1NBbmltYXRpb24gb2JqZWN0LiIpOworfSwgIldlYiBBbmltYXRpb25zIHNob3VsZCByZWZsZWN0
IHRoZSBhbmltYXRpb24tbmFtZSBwcm9wZXJ0eS4iKTsKKwordGFyZ2V0VGVzdCh0YXJnZXQgPT4g
eworICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25EZWxheSA9ICItMXMiOworICAgIHRhcmdldC5z
dHlsZS5hbmltYXRpb25EdXJhdGlvbiA9ICIycyI7CisgICAgdGFyZ2V0LnN0eWxlLmFuaW1hdGlv
bk5hbWUgPSAiYW5pbWF0aW9uIjsKKworICAgIGNvbnN0IGluaXRpYWxBbmltYXRpb24gPSB0YXJn
ZXQuZ2V0QW5pbWF0aW9ucygpWzBdOworICAgIGFzc2VydF9lcXVhbHModGFyZ2V0LmdldEFuaW1h
dGlvbnMoKVswXS5wbGF5U3RhdGUsICJydW5uaW5nIiwgIlNldHRpbmcgYW5pbWF0aW9uLXBsYXkt
c3RhdGUgdG8gcnVubmluZyBzaG91bGQgcmVzdW1lIHRoZSBhbmltYXRpb24uIik7CisKKyAgICB0
YXJnZXQuc3R5bGUuYW5pbWF0aW9uUGxheVN0YXRlID0gInBhdXNlZCI7CisgICAgYXNzZXJ0X2Vx
dWFscyh0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdLnBsYXlTdGF0ZSwgInBhdXNlZCIsICJTZXR0
aW5nIGFuaW1hdGlvbi1wbGF5LXN0YXRlIGJhY2sgdG8gcGF1c2VkIHNob3VsZCBwYXVzZSB0aGUg
YW5pbWF0aW9uLiIpOworCisgICAgdGFyZ2V0LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJhbmltYXRp
b24tcGxheS1zdGF0ZSIpOworICAgIGFzc2VydF9lcXVhbHModGFyZ2V0LmdldEFuaW1hdGlvbnMo
KVswXS5wbGF5U3RhdGUsICJydW5uaW5nIiwgIlJlbW92aW5nIHRoZSBhbmltYXRpb24tcGxheS1z
dGF0ZSBwcm9wZXJ0eSBzaG91bGQgcmVzdW1lIHRoZSBhbmltYXRpb24uIik7CisKKyAgICBhc3Nl
cnRfZXF1YWxzKHRhcmdldC5nZXRBbmltYXRpb25zKClbMF0sIGluaXRpYWxBbmltYXRpb24sICJU
aGUgYW5pbWF0aW9uIG9iamVjdCByZW1haW5lZCB0aGUgc2FtZSBpbnN0YW5jZSB0aHJvdWdob3V0
IHRoZSB0ZXN0LiIpOworfSwgIldlYiBBbmltYXRpb25zIHNob3VsZCByZWZsZWN0IHRoZSBhbmlt
YXRpb24tcGxheS1zdGF0ZSBwcm9wZXJ0eS4iKTsKKwordGFyZ2V0VGVzdCh0YXJnZXQgPT4gewor
ICAgIHRhcmdldC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9ICIycyI7CisgICAgdGFyZ2V0LnN0
eWxlLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uID0gImVhc2Utb3V0IjsKKyAgICB0YXJnZXQuc3R5
bGUuYW5pbWF0aW9uTmFtZSA9ICJhbmltYXRpb24iOworCisgICAgYXNzZXJ0X2VxdWFscyh0YXJn
ZXQuZ2V0QW5pbWF0aW9ucygpWzBdLmVmZmVjdC50aW1pbmcuZWFzaW5nLCAiZWFzZS1vdXQiLCAi
VGhlIGFuaW1hdGlvbidzIGVhc2luZyBtYXRjaGVzIHRoZSBpbml0aWFsIGFuaW1hdGlvbi10aW1p
bmctZnVuY3Rpb24gcHJvcGVydHkuIik7CisKKyAgICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uVGlt
aW5nRnVuY3Rpb24gPSAiZWFzZS1pbiI7CisgICAgYXNzZXJ0X2VxdWFscyh0YXJnZXQuZ2V0QW5p
bWF0aW9ucygpWzBdLmVmZmVjdC50aW1pbmcuZWFzaW5nLCAiZWFzZS1pbiIsICJUaGUgYW5pbWF0
aW9uJ3MgZWFzaW5nIG1hdGNoZXMgdGhlIHVwZGF0ZWQgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlv
biBwcm9wZXJ0eS4iKTsKKworICAgIHRhcmdldC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiYW5pbWF0
aW9uLXRpbWluZy1mdW5jdGlvbiIpOworICAgIGFzc2VydF9lcXVhbHModGFyZ2V0LmdldEFuaW1h
dGlvbnMoKVswXS5lZmZlY3QudGltaW5nLmVhc2luZywgImVhc2UiLCAiVGhlIGFuaW1hdGlvbidz
IGVhc2luZyBtYXRjaGVzIHRoZSBkZWZhdWx0IGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb24gdmFs
dWUgd2hlbiB0aGUgcHJvcGVydHkgaXMgbm90IHNldC4iKTsKK30sICJXZWIgQW5pbWF0aW9ucyBz
aG91bGQgcmVmbGVjdCB0aGUgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiBwcm9wZXJ0eS4iKTsK
KworZnVuY3Rpb24gcnVuQW5pbWF0aW9uQ29tcGxldGlvblRlc3QoZmluYWxBc3NlcnRpb25DYWxs
YmFjaywgZGVzY3JpcHRpb24pCit7CisgICAgdGFyZ2V0VGVzdCh0YXJnZXQgPT4geworICAgICAg
ICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uTmFtZSA9ICJhbmltYXRpb24iOworICAgICAgICBhc3Nl
cnRfYXJyYXlfZXF1YWxzKHRhcmdldC5nZXRBbmltYXRpb25zKCksIFtdLCAiU2V0aW5nIHRoZSBh
bmltYXRpb24tbmFtZSBwcm9wZXJ0eSBhbG9uZSBkb2VzIG5vdCB5aWVsZCBhIENTU0FuaW1hdGlv
bi4iKTsKKworICAgICAgICB0YXJnZXQuc3R5bGUuYW5pbWF0aW9uRHVyYXRpb24gPSAiMXMiOwor
ICAgICAgICBhc3NlcnRfZXF1YWxzKHRhcmdldC5nZXRBbmltYXRpb25zKCkubGVuZ3RoLCAxLCAi
U2V0aW5nIHRoZSBhbmltYXRpb24tZHVyYXRpb24gcHJvcGVydHkgb24gdG9wIG9mIHRoZSBhbmlt
YXRpb24tbmFtZSB5aWVsZHMgYSBDU1NBbmltYXRpb24uIik7CisgICAgICAgIGFzc2VydF9lcXVh
bHModGFyZ2V0LmdldEFuaW1hdGlvbnMoKVswXS5wbGF5U3RhdGUsICJydW5uaW5nIiwgIlNldGlu
ZyB0aGUgYW5pbWF0aW9uLWR1cmF0aW9uIHByb3BlcnR5IG9uIHRvcCBvZiB0aGUgYW5pbWF0aW9u
LW5hbWUgeWllbGRzIGEgcnVubmluZyBDU1NBbmltYXRpb24uIik7CisKKyAgICAgICAgZmluYWxB
c3NlcnRpb25DYWxsYmFjayh0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdKTsKKyAgICAgICAgYXNz
ZXJ0X2FycmF5X2VxdWFscyh0YXJnZXQuZ2V0QW5pbWF0aW9ucygpLCBbXSwgYCR7ZGVzY3JpcHRp
b259IG5vIGxvbmdlciBsaXN0cyB0aGUgYW5pbWF0aW9uLmApOworICAgIH0sIGAke2Rlc2NyaXB0
aW9ufSBubyBsb25nZXIgbGlzdHMgdGhlIGFuaW1hdGlvbiBhZnRlciBpdCBoYXMgYmVlbiBydW5u
aW5nLmApOworfQorCitydW5BbmltYXRpb25Db21wbGV0aW9uVGVzdChhbmltYXRpb24gPT4gYW5p
bWF0aW9uLmZpbmlzaCgpLCAiQ2FsbGluZyBmaW5pc2goKSBvbiB0aGUgYW5pbWF0aW9uIik7City
dW5BbmltYXRpb25Db21wbGV0aW9uVGVzdChhbmltYXRpb24gPT4gYW5pbWF0aW9uLmN1cnJlbnRU
aW1lID0gYW5pbWF0aW9uLmVmZmVjdC50aW1pbmcuZHVyYXRpb24sICJTZWVraW5nIHRoZSBhbmlt
YXRpb24gdG8gaXRzIGVuZCB0aW1lIik7CitydW5BbmltYXRpb25Db21wbGV0aW9uVGVzdChhbmlt
YXRpb24gPT4gYW5pbWF0aW9uLmN1cnJlbnRUaW1lID0gLTEsICJTZWVraW5nIHRoZSBhbmltYXRp
b24gdG8gYmVmb3JlIGl0cyBzdGFydCB0aW1lIik7CitydW5BbmltYXRpb25Db21wbGV0aW9uVGVz
dChhbmltYXRpb24gPT4gYW5pbWF0aW9uLmVmZmVjdC50YXJnZXQuc3R5bGUuYW5pbWF0aW9uTmFt
ZSA9ICJub25lIiwgIlNldHRpbmcgdGhlIHRhcmdldCdzIGFuaW1hdGlvbi1uYW1lIHRvIG5vbmUi
KTsKK3J1bkFuaW1hdGlvbkNvbXBsZXRpb25UZXN0KGFuaW1hdGlvbiA9PiBhbmltYXRpb24uZWZm
ZWN0LnRhcmdldC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9IDAsICJTZXR0aW5nIHRoZSB0YXJn
ZXQncyBhbmltYXRpb24tZHVyYXRpb24gdG8gMCIpOworCis8L3NjcmlwdD4KKzwvYm9keT4KXCBO
byBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhbmlt
YXRpb25zL2Nzcy10cmFuc2l0aW9ucy1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy93ZWJhbmlt
YXRpb25zL2Nzcy10cmFuc2l0aW9ucy1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNzhiMGY5ZGMw
NWU1MDgzMDNhYjUyNmQ5OTkwNmE2Yjc0NjAyMWRhZQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91
dFRlc3RzL3dlYmFuaW1hdGlvbnMvY3NzLXRyYW5zaXRpb25zLWV4cGVjdGVkLnR4dApAQCAtMCww
ICsxLDEyIEBACisKK1BBU1MgQSBDU1MgVHJhbnNpdGlvbiBzaG91bGQgYmUgcmVmbGVjdGVkIGVu
dGlyZWx5IGFzIGEgQ1NTVHJhbnNpdGlvbiBvYmplY3Qgb24gdGhlIHRpbWVsaW5lLiAKK1BBU1Mg
V2ViIEFuaW1hdGlvbnMgc2hvdWxkIHJlZmxlY3QgdGhlIHRyYW5zaXRpb24tZGVsYXkgcHJvcGVy
dHkuIAorUEFTUyBXZWIgQW5pbWF0aW9ucyBzaG91bGQgcmVmbGVjdCB0aGUgdHJhbnNpdGlvbi1k
dXJhdGlvbiBwcm9wZXJ0eS4gCitQQVNTIFdlYiBBbmltYXRpb25zIHNob3VsZCByZWZsZWN0IHRo
ZSB0cmFuc2l0aW9uLXByb3BlcnR5IHByb3BlcnR5LiAKK1BBU1MgV2ViIEFuaW1hdGlvbnMgc2hv
dWxkIHJlZmxlY3QgdGhlIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIHByb3BlcnR5LiAKK1BB
U1MgQ2FsbGluZyBmaW5pc2goKSBvbiB0aGUgYW5pbWF0aW9uIG5vIGxvbmdlciBsaXN0cyB0aGUg
YW5pbWF0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIHJ1bm5pbmcuIAorUEFTUyBTZWVraW5nIHRoZSBh
bmltYXRpb24gdG8gaXRzIGVuZCB0aW1lIG5vIGxvbmdlciBsaXN0cyB0aGUgYW5pbWF0aW9uIGFm
dGVyIGl0IGhhcyBiZWVuIHJ1bm5pbmcuIAorUEFTUyBTZWVraW5nIHRoZSBhbmltYXRpb24gdG8g
YmVmb3JlIGl0cyBzdGFydCB0aW1lIG5vIGxvbmdlciBsaXN0cyB0aGUgYW5pbWF0aW9uIGFmdGVy
IGl0IGhhcyBiZWVuIHJ1bm5pbmcuIAorUEFTUyBTZXR0aW5nIHRoZSB0YXJnZXQncyB0cmFuc2l0
aW9uLXByb3BlcnR5IHRvIG5vbmUgbm8gbG9uZ2VyIGxpc3RzIHRoZSBhbmltYXRpb24gYWZ0ZXIg
aXQgaGFzIGJlZW4gcnVubmluZy4gCitQQVNTIFNlZWtpbmcgdGhlIHRhcmdldCdzIHRyYW5zaXRp
b24tZHVyYXRpb24gdG8gMCBubyBsb25nZXIgbGlzdHMgdGhlIGFuaW1hdGlvbiBhZnRlciBpdCBo
YXMgYmVlbiBydW5uaW5nLiAKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvd2ViYW5pbWF0aW9u
cy9jc3MtdHJhbnNpdGlvbnMuaHRtbCBiL0xheW91dFRlc3RzL3dlYmFuaW1hdGlvbnMvY3NzLXRy
YW5zaXRpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmM3YmFhNWRiZGUxMDQ4YWRjYzBkZjgyN2MyNzYz
MjE3NTUzMDgzMAotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL3dlYmFuaW1hdGlvbnMv
Y3NzLXRyYW5zaXRpb25zLmh0bWwKQEAgLTAsMCArMSwxOTMgQEAKKzwhRE9DVFlQRSBodG1sPjwh
LS0gd2Via2l0LXRlc3QtcnVubmVyIFsgZW5hYmxlQ1NTQW5pbWF0aW9uc0FuZENTU1RyYW5zaXRp
b25zQmFja2VkQnlXZWJBbmltYXRpb25zPXRydWUgXSAtLT4KKzxtZXRhIGNoYXJzZXQ9dXRmLTg+
Cis8dGl0bGU+Q1NTIFRyYW5zaXRpb25zPC90aXRsZT4KKzxib2R5PgorPHNjcmlwdCBzcmM9Ii4u
L3Jlc291cmNlcy90ZXN0aGFybmVzcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVz
b3VyY2VzL3Rlc3RoYXJuZXNzcmVwb3J0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+CisKKyd1c2Ug
c3RyaWN0JzsKKworZnVuY3Rpb24gdGFyZ2V0VGVzdCh0ZXN0Q2FsbGJhY2ssIGRlc2NyaXB0aW9u
KQoreworICAgIHRlc3QoKCkgPT4geworICAgICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5i
b2R5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKKyAgICAgICAg
dGVzdENhbGxiYWNrKHRhcmdldCk7CisgICAgICAgIHRhcmdldC5yZW1vdmUoKTsKKyAgICB9LCBk
ZXNjcmlwdGlvbik7Cit9CisKK2Z1bmN0aW9uIGZvcmNlU3R5bGVVcGRhdGUoZWxlbWVudCkKK3sK
KyAgICBlbGVtZW50Lm9mZnNldExlZnQ7Cit9CisKK3RhcmdldFRlc3QodGFyZ2V0ID0+IHsKKyAg
ICB0YXJnZXQuc3R5bGUubGVmdCA9ICI1MHB4IjsKKworICAgIGFzc2VydF9hcnJheV9lcXVhbHMo
dGFyZ2V0LmdldEFuaW1hdGlvbnMoKSwgW10sICJBbiBlbGVtZW50IHNob3VsZCBub3QgaGF2ZSBh
bnkgYW5pbWF0aW9ucyBpbml0aWFsbHkuIik7CisKKyAgICB0YXJnZXQuc3R5bGUudHJhbnNpdGlv
blByb3BlcnR5ID0gImxlZnQiOworICAgIHRhcmdldC5zdHlsZS50cmFuc2l0aW9uRGVsYXkgPSAi
LTFzIjsKKyAgICB0YXJnZXQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gIjJzIjsKKyAgICB0
YXJnZXQuc3R5bGUudHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uID0gImxpbmVhciI7CisKKyAgICBh
c3NlcnRfYXJyYXlfZXF1YWxzKHRhcmdldC5nZXRBbmltYXRpb25zKCksIFtdLCAiU2V0dGluZyBD
U1MgdHJhbnNpdGlvbnMgcHJvcGVydGllcyBzaG91bGQgbm90IHlpZWxkIGEgQ1NTVHJhbnNpdGlv
biB1bnRpbCBhIG5ldyB0YXJnZXQgdmFsdWUgaXMgc3BlY2lmaWVkLiIpOworCisgICAgZm9yY2VT
dHlsZVVwZGF0ZSh0YXJnZXQpOworICAgIHRhcmdldC5zdHlsZS5sZWZ0ID0gIjEwMHB4IjsKKwor
ICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRhcmdldC5nZXRBbmltYXRpb25zKClbMF07CisgICAgYXNz
ZXJ0X3RydWUoYW5pbWF0aW9uIGluc3RhbmNlb2YgQ1NTVHJhbnNpdGlvbiwgIlRoZSBhbmltYXRp
b24gaXMgYSBDU1NUcmFuc2l0aW9uLiIpOworICAgIGFzc2VydF90cnVlKGFuaW1hdGlvbiBpbnN0
YW5jZW9mIEFuaW1hdGlvbiwgIlRoZSBhbmltYXRpb24gaXMgYW4gQW5pbWF0aW9uLiIpOworICAg
IGFzc2VydF9lcXVhbHMoYW5pbWF0aW9uLnRpbWVsaW5lLCB0YXJnZXQub3duZXJEb2N1bWVudC50
aW1lbGluZSwgIlRoZSBhbmltYXRpb24ncyB0aW1lbGluZSBpcyBzZXQgdG8gdGhlIGVsZW1lbnQn
cyBkb2N1bWVudCB0aW1lbGluZS4iKTsKKyAgICBhc3NlcnRfZXF1YWxzKGFuaW1hdGlvbi5wbGF5
U3RhdGUsICJydW5uaW5nIiwgIlRoZSBhbmltYXRpb24gaXMgcnVubmluZyBhcyBzb29uIGFzIGl0
J3MgY3JlYXRlZC4iKTsKKyAgICBhc3NlcnRfZXF1YWxzKGFuaW1hdGlvbi50cmFuc2l0aW9uUHJv
cGVydHksICJsZWZ0IiwgIlRoZSBhbmltYXRpb24ncyB0cmFuc2l0aW9uUHJvcGVydHkgaXMgc2V0
LiIpOworCisgICAgY29uc3QgZWZmZWN0ID0gYW5pbWF0aW9uLmVmZmVjdDsKKyAgICBhc3NlcnRf
dHJ1ZShlZmZlY3QgaW5zdGFuY2VvZiBLZXlmcmFtZUVmZmVjdFJlYWRPbmx5LCAiVGhlIGFuaW1h
dGlvbidzIGVmZmVjdCBpcyBhIEtleWZyYW1lRWZmZWN0UmVhZE9ubHkuIik7CisgICAgYXNzZXJ0
X2ZhbHNlKGVmZmVjdCBpbnN0YW5jZW9mIEtleWZyYW1lRWZmZWN0LCAiVGhlIGFuaW1hdGlvbidz
IGVmZmVjdCBpcyBub3QgYSBLZXlmcmFtZUVmZmVjdC4iKTsKKyAgICBhc3NlcnRfZXF1YWxzKGVm
ZmVjdC50YXJnZXQsIHRhcmdldCwgIlRoZSBhbmltYXRpb24ncyBlZmZlY3QgaXMgdGFyZ2V0aW5n
IHRoZSB0YXJnZXQuIik7CisKKyAgICBjb25zdCB0aW1pbmcgPSBhbmltYXRpb24uZWZmZWN0LnRp
bWluZzsKKyAgICBhc3NlcnRfZXF1YWxzKHRpbWluZy5kZWxheSwgLTEwMDAsICJUaGUgYW5pbWF0
aW9uJ3MgZGVsYXkgcHJvcGVydHkgbWF0Y2hlcyB0aGUgdHJhbnNpdGlvbi1kZWxheSBwcm9wZXJ0
eS4iKTsKKyAgICBhc3NlcnRfZXF1YWxzKHRpbWluZy5kdXJhdGlvbiwgMjAwMCwgIlRoZSBhbmlt
YXRpb24ncyBkdXJhdGlvbiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSB0cmFuc2l0aW9uLWR1cmF0aW9u
IHByb3BlcnR5LiIpOworICAgIGFzc2VydF9lcXVhbHModGltaW5nLmVhc2luZywgImxpbmVhciIs
ICJUaGUgYW5pbWF0aW9uJ3MgZWFzaW5nIHByb3BlcnR5IG1hdGNoZXMgdGhlIHRyYW5zaXRpb24t
dGltaW5nLWZ1bmN0aW9uIHByb3BlcnR5LiIpOworCisgICAgY29uc3QgY29tcHV0ZWRUaW1pbmcg
PSBhbmltYXRpb24uZWZmZWN0LmdldENvbXB1dGVkVGltaW5nKCk7CisgICAgYXNzZXJ0X2VxdWFs
cyhjb21wdXRlZFRpbWluZy5hY3RpdmVEdXJhdGlvbiwgMjAwMCwgIlRoZSBhbmltYXRpb25zJ3Mg
Y29tcHV0ZWQgdGltaW5nIGFjdGl2ZUR1cmF0aW9uIHByb3BlcnR5IG1hdGNoZXMgdGhlIHByb3Bl
cnRpZXMgc2V0IGJ5IENTUyIpOworICAgIGFzc2VydF9lcXVhbHMoY29tcHV0ZWRUaW1pbmcuY3Vy
cmVudEl0ZXJhdGlvbiwgMCwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGltaW5nIGN1cnJl
bnRJdGVyYXRpb24gcHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7
CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWluZy5kZWxheSwgLTEwMDAsICJUaGUgYW5p
bWF0aW9ucydzIGNvbXB1dGVkIHRpbWluZyBkZWxheSBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBwcm9w
ZXJ0aWVzIHNldCBieSBDU1MiKTsKKyAgICBhc3NlcnRfZXF1YWxzKGNvbXB1dGVkVGltaW5nLmR1
cmF0aW9uLCAyMDAwLCAiVGhlIGFuaW1hdGlvbnMncyBjb21wdXRlZCB0aW1pbmcgZHVyYXRpb24g
cHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0
X2VxdWFscyhjb21wdXRlZFRpbWluZy5lbmREZWxheSwgMCwgIlRoZSBhbmltYXRpb25zJ3MgY29t
cHV0ZWQgdGltaW5nIGVuZERlbGF5IHByb3BlcnR5IG1hdGNoZXMgdGhlIHByb3BlcnRpZXMgc2V0
IGJ5IENTUyIpOworICAgIGFzc2VydF9lcXVhbHMoY29tcHV0ZWRUaW1pbmcuZW5kVGltZSwgMTAw
MCwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGltaW5nIGVuZFRpbWUgcHJvcGVydHkgbWF0
Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0X2VxdWFscyhjb21w
dXRlZFRpbWluZy5pdGVyYXRpb25TdGFydCwgMCwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQg
dGltaW5nIGl0ZXJhdGlvblN0YXJ0IHByb3BlcnR5IG1hdGNoZXMgdGhlIHByb3BlcnRpZXMgc2V0
IGJ5IENTUyIpOworICAgIGFzc2VydF9lcXVhbHMoY29tcHV0ZWRUaW1pbmcuaXRlcmF0aW9ucywg
MSwgIlRoZSBhbmltYXRpb25zJ3MgY29tcHV0ZWQgdGltaW5nIGl0ZXJhdGlvbnMgcHJvcGVydHkg
bWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0X2VxdWFscyhj
b21wdXRlZFRpbWluZy5sb2NhbFRpbWUsIDAsICJUaGUgYW5pbWF0aW9ucydzIGNvbXB1dGVkIHRp
bWluZyBsb2NhbFRpbWUgcHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NT
Iik7CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRpbWluZy5wcm9ncmVzcywgMC41LCAiVGhl
IGFuaW1hdGlvbnMncyBjb21wdXRlZCB0aW1pbmcgcHJvZ3Jlc3MgcHJvcGVydHkgbWF0Y2hlcyB0
aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisgICAgYXNzZXJ0X2VxdWFscyhjb21wdXRlZFRp
bWluZy5maWxsLCAibm9uZSIsICJUaGUgYW5pbWF0aW9ucydzIGNvbXB1dGVkIHRpbWluZyBmaWxs
IHByb3BlcnR5IG1hdGNoZXMgdGhlIHByb3BlcnRpZXMgc2V0IGJ5IENTUyIpOworICAgIGFzc2Vy
dF9lcXVhbHMoY29tcHV0ZWRUaW1pbmcuZWFzaW5nLCAibGluZWFyIiwgIlRoZSBhbmltYXRpb25z
J3MgY29tcHV0ZWQgdGltaW5nIGVhc2luZyBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBwcm9wZXJ0aWVz
IHNldCBieSBDU1MiKTsKKyAgICBhc3NlcnRfZXF1YWxzKGNvbXB1dGVkVGltaW5nLmRpcmVjdGlv
biwgIm5vcm1hbCIsICJUaGUgYW5pbWF0aW9ucydzIGNvbXB1dGVkIHRpbWluZyBkaXJlY3Rpb24g
cHJvcGVydHkgbWF0Y2hlcyB0aGUgcHJvcGVydGllcyBzZXQgYnkgQ1NTIik7CisKKyAgICBjb25z
dCBrZXlmcmFtZXMgPSBhbmltYXRpb24uZWZmZWN0LmdldEtleWZyYW1lcygpOworICAgIGFzc2Vy
dF9lcXVhbHMoa2V5ZnJhbWVzLmxlbmd0aCwgMiwgIlRoZSBhbmltYXRpb24ncyBlZmZlY3QgaGFz
IHR3byBrZXlmcmFtZXMuIik7CisgICAgYXNzZXJ0X2VxdWFscyhrZXlmcmFtZXNbMF0ub2Zmc2V0
LCAwLCAiVGhlIGFuaW1hdGlvbidzIGVmZmVjdCdzIGZpcnN0IGtleWZyYW1lIGhhcyBhIDAgb2Zm
c2V0LiIpOworICAgIGFzc2VydF9lcXVhbHMoa2V5ZnJhbWVzWzBdLmxlZnQsICI1MHB4IiwgIlRo
ZSBhbmltYXRpb24ncyBlZmZlY3QncyBmaXJzdCBrZXlmcmFtZSBoYXMgaXRzIGxlZnQgcHJvcGVy
dHkgc2V0IHRvIDUwcHguIik7CisgICAgYXNzZXJ0X2VxdWFscyhrZXlmcmFtZXNbMV0ub2Zmc2V0
LCAxLCAiVGhlIGFuaW1hdGlvbidzIGVmZmVjdCdzIGZpcnN0IGtleWZyYW1lIGhhcyBhIDEgb2Zm
c2V0LiIpOworICAgIGFzc2VydF9lcXVhbHMoa2V5ZnJhbWVzWzFdLmxlZnQsICIxMDBweCIsICJU
aGUgYW5pbWF0aW9uJ3MgZWZmZWN0J3MgZmlyc3Qga2V5ZnJhbWUgaGFzIGl0cyBsZWZ0IHByb3Bl
cnR5IHNldCB0byAxMDBweC4iKTsKKworICAgIGFzc2VydF9lcXVhbHMoZ2V0Q29tcHV0ZWRTdHls
ZShlZmZlY3QudGFyZ2V0KS5sZWZ0LCAiNzVweCIsICJUaGUgYW5pbWF0aW9uJ3MgdGFyZ2V0J3Mg
Y29tcHV0ZWQgc3R5bGUgcmVmbGVjdHMgdGhlIGFuaW1hdGlvbiBzdGF0ZS4iKTsKK30sICJBIENT
UyBUcmFuc2l0aW9uIHNob3VsZCBiZSByZWZsZWN0ZWQgZW50aXJlbHkgYXMgYSBDU1NUcmFuc2l0
aW9uIG9iamVjdCBvbiB0aGUgdGltZWxpbmUuIik7CisKK2Z1bmN0aW9uIHRyYW5zaXRpb25Qcm9w
ZXJ0eSh0YXJnZXQsIHByb3BlcnR5TmFtZSwgZnJvbSwgdG8pCit7CisgICAgdGFyZ2V0LnN0eWxl
W3Byb3BlcnR5TmFtZV0gPSBmcm9tOworICAgIGZvcmNlU3R5bGVVcGRhdGUodGFyZ2V0KTsKKyAg
ICB0YXJnZXQuc3R5bGVbcHJvcGVydHlOYW1lXSA9IHRvOworfQorCitmdW5jdGlvbiB0cmFuc2l0
aW9uUHJvcGVydHlVcGRhdGVUZXN0KHRlc3RDYWxsYmFjaywgZGVzY3JpcHRpb24pCit7CisgICAg
dGFyZ2V0VGVzdCh0YXJnZXQgPT4geworICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNpdGlvblBy
b3BlcnR5ID0gImxlZnQiOworICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0g
Ii01MDBtcyI7CisgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAiMnMi
OworICAgICAgICB0cmFuc2l0aW9uUHJvcGVydHkodGFyZ2V0LCAibGVmdCIsICI1MHB4IiwgIjEw
MHB4Iik7CisgICAgICAgIHRlc3RDYWxsYmFjayh0YXJnZXQpOworICAgIH0sIGRlc2NyaXB0aW9u
KTsKK30KKwordHJhbnNpdGlvblByb3BlcnR5VXBkYXRlVGVzdCh0YXJnZXQgPT4geworICAgIGNv
bnN0IGluaXRpYWxBbmltYXRpb24gPSB0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdOworICAgIGFz
c2VydF9lcXVhbHMoaW5pdGlhbEFuaW1hdGlvbi5lZmZlY3QudGltaW5nLmRlbGF5LCAtNTAwLCAi
VGhlIGFuaW1hdGlvbidzIGRlbGF5IG1hdGNoZXMgdGhlIGluaXRpYWwgdHJhbnNpdGlvbi1kZWxh
eSBwcm9wZXJ0eS4iKTsKKworICAgIHRhcmdldC5zdHlsZS50cmFuc2l0aW9uRGVsYXkgPSAwOwor
ICAgIGNvbnN0IHVwZGF0ZWRBbmltYXRpb24gPSB0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdOwor
ICAgIGFzc2VydF9lcXVhbHModXBkYXRlZEFuaW1hdGlvbi5lZmZlY3QudGltaW5nLmRlbGF5LCAw
LCAiVGhlIGFuaW1hdGlvbidzIGRlbGF5IG1hdGNoZXMgdGhlIHVwZGF0ZWQgdHJhbnNpdGlvbi1k
ZWxheSBwcm9wZXJ0eS4iKTsKKworICAgIGFzc2VydF9ub3RfZXF1YWxzKGluaXRpYWxBbmltYXRp
b24sIHVwZGF0ZWRBbmltYXRpb24sICJUaGUgYW5pbWF0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIHVw
ZGF0aW5nIHRoZSB0cmFuc2l0aW9uLWRlbGF5IHByb3BlcnR5IGRpZmZlci4iKTsKK30sICJXZWIg
QW5pbWF0aW9ucyBzaG91bGQgcmVmbGVjdCB0aGUgdHJhbnNpdGlvbi1kZWxheSBwcm9wZXJ0eS4i
KTsKKwordHJhbnNpdGlvblByb3BlcnR5VXBkYXRlVGVzdCh0YXJnZXQgPT4geworICAgIGNvbnN0
IGluaXRpYWxBbmltYXRpb24gPSB0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdOworICAgIGFzc2Vy
dF9lcXVhbHMoaW5pdGlhbEFuaW1hdGlvbi5lZmZlY3QudGltaW5nLmR1cmF0aW9uLCAyMDAwLCAi
VGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uIG1hdGNoZXMgdGhlIGluaXRpYWwgdHJhbnNpdGlvbi1k
dXJhdGlvbiBwcm9wZXJ0eS4iKTsKKworICAgIHRhcmdldC5zdHlsZS50cmFuc2l0aW9uRHVyYXRp
b24gPSAiMXMiOworICAgIGNvbnN0IHVwZGF0ZWRBbmltYXRpb24gPSB0YXJnZXQuZ2V0QW5pbWF0
aW9ucygpWzBdOworICAgIGFzc2VydF9lcXVhbHModXBkYXRlZEFuaW1hdGlvbi5lZmZlY3QudGlt
aW5nLmR1cmF0aW9uLCAxMDAwLCAiVGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uIG1hdGNoZXMgdGhl
IHVwZGF0ZWQgdHJhbnNpdGlvbi1kdXJhdGlvbiBwcm9wZXJ0eS4iKTsKKworICAgIGFzc2VydF9u
b3RfZXF1YWxzKGluaXRpYWxBbmltYXRpb24sIHVwZGF0ZWRBbmltYXRpb24sICJUaGUgYW5pbWF0
aW9ucyBiZWZvcmUgYW5kIGFmdGVyIHVwZGF0aW5nIHRoZSB0cmFuc2l0aW9uLWR1cmF0aW9uIHBy
b3BlcnR5IGRpZmZlci4iKTsKK30sICJXZWIgQW5pbWF0aW9ucyBzaG91bGQgcmVmbGVjdCB0aGUg
dHJhbnNpdGlvbi1kdXJhdGlvbiBwcm9wZXJ0eS4iKTsKKwordGFyZ2V0VGVzdCh0YXJnZXQgPT4g
eworICAgIHRhcmdldC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAiMnMiOworCisgICAgdGFy
Z2V0LnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eSA9ICJsZWZ0IjsKKyAgICB0cmFuc2l0aW9uUHJv
cGVydHkodGFyZ2V0LCAibGVmdCIsICI1MHB4IiwgIjEwMHB4Iik7CisKKyAgICBjb25zdCBpbml0
aWFsQW5pbWF0aW9uID0gdGFyZ2V0LmdldEFuaW1hdGlvbnMoKVswXTsKKyAgICBhc3NlcnRfZXF1
YWxzKHRhcmdldC5nZXRBbmltYXRpb25zKClbMF0udHJhbnNpdGlvblByb3BlcnR5LCAibGVmdCIs
ICJUaGUgYW5pbWF0aW9uJ3MgcHJvcGVydHkgbWF0Y2hlcyB0aGUgaW5pdGlhbCB0cmFuc2l0aW9u
LXByb3BlcnR5IENTUyBwcm9wZXJ0eS4iKTsKKworICAgIGNvbnN0IGluaXRpYWxLZXlmcmFtZXMg
PSBpbml0aWFsQW5pbWF0aW9uLmVmZmVjdC5nZXRLZXlmcmFtZXMoKTsKKyAgICBhc3NlcnRfZXF1
YWxzKGluaXRpYWxLZXlmcmFtZXMubGVuZ3RoLCAyKTsKKyAgICBhc3NlcnRfZXF1YWxzKGluaXRp
YWxLZXlmcmFtZXNbMF0ub2Zmc2V0LCAwKTsKKyAgICBhc3NlcnRfZXF1YWxzKGluaXRpYWxLZXlm
cmFtZXNbMF0ubGVmdCwgIjUwcHgiKTsKKyAgICBhc3NlcnRfZXF1YWxzKGluaXRpYWxLZXlmcmFt
ZXNbMV0ub2Zmc2V0LCAxKTsKKyAgICBhc3NlcnRfZXF1YWxzKGluaXRpYWxLZXlmcmFtZXNbMV0u
bGVmdCwgIjEwMHB4Iik7CisKKyAgICB0YXJnZXQuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5ID0g
InRvcCI7CisgICAgdHJhbnNpdGlvblByb3BlcnR5KHRhcmdldCwgInRvcCIsICI1MHB4IiwgIjEw
MHB4Iik7CisKKyAgICBjb25zdCB1cGRhdGVkQW5pbWF0aW9uID0gdGFyZ2V0LmdldEFuaW1hdGlv
bnMoKVswXTsKKyAgICBhc3NlcnRfZXF1YWxzKHVwZGF0ZWRBbmltYXRpb24udHJhbnNpdGlvblBy
b3BlcnR5LCAidG9wIiwgIlRoZSBhbmltYXRpb24ncyBwcm9wZXJ0eSBtYXRjaGVzIHRoZSB1cGRh
dGVkIHRyYW5zaXRpb24tcHJvcGVydHkgQ1NTIHByb3BlcnR5LiIpOworCisgICAgY29uc3QgdXBk
YXRlZEtleWZyYW1lcyA9IHVwZGF0ZWRBbmltYXRpb24uZWZmZWN0LmdldEtleWZyYW1lcygpOwor
ICAgIGFzc2VydF9lcXVhbHModXBkYXRlZEtleWZyYW1lcy5sZW5ndGgsIDIpOworICAgIGFzc2Vy
dF9lcXVhbHModXBkYXRlZEtleWZyYW1lc1swXS5vZmZzZXQsIDApOworICAgIGFzc2VydF9lcXVh
bHModXBkYXRlZEtleWZyYW1lc1swXS50b3AsICI1MHB4Iik7CisgICAgYXNzZXJ0X2VxdWFscyh1
cGRhdGVkS2V5ZnJhbWVzWzFdLm9mZnNldCwgMSk7CisgICAgYXNzZXJ0X2VxdWFscyh1cGRhdGVk
S2V5ZnJhbWVzWzFdLnRvcCwgIjEwMHB4Iik7CisKKyAgICBhc3NlcnRfbm90X2VxdWFscyh1cGRh
dGVkQW5pbWF0aW9uLCBpbml0aWFsQW5pbWF0aW9uLCAiQ2hhbmdpbmcgdGhlIHRyYW5zaXRpb24t
cHJvcGVydHkgcHJvcGVydHkgZ2VuZXJhdGVzIGEgZGlmZmVyZW50IENTU1RyYW5zaXRpb24gb2Jq
ZWN0LiIpOworfSwgIldlYiBBbmltYXRpb25zIHNob3VsZCByZWZsZWN0IHRoZSB0cmFuc2l0aW9u
LXByb3BlcnR5IHByb3BlcnR5LiIpOworCit0cmFuc2l0aW9uUHJvcGVydHlVcGRhdGVUZXN0KHRh
cmdldCA9PiB7CisgICAgY29uc3QgaW5pdGlhbEFuaW1hdGlvbiA9IHRhcmdldC5nZXRBbmltYXRp
b25zKClbMF07CisgICAgYXNzZXJ0X2VxdWFscyhpbml0aWFsQW5pbWF0aW9uLmVmZmVjdC50aW1p
bmcuZWFzaW5nLCAiZWFzZSIsICJUaGUgYW5pbWF0aW9uJ3MgZWFzaW5nIG1hdGNoZXMgdGhlIGRl
ZmF1bHQgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24gcHJvcGVydHkuIik7CisKKyAgICB0YXJn
ZXQuc3R5bGUudHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uID0gImVhc2UtaW4iOworICAgIGNvbnN0
IHVwZGF0ZWRBbmltYXRpb24gPSB0YXJnZXQuZ2V0QW5pbWF0aW9ucygpWzBdOworICAgIGFzc2Vy
dF9lcXVhbHModXBkYXRlZEFuaW1hdGlvbi5lZmZlY3QudGltaW5nLmVhc2luZywgImVhc2UtaW4i
LCAiVGhlIGFuaW1hdGlvbidzIGVhc2luZyBtYXRjaGVzIHRoZSB1cGRhdGVkIHRyYW5zaXRpb24t
dGltaW5nLWZ1bmN0aW9uIHByb3BlcnR5LiIpOworCisgICAgdGFyZ2V0LnN0eWxlLnJlbW92ZVBy
b3BlcnR5KCJ0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiIpOworICAgIGNvbnN0IGZpbmFsQW5p
bWF0aW9uID0gdGFyZ2V0LmdldEFuaW1hdGlvbnMoKVswXTsKKyAgICBhc3NlcnRfZXF1YWxzKHRh
cmdldC5nZXRBbmltYXRpb25zKClbMF0uZWZmZWN0LnRpbWluZy5lYXNpbmcsICJlYXNlIiwgIlRo
ZSBhbmltYXRpb24ncyBlYXNpbmcgbWF0Y2hlcyB0aGUgZGVmYXVsdCB0cmFuc2l0aW9uLXRpbWlu
Zy1mdW5jdGlvbiB2YWx1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiIpOworCisgICAg
YXNzZXJ0X25vdF9lcXVhbHMoaW5pdGlhbEFuaW1hdGlvbiwgdXBkYXRlZEFuaW1hdGlvbiwgIlRo
ZSBhbmltYXRpb25zIGJlZm9yZSBhbmQgYWZ0ZXIgdXBkYXRpbmcgdGhlIHRyYW5zaXRpb24tdGlt
aW5nLWZ1bmN0aW9uIHByb3BlcnR5IGRpZmZlci4iKTsKKyAgICBhc3NlcnRfbm90X2VxdWFscyh1
cGRhdGVkQW5pbWF0aW9uLCBmaW5hbEFuaW1hdGlvbiwgIlRoZSBhbmltYXRpb25zIGJlZm9yZSBh
bmQgYWZ0ZXIgdXBkYXRpbmcgdGhlIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIHByb3BlcnR5
IGRpZmZlci4iKTsKK30sICJXZWIgQW5pbWF0aW9ucyBzaG91bGQgcmVmbGVjdCB0aGUgdHJhbnNp
dGlvbi10aW1pbmctZnVuY3Rpb24gcHJvcGVydHkuIik7CisKK2Z1bmN0aW9uIHJ1bkFuaW1hdGlv
bkNvbXBsZXRpb25UZXN0KGZpbmFsQXNzZXJ0aW9uQ2FsbGJhY2ssIGRlc2NyaXB0aW9uKQorewor
ICAgIHRhcmdldFRlc3QodGFyZ2V0ID0+IHsKKyAgICAgICAgdGFyZ2V0LnN0eWxlLnRyYW5zaXRp
b25Qcm9wZXJ0eSA9ICJsZWZ0IjsKKyAgICAgICAgdGFyZ2V0LnN0eWxlLnRyYW5zaXRpb25EdXJh
dGlvbiA9ICIxcyI7CisgICAgICAgIHRyYW5zaXRpb25Qcm9wZXJ0eSh0YXJnZXQsICJsZWZ0Iiwg
IjUwcHgiLCAiMTAwcHgiKTsKKworICAgICAgICBhc3NlcnRfZXF1YWxzKHRhcmdldC5nZXRBbmlt
YXRpb25zKCkubGVuZ3RoLCAxLCAiU2V0aW5nIHRoZSB0cmFuc2l0aW9uLWR1cmF0aW9uIHByb3Bl
cnR5IG9uIHRvcCBvZiB0aGUgdHJhbnNpdGlvbi1wcm9wZXJ0eSB5aWVsZHMgYSBDU1NUcmFuc2l0
aW9uLiIpOworICAgICAgICBhc3NlcnRfZXF1YWxzKHRhcmdldC5nZXRBbmltYXRpb25zKClbMF0u
cGxheVN0YXRlLCAicnVubmluZyIsICJTZXRpbmcgdGhlIHRyYW5zaXRpb24tZHVyYXRpb24gcHJv
cGVydHkgb24gdG9wIG9mIHRoZSB0cmFuc2l0aW9uLXByb3BlcnR5IHlpZWxkcyBhIHJ1bm5pbmcg
Q1NTVHJhbnNpdGlvbi4iKTsKKworICAgICAgICBmaW5hbEFzc2VydGlvbkNhbGxiYWNrKHRhcmdl
dC5nZXRBbmltYXRpb25zKClbMF0pOworCisgICAgICAgIGFzc2VydF9hcnJheV9lcXVhbHModGFy
Z2V0LmdldEFuaW1hdGlvbnMoKSwgW10sIGAke2Rlc2NyaXB0aW9ufSBubyBsb25nZXIgbGlzdHMg
dGhlIGFuaW1hdGlvbi5gKTsKKyAgICB9LCBgJHtkZXNjcmlwdGlvbn0gbm8gbG9uZ2VyIGxpc3Rz
IHRoZSBhbmltYXRpb24gYWZ0ZXIgaXQgaGFzIGJlZW4gcnVubmluZy5gKTsKK30KKworcnVuQW5p
bWF0aW9uQ29tcGxldGlvblRlc3QoYW5pbWF0aW9uID0+IGFuaW1hdGlvbi5maW5pc2goKSwgIkNh
bGxpbmcgZmluaXNoKCkgb24gdGhlIGFuaW1hdGlvbiIpOworcnVuQW5pbWF0aW9uQ29tcGxldGlv
blRlc3QoYW5pbWF0aW9uID0+IGFuaW1hdGlvbi5jdXJyZW50VGltZSA9IGFuaW1hdGlvbi5lZmZl
Y3QudGltaW5nLmR1cmF0aW9uLCAiU2Vla2luZyB0aGUgYW5pbWF0aW9uIHRvIGl0cyBlbmQgdGlt
ZSIpOworcnVuQW5pbWF0aW9uQ29tcGxldGlvblRlc3QoYW5pbWF0aW9uID0+IGFuaW1hdGlvbi5j
dXJyZW50VGltZSA9IC0xLCAiU2Vla2luZyB0aGUgYW5pbWF0aW9uIHRvIGJlZm9yZSBpdHMgc3Rh
cnQgdGltZSIpOworcnVuQW5pbWF0aW9uQ29tcGxldGlvblRlc3QoYW5pbWF0aW9uID0+IGFuaW1h
dGlvbi5lZmZlY3QudGFyZ2V0LnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eSA9ICJub25lIiwgIlNl
dHRpbmcgdGhlIHRhcmdldCdzIHRyYW5zaXRpb24tcHJvcGVydHkgdG8gbm9uZSIpOworcnVuQW5p
bWF0aW9uQ29tcGxldGlvblRlc3QoYW5pbWF0aW9uID0+IGFuaW1hdGlvbi5lZmZlY3QudGFyZ2V0
LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IDAsICJTZWVraW5nIHRoZSB0YXJnZXQncyB0cmFu
c2l0aW9uLWR1cmF0aW9uIHRvIDAiKTsKKworPC9zY3JpcHQ+Cis8L2JvZHk+ClwgTm8gbmV3bGlu
ZSBhdCBlbmQgb2YgZmlsZQo=
</data>
<flag name="review"
          id="354191"
          type_id="1"
          status="+"
          setter="dino"
    />
          </attachment>
      

    </bug>

</bugzilla>