<?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>17513</bug_id>
          
          <creation_ts>2008-02-24 02:37:49 -0800</creation_ts>
          <short_desc>Add ability for image maps to be focused via tabbing</short_desc>
          <delta_ts>2010-01-26 10:29:29 -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>Accessibility</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://www.blabla.cn/asdocs/html_tutorials/maparea.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar, NeedsReduction</keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Conner Mo">connermo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bdakin</cc>
    
    <cc>browserbugs2</cc>
    
    <cc>cfleizach</cc>
    
    <cc>darin</cc>
    
    <cc>mike</cc>
    
    <cc>nickshanks</cc>
    
    <cc>rik</cc>
    
    <cc>zhenghe.zhang</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>71718</commentid>
    <comment_count>0</comment_count>
    <who name="Conner Mo">connermo</who>
    <bug_when>2008-02-24 02:37:49 -0800</bug_when>
    <thetext>In IE/Firefox, image map can be TAB focused with outline rendered. It behaves differently under WebKit based browsers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>80438</commentid>
    <comment_count>1</comment_count>
    <who name="Gérard Talbot (no longer involved)">browserbugs2</who>
    <bug_when>2008-05-14 18:43:10 -0700</bug_when>
    <thetext>Conner, even with Firefox, because of the black background of the image, it&apos;s difficult to see the outline focus (dotted black dots on a black background)

May I suggest this other testcase (which passes markup validation):
http://www.mozilla.org/access/qa/tiny/map_area.html

(adding my vote on this bug)
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>81063</commentid>
    <comment_count>2</comment_count>
    <who name="Gérard Talbot (no longer involved)">browserbugs2</who>
    <bug_when>2008-05-20 16:25:06 -0700</bug_when>
    <thetext>Latest HTML 5 specification states:

&quot;One way that a user agent can enable users to follow hyperlinks is by allowing area elements to be clicked, or focussed and activated by the keyboard. This will cause the aforementioned activation behavior to be invoked.&quot;
http://www.whatwg.org/specs/web-apps/current-work/#coords

&quot;User agents may also allow individual area elements representing hyperlinks to be selected and activated (e.g. using a keyboard)&quot;
http://www.whatwg.org/specs/web-apps/current-work/#image-map

Tab-focusing to focus-select (moving from and to) individual areas 
in the webpage
http://www.mozilla.org/access/qa/tiny/map_area.html
works well for Firefox 2, Firefox 3, IE 7, IE 8 b1 and very well in Opera 9.50 build 9981</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106044</commentid>
    <comment_count>3</comment_count>
      <attachid>26787</attachid>
    <who name="Nicholas Shanks">nickshanks</who>
    <bug_when>2009-01-16 03:10:08 -0800</bug_when>
    <thetext>Created attachment 26787
test case

To test this, make sure you have enabled tabbing through all elements on a page, not just form fields.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106154</commentid>
    <comment_count>4</comment_count>
    <who name="Deirdre Saoirse Moen">desamo</who>
    <bug_when>2009-01-16 18:00:07 -0800</bug_when>
    <thetext>&lt;rdar://problem/6502465&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106167</commentid>
    <comment_count>5</comment_count>
    <who name="Gérard Talbot (no longer involved)">browserbugs2</who>
    <bug_when>2009-01-16 20:23:47 -0800</bug_when>
    <thetext>Deirdre Saoirse Moen, 
I believe 
http://www.mozilla.org/access/qa/tiny/map_area.html
meets quality and reduction criteria. Is keyword NeedsReduction still required? Just asking..

Regards, Gérard
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183899</commentid>
    <comment_count>6</comment_count>
      <attachid>47250</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2010-01-22 17:41:42 -0800</bug_when>
    <thetext>Created attachment 47250
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183902</commentid>
    <comment_count>7</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2010-01-22 17:44:15 -0800</bug_when>
    <thetext>just added the patch.

this is my first attempt to go into renderer land, so not sure if everything is done the right way

the basic problem is that HTMLAreaElements don&apos;t have renderers, so they are automatically left out of the focus loop.

Adding them back in required to override a few of the isFocusable() type methods

Then to make it draw the highlight, i overrode some painting methods in RenderImage to check if it had an image map with an active link.

If so, it would draw the focus rect

Since area elements don&apos;t have to be rects, I had to modify drawFocusRects to also be able to take arbitrary Paths. 

Seems to work pretty well as far as I can tell. It passes all of the various test cases i&apos;ve seen</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183905</commentid>
    <comment_count>8</comment_count>
      <attachid>47250</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-01-22 18:00:08 -0800</bug_when>
    <thetext>Comment on attachment 47250
Patch

&gt; +        if (reinterpret_cast&lt;AccessibilityImageMapLink*&gt;(child)-&gt;areaElement() == areaElement)

This should be static_cast, not reinterpret_cast. We should almost never use a reinterpret_cast.

&gt; +        return focusedImageMapUIElement(reinterpret_cast&lt;HTMLAreaElement*&gt;(focusedNode));

Ditto.

&gt; +    static AccessibilityObject* focusedImageMapUIElement(HTMLAreaElement* areaElement);

This argument should not have a name.

&gt; +    virtual bool isImageMapLink() const { return true; }

This sort of function should be private, because it’s a programming error to call it if you have a pointer of the specific type. 

&gt; +    return reinterpret_cast&lt;HTMLMapElement*&gt;(mapElement)-&gt;imageElement();

static_cast

&gt; +void HTMLAreaElement::updateFocusAppearance(bool restorePreviousSelection)
&gt; +{
&gt; +    Node* parent = parentNode();
&gt; +    if (parent &amp;&amp; parent-&gt;hasTagName(mapTag)) {
&gt; +        HTMLImageElement* imageElement = reinterpret_cast&lt;HTMLMapElement*&gt;(parent)-&gt;imageElement();
&gt; +
&gt; +        // This will handle scrolling to the image if necessary.
&gt; +        imageElement-&gt;updateFocusAppearance(restorePreviousSelection);
&gt; +        
&gt; +        if (imageElement) {
&gt; +            RenderObject* imageRenderer = imageElement-&gt;renderer();
&gt; +            if (imageRenderer)
&gt; +                imageRenderer-&gt;setNeedsLayout(true);
&gt; +        }
&gt; +    }
&gt; +}

We normally prefer early returns rather than nesting the function inside if statements.

The cast needs to be a static_cast.

&gt;  bool HTMLAreaElement::supportsFocus() const
&gt;  {
&gt; -    // Skip HTMLAnchorElements isLink() check.
&gt; -    return HTMLElement::supportsFocus();
&gt; +    // As long as this is a link and the tabIndex was not explicitly set to -1.
&gt; +    return isLink() &amp;&amp; Node::tabIndex() != -1;
&gt;  }

Are you sure this can’t just be a call to tabIndex()? As far as I can tell it should give you the same value, and the code would be less strange.

I’m not sure this is the right rule. Will this change tabbing for all documents? Why is this different from the rule for links?

&gt; +    Path getPath(RenderObject*) const;

Normally we don’t use the word “get” in the names of functions that return a value. We reserve it for functions that return values in unusual ways, with out arguments. I think the name of the function is not clear enough. Sure it&apos;s a path, but what does the path represent?

&gt; +    String mapName = getName().string().lower();
&gt; +    RefPtr&lt;HTMLCollection&gt; coll = renderer()-&gt;document()-&gt;images();
&gt; +    for (Node* curr = coll-&gt;firstItem(); curr; curr = coll-&gt;nextItem()) {
&gt; +        if (!curr-&gt;hasTagName(imgTag))
&gt; +            continue;
&gt; +        
&gt; +        // The HTMLImageElement&apos;s useMap() value includes the &apos;#&apos; symbol at the beginning,
&gt; +        // which has to be stripped off.
&gt; +        HTMLImageElement* imageElement = static_cast&lt;HTMLImageElement*&gt;(curr);
&gt; +        String useMapName = imageElement-&gt;getAttribute(usemapAttr).string().substring(1).lower();
&gt; +        if (useMapName == mapName)
&gt; +            return imageElement;
&gt; +    }

I know this is not new code, but it seems strange to call lower on both strings instead of equalIgnoringCase.

&gt; +    Document* doc = mapElement-&gt;document();
&gt; +    if (!doc)
&gt; +        return;

Please use the name &quot;document&quot; for the local variable instead of the abbreviation &quot;doc&quot;.

&gt; +    // FIXME: Clip the paths to the image bounding box.

Why aren&apos;t you doing that? Seems easy to do.

&gt; +        Path path = areaElement-&gt;getPath(this);
&gt; +        Vector&lt;Path&gt; focusRingPaths;
&gt; +        focusRingPaths.append(path);

You don&apos;t need the local variable &quot;path&quot; here.

&gt; +    virtual void paint(PaintInfo&amp; paintInfo, int tx, int ty);

I would make this private unless there&apos;s a reason not to. Or protected at least.

Please omit the argument name &quot;paintInfo&quot;.

&gt; +    void paintFocusRings(PaintInfo&amp;, const RenderStyle* style);

Please omit the argument name &quot;style&quot;.

&gt; -            graphicsContext-&gt;drawFocusRing(focusRingRects, ow, style()-&gt;outlineOffset(), oc);
&gt; +            graphicsContext-&gt;drawFocusRingRects(focusRingRects, ow, style()-&gt;outlineOffset(), oc);

C++ has overloading, so you don&apos;t have to rename the function. You can just provide two versions, one that works with a vector of paths and the other that works with a vector of rects.

&gt; +    friend class RenderImage;

This friendship seems really unfortunate. Can we avoid this somehow?

Did we discuss whether the change in tabbing behavior is good all the time? Did you talk to anyone else who works on WebKit about that change?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>183941</commentid>
    <comment_count>9</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2010-01-22 21:13:03 -0800</bug_when>
    <thetext>Thanks for your comments Darin. Will address everything not mentioned here. Please see the below.  

&gt; &gt;  bool HTMLAreaElement::supportsFocus() const
&gt; &gt;  {
&gt; &gt; -    // Skip HTMLAnchorElements isLink() check.
&gt; &gt; -    return HTMLElement::supportsFocus();
&gt; &gt; +    // As long as this is a link and the tabIndex was not explicitly set to -1.
&gt; &gt; +    return isLink() &amp;&amp; Node::tabIndex() != -1;
&gt; &gt;  }
&gt; 
&gt; Are you sure this can’t just be a call to tabIndex()? As far as I can tell it
&gt; should give you the same value, and the code would be less strange.
&gt; 

An AREA element might also have a nohref attribute or just no link. in that case, it should not be focusable or support focus.

&gt; I’m not sure this is the right rule. Will this change tabbing for all
&gt; documents? Why is this different from the rule for links?
&gt; 

you&apos;re right. looks like the tabIndex is taken care of in Node::nextFocusableNode

&gt; &gt; +    Path getPath(RenderObject*) const;
&gt; 
&gt; Normally we don’t use the word “get” in the names of functions that return a
&gt; value. We reserve it for functions that return values in unusual ways, with out
&gt; arguments. I think the name of the function is not clear enough. Sure it&apos;s a
&gt; path, but what does the path represent?

This method was right below 
IntRect getRect(RenderObject*), so was following convention. 

Do you think

getPathBoundary() is better. 
It&apos;s the path of the area element, since an area can be a polygon, circle, etc. Drawing a blank on other ideas. Perhaps a better comment?


&gt; &gt; +    // FIXME: Clip the paths to the image bounding box.
&gt; 
&gt; Why aren&apos;t you doing that? Seems easy to do.

Looked into it and its a lot harder than it sounds when you just have a CGPathRef. ImageKit takes a lot of code to implement IKPathClipToRect.


&gt; Did we discuss whether the change in tabbing behavior is good all the time? Did
&gt; you talk to anyone else who works on WebKit about that change?

There has been no discussion on this. I have assumed that this was just a bug, since you can always tab to links and these are links. This behavior also works in all other browsers. Should I bring this up on webkit-dev?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>184407</commentid>
    <comment_count>10</comment_count>
      <attachid>47365</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2010-01-25 12:47:56 -0800</bug_when>
    <thetext>Created attachment 47365
patch

Added patch to address all issues Darin mentioned, aside from things I noted in my response.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>184447</commentid>
    <comment_count>11</comment_count>
      <attachid>47365</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-01-25 17:14:32 -0800</bug_when>
    <thetext>Comment on attachment 47365
patch

&gt; +void HTMLAreaElement::dispatchBlurEvent()
&gt; +{
&gt; +    Node::dispatchBlurEvent();
&gt; +    
&gt; +    // On a blur, we might need to remove our focus rings by repainting.
&gt; +    updateFocusAppearance(false);
&gt; +}

If you are intentionally skipping base class implementations of dispatchBlurEvent, then you should include a comment saying why.

If you are not, then the call should be to HTMLAnchorElement::dispatchBlurEvent, rather than Node::dispatchBlurEvent, even though it will end up calling the same function. In case someone overrides later in between.

&gt;  bool HTMLAreaElement::supportsFocus() const
&gt;  {
&gt; +    // As long as this is a link and the tabIndex was not explicitly set to -1.
&gt; +    return isLink();
&gt;  }

The comment here is inconsistent with the code. Please fix that by changing the comment somehow. The comment should briefly explain both why isLink is the right function to call and why we can&apos;t just use the version of the supportsFocus function we inherit from the base class.

&gt; +    String mapName = getName().string();

Since this is a member, I suggest just using m_name instead of getName(). And I don&apos;t think you need a local variable for it.

&gt; +    CGContextBeginTransparencyLayer(context, NULL);

WebKit code uses 0 instead of NULL.

&gt; +    RetainPtr&lt;CGColorRef&gt; colorRef;
&gt; +    if (color.isValid())
&gt; +        colorRef.adoptCF(createCGColor(color));

We really should change createCGColor to return a RetainPtr.

&gt; +        Path path = areaElement-&gt;getPath(this);
&gt; +        Vector&lt;Path&gt; focusRingPaths;
&gt; +        focusRingPaths.append(path);

I don&apos;t think we need the local variable &quot;path&quot; here.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>184621</commentid>
    <comment_count>12</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2010-01-26 10:07:06 -0800</bug_when>
    <thetext>bombs away
http://trac.webkit.org/changeset/53857</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>184625</commentid>
    <comment_count>13</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2010-01-26 10:29:29 -0800</bug_when>
    <thetext>looks like tab wrap around behavior is different on gtk</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>26787</attachid>
            <date>2009-01-16 03:10:08 -0800</date>
            <delta_ts>2009-01-16 03:10:08 -0800</delta_ts>
            <desc>test case</desc>
            <filename>imagemaps.html</filename>
            <type>text/html</type>
            <size>365</size>
            <attacher name="Nicholas Shanks">nickshanks</attacher>
            
              <data encoding="base64">PGEgaHJlZj0iIj48aW1nIHNyYz0iIiB3aWR0aD0iODAiIGhlaWdodD0iMTAwIj48L2E+PGEgaHJl
Zj0iIj48aW1nIHNyYz0iIiB3aWR0aD0iODAiIGhlaWdodD0iMTAwIj48L2E+PGEgaHJlZj0iIj48
aW1nIHNyYz0iIiB3aWR0aD0iODAiIGhlaWdodD0iMTAwIj48L2E+PGEgaHJlZj0iIj48aW1nIHNy
Yz0iIiB3aWR0aD0iODAiIGhlaWdodD0iMTAwIj48L2E+PGltZyBzcmM9IiIgd2lkdGg9IjgwIiBo
ZWlnaHQ9IjEwMCIgdXNlbWFwPSIjbmIiPjxtYXAgbmFtZT0ibmIiPjxhcmVhIHNoYXBlPXJlY3Qg
Y29vcmRzPSIwLDAsMzUsMTAwIiBocmVmPSIiPjxhcmVhIHNoYXBlPXJlY3QgY29vcmRzPSIzNSww
LDcwLDEwMCIgaHJlZj0iIj48L21hcD4=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>47250</attachid>
            <date>2010-01-22 17:41:42 -0800</date>
            <delta_ts>2010-01-25 12:47:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-17513-20100122174141.patch</filename>
            <type>text/plain</type>
            <size>35619</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1Mzc0MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzQgQEAKKzIwMTAtMDEtMjIgIENocmlzIEZsZWl6YWNoICA8Y2ZsZWl6YWNoQGFw
cGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGQgYWJpbGl0eSBmb3IgaW1hZ2UgbWFwcyB0byBiZSBmb2N1c2VkIHZpYSB0YWJiaW5nCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzUxMworCisg
ICAgICAgIFRlc3Q6IGZhc3QvZXZlbnRzL3RhYi1pbWFnZW1hcC5odG1sCisKKyAgICAgICAgKiBh
Y2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmpl
Y3RDYWNoZTo6Zm9jdXNlZEltYWdlTWFwVUlFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkFY
T2JqZWN0Q2FjaGU6OmZvY3VzZWRVSUVsZW1lbnRGb3JQYWdlKToKKyAgICAgICAgKiBhY2Nlc3Np
YmlsaXR5L0FYT2JqZWN0Q2FjaGUuaDoKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2li
aWxpdHlJbWFnZU1hcExpbmsuaDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlJbWFn
ZU1hcExpbms6OmFyZWFFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlJ
bWFnZU1hcExpbms6Om1hcEVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eUltYWdlTWFwTGluazo6aXNJbWFnZU1hcExpbmspOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU9iamVjdC5oOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9i
amVjdDo6aXNJbWFnZU1hcExpbmspOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVu
ZGVyT2JqZWN0OjphY2Nlc3NpYmlsaXR5UGFyZW50Rm9ySW1hZ2VNYXApOgorICAgICAgICAqIGh0
bWwvSFRNTEFyZWFFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxBcmVhRWxlbWVu
dDo6Z2V0UGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MQXJlYUVsZW1lbnQ6OmdldFJlY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6SFRNTEFyZWFFbGVtZW50OjppbWFnZUVsZW1lbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTEFyZWFFbGVtZW50Ojppc0tleWJvYXJkRm9jdXNhYmxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxBcmVhRWxlbWVudDo6aXNGb2N1c2FibGUpOgorICAgICAgICAo
V2ViQ29yZTo6SFRNTEFyZWFFbGVtZW50OjpkaXNwYXRjaEJsdXJFdmVudCk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MQXJlYUVsZW1lbnQ6OnVwZGF0ZUZvY3VzQXBwZWFyYW5jZSk6CisgICAgICAg
IChXZWJDb3JlOjpIVE1MQXJlYUVsZW1lbnQ6OnN1cHBvcnRzRm9jdXMpOgorICAgICAgICAqIGh0
bWwvSFRNTEFyZWFFbGVtZW50Lmg6CisgICAgICAgICogaHRtbC9IVE1MTWFwRWxlbWVudC5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MTWFwRWxlbWVudDo6aW1hZ2VFbGVtZW50KToKKyAgICAg
ICAgKiBodG1sL0hUTUxNYXBFbGVtZW50Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
R3JhcGhpY3NDb250ZXh0Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3Jh
cGhpY3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpkcmF3Rm9jdXNSaW5nUGF0aHMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpkcmF3Rm9jdXNSaW5nUmVjdHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2hhaWt1
L0dyYXBoaWNzQ29udGV4dEhhaWt1LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDo6ZHJhd0ZvY3VzUmluZ1BhdGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDo6ZHJhd0ZvY3VzUmluZ1JlY3RzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9t
YWMvR3JhcGhpY3NDb250ZXh0TWFjLm1tOgorICAgICAgICAoV2ViQ29yZTo6ZHJhd0ZvY3VzUmlu
Z1RvQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1
c1JpbmdQYXRocyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1
c1JpbmdSZWN0cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3JhcGhpY3NDb250
ZXh0UXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNS
aW5nUGF0aHMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNS
aW5nUmVjdHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250
ZXh0U2tpYS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1
c1JpbmdQYXRocyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1
c1JpbmdSZWN0cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29u
dGV4dENHV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd0Zv
Y3VzUmluZ1BhdGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd0Zv
Y3VzUmluZ1JlY3RzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGlj
c0NvbnRleHRXaW5jZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRy
YXdGb2N1c1JpbmdQYXRocyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRy
YXdGb2N1c1JpbmdSZWN0cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd3gvR3JhcGhp
Y3NDb250ZXh0V3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3
Rm9jdXNSaW5nUGF0aHMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJJbWFnZTo6cGFpbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVySW1hZ2U6OnBhaW50Rm9jdXNSaW5ncyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJJ
bWFnZTo6aW1hZ2VNYXApOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJJbWFnZS5oOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVySW5saW5lOjpwYWludE91dGxpbmUpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJPYmpl
Y3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyT2JqZWN0OjpwYWludE91dGxpbmUpOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJPYmplY3QuaDoKKyAgICAgICAgKiByZW5kZXJpbmcv
UmVuZGVyUmVwbGFjZWQuaDoKKwogMjAxMC0wMS0yMiAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJh
c2VyQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpJbmRl
eDogV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmNwcAkocmV2aXNpb24gNTM3NDIp
CisrKyBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDYgKzUwLDggQEAKICNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5VGFibGVSb3cuaCIK
ICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1
ZGUgIkhUTUxBcmVhRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxJbWFnZUVsZW1lbnQuaCIKICNp
bmNsdWRlICJIVE1MTmFtZXMuaCIKICNpZiBFTkFCTEUoVklERU8pCiAjaW5jbHVkZSAiTWVkaWFD
b250cm9sRWxlbWVudHMuaCIKQEAgLTg0LDYgKzg2LDM1IEBAIEFYT2JqZWN0Q2FjaGU6On5BWE9i
amVjdENhY2hlKCkKICAgICB9CiB9CiAKK0FjY2Vzc2liaWxpdHlPYmplY3QqIEFYT2JqZWN0Q2Fj
aGU6OmZvY3VzZWRJbWFnZU1hcFVJRWxlbWVudChIVE1MQXJlYUVsZW1lbnQqIGFyZWFFbGVtZW50
KQoreworICAgIC8vIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgYWNjZXNzaWJpbGl0eSBvYmplY3Qg
Zm9yIHRoZSBIVE1MQXJlYUVsZW1lbnQuIFRoaXMgc2hvdWxkIGJlCisgICAgLy8gaW4gdGhlIGxp
c3Qgb2YgY2hpbGRyZW4gZm9yIGl0cyBjb3JyZXNwb25kaW5nIGltYWdlLgorICAgIGlmICghYXJl
YUVsZW1lbnQpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIEhUTUxJbWFnZUVsZW1lbnQq
IGltYWdlRWxlbWVudCA9IGFyZWFFbGVtZW50LT5pbWFnZUVsZW1lbnQoKTsKKyAgICBpZiAoIWlt
YWdlRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgQWNjZXNzaWJpbGl0eU9i
amVjdCogYXhSZW5kZXJJbWFnZSA9IGFyZWFFbGVtZW50LT5kb2N1bWVudCgpLT5heE9iamVjdENh
Y2hlKCktPmdldE9yQ3JlYXRlKGltYWdlRWxlbWVudC0+cmVuZGVyZXIoKSk7CisgICAgaWYgKCFh
eFJlbmRlckltYWdlKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBBY2Nlc3NpYmlsaXR5
T2JqZWN0OjpBY2Nlc3NpYmlsaXR5Q2hpbGRyZW5WZWN0b3IgaW1hZ2VDaGlsZHJlbiA9IGF4UmVu
ZGVySW1hZ2UtPmNoaWxkcmVuKCk7CisgICAgdW5zaWduZWQgY291bnQgPSBpbWFnZUNoaWxkcmVu
LnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgY291bnQ7ICsraykgeworICAg
ICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBjaGlsZCA9IGltYWdlQ2hpbGRyZW5ba10uZ2V0KCk7
CisgICAgICAgIGlmICghY2hpbGQtPmlzSW1hZ2VNYXBMaW5rKCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZWludGVycHJldF9jYXN0PEFjY2Vzc2liaWxp
dHlJbWFnZU1hcExpbmsqPihjaGlsZCktPmFyZWFFbGVtZW50KCkgPT0gYXJlYUVsZW1lbnQpCisg
ICAgICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgfSAgICAKKyAgICAKKyAgICByZXR1cm4gMDsK
K30KKyAgICAKIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFYT2JqZWN0Q2FjaGU6OmZvY3VzZWRVSUVs
ZW1lbnRGb3JQYWdlKGNvbnN0IFBhZ2UqIHBhZ2UpCiB7CiAgICAgLy8gZ2V0IHRoZSBmb2N1c2Vk
IG5vZGUgaW4gdGhlIHBhZ2UKQEAgLTkyLDYgKzEyMyw5IEBAIEFjY2Vzc2liaWxpdHlPYmplY3Qq
IEFYT2JqZWN0Q2FjaGU6OmZvY3UKICAgICBpZiAoIWZvY3VzZWROb2RlKQogICAgICAgICBmb2N1
c2VkTm9kZSA9IGZvY3VzZWREb2N1bWVudDsKIAorICAgIGlmIChmb2N1c2VkTm9kZS0+aGFzVGFn
TmFtZShhcmVhVGFnKSkKKyAgICAgICAgcmV0dXJuIGZvY3VzZWRJbWFnZU1hcFVJRWxlbWVudChy
ZWludGVycHJldF9jYXN0PEhUTUxBcmVhRWxlbWVudCo+KGZvY3VzZWROb2RlKSk7CisgICAgCiAg
ICAgUmVuZGVyT2JqZWN0KiBmb2N1c2VkTm9kZVJlbmRlcmVyID0gZm9jdXNlZE5vZGUtPnJlbmRl
cmVyKCk7CiAgICAgaWYgKCFmb2N1c2VkTm9kZVJlbmRlcmVyKQogICAgICAgICByZXR1cm4gMDsK
SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuaAkocmV2aXNpb24gNTM3NDIp
CisrKyBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC00Miw2ICs0Miw3IEBAIGNsYXNzIFdlYkNvcmVUZXh0TWFya2VyOwogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKK2NsYXNzIEhUTUxBcmVhRWxlbWVudDsKIGNsYXNzIE5vZGU7CiBjbGFzcyBQ
YWdlOwogY2xhc3MgUmVuZGVyT2JqZWN0OwpAQCAtMTM1LDYgKzEzNiw4IEBAIHByaXZhdGU6CiAg
ICAgVmVjdG9yPHBhaXI8UmVmUHRyPEFjY2Vzc2liaWxpdHlPYmplY3Q+LCBBWE5vdGlmaWNhdGlv
bj4gPiBtX25vdGlmaWNhdGlvbnNUb1Bvc3Q7CiAgICAgdm9pZCBub3RpZmljYXRpb25Qb3N0VGlt
ZXJGaXJlZChUaW1lcjxBWE9iamVjdENhY2hlPiopOwogICAgIAorICAgIHN0YXRpYyBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBmb2N1c2VkSW1hZ2VNYXBVSUVsZW1lbnQoSFRNTEFyZWFFbGVtZW50KiBh
cmVhRWxlbWVudCk7CisgICAgCiAgICAgQVhJRCBnZXRBWElEKEFjY2Vzc2liaWxpdHlPYmplY3Qq
KTsKICAgICBib29sIG5vZGVJc0FyaWFUeXBlKE5vZGUqLCBTdHJpbmcgcm9sZSk7CiB9OwpJbmRl
eDogV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUltYWdlTWFwTGlu
ay5oCShyZXZpc2lvbiA1Mzc0MikKKysrIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmls
aXR5SW1hZ2VNYXBMaW5rLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDEzICs0NCwxOCBAQCBwdWJs
aWM6CiAgICAgdmlydHVhbCB+QWNjZXNzaWJpbGl0eUltYWdlTWFwTGluaygpOwogICAgIAogICAg
IHZvaWQgc2V0SFRNTEFyZWFFbGVtZW50KEhUTUxBcmVhRWxlbWVudCogZWxlbWVudCkgeyBtX2Fy
ZWFFbGVtZW50ID0gZWxlbWVudDsgfQorICAgIEhUTUxBcmVhRWxlbWVudCogYXJlYUVsZW1lbnQo
KSBjb25zdCB7IHJldHVybiBtX2FyZWFFbGVtZW50OyB9CisgICAgCiAgICAgdm9pZCBzZXRIVE1M
TWFwRWxlbWVudChIVE1MTWFwRWxlbWVudCogZWxlbWVudCkgeyBtX21hcEVsZW1lbnQgPSBlbGVt
ZW50OyB9ICAgIAorICAgIEhUTUxNYXBFbGVtZW50KiBtYXBFbGVtZW50KCkgY29uc3QgeyByZXR1
cm4gbV9tYXBFbGVtZW50OyB9CisgICAgCiAgICAgdm9pZCBzZXRQYXJlbnQoQWNjZXNzaWJpbGl0
eU9iamVjdCogcGFyZW50KSB7IG1fcGFyZW50ID0gcGFyZW50OyB9CiAgICAgICAgIAogICAgIHZp
cnR1YWwgQWNjZXNzaWJpbGl0eVJvbGUgcm9sZVZhbHVlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBi
b29sIGFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAg
IHZpcnR1YWwgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KKyAgICB2
aXJ0dWFsIGJvb2wgaXNJbWFnZU1hcExpbmsoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAg
CiAgICAgdmlydHVhbCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBwYXJlbnRPYmplY3QoKSBjb25zdDsK
ICAgICB2aXJ0dWFsIEVsZW1lbnQqIGFuY2hvckVsZW1lbnQoKSBjb25zdDsKICAgICB2aXJ0dWFs
IEVsZW1lbnQqIGFjdGlvbkVsZW1lbnQoKSBjb25zdDsKSW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJp
bGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaAkocmV2aXNpb24gNTM3NDIpCisrKyBXZWJDb3Jl
L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
ODUsNiArMjg1LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBpc0ZpZWxkc2V0KCkgY29u
c3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNHcm91cCgpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlzQVJJQVRyZWVHcmlkUm93KCkgY29u
c3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZU1hcExpbmsoKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc01lbnVMaXN0KCkgY29u
c3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNNZW51TGlzdFBvcHVwKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNNZW51TGlzdE9wdGlv
bigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CkluZGV4OiBXZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1Mzc0MikK
KysrIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjA0OSwyNCArMjA0OSwxNCBAQCBBWE9iamVjdENhY2hlKiBBY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0CiBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjphY2Nlc3NpYmlsaXR5UGFyZW50Rm9ySW1hZ2VNYXAoSFRNTE1hcEVsZW1l
bnQqIG1hcCkgY29uc3QKIHsKICAgICAvLyBmaW5kIGFuIGltYWdlIHRoYXQgaXMgdXNpbmcgdGhp
cyBtYXAKLSAgICBpZiAoIW1fcmVuZGVyZXIgfHwgIW1hcCkKKyAgICBpZiAoIW1hcCkKICAgICAg
ICAgcmV0dXJuIDA7CiAKLSAgICBTdHJpbmcgbWFwTmFtZSA9IG1hcC0+Z2V0TmFtZSgpLnN0cmlu
ZygpLmxvd2VyKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjb2xsID0gbV9yZW5kZXJl
ci0+ZG9jdW1lbnQoKS0+aW1hZ2VzKCk7Ci0gICAgZm9yIChOb2RlKiBjdXJyID0gY29sbC0+Zmly
c3RJdGVtKCk7IGN1cnI7IGN1cnIgPSBjb2xsLT5uZXh0SXRlbSgpKSB7Ci0gICAgICAgIFJlbmRl
ck9iamVjdCogb2JqID0gY3Vyci0+cmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKCFvYmogfHwgIWN1
cnItPmhhc1RhZ05hbWUoaW1nVGFnKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAK
LSAgICAgICAgLy8gVGhlIEhUTUxJbWFnZUVsZW1lbnQncyB1c2VNYXAoKSB2YWx1ZSBpbmNsdWRl
cyB0aGUgJyMnIHN5bWJvbCBhdCB0aGUgYmVnaW5uaW5nLAotICAgICAgICAvLyB3aGljaCBoYXMg
dG8gYmUgc3RyaXBwZWQgb2ZmCi0gICAgICAgIFN0cmluZyB1c2VNYXBOYW1lID0gc3RhdGljX2Nh
c3Q8SFRNTEltYWdlRWxlbWVudCo+KGN1cnIpLT5nZXRBdHRyaWJ1dGUodXNlbWFwQXR0cikuc3Ry
aW5nKCkuc3Vic3RyaW5nKDEpLmxvd2VyKCk7Ci0gICAgICAgIGlmICh1c2VNYXBOYW1lID09IG1h
cE5hbWUpCi0gICAgICAgICAgICByZXR1cm4gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShv
YmopOwotICAgIH0KKyAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZUVsZW1lbnQgPSBtYXAtPmlt
YWdlRWxlbWVudCgpOworICAgIGlmICghaW1hZ2VFbGVtZW50KQorICAgICAgICByZXR1cm4gMDsK
ICAgICAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNy
ZWF0ZShpbWFnZUVsZW1lbnQtPnJlbmRlcmVyKCkpOwogfQogICAgIAogdm9pZCBBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0OjpnZXREb2N1bWVudExpbmtzKEFjY2Vzc2liaWxpdHlDaGlsZHJlblZl
Y3RvciYgcmVzdWx0KQpJbmRleDogV2ViQ29yZS9odG1sL0hUTUxBcmVhRWxlbWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxBcmVhRWxlbWVudC5jcHAJKHJldmlzaW9uIDUz
NzQyKQorKysgV2ViQ29yZS9odG1sL0hUTUxBcmVhRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJIVE1MQXJl
YUVsZW1lbnQuaCIKIAorI2luY2x1ZGUgIkhUTUxJbWFnZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJI
VE1MTWFwRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhpdFRl
c3RSZXN1bHQuaCIKICNpbmNsdWRlICJNYXBwZWRBdHRyaWJ1dGUuaCIKQEAgLTgyLDEzICs4NCwy
NyBAQCBib29sIEhUTUxBcmVhRWxlbWVudDo6bWFwTW91c2VFdmVudChpbnQgCiAgICAgcmV0dXJu
IHRydWU7CiB9CiAKLUludFJlY3QgSFRNTEFyZWFFbGVtZW50OjpnZXRSZWN0KFJlbmRlck9iamVj
dCogb2JqKSBjb25zdAorUGF0aCBIVE1MQXJlYUVsZW1lbnQ6OmdldFBhdGgoUmVuZGVyT2JqZWN0
KiBvYmopIGNvbnN0CiB7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiBQYXRoKCk7Cisg
ICAgCiAgICAgLy8gRklYTUU6IFRoaXMgZG9lc24ndCB3b3JrIGNvcnJlY3RseSB3aXRoIHRyYW5z
Zm9ybXMuCiAgICAgRmxvYXRQb2ludCBhYnNQb3MgPSBvYmotPmxvY2FsVG9BYnNvbHV0ZSgpOwot
ICAgIFBhdGggcCA9IGdldFJlZ2lvbihtX2xhc3RTaXplKTsKKworICAgIC8vIERlZmF1bHQgc2hv
dWxkIGRlZmF1bHQgdG8gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5pbmcgb2JqZWN0LgorICAgIElu
dFNpemUgc2l6ZSA9IG1fbGFzdFNpemU7CisgICAgaWYgKG1fc2hhcGUgPT0gRGVmYXVsdCkKKyAg
ICAgICAgc2l6ZSA9IG9iai0+YWJzb2x1dGVPdXRsaW5lQm91bmRzKCkuc2l6ZSgpOworICAgIAor
ICAgIFBhdGggcCA9IGdldFJlZ2lvbihzaXplKTsKICAgICBwLnRyYW5zbGF0ZShhYnNQb3MgLSBG
bG9hdFBvaW50KCkpOwotICAgIHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KHAuYm91bmRpbmdSZWN0
KCkpOworICAgIHJldHVybiBwOworfQorICAgIAorSW50UmVjdCBIVE1MQXJlYUVsZW1lbnQ6Omdl
dFJlY3QoUmVuZGVyT2JqZWN0KiBvYmopIGNvbnN0Cit7CisgICAgcmV0dXJuIGVuY2xvc2luZ0lu
dFJlY3QoZ2V0UGF0aChvYmopLmJvdW5kaW5nUmVjdCgpKTsKIH0KIAogUGF0aCBIVE1MQXJlYUVs
ZW1lbnQ6OmdldFJlZ2lvbihjb25zdCBJbnRTaXplJiBzaXplKSBjb25zdApAQCAtMTYxLDExICsx
NzcsNTUgQEAgdm9pZCBIVE1MQXJlYUVsZW1lbnQ6OnNldE5vSHJlZihib29sIG5vSAogewogICAg
IHNldEF0dHJpYnV0ZShub2hyZWZBdHRyLCBub0hyZWYgPyAiIiA6IDApOwogfQorICAgIAorSFRN
TEltYWdlRWxlbWVudCogSFRNTEFyZWFFbGVtZW50OjppbWFnZUVsZW1lbnQoKSBjb25zdAorewor
ICAgIE5vZGUqIG1hcEVsZW1lbnQgPSBwYXJlbnQoKTsKKyAgICBpZiAoIW1hcEVsZW1lbnQtPmhh
c1RhZ05hbWUobWFwVGFnKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgcmV0dXJuIHJl
aW50ZXJwcmV0X2Nhc3Q8SFRNTE1hcEVsZW1lbnQqPihtYXBFbGVtZW50KS0+aW1hZ2VFbGVtZW50
KCk7Cit9CiAKK2Jvb2wgSFRNTEFyZWFFbGVtZW50Ojppc0tleWJvYXJkRm9jdXNhYmxlKEtleWJv
YXJkRXZlbnQqKSBjb25zdAoreworICAgIHJldHVybiBzdXBwb3J0c0ZvY3VzKCk7Cit9CisKK2Jv
b2wgSFRNTEFyZWFFbGVtZW50Ojppc0ZvY3VzYWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1
cHBvcnRzRm9jdXMoKTsKK30KKyAgICAKK3ZvaWQgSFRNTEFyZWFFbGVtZW50OjpkaXNwYXRjaEJs
dXJFdmVudCgpCit7CisgICAgTm9kZTo6ZGlzcGF0Y2hCbHVyRXZlbnQoKTsKKyAgICAKKyAgICAv
LyBPbiBhIGJsdXIsIHdlIG1pZ2h0IG5lZWQgdG8gcmVtb3ZlIG91ciBmb2N1cyByaW5ncyBieSBy
ZXBhaW50aW5nLgorICAgIHVwZGF0ZUZvY3VzQXBwZWFyYW5jZShmYWxzZSk7Cit9CisgICAgCit2
b2lkIEhUTUxBcmVhRWxlbWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlKGJvb2wgcmVzdG9yZVBy
ZXZpb3VzU2VsZWN0aW9uKQoreworICAgIE5vZGUqIHBhcmVudCA9IHBhcmVudE5vZGUoKTsKKyAg
ICBpZiAocGFyZW50ICYmIHBhcmVudC0+aGFzVGFnTmFtZShtYXBUYWcpKSB7CisgICAgICAgIEhU
TUxJbWFnZUVsZW1lbnQqIGltYWdlRWxlbWVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SFRNTE1hcEVs
ZW1lbnQqPihwYXJlbnQpLT5pbWFnZUVsZW1lbnQoKTsKKworICAgICAgICAvLyBUaGlzIHdpbGwg
aGFuZGxlIHNjcm9sbGluZyB0byB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5LgorICAgICAgICBpbWFn
ZUVsZW1lbnQtPnVwZGF0ZUZvY3VzQXBwZWFyYW5jZShyZXN0b3JlUHJldmlvdXNTZWxlY3Rpb24p
OworICAgICAgICAKKyAgICAgICAgaWYgKGltYWdlRWxlbWVudCkgeworICAgICAgICAgICAgUmVu
ZGVyT2JqZWN0KiBpbWFnZVJlbmRlcmVyID0gaW1hZ2VFbGVtZW50LT5yZW5kZXJlcigpOworICAg
ICAgICAgICAgaWYgKGltYWdlUmVuZGVyZXIpCisgICAgICAgICAgICAgICAgaW1hZ2VSZW5kZXJl
ci0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisgICAgCiBib29s
IEhUTUxBcmVhRWxlbWVudDo6c3VwcG9ydHNGb2N1cygpIGNvbnN0CiB7Ci0gICAgLy8gU2tpcCBI
VE1MQW5jaG9yRWxlbWVudHMgaXNMaW5rKCkgY2hlY2suCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50
OjpzdXBwb3J0c0ZvY3VzKCk7CisgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGlzIGEgbGluayBhbmQg
dGhlIHRhYkluZGV4IHdhcyBub3QgZXhwbGljaXRseSBzZXQgdG8gLTEuCisgICAgcmV0dXJuIGlz
TGluaygpICYmIE5vZGU6OnRhYkluZGV4KCkgIT0gLTE7CiB9CiAKIFN0cmluZyBIVE1MQXJlYUVs
ZW1lbnQ6OnRhcmdldCgpIGNvbnN0CkluZGV4OiBXZWJDb3JlL2h0bWwvSFRNTEFyZWFFbGVtZW50
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxBcmVhRWxlbWVudC5oCShyZXZpc2lv
biA1Mzc0MikKKysrIFdlYkNvcmUvaHRtbC9IVE1MQXJlYUVsZW1lbnQuaAkod29ya2luZyBjb3B5
KQpAQCAtMzAsNiArMzAsNyBAQAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBIaXRUZXN0
UmVzdWx0OworY2xhc3MgSFRNTEltYWdlRWxlbWVudDsKIGNsYXNzIFBhdGg7CiAKIGNsYXNzIEhU
TUxBcmVhRWxlbWVudCA6IHB1YmxpYyBIVE1MQW5jaG9yRWxlbWVudCB7CkBAIC00MSw3ICs0Miwx
MSBAQCBwdWJsaWM6CiAgICAgYm9vbCBtYXBNb3VzZUV2ZW50KGludCB4LCBpbnQgeSwgY29uc3Qg
SW50U2l6ZSYsIEhpdFRlc3RSZXN1bHQmKTsKIAogICAgIEludFJlY3QgZ2V0UmVjdChSZW5kZXJP
YmplY3QqKSBjb25zdDsKLQorICAgIFBhdGggZ2V0UGF0aChSZW5kZXJPYmplY3QqKSBjb25zdDsK
KyAgICAKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IHRoZSBwYXJlbnQgbWFwJ3Mg
aW1hZ2UuCisgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VFbGVtZW50KCkgY29uc3Q7CisgICAg
CiAgICAgS1VSTCBocmVmKCkgY29uc3Q7CiAKICAgICBib29sIG5vSHJlZigpIGNvbnN0OwpAQCAt
NTUsNyArNjAsMTEgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRm9jdXMo
KSBjb25zdDsKICAgICB2aXJ0dWFsIFN0cmluZyB0YXJnZXQoKSBjb25zdDsKLQorICAgIHZpcnR1
YWwgYm9vbCBpc0tleWJvYXJkRm9jdXNhYmxlKEtleWJvYXJkRXZlbnQqKSBjb25zdDsKKyAgICB2
aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
Rm9jdXNBcHBlYXJhbmNlKGJvb2wgLypyZXN0b3JlUHJldmlvdXNTZWxlY3Rpb24qLyk7CisgICAg
dmlydHVhbCB2b2lkIGRpc3BhdGNoQmx1ckV2ZW50KCk7CisgICAgCiAgICAgZW51bSBTaGFwZSB7
IERlZmF1bHQsIFBvbHksIFJlY3QsIENpcmNsZSwgVW5rbm93biB9OwogICAgIFBhdGggZ2V0UmVn
aW9uKGNvbnN0IEludFNpemUmKSBjb25zdDsKIApJbmRleDogV2ViQ29yZS9odG1sL0hUTUxNYXBF
bGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvSFRNTE1hcEVsZW1lbnQuY3Bw
CShyZXZpc2lvbiA1Mzc0MikKKysrIFdlYkNvcmUvaHRtbC9IVE1MTWFwRWxlbWVudC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI1LDEwICsyNSwxMiBAQAogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAj
aW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTENvbGxlY3Rpb24uaCIK
KyNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAj
aW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgogI2luY2x1ZGUgIkludFNpemUuaCIKICNpbmNsdWRl
ICJNYXBwZWRBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKIAogdXNpbmcg
bmFtZXNwYWNlIHN0ZDsKIApAQCAtNzUsNiArNzcsMjUgQEAgYm9vbCBIVE1MTWFwRWxlbWVudDo6
bWFwTW91c2VFdmVudChpbnQgeAogICAgIHJldHVybiBkZWZhdWx0QXJlYTsKIH0KIAorSFRNTElt
YWdlRWxlbWVudCogSFRNTE1hcEVsZW1lbnQ6OmltYWdlRWxlbWVudCgpIGNvbnN0Cit7CisgICAg
U3RyaW5nIG1hcE5hbWUgPSBnZXROYW1lKCkuc3RyaW5nKCkubG93ZXIoKTsKKyAgICBSZWZQdHI8
SFRNTENvbGxlY3Rpb24+IGNvbGwgPSByZW5kZXJlcigpLT5kb2N1bWVudCgpLT5pbWFnZXMoKTsK
KyAgICBmb3IgKE5vZGUqIGN1cnIgPSBjb2xsLT5maXJzdEl0ZW0oKTsgY3VycjsgY3VyciA9IGNv
bGwtPm5leHRJdGVtKCkpIHsKKyAgICAgICAgaWYgKCFjdXJyLT5oYXNUYWdOYW1lKGltZ1RhZykp
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBIVE1MSW1h
Z2VFbGVtZW50J3MgdXNlTWFwKCkgdmFsdWUgaW5jbHVkZXMgdGhlICcjJyBzeW1ib2wgYXQgdGhl
IGJlZ2lubmluZywKKyAgICAgICAgLy8gd2hpY2ggaGFzIHRvIGJlIHN0cmlwcGVkIG9mZi4KKyAg
ICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTElt
YWdlRWxlbWVudCo+KGN1cnIpOworICAgICAgICBTdHJpbmcgdXNlTWFwTmFtZSA9IGltYWdlRWxl
bWVudC0+Z2V0QXR0cmlidXRlKHVzZW1hcEF0dHIpLnN0cmluZygpLnN1YnN0cmluZygxKS5sb3dl
cigpOworICAgICAgICBpZiAodXNlTWFwTmFtZSA9PSBtYXBOYW1lKQorICAgICAgICAgICAgcmV0
dXJuIGltYWdlRWxlbWVudDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7ICAgIAorfQorICAg
IAogdm9pZCBIVE1MTWFwRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlKiBhdHRyKQogewogICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lID0gYXR0ci0+
bmFtZSgpOwpJbmRleDogV2ViQ29yZS9odG1sL0hUTUxNYXBFbGVtZW50LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9odG1sL0hUTUxNYXBFbGVtZW50LmgJKHJldmlzaW9uIDUzNzQyKQorKysgV2Vi
Q29yZS9odG1sL0hUTUxNYXBFbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI5LDcgKzI5LDgg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBJbnRTaXplOwogY2xhc3MgSGl0VGVzdFJl
c3VsdDsKLQorY2xhc3MgSFRNTEltYWdlRWxlbWVudDsKKyAgICAKIGNsYXNzIEhUTUxNYXBFbGVt
ZW50IDogcHVibGljIEhUTUxFbGVtZW50IHsKIHB1YmxpYzoKICAgICBIVE1MTWFwRWxlbWVudChj
b25zdCBRdWFsaWZpZWROYW1lJiwgRG9jdW1lbnQqKTsKQEAgLTQ0LDcgKzQ1LDggQEAgcHVibGlj
OgogICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUq
KTsKIAogICAgIGJvb2wgbWFwTW91c2VFdmVudChpbnQgeCwgaW50IHksIGNvbnN0IEludFNpemUm
LCBIaXRUZXN0UmVzdWx0Jik7Ci0KKyAgICAKKyAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZUVs
ZW1lbnQoKSBjb25zdDsKICAgICBQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBhcmVhcygpOwog
CiAgICAgU3RyaW5nIG5hbWUoKSBjb25zdDsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvR3JhcGhpY3NDb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9HcmFwaGljc0NvbnRleHQuaAkocmV2aXNpb24gNTM3NDIpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNjIsNyAr
MjYyLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBib29sIGdldFNoYWRvdyhJbnRT
aXplJiwgaW50JiwgQ29sb3ImKSBjb25zdDsKICAgICAgICAgdm9pZCBjbGVhclNoYWRvdygpOwog
Ci0gICAgICAgIHZvaWQgZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50UmVjdD4mLCBpbnQg
d2lkdGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJik7CisgICAgICAgIHZvaWQgZHJhd0ZvY3Vz
UmluZ1JlY3RzKGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYsIGludCB3aWR0aCwgaW50IG9mZnNldCwg
Y29uc3QgQ29sb3ImKTsKKyAgICAgICAgdm9pZCBkcmF3Rm9jdXNSaW5nUGF0aHMoY29uc3QgVmVj
dG9yPFBhdGg+JiwgaW50IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xvciYpOwogCiAgICAg
ICAgIHZvaWQgc2V0TGluZUNhcChMaW5lQ2FwKTsKICAgICAgICAgdm9pZCBzZXRMaW5lRGFzaChj
b25zdCBEYXNoQXJyYXkmLCBmbG9hdCBkYXNoT2Zmc2V0KTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3Bw
CShyZXZpc2lvbiA1Mzc0MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3Jh
cGhpY3NDb250ZXh0Q2Fpcm8uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MDYsNyArNjA2LDEyIEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwUGF0aChXaW5kUnVsZSAKICAgICBjYWlyb19jbGlw
KGNyKTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgVmVj
dG9yPEludFJlY3Q+JiByZWN0cywgaW50IHdpZHRoLCBpbnQgLyogb2Zmc2V0ICovLCBjb25zdCBD
b2xvciYgY29sb3IpCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZ1BhdGhzKGNv
bnN0IFZlY3RvcjxQYXRoPiYgcGF0aHMsIGludCB3aWR0aCwgaW50IG9mZnNldCwgY29uc3QgQ29s
b3ImIGNvbG9yKQoreworICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdGb2N1c1JpbmdSZWN0cyhjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3Rz
LCBpbnQgd2lkdGgsIGludCAvKiBvZmZzZXQgKi8sIGNvbnN0IENvbG9yJiBjb2xvcikKIHsKICAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2hhaWt1L0dyYXBoaWNzQ29udGV4dEhhaWt1LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2hhaWt1L0dyYXBoaWNzQ29udGV4dEhh
aWt1LmNwcAkocmV2aXNpb24gNTM3NDIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2hh
aWt1L0dyYXBoaWNzQ29udGV4dEhhaWt1LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjA0LDcgKzIw
NCwxMiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBGbG9hdFJlCiAgICAgbV9k
YXRhLT5tX3ZpZXctPkNvbnN0cmFpbkNsaXBwaW5nUmVnaW9uKCZyZWdpb24pOwogfQogCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJl
Y3RzLCBpbnQgLyogd2lkdGggKi8sIGludCAvKiBvZmZzZXQgKi8sIGNvbnN0IENvbG9yJiBjb2xv
cikKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nUGF0aHMoY29uc3QgVmVjdG9y
PFBhdGg+JiBwYXRocywgaW50IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3Ip
Cit7CisgICAgLy8gRklYTUU6IGltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
ZHJhd0ZvY3VzUmluZ1JlY3RzKGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCAvKiB3
aWR0aCAqLywgaW50IC8qIG9mZnNldCAqLywgY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dE1hYy5tbQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHRNYWMubW0JKHJldmlz
aW9uIDUzNzQyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250
ZXh0TWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC00Myw3ICs0MywzOSBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAvLyBjYWxscyBpbiB0aGlzIGZpbGUgYXJlIGFsbCBleGNlcHRpb24tc2FmZSwgc28g
d2UgZG9uJ3QgYmxvY2sKIC8vIGV4Y2VwdGlvbnMgZm9yIHRob3NlLgogCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQg
d2lkdGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3N0YXRpYyB2b2lkIGRyYXdG
b2N1c1JpbmdUb0NvbnRleHQoQ0dDb250ZXh0UmVmIGNvbnRleHQsIFJldGFpblB0cjxDR1BhdGhS
ZWY+IGZvY3VzUmluZ1BhdGgsIFJldGFpblB0cjxDR0NvbG9yUmVmPiBjb2xvclJlZiwgaW50IHJh
ZGl1cykKK3sKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIENHQ29udGV4dEJlZ2luVHJh
bnNwYXJlbmN5TGF5ZXIoY29udGV4dCwgTlVMTCk7CisjZW5kaWYKKyAgICBDR0NvbnRleHRCZWdp
blBhdGgoY29udGV4dCk7CisgICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBmb2N1c1JpbmdQ
YXRoLmdldCgpKTsKKyAgICB3a0RyYXdGb2N1c1JpbmcoY29udGV4dCwgY29sb3JSZWYuZ2V0KCks
IHJhZGl1cyk7CisjaWZkZWYgQlVJTERJTkdfT05fVElHRVIKKyAgICBDR0NvbnRleHRFbmRUcmFu
c3BhcmVuY3lMYXllcihjb250ZXh0KTsKKyNlbmRpZgorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZHJhd0ZvY3VzUmluZ1BhdGhzKGNvbnN0IFZlY3RvcjxQYXRoPiYgcGF0aHMsIGludCB3aWR0
aCwgaW50IG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpbnQgcmFkaXVzID0gKHdpZHRo
IC0gMSkgLyAyOworICAgIG9mZnNldCArPSByYWRpdXM7CisgICAgUmV0YWluUHRyPENHQ29sb3JS
ZWY+IGNvbG9yUmVmOworICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIGNvbG9yUmVm
LmFkb3B0Q0YoY3JlYXRlQ0dDb2xvcihjb2xvcikpOworICAgIAorICAgIFJldGFpblB0cjxDR011
dGFibGVQYXRoUmVmPiBmb2N1c1JpbmdQYXRoKEFkb3B0Q0YsIENHUGF0aENyZWF0ZU11dGFibGUo
KSk7CisgICAgdW5zaWduZWQgcGF0aENvdW50ID0gcGF0aHMuc2l6ZSgpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBwYXRoQ291bnQ7IGkrKykKKyAgICAgICAgQ0dQYXRoQWRkUGF0aChm
b2N1c1JpbmdQYXRoLmdldCgpLCAwLCBwYXRoc1tpXS5wbGF0Zm9ybVBhdGgoKSk7CisgICAgCisg
ICAgZHJhd0ZvY3VzUmluZ1RvQ29udGV4dChwbGF0Zm9ybUNvbnRleHQoKSwgZm9jdXNSaW5nUGF0
aCwgY29sb3JSZWYsIHJhZGl1cyk7Cit9ICAgIAorICAgIAordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdGb2N1c1JpbmdSZWN0cyhjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgd2lk
dGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKIHsKICAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CkBAIC01OSwxNiArOTEsNyBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHJlY3RDb3VudDsgaSsrKQogICAgICAgICBDR1BhdGhBZGRSZWN0KGZvY3VzUmluZ1BhdGgu
Z2V0KCksIDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAtb2Zmc2V0LCAtb2Zmc2V0KSk7CiAKLSAg
ICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotI2lmZGVmIEJVSUxE
SU5HX09OX1RJR0VSCi0gICAgQ0dDb250ZXh0QmVnaW5UcmFuc3BhcmVuY3lMYXllcihjb250ZXh0
LCBOVUxMKTsKLSNlbmRpZgotICAgIENHQ29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsKLSAgICBD
R0NvbnRleHRBZGRQYXRoKGNvbnRleHQsIGZvY3VzUmluZ1BhdGguZ2V0KCkpOwotICAgIHdrRHJh
d0ZvY3VzUmluZyhjb250ZXh0LCBjb2xvclJlZi5nZXQoKSwgcmFkaXVzKTsKLSNpZmRlZiBCVUlM
RElOR19PTl9USUdFUgotICAgIENHQ29udGV4dEVuZFRyYW5zcGFyZW5jeUxheWVyKGNvbnRleHQp
OwotI2VuZGlmCisgICAgZHJhd0ZvY3VzUmluZ1RvQ29udGV4dChwbGF0Zm9ybUNvbnRleHQoKSwg
Zm9jdXNSaW5nUGF0aCwgY29sb3JSZWYsIHJhZGl1cyk7CiB9CiAKICNpZmRlZiBCVUlMRElOR19P
Tl9USUdFUiAvLyBQb3N0LVRpZ2VyJ3Mgc2V0Q29tcG9zaXRlT3BlcmF0aW9uKCkgaXMgZGVmaW5l
ZCBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3F0L0dyYXBoaWNzQ29udGV4dFF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzQ29udGV4dFF0LmNwcAkocmV2aXNpb24gNTM3NDIpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzQ29udGV4dFF0LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNzk1LDEyICs3OTUsMTcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBQYXRoKFdpbmRSdWxlIAogICAgIHAtPnNldENsaXBQYXRoKG5ld1BhdGgpOwogfQogCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZ1BhdGhzKGNvbnN0IFZlY3RvcjxQYXRoPiYg
cGF0aHMsIGludCB3aWR0aCwgaW50IG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAg
IC8vIEZJWE1FOiBpbXBsZW1lbnQKK30KKwogLyoqCiAgKiBGb2N1cyByaW5nIGhhbmRsaW5nIGlz
IG5vdCBoYW5kbGVkIGhlcmUuIFF0IHN0eWxlIGluIAogICogUmVuZGVyVGhlbWUgaGFuZGxlcyBk
cmF3aW5nIGZvY3VzIG9uIHdpZGdldHMgd2hpY2ggCiAgKiBuZWVkIGl0LgogICovCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3Rz
LCBpbnQgLyogd2lkdGggKi8sIGludCAvKiBvZmZzZXQgKi8sIGNvbnN0IENvbG9yJiBjb2xvcikK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nUmVjdHMoY29uc3QgVmVjdG9yPElu
dFJlY3Q+JiByZWN0cywgaW50IC8qIHdpZHRoICovLCBpbnQgLyogb2Zmc2V0ICovLCBjb25zdCBD
b2xvciYgY29sb3IpCiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0
dXJuOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4
dFNraWEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9H
cmFwaGljc0NvbnRleHRTa2lhLmNwcAkocmV2aXNpb24gNTM3NDIpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTUwMSw3ICs1MDEsMTIgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNv
bnN0IAogICAgIH0KIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29u
c3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IC8qIHdpZHRoICovLCBpbnQgLyogb2Zmc2V0
ICovLCBjb25zdCBDb2xvciYgY29sb3IpCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3Vz
UmluZ1BhdGhzKGNvbnN0IFZlY3RvcjxQYXRoPiYgcGF0aHMsIGludCB3aWR0aCwgaW50IG9mZnNl
dCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmdSZWN0cyhjb25zdCBWZWN0b3I8SW50
UmVjdD4mIHJlY3RzLCBpbnQgLyogd2lkdGggKi8sIGludCAvKiBvZmZzZXQgKi8sIGNvbnN0IENv
bG9yJiBjb2xvcikKIHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1
cm47CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3Jh
cGhpY3NDb250ZXh0Q0dXaW4uY3BwCShyZXZpc2lvbiA1Mzc0MikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTI0LDcgKzEyNCwxMiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1dpbmRvd3NCaXRt
YXAoCiAgICAgQ0dDb250ZXh0RHJhd0ltYWdlKG1fZGF0YS0+bV9jZ0NvbnRleHQuZ2V0KCksIENH
UmVjdE1ha2UocG9pbnQueCgpLCBwb2ludC55KCksIGltYWdlLT5zaXplKCkud2lkdGgoKSwgaW1h
Z2UtPnNpemUoKS5oZWlnaHQoKSksIGNnSW1hZ2UuZ2V0KCkpOyAgIAogfQogCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBp
bnQgd2lkdGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3Rm9jdXNSaW5nUGF0aHMoY29uc3QgVmVjdG9yPFBhdGg+JiBwYXRocywgaW50
IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgLy8gRklYTUU6
IGltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZ1JlY3Rz
KGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB3aWR0aCwgaW50IG9mZnNldCwgY29u
c3QgQ29sb3ImIGNvbG9yKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAg
IHJldHVybjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhcGhpY3ND
b250ZXh0V2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvR3JhcGhpY3NDb250ZXh0V2luY2UuY3BwCShyZXZpc2lvbiA1Mzc0MikKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhcGhpY3NDb250ZXh0V2luY2UuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMDAyLDcgKzEwMDIsMTIgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBPdXQoY29uc3QgSW50UgogICAgIEV4Y2x1ZGVDbGlwUmVjdChtX2RhdGEtPm1fZGMsIHRyUmVj
dC54KCksIHRyUmVjdC55KCksIHRyUmVjdC5yaWdodCgpLCB0clJlY3QuYm90dG9tKCkpOwogfQog
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50UmVj
dD4mIHJlY3RzLCBpbnQgd2lkdGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nUGF0aHMoY29uc3QgVmVjdG9yPFBhdGg+
JiBwYXRocywgaW50IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCit7Cisg
ICAgLy8gRklYTUU6IGltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0Zv
Y3VzUmluZ1JlY3RzKGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB3aWR0aCwgaW50
IG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIGlmICghbV9kYXRhLT5tX29wYWNp
dHkgfHwgcGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3d4L0dyYXBoaWNzQ29udGV4dFd4LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0dyYXBoaWNzQ29udGV4dFd4LmNwcAkocmV2
aXNpb24gNTM3NDIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3d4L0dyYXBoaWNzQ29u
dGV4dFd4LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcwLDYgKzI3MCwxMSBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZmlsbFJvdW5kZWRSZWN0KGNvCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0K
IAordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmdQYXRocyhjb25zdCBWZWN0b3I8
UGF0aD4mIHBhdGhzLCBpbnQgd2lkdGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikK
K3sKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50Cit9CisKIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3Rm9jdXNSaW5nKGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB3aWR0aCwgaW50
IG9mZnNldCwgY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3BwCShyZXZpc2lvbiA1Mzc0MikKKysr
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYs
MTQgKzI2LDE5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2Uu
aCIKIAorI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisj
aW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTENvbGxlY3Rpb24uaCIK
ICNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVu
dC5oIgogI2luY2x1ZGUgIkhUTUxNYXBFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgi
CiAjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRl
ICJSZW5kZXJUaGVtZS5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJTZWxl
Y3Rpb25Db250cm9sbGVyLmgiCiAjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CiAjaW5jbHVk
ZSA8d3RmL1VudXNlZFBhcmFtLmg+CiAKQEAgLTQyNSw2ICs0MzAsNTIgQEAgdm9pZCBSZW5kZXJJ
bWFnZTo6cGFpbnRSZXBsYWNlZChQYWludEluZgogICAgIH0KIH0KIAordm9pZCBSZW5kZXJJbWFn
ZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQoreworICAgIFJl
bmRlclJlcGxhY2VkOjpwYWludChwYWludEluZm8sIHR4LCB0eSk7CisgICAgCisgICAgaWYgKHBh
aW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSkKKyAgICAgICAgcGFpbnRGb2N1c1Jp
bmdzKHBhaW50SW5mbywgc3R5bGUoKSk7Cit9CisgICAgCit2b2lkIFJlbmRlckltYWdlOjpwYWlu
dEZvY3VzUmluZ3MoUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IFJlbmRlclN0eWxlKiBzdHls
ZSkKK3sKKyAgICAvLyBEb24ndCBkcmF3IGZvY3VzIHJpbmdzIGlmIHByaW50aW5nLgorICAgIGlm
IChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFkb2N1bWVudCgpLT5mcmFtZSgpLT5zZWxlY3Rp
b24oKS0+aXNGb2N1c2VkQW5kQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBp
ZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSAmJiAhcGFpbnRJbmZvLmNv
bnRleHQtPnVwZGF0aW5nQ29udHJvbFRpbnRzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhU
TUxNYXBFbGVtZW50KiBtYXBFbGVtZW50ID0gaW1hZ2VNYXAoKTsKKyAgICBpZiAoIW1hcEVsZW1l
bnQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBEb2N1bWVudCogZG9jID0gbWFwRWxlbWVu
dC0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IE5vZGUqIGZvY3VzZWROb2RlID0gZG9jLT5mb2N1c2VkTm9kZSgpOworICAgIGlmICghZm9jdXNl
ZE5vZGUpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+
IGFyZWFzID0gbWFwRWxlbWVudC0+YXJlYXMoKTsKKyAgICB1bnNpZ25lZCBudW1BcmVhcyA9IGFy
ZWFzLT5sZW5ndGgoKTsKKyAgICAKKyAgICAvLyBGSVhNRTogQ2xpcCB0aGUgcGF0aHMgdG8gdGhl
IGltYWdlIGJvdW5kaW5nIGJveC4KKyAgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgbnVtQXJl
YXM7ICsraykgeworICAgICAgICBIVE1MQXJlYUVsZW1lbnQqIGFyZWFFbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8SFRNTEFyZWFFbGVtZW50Kj4oYXJlYXMtPml0ZW0oaykpOworICAgICAgICBpZiAoZm9j
dXNlZE5vZGUgIT0gYXJlYUVsZW1lbnQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
CisgICAgICAgIFBhdGggcGF0aCA9IGFyZWFFbGVtZW50LT5nZXRQYXRoKHRoaXMpOworICAgICAg
ICBWZWN0b3I8UGF0aD4gZm9jdXNSaW5nUGF0aHM7CisgICAgICAgIGZvY3VzUmluZ1BhdGhzLmFw
cGVuZChwYXRoKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdGb2N1c1JpbmdQYXRo
cyhmb2N1c1JpbmdQYXRocywgc3R5bGUtPm91dGxpbmVXaWR0aCgpLCBzdHlsZS0+b3V0bGluZU9m
ZnNldCgpLCBzdHlsZS0+b3V0bGluZUNvbG9yKCkpOworICAgICAgICBicmVhazsKKyAgICB9Cit9
CisgICAgCiB2b2lkIFJlbmRlckltYWdlOjpwYWludEludG9SZWN0KEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCkKIHsKICAgICBpZiAoIWhhc0ltYWdlKCkgfHwg
ZXJyb3JPY2N1cnJlZCgpIHx8IHJlY3Qud2lkdGgoKSA8PSAwIHx8IHJlY3QuaGVpZ2h0KCkgPD0g
MCkKQEAgLTQ0NSw3ICs0OTYsNyBAQCBpbnQgUmVuZGVySW1hZ2U6Om1pbmltdW1SZXBsYWNlZEhl
aWdodCgpCiAgICAgcmV0dXJuIGVycm9yT2NjdXJyZWQoKSA/IGludHJpbnNpY1NpemUoKS5oZWln
aHQoKSA6IDA7CiB9CiAKLUhUTUxNYXBFbGVtZW50KiBSZW5kZXJJbWFnZTo6aW1hZ2VNYXAoKQor
SFRNTE1hcEVsZW1lbnQqIFJlbmRlckltYWdlOjppbWFnZU1hcCgpIGNvbnN0CiB7CiAgICAgSFRN
TEltYWdlRWxlbWVudCogaSA9IG5vZGUoKSAmJiBub2RlKCktPmhhc1RhZ05hbWUoaW1nVGFnKSA/
IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1lbnQqPihub2RlKCkpIDogMDsKICAgICByZXR1cm4g
aSA/IGktPmRvY3VtZW50KCktPmdldEltYWdlTWFwKGktPmdldEF0dHJpYnV0ZSh1c2VtYXBBdHRy
KSkgOiAwOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2UuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5oCShyZXZpc2lvbiA1Mzc0MikKKysr
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckltYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTQzLDEz
ICs0MywxNCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSop
OwogICAgIENhY2hlZEltYWdlKiBjYWNoZWRJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVk
SW1hZ2UuZ2V0KCk7IH0KIAotICAgIEhUTUxNYXBFbGVtZW50KiBpbWFnZU1hcCgpOworICAgIEhU
TUxNYXBFbGVtZW50KiBpbWFnZU1hcCgpIGNvbnN0OwogCiAgICAgdm9pZCByZXNldEFuaW1hdGlv
bigpOwogCiAgICAgdmlydHVhbCBib29sIGhhc0ltYWdlKCkgY29uc3QgeyByZXR1cm4gbV9jYWNo
ZWRJbWFnZTsgfQogCiAgICAgdm9pZCBoaWdoUXVhbGl0eVJlcGFpbnRUaW1lckZpcmVkKFRpbWVy
PFJlbmRlckltYWdlPiopOworICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mIHBhaW50
SW5mbywgaW50IHR4LCBpbnQgdHkpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBJbWFnZSog
aW1hZ2UoaW50IC8qIHdpZHRoICovID0gMCwgaW50IC8qIGhlaWdodCAqLyA9IDApIHsgcmV0dXJu
IG1fY2FjaGVkSW1hZ2UgPyBtX2NhY2hlZEltYWdlLT5pbWFnZSgpIDogbnVsbEltYWdlKCk7IH0K
QEAgLTU4LDcgKzU5LDggQEAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9pZCBpbWFnZUNoYW5n
ZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9IDApOwogCiAgICAgdmlydHVhbCB2
b2lkIHBhaW50SW50b1JlY3QoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpOwotCisg
ICAgdm9pZCBwYWludEZvY3VzUmluZ3MoUGFpbnRJbmZvJiwgY29uc3QgUmVuZGVyU3R5bGUqIHN0
eWxlKTsKKyAgICAKICAgICBib29sIGlzV2lkdGhTcGVjaWZpZWQoKSBjb25zdDsKICAgICBib29s
IGlzSGVpZ2h0U3BlY2lmaWVkKCkgY29uc3Q7CiAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlcklubGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5s
aW5lLmNwcAkocmV2aXNpb24gNTM3NDIpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxp
bmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05ODEsNyArOTgxLDcgQEAgdm9pZCBSZW5kZXJJbmxp
bmU6OnBhaW50T3V0bGluZShHcmFwaGljcwogICAgICAgICBWZWN0b3I8SW50UmVjdD4gZm9jdXNS
aW5nUmVjdHM7CiAgICAgICAgIGFkZEZvY3VzUmluZ1JlY3RzKGZvY3VzUmluZ1JlY3RzLCB0eCwg
dHkpOwogICAgICAgICBpZiAoc3R5bGUoKS0+b3V0bGluZVN0eWxlSXNBdXRvKCkpCi0gICAgICAg
ICAgICBncmFwaGljc0NvbnRleHQtPmRyYXdGb2N1c1JpbmcoZm9jdXNSaW5nUmVjdHMsIG93LCBz
dHlsZSgpLT5vdXRsaW5lT2Zmc2V0KCksIG9jKTsKKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4
dC0+ZHJhd0ZvY3VzUmluZ1JlY3RzKGZvY3VzUmluZ1JlY3RzLCBvdywgc3R5bGUoKS0+b3V0bGlu
ZU9mZnNldCgpLCBvYyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGFkZFBERlVSTFJlY3Qo
Z3JhcGhpY3NDb250ZXh0LCB1bmlvblJlY3QoZm9jdXNSaW5nUmVjdHMpKTsKICAgICB9CkluZGV4
OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDUzNzQyKQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTAxMSw3ICsx
MDExLDcgQEAgdm9pZCBSZW5kZXJPYmplY3Q6OnBhaW50T3V0bGluZShHcmFwaGljcwogICAgICAg
ICAgICAgVmVjdG9yPEludFJlY3Q+IGZvY3VzUmluZ1JlY3RzOwogICAgICAgICAgICAgYWRkRm9j
dXNSaW5nUmVjdHMoZm9jdXNSaW5nUmVjdHMsIHR4LCB0eSk7CiAgICAgICAgICAgICBpZiAoc3R5
bGUtPm91dGxpbmVTdHlsZUlzQXV0bygpKQotICAgICAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4
dC0+ZHJhd0ZvY3VzUmluZyhmb2N1c1JpbmdSZWN0cywgb3csIG9mZnNldCwgb2MpOworICAgICAg
ICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ZvY3VzUmluZ1JlY3RzKGZvY3VzUmluZ1Jl
Y3RzLCBvdywgb2Zmc2V0LCBvYyk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAg
YWRkUERGVVJMUmVjdChncmFwaGljc0NvbnRleHQsIHVuaW9uUmVjdChmb2N1c1JpbmdSZWN0cykp
OwogICAgICAgICB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAkocmV2aXNpb24gNTM3
NDIpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpA
QCAtMTM1LDYgKzEzNSw3IEBAIHN0cnVjdCBEYXNoYm9hcmRSZWdpb25WYWx1ZSB7CiBjbGFzcyBS
ZW5kZXJPYmplY3QgOiBwdWJsaWMgQ2FjaGVkUmVzb3VyY2VDbGllbnQgewogICAgIGZyaWVuZCBj
bGFzcyBSZW5kZXJCbG9jazsKICAgICBmcmllbmQgY2xhc3MgUmVuZGVyQm94OworICAgIGZyaWVu
ZCBjbGFzcyBSZW5kZXJJbWFnZTsKICAgICBmcmllbmQgY2xhc3MgUmVuZGVyTGF5ZXI7CiAgICAg
ZnJpZW5kIGNsYXNzIFJlbmRlck9iamVjdENoaWxkTGlzdDsKICAgICBmcmllbmQgY2xhc3MgUmVu
ZGVyU1ZHQ29udGFpbmVyOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUmVwbGFjZWQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSZXBsYWNlZC5oCShyZXZp
c2lvbiA1Mzc0MikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJlcGxhY2VkLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQ2LDYgKzQ2LDcgQEAgcHJvdGVjdGVkOgogICAgIHZvaWQgc2V0SW50cmlu
c2ljU2l6ZShjb25zdCBJbnRTaXplJik7CiAgICAgdmlydHVhbCB2b2lkIGludHJpbnNpY1NpemVD
aGFuZ2VkKCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBp
bnQgdHkpOwogICAgIGJvb2wgc2hvdWxkUGFpbnQoUGFpbnRJbmZvJiwgaW50JiB0eCwgaW50JiB0
eSk7CiAgICAgdm9pZCBhZGp1c3RPdmVyZmxvd0ZvckJveFNoYWRvd0FuZFJlZmxlY3QoKTsKICAg
ICBJbnRSZWN0IGxvY2FsU2VsZWN0aW9uUmVjdChib29sIGNoZWNrV2hldGhlclNlbGVjdGVkID0g
dHJ1ZSkgY29uc3Q7CkBAIC02Miw3ICs2Myw2IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGlu
dCBtaW5pbXVtUmVwbGFjZWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9CiAKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwogICAgIHZpcnR1YWwg
dm9pZCBwYWludFJlcGxhY2VkKFBhaW50SW5mbyYsIGludCAvKnR4Ki8sIGludCAvKnR5Ki8pIHsg
fQogCiAgICAgdmlydHVhbCBJbnRSZWN0IGNsaXBwZWRPdmVyZmxvd1JlY3RGb3JSZXBhaW50KFJl
bmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyKTsKSW5kZXg6IExheW91dFRlc3Rz
L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9u
IDUzNzQyKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMTMgQEAKKzIwMTAtMDEtMjIgIENocmlzIEZsZWl6YWNoICA8Y2ZsZWl6YWNoQGFwcGxlLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQg
YWJpbGl0eSBmb3IgaW1hZ2UgbWFwcyB0byBiZSBmb2N1c2VkIHZpYSB0YWJiaW5nCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzUxMworCisgICAgICAg
ICogZmFzdC9ldmVudHMvdGFiLWltYWdlbWFwLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAg
ICogZmFzdC9ldmVudHMvdGFiLWltYWdlbWFwLmh0bWw6IEFkZGVkLgorCiAyMDEwLTAxLTIyICBT
dGV2ZSBGYWxrZW5idXJnICA8c2ZhbGtlbkBhcHBsZS5jb20+CiAKICAgICAgICAgU2tpcCBmYXN0
L2RvbS9XaW5kb3cvd2luZG93LXByb3BlcnRpZXMtZ2VvbG9jYXRpb24uaHRtbApJbmRleDogTGF5
b3V0VGVzdHMvZmFzdC9ldmVudHMvdGFiLWltYWdlbWFwLWV4cGVjdGVkLnR4dAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2V2ZW50cy90YWItaW1hZ2VtYXAtZXhwZWN0ZWQudHh0CShy
ZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9ldmVudHMvdGFiLWltYWdlbWFwLWV4cGVj
dGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMyBAQAorIAorVGhpcyB0ZXN0cyB0aGF0
IGxpbmtzIGluIGEgaW1hZ2UgbWFwIGFyZSBhYmxlIHRvIGJlIHJlYWNoZWQgdGhyb3VnaCBrZXli
b2FyZCBhY2Nlc3MgYW5kIHRhYmJpbmcuCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNl
cmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKwor
CitQQVNTIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuaWQgaXMgJ2FyZWExJworUEFTUyBkb2N1bWVu
dC5hY3RpdmVFbGVtZW50LmlkIGlzICdhcmVhMicKK1BBU1MgZG9jdW1lbnQuYWN0aXZlRWxlbWVu
dC5pZCBpcyAnYXJlYTMnCitQQVNTIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuaWQgaXMgJ2FyZWE1
JworUEFTUyBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmlkIGlzICdhcmVhNicKK1BBU1MgZG9jdW1l
bnQuYWN0aXZlRWxlbWVudC5pZCBpcyAnYXJlYTEnCisKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qv
ZXZlbnRzL3RhYi1pbWFnZW1hcC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qv
ZXZlbnRzL3RhYi1pbWFnZW1hcC5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFz
dC9ldmVudHMvdGFiLWltYWdlbWFwLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTYgQEAK
KzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgor
PGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2pzL3Jlc291cmNlcy9qcy10
ZXN0LXN0eWxlLmNzcyI+Cis8c2NyaXB0PgordmFyIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IGZhbHNl
OworPC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpz
Ij48L3NjcmlwdD4KKzxib2R5IGlkPSJib2R5Ij4KKworPG1hcCBuYW1lPSJteW1hcCI+Cis8YXJl
YSBpZD0iYXJlYTEiIHNoYXBlPSJjaXJjbGUiIGNvb3Jkcz0iNzAsODQsNTEiIGhyZWY9IjEiPgor
PGFyZWEgaWQ9ImFyZWEyIiBzaGFwZT0icmVjdCIgY29vcmRzPSIyNSwxODAsMTI1LDI4MCIgaHJl
Zj0iMiI+Cis8YXJlYSBpZD0iYXJlYTMiIHNoYXBlPSJwb2x5IiBjb29yZHM9IjE1MywxMDYsMTg2
LDIyNSwzNDAsMTkzLDMxNSw4MSwzMDQsMTY3IiBocmVmPSIzIj4KKzxhcmVhIGlkPSJhcmVhNCIg
c2hhcGU9InJlY3QiIGNvb3Jkcz0iNDIwLDE5LDQ3OCwyNzgiIG5vaHJlZj4KKzxhcmVhIGlkPSJh
cmVhNSIgc2hhcGU9ImNpcmNsZSIgY29vcmRzPSIyMjAsMTUwLDEwMCIgaHJlZj0iNCI+Cis8YXJl
YSBpZD0iYXJlYTYiIHNoYXBlPSJkZWZhdWx0IiBjb29yZHM9IjAsMCw1MDAsMzAwIiBocmVmPSI1
Ij4KKzxhcmVhIGlkPSJhcmVhNyIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMSwgMSwgMTAsIDEwIiB0
YWJpbmRleD0tMSBocmVmPSI2Ij4KKzwvbWFwPgorCis8aW1nIHNyYz0icmVzb3VyY2VzL2FiZS5w
bmciIHdpZHRoPSI1MDAiIGhlaWdodD0iMzAwIiBhbHQ9IkltYWdlIE1hcCIgdXNlbWFwPSIjbXlt
YXAiIGlzbWFwPgorCisKKzxwIGlkPSJkZXNjcmlwdGlvbiI+PC9wPgorPGRpdiBpZD0iY29uc29s
ZSI+PC9kaXY+CisKKzxzY3JpcHQ+CisKKyAgICBkZXNjcmlwdGlvbigiVGhpcyB0ZXN0cyB0aGF0
IGxpbmtzIGluIGEgaW1hZ2UgbWFwIGFyZSBhYmxlIHRvIGJlIHJlYWNoZWQgdGhyb3VnaCBrZXli
b2FyZCBhY2Nlc3MgYW5kIHRhYmJpbmcuIik7CisKKyAgICBldmVudFNlbmRlci5rZXlEb3duKCdc
dCcpOworICAgIHNob3VsZEJlKCJkb2N1bWVudC5hY3RpdmVFbGVtZW50LmlkIiwgIidhcmVhMSci
KTsKKworICAgIGV2ZW50U2VuZGVyLmtleURvd24oJ1x0Jyk7CisgICAgc2hvdWxkQmUoImRvY3Vt
ZW50LmFjdGl2ZUVsZW1lbnQuaWQiLCAiJ2FyZWEyJyIpOworCisgICAgZXZlbnRTZW5kZXIua2V5
RG93bignXHQnKTsKKyAgICBzaG91bGRCZSgiZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pZCIsICIn
YXJlYTMnIik7CisKKyAgICAvLyBXZSdsbCBza2lwIG92ZXIgYXJlYTQgYmVjYXVzZSBpdHMgbm9o
cmVmCisgICAgZXZlbnRTZW5kZXIua2V5RG93bignXHQnKTsKKyAgICBzaG91bGRCZSgiZG9jdW1l
bnQuYWN0aXZlRWxlbWVudC5pZCIsICInYXJlYTUnIik7CisKKyAgICBldmVudFNlbmRlci5rZXlE
b3duKCdcdCcpOworICAgIHNob3VsZEJlKCJkb2N1bWVudC5hY3RpdmVFbGVtZW50LmlkIiwgIidh
cmVhNiciKTsKKworICAgIC8vIFdlJ2xsIHNraXAgb3ZlciBhcmVhNyBiZWNhdXNlIGl0cyB0YWJp
bmRleD0tMQorICAgIGV2ZW50U2VuZGVyLmtleURvd24oJ1x0Jyk7CisgICAgc2hvdWxkQmUoImRv
Y3VtZW50LmFjdGl2ZUVsZW1lbnQuaWQiLCAiJ2FyZWExJyIpOworCisgICAgc3VjY2Vzc2Z1bGx5
UGFyc2VkID0gdHJ1ZTsKKzwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0iLi4vZmFzdC9qcy9yZXNv
dXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4K
</data>
<flag name="review"
          id="29654"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>47365</attachid>
            <date>2010-01-25 12:47:56 -0800</date>
            <delta_ts>2010-01-25 17:14:32 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64"></data>
<flag name="review"
          id="29784"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>