<?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>21751</bug_id>
          
          <creation_ts>2008-10-20 07:41:30 -0700</creation_ts>
          <short_desc>Convert checkbox/radio buttons on Mac to new Theme API</short_desc>
          <delta_ts>2008-10-20 09:50:48 -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>Forms</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dave Hyatt">hyatt</reporter>
          <assigned_to name="Dave Hyatt">hyatt</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>95988</commentid>
    <comment_count>0</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-10-20 07:41:30 -0700</bug_when>
    <thetext>Convert checkbox/radio buttons on Mac to new Theme API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>95989</commentid>
    <comment_count>1</comment_count>
      <attachid>24522</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-10-20 07:42:45 -0700</bug_when>
    <thetext>Created attachment 24522
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>95995</commentid>
    <comment_count>2</comment_count>
      <attachid>24522</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-10-20 08:13:11 -0700</bug_when>
    <thetext>Comment on attachment 24522
Patch

 81     // The size here is in zoomed coordinates already.  If a new size is returned, it also needs to be in zoomed coordinates.
 82     virtual IntSize controlSize(ControlPart, const Font&amp;, const IntSize&amp; size, float zoomFactor) const { return size; }

Should we call the parameter &quot;zoomedSize&quot;?

 91     // Method for painting a control.  The rect is in zoomed coordinates.
 92     virtual void paint(ControlPart, ControlStates, GraphicsContext*, const IntRect&amp;, float zoomFactor, ScrollView*) const { };

 96     // The rect passed in is in zoomed coordinates, so the inflation should take that into account and make sure the inflation
 97     // amount is also scaled by the zoomFactor.
 98     virtual void inflateControlPaintRect(ControlPart, ControlStates, IntRect&amp;, float zoomFactor) const { }

Should we call the IntRect parameter in these two functions zoomedRect?

 62 static IntSize sizeFromFont(const Font&amp; font, const IntSize&amp; size, float zoomFactor, const IntSize* sizes)

It would be useful to document which of the size parameter, the sizes parameter, and the return value should be in zoomed coordinates, either with a comment or by making the parameter names clearer or both.

 75 static void setControlSize(NSCell* cell, const IntSize* sizes, const IntSize&amp; minSize, float zoomLevel)

Ditto

 78     if (minSize.width() &gt;= static_cast&lt;int&gt;(sizes[NSRegularControlSize].width() * zoomLevel) &amp;&amp;
 79         minSize.height() &gt;= static_cast&lt;int&gt;(sizes[NSRegularControlSize].height() * zoomLevel))
 80         size = NSRegularControlSize;
 81     else if (minSize.width() &gt;= static_cast&lt;int&gt;(sizes[NSSmallControlSize].width() * zoomLevel) &amp;&amp;
 82              minSize.height() &gt;= static_cast&lt;int&gt;(sizes[NSSmallControlSize].height() * zoomLevel))
 83         size = NSSmallControlSize;

Is truncating really the right behavior here? Should we be rounding instead?

 96     bool pressed = (states &amp; PressedState);

I don&apos;t think the parentheses here (and on other similar lines) improve clarity.

 116     if (oldIndeterminate != indeterminate) {
 117         [cell setState:indeterminate ? NSMixedState : (checked ? NSOnState : NSOffState)];
 118         return;
 119     }
 120     bool oldChecked = [cell state] == NSOnState;
 121     if (checked != oldChecked)
 122         [cell setState:checked ? NSOnState : NSOffState];

I think you could combine this into a single call to setState:

if (oldIndeterminate != indeterminate || oldChecked != checked)
    [cell setState:indeterminate ? NSMixedState : (checked ? NSOnState : NSOffState)];

 128 static IntRect inflateRect(const IntRect&amp; r, const IntSize&amp; size, const int* margins, float zoomLevel)

 165 static IntSize checkboxSize(ControlPart part, const Font&amp; font, const IntSize&amp; size, float zoomFactor)

 175 static NSButtonCell* checkbox(ControlStates states, const IntRect&amp; rect, float zoomFactor)

 195 static void paintCheckbox(ControlStates states, GraphicsContext* context, const IntRect&amp; rect, float zoomFactor, ScrollView* scrollView)

 251 static NSButtonCell* radio(ControlStates states, const IntRect&amp; rect, float zoomFactor)

 270 static void paintRadio(ControlStates states, GraphicsContext* context, const IntRect&amp; rect, float zoomFactor, ScrollView* scrollView)

Ditto for these functions re: which parameters/return value are zoomed.

 177     static RetainPtr&lt;NSButtonCell&gt; checkboxCell;

I think we should just use bare (leaked) pointers for all these static NSCell objects.

Is it possible to share code between paintCheckbox and paintRadio? It sure seems like it!

 230 static const int* radioMargins(NSControlSize controlSize)
 231 {
 232     static const int margins[3][4] =
 233     {
 234         { 2, 2, 4, 2 },
 235         { 3, 2, 3, 2 },
 236         { 1, 0, 2, 0 },
 237     };
 238     return margins[controlSize];
 239 }

Should margins instead be a ControlBox[3]?

 299 int ThemeMac::baselinePositionAdjustment(ControlPart part) const
 300 {
 301     if (part == CheckboxPart || part == RadioPart)
 302         return -2;

Should you be using cUnchangedControlSize instead of -2 here?

 345 void ThemeMac::inflateControlPaintRect(ControlPart part, ControlStates states, IntRect&amp; rect, float zoomFactor) const
 346 {
 347     switch (part) {
 348         case CheckboxPart: {
 349             // We inflate the rect as needed to account for padding included in the cell to accommodate the checkbox
 350             // shadow&quot; and the check.  We don&apos;t consider this part of the bounds of the control in WebKit.
 351             NSCell* cell = checkbox(states, rect, zoomFactor);
 352             NSControlSize controlSize = [cell controlSize];
 353             IntSize size = checkboxSizes()[controlSize];
 354             size.setHeight(size.height() * zoomFactor);
 355             size.setWidth(size.width() * zoomFactor);
 356             rect = inflateRect(rect, size, checkboxMargins(controlSize), zoomFactor);
 357             break;
 358         }
 359         case RadioPart: {
 360             // We inflate the rect as needed to account for padding included in the cell to accommodate the radio button
 361             // shadow&quot;.  We don&apos;t consider this part of the bounds of the control in WebKit.
 362             NSCell* cell = radio(states, rect, zoomFactor);
 363             NSControlSize controlSize = [cell controlSize];
 364             IntSize size = radioSizes()[controlSize];
 365             size.setHeight(size.height() * zoomFactor);
 366             size.setWidth(size.width() * zoomFactor);
 367             rect = inflateRect(rect, size, radioMargins(controlSize), zoomFactor);
 368             break;
 369         }
 370         default:
 371             break;
 372     }
 373 }

Can we share more code here?

 105         IntSize controlSize = m_theme-&gt;controlSize(part, style-&gt;font(), IntSize(lengthToInt(style-&gt;width()), lengthToInt(style-&gt;height())), style-&gt;effectiveZoom());
 106         if (controlSize.width() != cUnchangedControlSize)
 107             style-&gt;setWidth(intToLength(controlSize.width()));
 108         if (controlSize.height() != cUnchangedControlSize)
 109             style-&gt;setHeight(intToLength(controlSize.height()));

I wonder if it would be clearer for controlSize() to have two boolean out parmeters, widthChanged and heightChanged, rather than using these magic values.

374442 // FIXME: It would be nice to set this state on the RenderObjects instead of
375443 // having to dig up to the FocusController at paint time.
 444 ControlStates RenderTheme::controlStatesForRenderer(const RenderObject* o) const

The FIXME is now misplaced.

@@ bool RenderTheme::isFocused(const Render
418510         return false;
419511     Document* document = node-&gt;document();
420512     Frame* frame = document-&gt;frame();
421      return node == document-&gt;focusedNode() &amp;&amp; frame &amp;&amp; frame-&gt;selection()-&gt;isFocusedAndActive();
 513     return node == document-&gt;focusedNode() &amp;&amp; frame &amp;&amp; frame-&gt;selection()-&gt;isFocusedAndActive() &amp;&amp; o-&gt;style()-&gt;outlineStyleIsAuto();

It seems wrong for isFocused to return false just because someone set &quot;outline:none&quot; on this element. Should callers of isFocused instead be responsible for checking this? Or maybe we should rename the function to isShowingFocus?

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96011</commentid>
    <comment_count>3</comment_count>
      <attachid>24525</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-10-20 09:25:28 -0700</bug_when>
    <thetext>Created attachment 24525
Patch #2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96012</commentid>
    <comment_count>4</comment_count>
      <attachid>24525</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-10-20 09:37:41 -0700</bug_when>
    <thetext>Comment on attachment 24525
Patch #2

 243     Length width() const { return m_width; }
 244     Length height() const { return m_height; }
 245     
 246     void setWidth(Length w) { m_width = w; }
 247     void setHeight(Length h) { m_height = h; }

Should we be returning/accepting const Length&amp; here, like we do for the constructor?

 116     if (oldIndeterminate != indeterminate || checked != oldChecked) {
 117         [cell setState:indeterminate ? NSMixedState : (checked ? NSOnState : NSOffState)];
 118         return;
 119     }

The return statement doesn&apos;t seem useful here.

I still think it would be good to share more code between checkboxes and radio buttons. At least paintCheckbox/paintRadio seem trivial to merge. Even a FIXME would be good!

@@ bool RenderTheme::isFocused(const Render
418489         return false;
419490     Document* document = node-&gt;document();
420491     Frame* frame = document-&gt;frame();
421      return node == document-&gt;focusedNode() &amp;&amp; frame &amp;&amp; frame-&gt;selection()-&gt;isFocusedAndActive();
 492     return node == document-&gt;focusedNode() &amp;&amp; frame &amp;&amp; frame-&gt;selection()-&gt;isFocusedAndActive() &amp;&amp; o-&gt;style()-&gt;outlineStyleIsAuto();

I think you meant to undo this change.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>96013</commentid>
    <comment_count>5</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-10-20 09:50:48 -0700</bug_when>
    <thetext>Fixed in r37731.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24522</attachid>
            <date>2008-10-20 07:42:45 -0700</date>
            <delta_ts>2008-10-20 09:25:38 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>41962</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDM3NzE3
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjMgQEAKKzIwMDgtMTAt
MjAgIERhdmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgorCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTc1MQorCisgICAgICAgIENvbnZlcnQgY2hl
Y2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBvdmVyIHRvIHRoZSBuZXcgVGhlbWUgQVBJIG9uIE1h
Yy4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHBs
YXRmb3JtL1RoZW1lLmg6CisgICAgICAgIChXZWJDb3JlOjpUaGVtZTo6Y29udHJvbFNpemUpOgor
ICAgICAgICAoV2ViQ29yZTo6VGhlbWU6OmNvbnRyb2xGb250KToKKyAgICAgICAgKFdlYkNvcmU6
OlRoZW1lOjpjb250cm9sU3VwcG9ydHNCb3JkZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGhlbWU6
OmNvbnRyb2xTdXBwb3J0c1BhZGRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6VGhlbWU6OmNvbnRy
b2xQYWRkaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlRoZW1lOjpjb250cm9sSW50ZXJuYWxQYWRk
aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlRoZW1lOjpjb250cm9sQm9yZGVyUmFkaXVzKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRoZW1lOjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpUaGVtZTo6
aW5mbGF0ZUNvbnRyb2xQYWludFJlY3QpOgorICAgICAgICAqIHBsYXRmb3JtL1RoZW1lVHlwZXMu
aDoKKyAgICAgICAgKFdlYkNvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpDb250cm9sQm94OjpD
b250cm9sQm94KToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvVGhlbWVNYWMuaDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9tYWMvVGhlbWVNYWMubW06CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAg
ICAoV2ViQ29yZTo6Y29udHJvbFNpemVGb3JGb250KToKKyAgICAgICAgKFdlYkNvcmU6OnNpemVG
cm9tRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpzZXRDb250cm9sU2l6ZSk6CisgICAgICAgIChX
ZWJDb3JlOjp1cGRhdGVTdGF0ZXMpOgorICAgICAgICAoV2ViQ29yZTo6aW5mbGF0ZVJlY3QpOgor
ICAgICAgICAoV2ViQ29yZTo6Y2hlY2tib3hTaXplcyk6CisgICAgICAgIChXZWJDb3JlOjpjaGVj
a2JveE1hcmdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tib3hTaXplKToKKyAgICAgICAg
KFdlYkNvcmU6OmNoZWNrYm94KToKKyAgICAgICAgKFdlYkNvcmU6OnBhaW50Q2hlY2tib3gpOgor
ICAgICAgICAoV2ViQ29yZTo6cmFkaW9TaXplcyk6CisgICAgICAgIChXZWJDb3JlOjpyYWRpb01h
cmdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6cmFkaW9TaXplKToKKyAgICAgICAgKFdlYkNvcmU6
OnJhZGlvKToKKyAgICAgICAgKFdlYkNvcmU6OnBhaW50UmFkaW8pOgorICAgICAgICAoV2ViQ29y
ZTo6VGhlbWVNYWM6OmJhc2VsaW5lUG9zaXRpb25BZGp1c3RtZW50KToKKyAgICAgICAgKFdlYkNv
cmU6OlRoZW1lTWFjOjpjb250cm9sU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpUaGVtZU1hYzo6
Y29udHJvbFN1cHBvcnRzQm9yZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRoZW1lTWFjOjpjb250
cm9sU3VwcG9ydHNQYWRkaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlRoZW1lTWFjOjppbmZsYXRl
Q29udHJvbFBhaW50UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpUaGVtZU1hYzo6cGFpbnQpOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjps
ZW5ndGhUb0ludCk6CisgICAgICAgIChXZWJDb3JlOjppbnRUb0xlbmd0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZTo6YWRqdXN0U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWU6OnBhaW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lOjpiYXNlbGlu
ZVBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lOjphZGp1c3RSZXBhaW50
UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZTo6Y29udHJvbFN0YXRlc0ZvclJl
bmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lOjppc0ZvY3VzZWQpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZS5oOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5k
ZXJUaGVtZU1hYy5oOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjphZGp1c3RSZXBhaW50UmVjdCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6dXBkYXRlRm9jdXNlZFN0YXRlKToKKwogMjAw
OC0xMC0yMCAgQWxwIFRva2VyICA8YWxwQG51YW50aS5jb20+CiAKICAgICAgICAgUmVtb3ZlIHVu
dXNlZCBpbmNsdWRlcyBvbmx5LiBQYXJ0aWFsIEdUSysvV2luIGJ1aWxkIGZpeC4KSW5kZXg6IHBs
YXRmb3JtL1RoZW1lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vVGhlbWUuaAkocmV2aXNpb24g
Mzc2NjIpCisrKyBwbGF0Zm9ybS9UaGVtZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3
IEBACiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNz
IFNjcm9sbFZpZXc7CiAKIC8vIFVubGlrZSBvdGhlciBwbGF0Zm9ybSBjbGFzc2VzLCBUaGVtZSBk
b2VzIGV4dGVuc2l2ZWx5IHVzZSB2aXJ0dWFsIGZ1bmN0aW9ucy4gIFRoaXMgZGVzaWduIGFsbG93
cyBhIHBsYXRmb3JtIHRvIHN3aXRjaCBiZXR3ZWVuIG11bHRpcGxlIHRoZW1lcyBhdCBydW50aW1l
LgogY2xhc3MgVGhlbWUgewpAQCAtNzUsMjAgKzc2LDI2IEBAIHB1YmxpYzoKICAgICAvLyBOb3Rp
ZmljYXRpb24gd2hlbiB0aGUgdGhlbWUgaGFzIGNoYW5nZWQKICAgICB2aXJ0dWFsIHZvaWQgdGhl
bWVDaGFuZ2VkKCkgeyB9CiAKLSAgICAvLyBNZXRob2RzIHVzZWQgdG8gYWRqdXN0IHRoZSBSZW5k
ZXJTdHlsZXMgb2YgY29udHJvbHMuICAgIAotICAgIHZpcnR1YWwgSW50U2l6ZSBjb250cm9sU2l6
ZShDb250cm9sUGFydCwgY29uc3QgRm9udCYpIHsgcmV0dXJuIEludFNpemUoKTsgfQotICAgIHZp
cnR1YWwgRm9udCBjb250cm9sRm9udChDb250cm9sUGFydCwgY29uc3QgRm9udCYgZm9udCkgeyBy
ZXR1cm4gZm9udDsgfQotICAgIHZpcnR1YWwgQ29udHJvbEJveCBjb250cm9sUGFkZGluZyhDb250
cm9sUGFydCwgQ29udHJvbEJveCBib3gsIGNvbnN0IEZvbnQmKSB7IHJldHVybiBib3g7IH0KLSAg
ICB2aXJ0dWFsIENvbnRyb2xCb3ggY29udHJvbEludGVybmFsUGFkZGluZyhDb250cm9sUGFydCkg
eyByZXR1cm4gQ29udHJvbEJveCgpOyB9CisgICAgLy8gTWV0aG9kcyB1c2VkIHRvIGFkanVzdCB0
aGUgUmVuZGVyU3R5bGVzIG9mIGNvbnRyb2xzLgorICAgIAorICAgIC8vIFRoZSBzaXplIGhlcmUg
aXMgaW4gem9vbWVkIGNvb3JkaW5hdGVzIGFscmVhZHkuICBJZiBhIG5ldyBzaXplIGlzIHJldHVy
bmVkLCBpdCBhbHNvIG5lZWRzIHRvIGJlIGluIHpvb21lZCBjb29yZGluYXRlcy4KKyAgICB2aXJ0
dWFsIEludFNpemUgY29udHJvbFNpemUoQ29udHJvbFBhcnQsIGNvbnN0IEZvbnQmLCBjb25zdCBJ
bnRTaXplJiBzaXplLCBmbG9hdCB6b29tRmFjdG9yKSBjb25zdCB7IHJldHVybiBzaXplOyB9Cisg
ICAgdmlydHVhbCBGb250IGNvbnRyb2xGb250KENvbnRyb2xQYXJ0LCBjb25zdCBGb250JiBmb250
KSBjb25zdCB7IHJldHVybiBmb250OyB9CisgICAgdmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0
c0JvcmRlcihDb250cm9sUGFydCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwg
Q29udHJvbEJveCBjb250cm9sQm9yZGVyKENvbnRyb2xQYXJ0LCBDb250cm9sQm94IGJveCwgY29u
c3QgRm9udCYpIHsgcmV0dXJuIGJveDsgfQotICAgIHZpcnR1YWwgaW50IGNvbnRyb2xCb3JkZXJS
YWRpdXMoQ29udHJvbFBhcnQsIGNvbnN0IEZvbnQmKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVh
bCBib29sIGNvbnRyb2xTdXBwb3J0c1BhZGRpbmcoQ29udHJvbFBhcnQpIGNvbnN0IHsgcmV0dXJu
IHRydWU7IH0KKyAgICB2aXJ0dWFsIENvbnRyb2xCb3ggY29udHJvbFBhZGRpbmcoQ29udHJvbFBh
cnQsIENvbnRyb2xCb3ggYm94LCBjb25zdCBGb250JikgY29uc3QgeyByZXR1cm4gYm94OyB9Cisg
ICAgdmlydHVhbCBDb250cm9sQm94IGNvbnRyb2xJbnRlcm5hbFBhZGRpbmcoQ29udHJvbFBhcnQp
IGNvbnN0IHsgcmV0dXJuIENvbnRyb2xCb3goKTsgfQorICAgIHZpcnR1YWwgaW50IGNvbnRyb2xC
b3JkZXJSYWRpdXMoQ29udHJvbFBhcnQsIGNvbnN0IEZvbnQmKSBjb25zdCB7IHJldHVybiAwOyB9
CiAKLSAgICAvLyBNZXRob2QgZm9yIHBhaW50aW5nIGEgY29udHJvbC4KLSAgICB2aXJ0dWFsIHZv
aWQgcGFpbnQoQ29udHJvbFBhcnQsIENvbnRyb2xTdGF0ZXMsIEdyYXBoaWNzQ29udGV4dCosIGNv
bnN0IEludFJlY3QmKSB7IH07CisgICAgLy8gTWV0aG9kIGZvciBwYWludGluZyBhIGNvbnRyb2wu
ICBUaGUgcmVjdCBpcyBpbiB6b29tZWQgY29vcmRpbmF0ZXMuCisgICAgdmlydHVhbCB2b2lkIHBh
aW50KENvbnRyb2xQYXJ0LCBDb250cm9sU3RhdGVzLCBHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJ
bnRSZWN0JiwgZmxvYXQgem9vbUZhY3RvciwgU2Nyb2xsVmlldyopIGNvbnN0IHsgfTsKIAogICAg
IC8vIFNvbWUgY29udHJvbHMgbWF5IHNwaWxsIG91dCBvZiB0aGVpciBjb250YWluZXJzIChlLmcu
LCB0aGUgY2hlY2sgb24gYW4gT1MgWCBjaGVja2JveCkuICBXaGVuIHRoZXNlIGNvbnRyb2xzIHJl
cGFpbnQsCiAgICAgLy8gdGhlIHRoZW1lIG5lZWRzIHRvIGNvbW11bmljYXRlIHRoaXMgaW5mbGF0
ZWQgcmVjdCB0byB0aGUgZW5naW5lIHNvIHRoYXQgaXQgY2FuIGludmFsaWRhdGUgdGhlIHdob2xl
IGNvbnRyb2wuCi0gICAgdmlydHVhbCB2b2lkIGluZmxhdGVDb250cm9sUGFpbnRSZWN0KENvbnRy
b2xQYXJ0LCBDb250cm9sU3RhdGVzLCBJbnRSZWN0JikgeyB9CisgICAgLy8gVGhlIHJlY3QgcGFz
c2VkIGluIGlzIGluIHpvb21lZCBjb29yZGluYXRlcywgc28gdGhlIGluZmxhdGlvbiBzaG91bGQg
dGFrZSB0aGF0IGludG8gYWNjb3VudCBhbmQgbWFrZSBzdXJlIHRoZSBpbmZsYXRpb24KKyAgICAv
LyBhbW91bnQgaXMgYWxzbyBzY2FsZWQgYnkgdGhlIHpvb21GYWN0b3IuCisgICAgdmlydHVhbCB2
b2lkIGluZmxhdGVDb250cm9sUGFpbnRSZWN0KENvbnRyb2xQYXJ0LCBDb250cm9sU3RhdGVzLCBJ
bnRSZWN0JiwgZmxvYXQgem9vbUZhY3RvcikgY29uc3QgeyB9CiAgICAgCiAgICAgLy8gVGhpcyBt
ZXRob2QgaXMgY2FsbGVkIG9uY2UsIGZyb20gUmVuZGVyVGhlbWU6OmFkanVzdERlZmF1bHRTdHls
ZVNoZWV0KCksIHRvIGxldCBlYWNoIHBsYXRmb3JtIGFkanVzdAogICAgIC8vIHRoZSBkZWZhdWx0
IENTUyBydWxlcyBpbiBodG1sNC5jc3MuCkluZGV4OiBwbGF0Zm9ybS9UaGVtZVR5cGVzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcGxhdGZvcm0vVGhlbWVUeXBlcy5oCShyZXZpc2lvbiAzNzY2MikKKysrIHBs
YXRmb3JtL1RoZW1lVHlwZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQCBlbnVt
IENvbnRyb2xTdGF0ZSB7CiAgICAgUmVhZE9ubHlTdGF0ZSA9IDEgPDwgNSwKICAgICBEZWZhdWx0
U3RhdGUgPSAxIDw8IDYsCiAgICAgV2luZG93SW5hY3RpdmVTdGF0ZSA9IDEgPDwgNywKKyAgICBJ
bmRldGVybWluYXRlU3RhdGUgPSAxIDw8IDgsCiAgICAgQWxsU3RhdGVzID0gMHhmZmZmZmZmZgog
fTsKIApAQCAtNzAsOSArNzEsMTIgQEAgZW51bSBUaGVtZUNvbG9yIHsKICAgICBGb2N1c1JpbmdD
b2xvcgogfTsKIAorY29uc3QgaW50IGNVbmNoYW5nZWRDb250cm9sU2l6ZSA9IC0yOworY29uc3Qg
aW50IGNBdXRvQ29udHJvbFNpemUgPSAtMTsKKwogY2xhc3MgQ29udHJvbEJveCB7CiBwdWJsaWM6
Ci0gICAgQ29udHJvbEJveChpbnQgdCA9IDAsIGludCByID0gMCwgaW50IGIgPSAwLCBpbnQgbCA9
IDApCisgICAgQ29udHJvbEJveChpbnQgdCA9IGNVbmNoYW5nZWRDb250cm9sU2l6ZSwgaW50IHIg
PSBjVW5jaGFuZ2VkQ29udHJvbFNpemUsIGludCBiID0gY1VuY2hhbmdlZENvbnRyb2xTaXplLCBp
bnQgbCA9IGNVbmNoYW5nZWRDb250cm9sU2l6ZSkKICAgICAgICAgOiBtX3RvcCh0KQogICAgICAg
ICAsIG1fcmlnaHQocikKICAgICAgICAgLCBtX2JvdHRvbShiKQpJbmRleDogcGxhdGZvcm0vbWFj
L1RoZW1lTWFjLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vbWFjL1RoZW1lTWFjLmgJKHJldmlz
aW9uIDM3NjYyKQorKysgcGxhdGZvcm0vbWFjL1RoZW1lTWFjLmgJKHdvcmtpbmcgY29weSkKQEAg
LTM0LDYgKzM0LDE1IEBAIGNsYXNzIFRoZW1lTWFjIDogcHVibGljIFRoZW1lIHsKIHB1YmxpYzoK
ICAgICBUaGVtZU1hYygpIHsgfQogICAgIHZpcnR1YWwgflRoZW1lTWFjKCkgeyB9CisgICAgCisg
ICAgdmlydHVhbCBpbnQgYmFzZWxpbmVQb3NpdGlvbkFkanVzdG1lbnQoQ29udHJvbFBhcnQpIGNv
bnN0OworCisgICAgdmlydHVhbCBJbnRTaXplIGNvbnRyb2xTaXplKENvbnRyb2xQYXJ0LCBjb25z
dCBGb250JiwgY29uc3QgSW50U2l6ZSYsIGZsb2F0IHpvb21GYWN0b3IpIGNvbnN0OworICAgIHZp
cnR1YWwgYm9vbCBjb250cm9sU3VwcG9ydHNCb3JkZXIoQ29udHJvbFBhcnQpIGNvbnN0OworICAg
IHZpcnR1YWwgYm9vbCBjb250cm9sU3VwcG9ydHNQYWRkaW5nKENvbnRyb2xQYXJ0KSBjb25zdDsK
KyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoQ29udHJvbFBhcnQsIENvbnRyb2xTdGF0ZXMs
IEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmLCBmbG9hdCB6b29tRmFjdG9yLCBTY3Jv
bGxWaWV3KikgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGluZmxhdGVDb250cm9sUGFpbnRSZWN0
KENvbnRyb2xQYXJ0LCBDb250cm9sU3RhdGVzLCBJbnRSZWN0JiwgZmxvYXQgem9vbUZhY3Rvcikg
Y29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBwbGF0Zm9ybS9tYWMv
VGhlbWVNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vbWFjL1RoZW1lTWFjLm1tCShyZXZp
c2lvbiAzNzY2MikKKysrIHBsYXRmb3JtL21hYy9UaGVtZU1hYy5tbQkod29ya2luZyBjb3B5KQpA
QCAtMjMsMTUgKzIzLDM2NyBAQAogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCiAgKi8KIAotI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgIlRoZW1lTWFjLmgiCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBv
cnQgIlRoZW1lTWFjLmgiCisKKyNpbXBvcnQgIkdyYXBoaWNzQ29udGV4dC5oIgorI2ltcG9ydCAi
U2Nyb2xsVmlldy5oIgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgorCit1c2luZyBuYW1lc3Bh
Y2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2VudW0geworICAgIHRvcE1hcmdpbiwK
KyAgICByaWdodE1hcmdpbiwKKyAgICBib3R0b21NYXJnaW4sCisgICAgbGVmdE1hcmdpbgorfTsK
KwogVGhlbWUqIHBsYXRmb3JtVGhlbWUoKQogewogICAgIHN0YXRpYyBUaGVtZU1hYyB0aGVtZU1h
YzsKICAgICByZXR1cm4gJnRoZW1lTWFjOwogfQogCisvLyBIZWxwZXIgZnVuY3Rpb25zIHVzZWQg
YnkgYSBidW5jaCBvZiBkaWZmZXJlbnQgY29udHJvbCBwYXJ0cy4KKworc3RhdGljIE5TQ29udHJv
bFNpemUgY29udHJvbFNpemVGb3JGb250KGNvbnN0IEZvbnQmIGZvbnQpCit7CisgICAgaW50IGZv
bnRTaXplID0gZm9udC5waXhlbFNpemUoKTsKKyAgICBpZiAoZm9udFNpemUgPj0gMTYpCisgICAg
ICAgIHJldHVybiBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKKyAgICBpZiAoZm9udFNpemUgPj0gMTEp
CisgICAgICAgIHJldHVybiBOU1NtYWxsQ29udHJvbFNpemU7CisgICAgcmV0dXJuIE5TTWluaUNv
bnRyb2xTaXplOworfQorCitzdGF0aWMgSW50U2l6ZSBzaXplRnJvbUZvbnQoY29uc3QgRm9udCYg
Zm9udCwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgZmxvYXQgem9vbUZhY3RvciwgY29uc3QgSW50U2l6
ZSogc2l6ZXMpCit7CisgICAgSW50U2l6ZSBjb250cm9sU2l6ZSA9IHNpemVzW2NvbnRyb2xTaXpl
Rm9yRm9udChmb250KV07CisgICAgaWYgKHpvb21GYWN0b3IgIT0gMS4wZikKKyAgICAgICAgY29u
dHJvbFNpemUgPSBJbnRTaXplKGNvbnRyb2xTaXplLndpZHRoKCkgKiB6b29tRmFjdG9yLCBjb250
cm9sU2l6ZS5oZWlnaHQoKSAqIHpvb21GYWN0b3IpOworICAgIEludFNpemUgcmVzdWx0KGNVbmNo
YW5nZWRDb250cm9sU2l6ZSwgY1VuY2hhbmdlZENvbnRyb2xTaXplKTsKKyAgICBpZiAoc2l6ZS53
aWR0aCgpID09IGNBdXRvQ29udHJvbFNpemUgJiYgY29udHJvbFNpemUud2lkdGgoKSA+IDApCisg
ICAgICAgIHJlc3VsdC5zZXRXaWR0aChjb250cm9sU2l6ZS53aWR0aCgpKTsKKyAgICBpZiAoc2l6
ZS5oZWlnaHQoKSA9PSBjQXV0b0NvbnRyb2xTaXplICYmIGNvbnRyb2xTaXplLmhlaWdodCgpID4g
MCkKKyAgICAgICAgcmVzdWx0LnNldEhlaWdodChjb250cm9sU2l6ZS5oZWlnaHQoKSk7CisgICAg
cmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgc2V0Q29udHJvbFNpemUoTlNDZWxsKiBj
ZWxsLCBjb25zdCBJbnRTaXplKiBzaXplcywgY29uc3QgSW50U2l6ZSYgbWluU2l6ZSwgZmxvYXQg
em9vbUxldmVsKQoreworICAgIE5TQ29udHJvbFNpemUgc2l6ZTsKKyAgICBpZiAobWluU2l6ZS53
aWR0aCgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZXNbTlNSZWd1bGFyQ29udHJvbFNpemVdLndp
ZHRoKCkgKiB6b29tTGV2ZWwpICYmCisgICAgICAgIG1pblNpemUuaGVpZ2h0KCkgPj0gc3RhdGlj
X2Nhc3Q8aW50PihzaXplc1tOU1JlZ3VsYXJDb250cm9sU2l6ZV0uaGVpZ2h0KCkgKiB6b29tTGV2
ZWwpKQorICAgICAgICBzaXplID0gTlNSZWd1bGFyQ29udHJvbFNpemU7CisgICAgZWxzZSBpZiAo
bWluU2l6ZS53aWR0aCgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZXNbTlNTbWFsbENvbnRyb2xT
aXplXS53aWR0aCgpICogem9vbUxldmVsKSAmJgorICAgICAgICAgICAgIG1pblNpemUuaGVpZ2h0
KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplc1tOU1NtYWxsQ29udHJvbFNpemVdLmhlaWdodCgp
ICogem9vbUxldmVsKSkKKyAgICAgICAgc2l6ZSA9IE5TU21hbGxDb250cm9sU2l6ZTsKKyAgICBl
bHNlCisgICAgICAgIHNpemUgPSBOU01pbmlDb250cm9sU2l6ZTsKKyAgICBpZiAoc2l6ZSAhPSBb
Y2VsbCBjb250cm9sU2l6ZV0pIC8vIE9ubHkgdXBkYXRlIGlmIHdlIGhhdmUgdG8sIHNpbmNlIEFw
cEtpdCBkb2VzIHdvcmsgZXZlbiBpZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZS4KKyAgICAgICAgW2Nl
bGwgc2V0Q29udHJvbFNpemU6c2l6ZV07Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZVN0YXRlcyhO
U0NlbGwqIGNlbGwsIENvbnRyb2xTdGF0ZXMgc3RhdGVzKQoreworICAgIC8vIEhvdmVyIHN0YXRl
IGlzIG5vdCBzdXBwb3J0ZWQgYnkgQXF1YS4KKyAgICAKKyAgICAvLyBQcmVzc2VkIHN0YXRlCisg
ICAgYm9vbCBvbGRQcmVzc2VkID0gW2NlbGwgaXNIaWdobGlnaHRlZF07CisgICAgYm9vbCBwcmVz
c2VkID0gKHN0YXRlcyAmIFByZXNzZWRTdGF0ZSk7CisgICAgaWYgKHByZXNzZWQgIT0gb2xkUHJl
c3NlZCkKKyAgICAgICAgW2NlbGwgc2V0SGlnaGxpZ2h0ZWQ6cHJlc3NlZF07CisgICAgCisgICAg
Ly8gRW5hYmxlZCBzdGF0ZQorICAgIGJvb2wgb2xkRW5hYmxlZCA9IFtjZWxsIGlzRW5hYmxlZF07
CisgICAgYm9vbCBlbmFibGVkID0gKHN0YXRlcyAmIEVuYWJsZWRTdGF0ZSk7CisgICAgaWYgKGVu
YWJsZWQgIT0gb2xkRW5hYmxlZCkKKyAgICAgICAgW2NlbGwgc2V0RW5hYmxlZDplbmFibGVkXTsK
KyAgICAKKyAgICAvLyBGb2N1c2VkIHN0YXRlCisgICAgYm9vbCBvbGRGb2N1c2VkID0gW2NlbGwg
c2hvd3NGaXJzdFJlc3BvbmRlcl07CisgICAgYm9vbCBmb2N1c2VkID0gKHN0YXRlcyAmIEZvY3Vz
U3RhdGUpOworICAgIGlmIChmb2N1c2VkICE9IG9sZEZvY3VzZWQpCisgICAgICAgIFtjZWxsIHNl
dFNob3dzRmlyc3RSZXNwb25kZXI6Zm9jdXNlZF07CisKKyAgICAvLyBDaGVja2VkIGFuZCBJbmRl
dGVybWluYXRlCisgICAgYm9vbCBvbGRJbmRldGVybWluYXRlID0gW2NlbGwgc3RhdGVdID09IE5T
TWl4ZWRTdGF0ZTsKKyAgICBib29sIGluZGV0ZXJtaW5hdGUgPSAoc3RhdGVzICYgSW5kZXRlcm1p
bmF0ZVN0YXRlKTsKKyAgICBib29sIGNoZWNrZWQgPSAoc3RhdGVzICYgQ2hlY2tlZFN0YXRlKTsK
KyAgICBpZiAob2xkSW5kZXRlcm1pbmF0ZSAhPSBpbmRldGVybWluYXRlKSB7CisgICAgICAgIFtj
ZWxsIHNldFN0YXRlOmluZGV0ZXJtaW5hdGUgPyBOU01peGVkU3RhdGUgOiAoY2hlY2tlZCA/IE5T
T25TdGF0ZSA6IE5TT2ZmU3RhdGUpXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29s
IG9sZENoZWNrZWQgPSBbY2VsbCBzdGF0ZV0gPT0gTlNPblN0YXRlOworICAgIGlmIChjaGVja2Vk
ICE9IG9sZENoZWNrZWQpCisgICAgICAgIFtjZWxsIHNldFN0YXRlOmNoZWNrZWQgPyBOU09uU3Rh
dGUgOiBOU09mZlN0YXRlXTsKKyAgICAgICAgCisgICAgLy8gV2luZG93IGluYWN0aXZlIHN0YXRl
IGRvZXMgbm90IG5lZWQgdG8gYmUgY2hlY2tlZCBleHBsaWNpdGx5LCBzaW5jZSB3ZSBwYWludCBw
YXJlbnRlZCB0byAKKyAgICAvLyBhIHZpZXcgaW4gYSB3aW5kb3cgd2hvc2Uga2V5IHN0YXRlIGNh
biBiZSBkZXRlY3RlZC4KK30KKworc3RhdGljIEludFJlY3QgaW5mbGF0ZVJlY3QoY29uc3QgSW50
UmVjdCYgciwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3QgaW50KiBtYXJnaW5zLCBmbG9hdCB6
b29tTGV2ZWwpCit7CisgICAgLy8gT25seSBkbyB0aGUgaW5mbGF0aW9uIGlmIHRoZSBhdmFpbGFi
bGUgd2lkdGgvaGVpZ2h0IGFyZSB0b28gc21hbGwuICBPdGhlcndpc2UgdHJ5IHRvCisgICAgLy8g
Zml0IHRoZSBnbG93L2NoZWNrIHNwYWNlIGludG8gdGhlIGF2YWlsYWJsZSBib3gncyB3aWR0aC9o
ZWlnaHQuCisgICAgaW50IHdpZHRoRGVsdGEgPSByLndpZHRoKCkgLSAoc2l6ZS53aWR0aCgpICsg
bWFyZ2luc1tsZWZ0TWFyZ2luXSAqIHpvb21MZXZlbCArIG1hcmdpbnNbcmlnaHRNYXJnaW5dICog
em9vbUxldmVsKTsKKyAgICBpbnQgaGVpZ2h0RGVsdGEgPSByLmhlaWdodCgpIC0gKHNpemUuaGVp
Z2h0KCkgKyBtYXJnaW5zW3RvcE1hcmdpbl0gKiB6b29tTGV2ZWwgKyBtYXJnaW5zW2JvdHRvbU1h
cmdpbl0gKiB6b29tTGV2ZWwpOworICAgIEludFJlY3QgcmVzdWx0KHIpOworICAgIGlmICh3aWR0
aERlbHRhIDwgMCkgeworICAgICAgICByZXN1bHQuc2V0WChyZXN1bHQueCgpIC0gbWFyZ2luc1ts
ZWZ0TWFyZ2luXSAqIHpvb21MZXZlbCk7CisgICAgICAgIHJlc3VsdC5zZXRXaWR0aChyZXN1bHQu
d2lkdGgoKSAtIHdpZHRoRGVsdGEpOworICAgIH0KKyAgICBpZiAoaGVpZ2h0RGVsdGEgPCAwKSB7
CisgICAgICAgIHJlc3VsdC5zZXRZKHJlc3VsdC55KCkgLSBtYXJnaW5zW3RvcE1hcmdpbl0gKiB6
b29tTGV2ZWwpOworICAgICAgICByZXN1bHQuc2V0SGVpZ2h0KHJlc3VsdC5oZWlnaHQoKSAtIGhl
aWdodERlbHRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ2hlY2tib3hl
cworCitzdGF0aWMgY29uc3QgSW50U2l6ZSogY2hlY2tib3hTaXplcygpCit7CisgICAgc3RhdGlj
IGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMTQsIDE0KSwgSW50U2l6ZSgxMiwg
MTIpLCBJbnRTaXplKDEwLCAxMCkgfTsKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK3N0YXRpYyBj
b25zdCBpbnQqIGNoZWNrYm94TWFyZ2lucyhOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplKQorewor
ICAgIHN0YXRpYyBjb25zdCBpbnQgbWFyZ2luc1szXVs0XSA9CisgICAgeworICAgICAgICB7IDMs
IDQsIDQsIDIgfSwKKyAgICAgICAgeyA0LCAzLCAzLCAzIH0sCisgICAgICAgIHsgNCwgMywgMywg
MyB9LAorICAgIH07CisgICAgcmV0dXJuIG1hcmdpbnNbY29udHJvbFNpemVdOworfQorCitzdGF0
aWMgSW50U2l6ZSBjaGVja2JveFNpemUoQ29udHJvbFBhcnQgcGFydCwgY29uc3QgRm9udCYgZm9u
dCwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgZmxvYXQgem9vbUZhY3RvcikKK3sKKyAgICAvLyBJZiB0
aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3Ro
aW5nIHRvIGRvLgorICAgIGlmIChzaXplLndpZHRoKCkgIT0gY0F1dG9Db250cm9sU2l6ZSAmJiBz
aXplLmhlaWdodCgpICE9IGNBdXRvQ29udHJvbFNpemUpCisgICAgICAgIHJldHVybiBzaXplOwor
CisgICAgLy8gVXNlIHRoZSBmb250IHNpemUgdG8gZGV0ZXJtaW5lIHRoZSBpbnRyaW5zaWMgd2lk
dGggb2YgdGhlIGNvbnRyb2wuCisgICAgcmV0dXJuIHNpemVGcm9tRm9udChmb250LCBzaXplLCB6
b29tRmFjdG9yLCBjaGVja2JveFNpemVzKCkpOworfQorCitzdGF0aWMgTlNCdXR0b25DZWxsKiBj
aGVja2JveChDb250cm9sU3RhdGVzIHN0YXRlcywgY29uc3QgSW50UmVjdCYgcmVjdCwgZmxvYXQg
em9vbUZhY3RvcikKK3sKKyAgICBzdGF0aWMgUmV0YWluUHRyPE5TQnV0dG9uQ2VsbD4gY2hlY2ti
b3hDZWxsOworICAgIGlmICghY2hlY2tib3hDZWxsKSB7CisgICAgICAgIGNoZWNrYm94Q2VsbC5h
ZG9wdE5TKFtbTlNCdXR0b25DZWxsIGFsbG9jXSBpbml0XSk7CisgICAgICAgIFtjaGVja2JveENl
bGwuZ2V0KCkgc2V0QnV0dG9uVHlwZTpOU1N3aXRjaEJ1dHRvbl07CisgICAgICAgIFtjaGVja2Jv
eENlbGwuZ2V0KCkgc2V0VGl0bGU6bmlsXTsKKyAgICAgICAgW2NoZWNrYm94Q2VsbC5nZXQoKSBz
ZXRBbGxvd3NNaXhlZFN0YXRlOllFU107CisgICAgICAgIFtjaGVja2JveENlbGwuZ2V0KCkgc2V0
Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07CisgICAgfQorICAgIAorICAg
IC8vIFNldCB0aGUgY29udHJvbCBzaXplIGJhc2VkIG9mZiB0aGUgcmVjdGFuZ2xlIHdlJ3JlIHBh
aW50aW5nIGludG8uCisgICAgc2V0Q29udHJvbFNpemUoY2hlY2tib3hDZWxsLmdldCgpLCBjaGVj
a2JveFNpemVzKCksIHJlY3Quc2l6ZSgpLCB6b29tRmFjdG9yKTsKKworICAgIC8vIFVwZGF0ZSB0
aGUgdmFyaW91cyBzdGF0ZXMgd2UgcmVzcG9uZCB0by4KKyAgICB1cGRhdGVTdGF0ZXMoY2hlY2ti
b3hDZWxsLmdldCgpLCBzdGF0ZXMpOworICAgIAorICAgIHJldHVybiBjaGVja2JveENlbGwuZ2V0
KCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhaW50Q2hlY2tib3goQ29udHJvbFN0YXRlcyBzdGF0ZXMs
IEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgZmxvYXQgem9v
bUZhY3RvciwgU2Nyb2xsVmlldyogc2Nyb2xsVmlldykKK3sKKyAgICAvLyBEZXRlcm1pbmUgdGhl
IHdpZHRoIGFuZCBoZWlnaHQgbmVlZGVkIGZvciB0aGUgY29udHJvbCBhbmQgcHJlcGFyZSB0aGUg
Y2VsbCBmb3IgcGFpbnRpbmcuCisgICAgTlNCdXR0b25DZWxsKiBjaGVja2JveENlbGwgPSBjaGVj
a2JveChzdGF0ZXMsIHJlY3QsIHpvb21GYWN0b3IpOworCisgICAgY29udGV4dC0+c2F2ZSgpOwor
CisgICAgTlNDb250cm9sU2l6ZSBjb250cm9sU2l6ZSA9IFtjaGVja2JveENlbGwgY29udHJvbFNp
emVdOworICAgIEludFNpemUgc2l6ZSA9IGNoZWNrYm94U2l6ZXMoKVtjb250cm9sU2l6ZV07Cisg
ICAgc2l6ZS5zZXRXaWR0aChzaXplLndpZHRoKCkgKiB6b29tRmFjdG9yKTsKKyAgICBzaXplLnNl
dEhlaWdodChzaXplLmhlaWdodCgpICogem9vbUZhY3Rvcik7CisgICAgSW50UmVjdCBpbmZsYXRl
ZFJlY3QgPSBpbmZsYXRlUmVjdChyZWN0LCBzaXplLCBjaGVja2JveE1hcmdpbnMoY29udHJvbFNp
emUpLCB6b29tRmFjdG9yKTsKKyAgICAKKyAgICBpZiAoem9vbUZhY3RvciAhPSAxLjBmKSB7Cisg
ICAgICAgIGluZmxhdGVkUmVjdC5zZXRXaWR0aChpbmZsYXRlZFJlY3Qud2lkdGgoKSAvIHpvb21G
YWN0b3IpOworICAgICAgICBpbmZsYXRlZFJlY3Quc2V0SGVpZ2h0KGluZmxhdGVkUmVjdC5oZWln
aHQoKSAvIHpvb21GYWN0b3IpOworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoaW5mbGF0ZWRS
ZWN0LngoKSwgaW5mbGF0ZWRSZWN0LnkoKSk7CisgICAgICAgIGNvbnRleHQtPnNjYWxlKEZsb2F0
U2l6ZSh6b29tRmFjdG9yLCB6b29tRmFjdG9yKSk7CisgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0
ZSgtaW5mbGF0ZWRSZWN0LngoKSwgLWluZmxhdGVkUmVjdC55KCkpOworICAgIH0KKyAgICAKKyAg
ICBbY2hlY2tib3hDZWxsIGRyYXdXaXRoRnJhbWU6TlNSZWN0KGluZmxhdGVkUmVjdCkgaW5WaWV3
OnNjcm9sbFZpZXctPmRvY3VtZW50VmlldygpXTsKKyAgICBbY2hlY2tib3hDZWxsIHNldENvbnRy
b2xWaWV3Om5pbF07CisKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7Cit9CisKKy8vIFJhZGlvIEJ1
dHRvbnMKKworc3RhdGljIGNvbnN0IEludFNpemUqIHJhZGlvU2l6ZXMoKQoreworICAgIHN0YXRp
YyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDE0LCAxNSksIEludFNpemUoMTIs
IDEzKSwgSW50U2l6ZSgxMCwgMTApIH07CisgICAgcmV0dXJuIHNpemVzOworfQorCitzdGF0aWMg
Y29uc3QgaW50KiByYWRpb01hcmdpbnMoTlNDb250cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAg
ICBzdGF0aWMgY29uc3QgaW50IG1hcmdpbnNbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyAyLCAy
LCA0LCAyIH0sCisgICAgICAgIHsgMywgMiwgMywgMiB9LAorICAgICAgICB7IDEsIDAsIDIsIDAg
fSwKKyAgICB9OworICAgIHJldHVybiBtYXJnaW5zW2NvbnRyb2xTaXplXTsKK30KKworc3RhdGlj
IEludFNpemUgcmFkaW9TaXplKENvbnRyb2xQYXJ0IHBhcnQsIGNvbnN0IEZvbnQmIGZvbnQsIGNv
bnN0IEludFNpemUmIHNpemUsIGZsb2F0IHpvb21GYWN0b3IpCit7CisgICAgLy8gSWYgdGhlIHdp
ZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0
byBkby4KKyAgICBpZiAoc2l6ZS53aWR0aCgpICE9IGNBdXRvQ29udHJvbFNpemUgJiYgc2l6ZS5o
ZWlnaHQoKSAhPSBjQXV0b0NvbnRyb2xTaXplKQorICAgICAgICByZXR1cm4gc2l6ZTsKKworICAg
IC8vIFVzZSB0aGUgZm9udCBzaXplIHRvIGRldGVybWluZSB0aGUgaW50cmluc2ljIHdpZHRoIG9m
IHRoZSBjb250cm9sLgorICAgIHJldHVybiBzaXplRnJvbUZvbnQoZm9udCwgc2l6ZSwgem9vbUZh
Y3RvciwgcmFkaW9TaXplcygpKTsKK30KKworc3RhdGljIE5TQnV0dG9uQ2VsbCogcmFkaW8oQ29u
dHJvbFN0YXRlcyBzdGF0ZXMsIGNvbnN0IEludFJlY3QmIHJlY3QsIGZsb2F0IHpvb21GYWN0b3Ip
Cit7CisgICAgc3RhdGljIFJldGFpblB0cjxOU0J1dHRvbkNlbGw+IHJhZGlvQ2VsbDsKKyAgICBp
ZiAoIXJhZGlvQ2VsbCkgeworICAgICAgICByYWRpb0NlbGwuYWRvcHROUyhbW05TQnV0dG9uQ2Vs
bCBhbGxvY10gaW5pdF0pOworICAgICAgICBbcmFkaW9DZWxsLmdldCgpIHNldEJ1dHRvblR5cGU6
TlNSYWRpb0J1dHRvbl07CisgICAgICAgIFtyYWRpb0NlbGwuZ2V0KCkgc2V0VGl0bGU6bmlsXTsK
KyAgICAgICAgW3JhZGlvQ2VsbC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlw
ZUV4dGVyaW9yXTsKKyAgICB9CisgICAgCisgICAgLy8gU2V0IHRoZSBjb250cm9sIHNpemUgYmFz
ZWQgb2ZmIHRoZSByZWN0YW5nbGUgd2UncmUgcGFpbnRpbmcgaW50by4KKyAgICBzZXRDb250cm9s
U2l6ZShyYWRpb0NlbGwuZ2V0KCksIHJhZGlvU2l6ZXMoKSwgcmVjdC5zaXplKCksIHpvb21GYWN0
b3IpOworCisgICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgor
ICAgIHVwZGF0ZVN0YXRlcyhyYWRpb0NlbGwuZ2V0KCksIHN0YXRlcyk7CisgICAgCisgICAgcmV0
dXJuIHJhZGlvQ2VsbC5nZXQoKTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRSYWRpbyhDb250cm9s
U3RhdGVzIHN0YXRlcywgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBy
ZWN0LCBmbG9hdCB6b29tRmFjdG9yLCBTY3JvbGxWaWV3KiBzY3JvbGxWaWV3KQoreworICAgIC8v
IERldGVybWluZSB0aGUgd2lkdGggYW5kIGhlaWdodCBuZWVkZWQgZm9yIHRoZSBjb250cm9sIGFu
ZCBwcmVwYXJlIHRoZSBjZWxsIGZvciBwYWludGluZy4KKyAgICBOU0J1dHRvbkNlbGwqIHJhZGlv
Q2VsbCA9IHJhZGlvKHN0YXRlcywgcmVjdCwgem9vbUZhY3Rvcik7CisKKyAgICBjb250ZXh0LT5z
YXZlKCk7CisKKyAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplID0gW3JhZGlvQ2VsbCBjb250
cm9sU2l6ZV07CisgICAgSW50U2l6ZSBzaXplID0gcmFkaW9TaXplcygpW2NvbnRyb2xTaXplXTsK
KyAgICBzaXplLnNldFdpZHRoKHNpemUud2lkdGgoKSAqIHpvb21GYWN0b3IpOworICAgIHNpemUu
c2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tRmFjdG9yKTsKKyAgICBJbnRSZWN0IGluZmxh
dGVkUmVjdCA9IGluZmxhdGVSZWN0KHJlY3QsIHNpemUsIHJhZGlvTWFyZ2lucyhjb250cm9sU2l6
ZSksIHpvb21GYWN0b3IpOworICAgIAorICAgIGlmICh6b29tRmFjdG9yICE9IDEuMGYpIHsKKyAg
ICAgICAgaW5mbGF0ZWRSZWN0LnNldFdpZHRoKGluZmxhdGVkUmVjdC53aWR0aCgpIC8gem9vbUZh
Y3Rvcik7CisgICAgICAgIGluZmxhdGVkUmVjdC5zZXRIZWlnaHQoaW5mbGF0ZWRSZWN0LmhlaWdo
dCgpIC8gem9vbUZhY3Rvcik7CisgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZShpbmZsYXRlZFJl
Y3QueCgpLCBpbmZsYXRlZFJlY3QueSgpKTsKKyAgICAgICAgY29udGV4dC0+c2NhbGUoRmxvYXRT
aXplKHpvb21GYWN0b3IsIHpvb21GYWN0b3IpKTsKKyAgICAgICAgY29udGV4dC0+dHJhbnNsYXRl
KC1pbmZsYXRlZFJlY3QueCgpLCAtaW5mbGF0ZWRSZWN0LnkoKSk7CisgICAgfQorICAgIAorICAg
IFtyYWRpb0NlbGwgZHJhd1dpdGhGcmFtZTpOU1JlY3QoaW5mbGF0ZWRSZWN0KSBpblZpZXc6c2Ny
b2xsVmlldy0+ZG9jdW1lbnRWaWV3KCldOworICAgIFtyYWRpb0NlbGwgc2V0Q29udHJvbFZpZXc6
bmlsXTsKKworICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKK30KKworLy8gVGhlbWUgb3ZlcnJpZGVz
CisKK2ludCBUaGVtZU1hYzo6YmFzZWxpbmVQb3NpdGlvbkFkanVzdG1lbnQoQ29udHJvbFBhcnQg
cGFydCkgY29uc3QKK3sKKyAgICBpZiAocGFydCA9PSBDaGVja2JveFBhcnQgfHwgcGFydCA9PSBS
YWRpb1BhcnQpCisgICAgICAgIHJldHVybiAtMjsKKyAgICByZXR1cm4gVGhlbWU6OmJhc2VsaW5l
UG9zaXRpb25BZGp1c3RtZW50KHBhcnQpOworfQorCitJbnRTaXplIFRoZW1lTWFjOjpjb250cm9s
U2l6ZShDb250cm9sUGFydCBwYXJ0LCBjb25zdCBGb250JiBmb250LCBjb25zdCBJbnRTaXplJiBz
aXplLCBmbG9hdCB6b29tRmFjdG9yKSBjb25zdAoreworICAgIHN3aXRjaCAocGFydCkgeworICAg
ICAgICBjYXNlIENoZWNrYm94UGFydDoKKyAgICAgICAgICAgIHJldHVybiBjaGVja2JveFNpemUo
cGFydCwgZm9udCwgc2l6ZSwgem9vbUZhY3Rvcik7CisgICAgICAgIGNhc2UgUmFkaW9QYXJ0Ogor
ICAgICAgICAgICAgcmV0dXJuIHJhZGlvU2l6ZShwYXJ0LCBmb250LCBzaXplLCB6b29tRmFjdG9y
KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgIH0KK30K
KworYm9vbCBUaGVtZU1hYzo6Y29udHJvbFN1cHBvcnRzQm9yZGVyKENvbnRyb2xQYXJ0IHBhcnQp
IGNvbnN0Cit7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgICAgIGNhc2UgUHVzaEJ1dHRvblBh
cnQ6CisgICAgICAgIGNhc2UgTWVudWxpc3RQYXJ0OgorICAgICAgICBjYXNlIFNlYXJjaEZpZWxk
UGFydDoKKyAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6CisgICAgICAgIGNhc2UgUmFkaW9QYXJ0
OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCitib29sIFRoZW1lTWFjOjpjb250cm9sU3VwcG9y
dHNQYWRkaW5nKENvbnRyb2xQYXJ0IHBhcnQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChwYXJ0KSB7
CisgICAgICAgIGNhc2UgTWVudWxpc3RQYXJ0OgorICAgICAgICBjYXNlIE1lbnVsaXN0QnV0dG9u
UGFydDoKKyAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6CisgICAgICAgIGNhc2UgUmFkaW9QYXJ0
OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCit2b2lkIFRoZW1lTWFjOjppbmZsYXRlQ29udHJv
bFBhaW50UmVjdChDb250cm9sUGFydCBwYXJ0LCBDb250cm9sU3RhdGVzIHN0YXRlcywgSW50UmVj
dCYgcmVjdCwgZmxvYXQgem9vbUZhY3RvcikgY29uc3QKK3sKKyAgICBzd2l0Y2ggKHBhcnQpIHsK
KyAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6IHsKKyAgICAgICAgICAgIC8vIFdlIGluZmxhdGUg
dGhlIHJlY3QgYXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIHBhZGRpbmcgaW5jbHVkZWQgaW4gdGhl
IGNlbGwgdG8gYWNjb21tb2RhdGUgdGhlIGNoZWNrYm94CisgICAgICAgICAgICAvLyBzaGFkb3ci
IGFuZCB0aGUgY2hlY2suICBXZSBkb24ndCBjb25zaWRlciB0aGlzIHBhcnQgb2YgdGhlIGJvdW5k
cyBvZiB0aGUgY29udHJvbCBpbiBXZWJLaXQuCisgICAgICAgICAgICBOU0NlbGwqIGNlbGwgPSBj
aGVja2JveChzdGF0ZXMsIHJlY3QsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgTlNDb250cm9s
U2l6ZSBjb250cm9sU2l6ZSA9IFtjZWxsIGNvbnRyb2xTaXplXTsKKyAgICAgICAgICAgIEludFNp
emUgc2l6ZSA9IGNoZWNrYm94U2l6ZXMoKVtjb250cm9sU2l6ZV07CisgICAgICAgICAgICBzaXpl
LnNldEhlaWdodChzaXplLmhlaWdodCgpICogem9vbUZhY3Rvcik7CisgICAgICAgICAgICBzaXpl
LnNldFdpZHRoKHNpemUud2lkdGgoKSAqIHpvb21GYWN0b3IpOworICAgICAgICAgICAgcmVjdCA9
IGluZmxhdGVSZWN0KHJlY3QsIHNpemUsIGNoZWNrYm94TWFyZ2lucyhjb250cm9sU2l6ZSksIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBS
YWRpb1BhcnQ6IHsKKyAgICAgICAgICAgIC8vIFdlIGluZmxhdGUgdGhlIHJlY3QgYXMgbmVlZGVk
IHRvIGFjY291bnQgZm9yIHBhZGRpbmcgaW5jbHVkZWQgaW4gdGhlIGNlbGwgdG8gYWNjb21tb2Rh
dGUgdGhlIHJhZGlvIGJ1dHRvbgorICAgICAgICAgICAgLy8gc2hhZG93Ii4gIFdlIGRvbid0IGNv
bnNpZGVyIHRoaXMgcGFydCBvZiB0aGUgYm91bmRzIG9mIHRoZSBjb250cm9sIGluIFdlYktpdC4K
KyAgICAgICAgICAgIE5TQ2VsbCogY2VsbCA9IHJhZGlvKHN0YXRlcywgcmVjdCwgem9vbUZhY3Rv
cik7CisgICAgICAgICAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplID0gW2NlbGwgY29udHJv
bFNpemVdOworICAgICAgICAgICAgSW50U2l6ZSBzaXplID0gcmFkaW9TaXplcygpW2NvbnRyb2xT
aXplXTsKKyAgICAgICAgICAgIHNpemUuc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tRmFj
dG9yKTsKKyAgICAgICAgICAgIHNpemUuc2V0V2lkdGgoc2l6ZS53aWR0aCgpICogem9vbUZhY3Rv
cik7CisgICAgICAgICAgICByZWN0ID0gaW5mbGF0ZVJlY3QocmVjdCwgc2l6ZSwgcmFkaW9NYXJn
aW5zKGNvbnRyb2xTaXplKSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2
b2lkIFRoZW1lTWFjOjpwYWludChDb250cm9sUGFydCBwYXJ0LCBDb250cm9sU3RhdGVzIHN0YXRl
cywgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBmbG9hdCB6
b29tRmFjdG9yLCBTY3JvbGxWaWV3KiBzY3JvbGxWaWV3KSBjb25zdAoreworICAgIHN3aXRjaCAo
cGFydCkgeworICAgICAgICBjYXNlIENoZWNrYm94UGFydDoKKyAgICAgICAgICAgIHBhaW50Q2hl
Y2tib3goc3RhdGVzLCBjb250ZXh0LCByZWN0LCB6b29tRmFjdG9yLCBzY3JvbGxWaWV3KTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJhZGlvUGFydDoKKyAgICAgICAgICAgIHBh
aW50UmFkaW8oc3RhdGVzLCBjb250ZXh0LCByZWN0LCB6b29tRmFjdG9yLCBzY3JvbGxWaWV3KTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7
CisgICAgfQorfQorCiB9CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGhlbWUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUaGVtZS5jcHAJKHJldmlzaW9uIDM3NjYzKQorKysgcmVu
ZGVyaW5nL1JlbmRlclRoZW1lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsNiArMzEsNyBAQAog
I2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJSZW5k
ZXJTdHlsZS5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJTZWxlY3Rpb25D
b250cm9sbGVyLmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKIApAQCAtNDcsMTAgKzQ4LDMwIEBA
IFJlbmRlclRoZW1lOjpSZW5kZXJUaGVtZSgpCiB7CiB9CiAKK3N0YXRpYyBpbnQgbGVuZ3RoVG9J
bnQoTGVuZ3RoIGwpCit7CisgICAgaWYgKGwuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAgICAg
cmV0dXJuIGNBdXRvQ29udHJvbFNpemU7CisgICAgCisgICAgaWYgKGwuaXNGaXhlZCgpKQorICAg
ICAgICByZXR1cm4gbC52YWx1ZSgpOworICAgICAgICAKKyAgICByZXR1cm4gY1VuY2hhbmdlZENv
bnRyb2xTaXplOworfQorCitzdGF0aWMgTGVuZ3RoIGludFRvTGVuZ3RoKGludCBpKQoreworICAg
IEFTU0VSVChpICE9IGNVbmNoYW5nZWRDb250cm9sU2l6ZSk7CisgICAgaWYgKGkgPT0gY0F1dG9D
b250cm9sU2l6ZSkKKyAgICAgICAgcmV0dXJuIExlbmd0aCgpOworICAgIHJldHVybiBMZW5ndGgo
aSwgRml4ZWQpOworfQorCiB2b2lkIFJlbmRlclRoZW1lOjphZGp1c3RTdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVQUhhc0FwcGVhcmFuY2UsIGNvbnN0IEJvcmRl
ckRhdGEmIGJvcmRlciwgY29uc3QgRmlsbExheWVyJiBiYWNrZ3JvdW5kLCBjb25zdCBDb2xvciYg
YmFja2dyb3VuZENvbG9yKQogewogICAgIC8vIEZvcmNlIGlubGluZSBhbmQgdGFibGUgZGlzcGxh
eSBzdHlsZXMgdG8gYmUgaW5saW5lLWJsb2NrIChleGNlcHQgZm9yIHRhYmxlLSB3aGljaCBpcyBi
bG9jaykKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gc3R5bGUtPmFwcGVhcmFuY2UoKTsKICAgICBp
ZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJ
TkVfVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAgfHwKICAgICAg
ICAgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9GT09URVJfR1JPVVAgfHwKICAgICAgICAgc3R5bGUtPmRpc3BsYXkoKSA9
PSBUQUJMRV9ST1cgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVAgfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU4gfHwKQEAgLTYwLDE4ICs4MSw0MyBAQCB2
b2lkIFJlbmRlclRoZW1lOjphZGp1c3RTdHlsZShDU1NTdHlsZVNlCiAgICAgICAgIHN0eWxlLT5z
ZXREaXNwbGF5KEJMT0NLKTsKIAogICAgIGlmIChVQUhhc0FwcGVhcmFuY2UgJiYgdGhlbWUoKS0+
aXNDb250cm9sU3R5bGVkKHN0eWxlLCBib3JkZXIsIGJhY2tncm91bmQsIGJhY2tncm91bmRDb2xv
cikpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KQor
ICAgICAgICBpZiAocGFydCA9PSBNZW51bGlzdFBhcnQpCiAgICAgICAgICAgICBzdHlsZS0+c2V0
QXBwZWFyYW5jZShNZW51bGlzdEJ1dHRvblBhcnQpOwogICAgICAgICBlbHNlCiAgICAgICAgICAg
ICBzdHlsZS0+c2V0QXBwZWFyYW5jZShOb0NvbnRyb2xQYXJ0KTsKICAgICB9CiAKKyAgICBpZiAo
IXN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE5ldmVy
IHN1cHBvcnQgYm94LXNoYWRvdyBvbiBuYXRpdmUgY29udHJvbHMuCisgICAgc3R5bGUtPnNldEJv
eFNoYWRvdygwKTsKKyAgICAKKyNpZiBVU0UoTkVXX1RIRU1FKQorICAgIGlmIChwYXJ0ID09IENo
ZWNrYm94UGFydCB8fCBwYXJ0ID09IFJhZGlvUGFydCkgeworICAgICAgICBpZiAoIW1fdGhlbWUt
PmNvbnRyb2xTdXBwb3J0c0JvcmRlcihwYXJ0KSkKKyAgICAgICAgICAgIHN0eWxlLT5yZXNldEJv
cmRlcigpOworICAgICAgICBpZiAoIW1fdGhlbWUtPmNvbnRyb2xTdXBwb3J0c1BhZGRpbmcocGFy
dCkpCisgICAgICAgICAgICBzdHlsZS0+cmVzZXRQYWRkaW5nKCk7CisgICAgICAgICAgICAKKyAg
ICAgICAgLy8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgaGVyZSBhcmUgYWZmZWN0ZWQgYnkgdGhlIHpv
b20uCisgICAgICAgIC8vIEZJWE1FOiBDaGVjayBpcyBmbGF3ZWQsIHNpbmNlIGl0IGRvZXNuJ3Qg
dGFrZSBtaW4td2lkdGgvbWF4LXdpZHRoIGludG8gYWNjb3VudC4KKyAgICAgICAgSW50U2l6ZSBj
b250cm9sU2l6ZSA9IG1fdGhlbWUtPmNvbnRyb2xTaXplKHBhcnQsIHN0eWxlLT5mb250KCksIElu
dFNpemUobGVuZ3RoVG9JbnQoc3R5bGUtPndpZHRoKCkpLCBsZW5ndGhUb0ludChzdHlsZS0+aGVp
Z2h0KCkpKSwgc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSk7CisgICAgICAgIGlmIChjb250cm9sU2l6
ZS53aWR0aCgpICE9IGNVbmNoYW5nZWRDb250cm9sU2l6ZSkKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXRXaWR0aChpbnRUb0xlbmd0aChjb250cm9sU2l6ZS53aWR0aCgpKSk7CisgICAgICAgIGlmIChj
b250cm9sU2l6ZS5oZWlnaHQoKSAhPSBjVW5jaGFuZ2VkQ29udHJvbFNpemUpCisgICAgICAgICAg
ICBzdHlsZS0+c2V0SGVpZ2h0KGludFRvTGVuZ3RoKGNvbnRyb2xTaXplLmhlaWdodCgpKSk7Cisg
ICAgfQorI2VuZGlmCisKICAgICAvLyBDYWxsIHRoZSBhcHByb3ByaWF0ZSBzdHlsZSBhZGp1c3Rt
ZW50IG1ldGhvZCBiYXNlZCBvZmYgdGhlIGFwcGVhcmFuY2UgdmFsdWUuCiAgICAgc3dpdGNoIChz
dHlsZS0+YXBwZWFyYW5jZSgpKSB7CisjaWYgVVNFKE5FV19USEVNRSkKICAgICAgICAgY2FzZSBD
aGVja2JveFBhcnQ6CiAgICAgICAgICAgICByZXR1cm4gYWRqdXN0Q2hlY2tib3hTdHlsZShzZWxl
Y3Rvciwgc3R5bGUsIGUpOwogICAgICAgICBjYXNlIFJhZGlvUGFydDoKICAgICAgICAgICAgIHJl
dHVybiBhZGp1c3RSYWRpb1N0eWxlKHNlbGVjdG9yLCBzdHlsZSwgZSk7CisjZW5kaWYKICAgICAg
ICAgY2FzZSBQdXNoQnV0dG9uUGFydDoKICAgICAgICAgY2FzZSBTcXVhcmVCdXR0b25QYXJ0Ogog
ICAgICAgICBjYXNlIERlZmF1bHRCdXR0b25QYXJ0OgpAQCAtMTI2LDEyICsxNzIsMjMgQEAgYm9v
bCBSZW5kZXJUaGVtZTo6cGFpbnQoUmVuZGVyT2JqZWN0KiBvLAogICAgIGlmIChwYWludEluZm8u
Y29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKKyAg
ICBDb250cm9sUGFydCBwYXJ0ID0gby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworCisjaWYgVVNF
KE5FV19USEVNRSkKKyAgICBpZiAocGFydCA9PSBDaGVja2JveFBhcnQgfHwgcGFydCA9PSBSYWRp
b1BhcnQpIHsKKyAgICAgICAgbV90aGVtZS0+cGFpbnQocGFydCwgY29udHJvbFN0YXRlc0ZvclJl
bmRlcmVyKG8pLCBjb25zdF9jYXN0PEdyYXBoaWNzQ29udGV4dCo+KHBhaW50SW5mby5jb250ZXh0
KSwgciwgby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpLCBvLT52aWV3KCktPmZyYW1lVmlldygp
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCiAgICAgLy8gQ2FsbCB0
aGUgYXBwcm9wcmlhdGUgcGFpbnQgbWV0aG9kIGJhc2VkIG9mZiB0aGUgYXBwZWFyYW5jZSB2YWx1
ZS4KLSAgICBzd2l0Y2ggKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSkgeworICAgIHN3aXRjaCAo
cGFydCkgeworI2lmICFVU0UoTkVXX1RIRU1FKQogICAgICAgICBjYXNlIENoZWNrYm94UGFydDoK
ICAgICAgICAgICAgIHJldHVybiBwYWludENoZWNrYm94KG8sIHBhaW50SW5mbywgcik7CiAgICAg
ICAgIGNhc2UgUmFkaW9QYXJ0OgogICAgICAgICAgICAgcmV0dXJuIHBhaW50UmFkaW8obywgcGFp
bnRJbmZvLCByKTsKKyNlbmRpZgogICAgICAgICBjYXNlIFB1c2hCdXR0b25QYXJ0OgogICAgICAg
ICBjYXNlIFNxdWFyZUJ1dHRvblBhcnQ6CiAgICAgICAgIGNhc2UgRGVmYXVsdEJ1dHRvblBhcnQ6
CkBAIC0zMTgsNyArMzc1LDExIEBAIENvbG9yIFJlbmRlclRoZW1lOjppbmFjdGl2ZUxpc3RCb3hT
ZWxlY3QKIAogaW50IFJlbmRlclRoZW1lOjpiYXNlbGluZVBvc2l0aW9uKGNvbnN0IFJlbmRlck9i
amVjdCogbykgY29uc3QKIHsKKyNpZiBVU0UoTkVXX1RIRU1FKQorICAgIHJldHVybiBvLT5oZWln
aHQoKSArIG8tPm1hcmdpblRvcCgpICsgbV90aGVtZS0+YmFzZWxpbmVQb3NpdGlvbkFkanVzdG1l
bnQoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpKSAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20o
KTsKKyNlbHNlCiAgICAgcmV0dXJuIG8tPmhlaWdodCgpICsgby0+bWFyZ2luVG9wKCk7CisjZW5k
aWYKIH0KIAogYm9vbCBSZW5kZXJUaGVtZTo6aXNDb250cm9sQ29udGFpbmVyKENvbnRyb2xQYXJ0
IGFwcGVhcmFuY2UpIGNvbnN0CkBAIC0zNTEsNiArNDEyLDEzIEBAIGJvb2wgUmVuZGVyVGhlbWU6
OmlzQ29udHJvbFN0eWxlZChjb25zdCAKICAgICB9CiB9CiAKK3ZvaWQgUmVuZGVyVGhlbWU6OmFk
anVzdFJlcGFpbnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCogbywgSW50UmVjdCYgcikKK3sKKyNp
ZiBVU0UoTkVXX1RIRU1FKQorICAgIG1fdGhlbWUtPmluZmxhdGVDb250cm9sUGFpbnRSZWN0KG8t
PnN0eWxlKCktPmFwcGVhcmFuY2UoKSwgY29udHJvbFN0YXRlc0ZvclJlbmRlcmVyKG8pLCByLCBv
LT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOworI2VuZGlmCit9CisKIGJvb2wgUmVuZGVyVGhl
bWU6OnN1cHBvcnRzRm9jdXNSaW5nKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKIHsK
ICAgICByZXR1cm4gKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkgJiYgc3R5bGUtPmFwcGVhcmFuY2Uo
KSAhPSBUZXh0RmllbGRQYXJ0ICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gVGV4dEFyZWFQYXJ0
ICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gTWVudWxpc3RCdXR0b25QYXJ0ICYmIHN0eWxlLT5h
cHBlYXJhbmNlKCkgIT0gTGlzdGJveFBhcnQpOwpAQCAtMzczLDYgKzQ0MSwzMCBAQCBib29sIFJl
bmRlclRoZW1lOjpzdGF0ZUNoYW5nZWQoUmVuZGVyT2JqCiAKIC8vIEZJWE1FOiBJdCB3b3VsZCBi
ZSBuaWNlIHRvIHNldCB0aGlzIHN0YXRlIG9uIHRoZSBSZW5kZXJPYmplY3RzIGluc3RlYWQgb2YK
IC8vIGhhdmluZyB0byBkaWcgdXAgdG8gdGhlIEZvY3VzQ29udHJvbGxlciBhdCBwYWludCB0aW1l
LgorQ29udHJvbFN0YXRlcyBSZW5kZXJUaGVtZTo6Y29udHJvbFN0YXRlc0ZvclJlbmRlcmVyKGNv
bnN0IFJlbmRlck9iamVjdCogbykgY29uc3QKK3sKKyAgICBDb250cm9sU3RhdGVzIHJlc3VsdCA9
IDA7CisgICAgaWYgKGlzSG92ZXJlZChvKSkKKyAgICAgICAgcmVzdWx0IHw9IEhvdmVyU3RhdGU7
CisgICAgaWYgKGlzUHJlc3NlZChvKSkKKyAgICAgICAgcmVzdWx0IHw9IFByZXNzZWRTdGF0ZTsK
KyAgICBpZiAoaXNGb2N1c2VkKG8pKQorICAgICAgICByZXN1bHQgfD0gRm9jdXNTdGF0ZTsKKyAg
ICBpZiAoaXNFbmFibGVkKG8pKQorICAgICAgICByZXN1bHQgfD0gRW5hYmxlZFN0YXRlOworICAg
IGlmIChpc0NoZWNrZWQobykpCisgICAgICAgIHJlc3VsdCB8PSBDaGVja2VkU3RhdGU7CisgICAg
aWYgKGlzUmVhZE9ubHlDb250cm9sKG8pKQorICAgICAgICByZXN1bHQgfD0gUmVhZE9ubHlTdGF0
ZTsKKyAgICBpZiAoaXNEZWZhdWx0KG8pKQorICAgICAgICByZXN1bHQgfD0gRGVmYXVsdFN0YXRl
OworICAgIGlmICghaXNBY3RpdmUobykpCisgICAgICAgIHJlc3VsdCB8PSBXaW5kb3dJbmFjdGl2
ZVN0YXRlOworICAgIGlmIChpc0luZGV0ZXJtaW5hdGUobykpCisgICAgICAgIHJlc3VsdCB8PSBJ
bmRldGVybWluYXRlU3RhdGU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogYm9vbCBSZW5kZXJU
aGVtZTo6aXNBY3RpdmUoY29uc3QgUmVuZGVyT2JqZWN0KiBvKSBjb25zdAogewogICAgIE5vZGUq
IG5vZGUgPSBvLT5lbGVtZW50KCk7CkBAIC00MTgsNyArNTEwLDcgQEAgYm9vbCBSZW5kZXJUaGVt
ZTo6aXNGb2N1c2VkKGNvbnN0IFJlbmRlcgogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgRG9j
dW1lbnQqIGRvY3VtZW50ID0gbm9kZS0+ZG9jdW1lbnQoKTsKICAgICBGcmFtZSogZnJhbWUgPSBk
b2N1bWVudC0+ZnJhbWUoKTsKLSAgICByZXR1cm4gbm9kZSA9PSBkb2N1bWVudC0+Zm9jdXNlZE5v
ZGUoKSAmJiBmcmFtZSAmJiBmcmFtZS0+c2VsZWN0aW9uKCktPmlzRm9jdXNlZEFuZEFjdGl2ZSgp
OworICAgIHJldHVybiBub2RlID09IGRvY3VtZW50LT5mb2N1c2VkTm9kZSgpICYmIGZyYW1lICYm
IGZyYW1lLT5zZWxlY3Rpb24oKS0+aXNGb2N1c2VkQW5kQWN0aXZlKCkgJiYgby0+c3R5bGUoKS0+
b3V0bGluZVN0eWxlSXNBdXRvKCk7CiB9CiAKIGJvb2wgUmVuZGVyVGhlbWU6OmlzUHJlc3NlZChj
b25zdCBSZW5kZXJPYmplY3QqIG8pIGNvbnN0CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGhlbWUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGhlbWUuaAkocmV2aXNpb24gMzc2NjMp
CisrKyByZW5kZXJpbmcvUmVuZGVyVGhlbWUuaAkod29ya2luZyBjb3B5KQpAQCAtODQsNyArODQs
NyBAQCBwdWJsaWM6CiAKICAgICAvLyBTb21lIGNvbnRyb2xzIG1heSBzcGlsbCBvdXQgb2YgdGhl
aXIgY29udGFpbmVycyAoZS5nLiwgdGhlIGNoZWNrIG9uIGFuIE9TIFggY2hlY2tib3gpLiAgV2hl
biB0aGVzZSBjb250cm9scyByZXBhaW50LAogICAgIC8vIHRoZSB0aGVtZSBuZWVkcyB0byBjb21t
dW5pY2F0ZSB0aGlzIGluZmxhdGVkIHJlY3QgdG8gdGhlIGVuZ2luZSBzbyB0aGF0IGl0IGNhbiBp
bnZhbGlkYXRlIHRoZSB3aG9sZSBjb250cm9sLgotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RSZXBh
aW50UmVjdChjb25zdCBSZW5kZXJPYmplY3QqLCBJbnRSZWN0JikgeyB9CisgICAgdmlydHVhbCB2
b2lkIGFkanVzdFJlcGFpbnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCosIEludFJlY3QmKTsKIAog
ICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHJlbGV2YW50IHN0YXRlIGNo
YW5nZXMgb24gYSBwYXJ0aWN1bGFyIHRoZW1lZCBvYmplY3QsIGUuZy4sIHRoZSBtb3VzZSBiZWNv
bWVzIHByZXNzZWQKICAgICAvLyBvciBhIGNvbnRyb2wgYmVjb21lcyBkaXNhYmxlZC4KQEAgLTEz
MCwxNyArMTMwLDYgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRlclRo
dW1iU2l6ZShSZW5kZXJPYmplY3QqKSBjb25zdDsKIAotICAgIC8vIE1ldGhvZHMgZm9yIHN0YXRl
IHF1ZXJ5aW5nCi0gICAgYm9vbCBpc0FjdGl2ZShjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsK
LSAgICBib29sIGlzQ2hlY2tlZChjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKLSAgICBib29s
IGlzSW5kZXRlcm1pbmF0ZShjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKLSAgICBib29sIGlz
RW5hYmxlZChjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKLSAgICBib29sIGlzRm9jdXNlZChj
b25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKLSAgICBib29sIGlzUHJlc3NlZChjb25zdCBSZW5k
ZXJPYmplY3QqKSBjb25zdDsKLSAgICBib29sIGlzSG92ZXJlZChjb25zdCBSZW5kZXJPYmplY3Qq
KSBjb25zdDsKLSAgICBib29sIGlzUmVhZE9ubHlDb250cm9sKGNvbnN0IFJlbmRlck9iamVjdCop
IGNvbnN0OwotICAgIGJvb2wgaXNEZWZhdWx0KGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0Owot
CiAgICAgdmlydHVhbCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0eWxlKikg
Y29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5n
UmlnaHQoUmVuZGVyU3R5bGUqKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBpbnQg
cG9wdXBJbnRlcm5hbFBhZGRpbmdUb3AoUmVuZGVyU3R5bGUqKSBjb25zdCB7IHJldHVybiAwOyB9
CkBAIC0yMDQsNiArMTkzLDE5IEBAIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRN
ZWRpYVNsaWRlclRyYWNrKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiwgY29uc3QgSW50UmVjdCYpIHsgcmV0dXJuIHRydWU7IH0KICAgICB2aXJ0dWFsIGJvb2wg
cGFpbnRNZWRpYVNsaWRlclRodW1iKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpIHsgcmV0dXJuIHRydWU7IH0KIAorcHVibGljOgor
ICAgIC8vIE1ldGhvZHMgZm9yIHN0YXRlIHF1ZXJ5aW5nCisgICAgQ29udHJvbFN0YXRlcyBjb250
cm9sU3RhdGVzRm9yUmVuZGVyZXIoY29uc3QgUmVuZGVyT2JqZWN0KiBvKSBjb25zdDsKKyAgICBi
b29sIGlzQWN0aXZlKGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OworICAgIGJvb2wgaXNDaGVj
a2VkKGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OworICAgIGJvb2wgaXNJbmRldGVybWluYXRl
KGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OworICAgIGJvb2wgaXNFbmFibGVkKGNvbnN0IFJl
bmRlck9iamVjdCopIGNvbnN0OworICAgIGJvb2wgaXNGb2N1c2VkKGNvbnN0IFJlbmRlck9iamVj
dCopIGNvbnN0OworICAgIGJvb2wgaXNQcmVzc2VkKGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0
OworICAgIGJvb2wgaXNIb3ZlcmVkKGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OworICAgIGJv
b2wgaXNSZWFkT25seUNvbnRyb2woY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7CisgICAgYm9v
bCBpc0RlZmF1bHQoY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7CisKIHByaXZhdGU6CiAgICAg
bXV0YWJsZSBDb2xvciBtX2FjdGl2ZVNlbGVjdGlvbkNvbG9yOwogICAgIG11dGFibGUgQ29sb3Ig
bV9pbmFjdGl2ZVNlbGVjdGlvbkNvbG9yOwpJbmRleDogcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFj
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLmgJKHJldmlzaW9uIDM3
NjYyKQorKysgcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLmgJKHdvcmtpbmcgY29weSkKQEAgLTQy
LDExICs0Miw2IEBAIHB1YmxpYzoKICAgICBSZW5kZXJUaGVtZU1hYygpOwogICAgIHZpcnR1YWwg
flJlbmRlclRoZW1lTWFjKCk7CiAKLSAgICAvLyBBIG1ldGhvZCB0byBvYnRhaW4gdGhlIGJhc2Vs
aW5lIHBvc2l0aW9uIGZvciBhICJsZWFmIiBjb250cm9sLiAgVGhpcyB3aWxsIG9ubHkgYmUgdXNl
ZCBpZiBhIGJhc2VsaW5lCi0gICAgLy8gcG9zaXRpb24gY2Fubm90IGJlIGRldGVybWluZWQgYnkg
ZXhhbWluaW5nIGNoaWxkIGNvbnRlbnQuIENoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgYXJl
IGV4YW1wbGVzIG9mCi0gICAgLy8gY29udHJvbHMgdGhhdCBuZWVkIHRvIGRvIHRoaXMuCi0gICAg
dmlydHVhbCBpbnQgYmFzZWxpbmVQb3NpdGlvbihjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsK
LQogICAgIC8vIEEgbWV0aG9kIGFza2luZyBpZiB0aGUgY29udHJvbCBjaGFuZ2VzIGl0cyB0aW50
IHdoZW4gdGhlIHdpbmRvdyBoYXMgZm9jdXMgb3Igbm90LgogICAgIHZpcnR1YWwgYm9vbCBjb250
cm9sU3VwcG9ydHNUaW50cyhjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKIApAQCAtODIsMTIg
Kzc3LDYgQEAgcHVibGljOgogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gTWV0aG9kcyBmb3IgZWFjaCBh
cHBlYXJhbmNlIHZhbHVlLgotICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJlbmRlck9i
amVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwot
ICAgIHZpcnR1YWwgdm9pZCBzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKLQot
ICAgIHZpcnR1YWwgYm9vbCBwYWludFJhZGlvKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRS
YWRpb1NpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKLQogICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RC
dXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBXZWJDb3JlOjpFbGVt
ZW50KikgY29uc3Q7CiAgICAgdmlydHVhbCBib29sIHBhaW50QnV0dG9uKFJlbmRlck9iamVjdCos
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwogICAgIHZp
cnR1YWwgdm9pZCBzZXRCdXR0b25TaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CkBAIC0xNTEsMTMg
KzE0MCw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCB1cGRhdGVQcmVzc2VkU3RhdGUoTlNDZWxsKiwg
Y29uc3QgUmVuZGVyT2JqZWN0Kik7CiAKICAgICAvLyBIZWxwZXJzIGZvciBhZGp1c3RpbmcgYXBw
ZWFyYW5jZSBhbmQgZm9yIHBhaW50aW5nCi0gICAgY29uc3QgSW50U2l6ZSogY2hlY2tib3hTaXpl
cygpIGNvbnN0OwotICAgIGNvbnN0IGludCogY2hlY2tib3hNYXJnaW5zKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRDaGVja2JveENlbGxTdGF0ZShjb25zdCBSZW5kZXJPYmplY3QqLCBjb25zdCBJbnRS
ZWN0Jik7Ci0KLSAgICBjb25zdCBJbnRTaXplKiByYWRpb1NpemVzKCkgY29uc3Q7Ci0gICAgY29u
c3QgaW50KiByYWRpb01hcmdpbnMoKSBjb25zdDsKLSAgICB2b2lkIHNldFJhZGlvQ2VsbFN0YXRl
KGNvbnN0IFJlbmRlck9iamVjdCosIGNvbnN0IEludFJlY3QmKTsKIAogICAgIHZvaWQgc2V0QnV0
dG9uUGFkZGluZ0Zyb21Db250cm9sU2l6ZShSZW5kZXJTdHlsZSosIE5TQ29udHJvbFNpemUpIGNv
bnN0OwogICAgIGNvbnN0IEludFNpemUqIGJ1dHRvblNpemVzKCkgY29uc3Q7CkBAIC0xNzcsOCAr
MTU5LDYgQEAgcHJpdmF0ZToKICAgICB2b2lkIHNldFNlYXJjaENlbGxTdGF0ZShSZW5kZXJPYmpl
Y3QqLCBjb25zdCBJbnRSZWN0Jik7CiAgICAgdm9pZCBzZXRTZWFyY2hGaWVsZFNpemUoUmVuZGVy
U3R5bGUqKSBjb25zdDsKICAgICAKLSAgICBOU0J1dHRvbkNlbGwqIGNoZWNrYm94KCkgY29uc3Q7
Ci0gICAgTlNCdXR0b25DZWxsKiByYWRpbygpIGNvbnN0OwogICAgIE5TQnV0dG9uQ2VsbCogYnV0
dG9uKCkgY29uc3Q7CiAgICAgTlNQb3BVcEJ1dHRvbkNlbGwqIHBvcHVwQnV0dG9uKCkgY29uc3Q7
CiAgICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCgpIGNvbnN0OwpAQCAtMTg3LDggKzE2Nyw2
IEBAIHByaXZhdGU6CiAgICAgTlNTbGlkZXJDZWxsKiBzbGlkZXJUaHVtYlZlcnRpY2FsKCkgY29u
c3Q7CiAKIHByaXZhdGU6Ci0gICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNCdXR0b25DZWxsPiBtX2No
ZWNrYm94OwotICAgIG11dGFibGUgUmV0YWluUHRyPE5TQnV0dG9uQ2VsbD4gbV9yYWRpbzsKICAg
ICBtdXRhYmxlIFJldGFpblB0cjxOU0J1dHRvbkNlbGw+IG1fYnV0dG9uOwogICAgIG11dGFibGUg
UmV0YWluUHRyPE5TUG9wVXBCdXR0b25DZWxsPiBtX3BvcHVwQnV0dG9uOwogICAgIG11dGFibGUg
UmV0YWluUHRyPE5TU2VhcmNoRmllbGRDZWxsPiBtX3NlYXJjaDsKSW5kZXg6IHJlbmRlcmluZy9S
ZW5kZXJUaGVtZU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMu
bW0JKHJldmlzaW9uIDM3NjYzKQorKysgcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MjEsMzMgKzQyMSwxNiBAQCBib29sIFJlbmRlclRoZW1lTWFjOjppc0Nv
bnRyb2xTdHlsZWQoY29uCiAKIHZvaWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFJlcGFpbnRSZWN0
KGNvbnN0IFJlbmRlck9iamVjdCogbywgSW50UmVjdCYgcikKIHsKKyAgICBDb250cm9sUGFydCBw
YXJ0ID0gby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworICAgIAorI2lmIFVTRShORVdfVEhFTUUp
CisgICAgaWYgKHBhcnQgPT0gQ2hlY2tib3hQYXJ0IHx8IHBhcnQgPT0gUmFkaW9QYXJ0KQorICAg
ICAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmFkanVzdFJlcGFpbnRSZWN0KG8sIHIpOworI2VuZGlm
CisKICAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CiAK
ICAgICBzd2l0Y2ggKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSkgewotICAgICAgICBjYXNlIENo
ZWNrYm94UGFydDogewotICAgICAgICAgICAgLy8gU2luY2Ugd2UgcXVlcnkgdGhlIHByb3RvdHlw
ZSBjZWxsLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdHMgc3RhdGUgdG8gbWF0Y2guCi0gICAgICAgICAg
ICBzZXRDaGVja2JveENlbGxTdGF0ZShvLCByKTsKLQotICAgICAgICAgICAgLy8gV2UgaW5mbGF0
ZSB0aGUgcmVjdCBhcyBuZWVkZWQgdG8gYWNjb3VudCBmb3IgcGFkZGluZyBpbmNsdWRlZCBpbiB0
aGUgY2VsbCB0byBhY2NvbW1vZGF0ZSB0aGUgY2hlY2tib3gKLSAgICAgICAgICAgIC8vIHNoYWRv
dyIgYW5kIHRoZSBjaGVjay4gIFdlIGRvbid0IGNvbnNpZGVyIHRoaXMgcGFydCBvZiB0aGUgYm91
bmRzIG9mIHRoZSBjb250cm9sIGluIFdlYktpdC4KLSAgICAgICAgICAgIEludFNpemUgc2l6ZSA9
IGNoZWNrYm94U2l6ZXMoKVtbY2hlY2tib3goKSBjb250cm9sU2l6ZV1dOwotICAgICAgICAgICAg
c2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7Ci0gICAgICAgICAgICBz
aXplLnNldFdpZHRoKHNpemUud2lkdGgoKSAqIHpvb21MZXZlbCk7Ci0gICAgICAgICAgICByID0g
aW5mbGF0ZVJlY3Qociwgc2l6ZSwgY2hlY2tib3hNYXJnaW5zKCksIHpvb21MZXZlbCk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFJhZGlvUGFydDogewotICAg
ICAgICAgICAgLy8gU2luY2Ugd2UgcXVlcnkgdGhlIHByb3RvdHlwZSBjZWxsLCB3ZSBuZWVkIHRv
IHVwZGF0ZSBpdHMgc3RhdGUgdG8gbWF0Y2guCi0gICAgICAgICAgICBzZXRSYWRpb0NlbGxTdGF0
ZShvLCByKTsKLQotICAgICAgICAgICAgLy8gV2UgaW5mbGF0ZSB0aGUgcmVjdCBhcyBuZWVkZWQg
dG8gYWNjb3VudCBmb3IgcGFkZGluZyBpbmNsdWRlZCBpbiB0aGUgY2VsbCB0byBhY2NvbW1vZGF0
ZSB0aGUgY2hlY2tib3gKLSAgICAgICAgICAgIC8vIHNoYWRvdyIgYW5kIHRoZSBjaGVjay4gIFdl
IGRvbid0IGNvbnNpZGVyIHRoaXMgcGFydCBvZiB0aGUgYm91bmRzIG9mIHRoZSBjb250cm9sIGlu
IFdlYktpdC4KLSAgICAgICAgICAgIEludFNpemUgc2l6ZSA9IHJhZGlvU2l6ZXMoKVtbcmFkaW8o
KSBjb250cm9sU2l6ZV1dOwotICAgICAgICAgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQo
KSAqIHpvb21MZXZlbCk7Ci0gICAgICAgICAgICBzaXplLnNldFdpZHRoKHNpemUud2lkdGgoKSAq
IHpvb21MZXZlbCk7Ci0gICAgICAgICAgICByID0gaW5mbGF0ZVJlY3Qociwgc2l6ZSwgcmFkaW9N
YXJnaW5zKCksIHpvb21MZXZlbCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAg
ICAgICBjYXNlIFB1c2hCdXR0b25QYXJ0OgogICAgICAgICBjYXNlIERlZmF1bHRCdXR0b25QYXJ0
OgogICAgICAgICBjYXNlIEJ1dHRvblBhcnQ6IHsKQEAgLTUyMiw3ICs1MDUsNyBAQCB2b2lkIFJl
bmRlclRoZW1lTWFjOjp1cGRhdGVFbmFibGVkU3RhdGUoCiB2b2lkIFJlbmRlclRoZW1lTWFjOjp1
cGRhdGVGb2N1c2VkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5kZXJPYmplY3QqIG8pCiB7
CiAgICAgYm9vbCBvbGRGb2N1c2VkID0gW2NlbGwgc2hvd3NGaXJzdFJlc3BvbmRlcl07Ci0gICAg
Ym9vbCBmb2N1c2VkID0gaXNGb2N1c2VkKG8pICYmIG8tPnN0eWxlKCktPm91dGxpbmVTdHlsZUlz
QXV0bygpOworICAgIGJvb2wgZm9jdXNlZCA9IGlzRm9jdXNlZChvKTsKICAgICBpZiAoZm9jdXNl
ZCAhPSBvbGRGb2N1c2VkKQogICAgICAgICBbY2VsbCBzZXRTaG93c0ZpcnN0UmVzcG9uZGVyOmZv
Y3VzZWRdOwogfQpAQCAtNTM1LDEzICs1MTgsNiBAQCB2b2lkIFJlbmRlclRoZW1lTWFjOjp1cGRh
dGVQcmVzc2VkU3RhdGUoCiAgICAgICAgIFtjZWxsIHNldEhpZ2hsaWdodGVkOnByZXNzZWRdOwog
fQogCi1pbnQgUmVuZGVyVGhlbWVNYWM6OmJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2Jq
ZWN0KiBvKSBjb25zdAotewotICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gQ2hl
Y2tib3hQYXJ0IHx8IG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBSYWRpb1BhcnQpCi0gICAg
ICAgIHJldHVybiBvLT5tYXJnaW5Ub3AoKSArIG8tPmhlaWdodCgpIC0gMiAqIG8tPnN0eWxlKCkt
PmVmZmVjdGl2ZVpvb20oKTsgLy8gVGhlIGJhc2VsaW5lIGlzIDJweCB1cCBmcm9tIHRoZSBib3R0
b20gb2YgdGhlIGNoZWNrYm94L3JhZGlvIGluIEFwcEtpdC4KLSAgICByZXR1cm4gUmVuZGVyVGhl
bWU6OmJhc2VsaW5lUG9zaXRpb24obyk7Ci19Ci0KIGJvb2wgUmVuZGVyVGhlbWVNYWM6OmNvbnRy
b2xTdXBwb3J0c1RpbnRzKGNvbnN0IFJlbmRlck9iamVjdCogbykgY29uc3QKIHsKICAgICAvLyBB
biBhbHRlcm5hdGUgd2F5IHRvIGltcGxlbWVudCB0aGlzIHdvdWxkIGJlIHRvIGdldCB0aGUgYXBw
cm9wcmlhdGUgY2VsbCBvYmplY3QKQEAgLTY0MSwxNTUgKzYxNyw2IEBAIE5TQ29udHJvbFNpemUg
UmVuZGVyVGhlbWVNYWM6OmNvbnRyb2xTaXoKICAgICByZXR1cm4gTlNNaW5pQ29udHJvbFNpemU7
CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByKQotewotICAgIC8vIERldGVybWluZSB0aGUgd2lkdGggYW5kIGhlaWdodCBuZWVkZWQgZm9y
IHRoZSBjb250cm9sIGFuZCBwcmVwYXJlIHRoZSBjZWxsIGZvciBwYWludGluZy4KLSAgICBzZXRD
aGVja2JveENlbGxTdGF0ZShvLCByKTsKLQotICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7
Ci0KLSAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0K
LSAgICAvLyBXZSBpbmZsYXRlIHRoZSByZWN0IGFzIG5lZWRlZCB0byBhY2NvdW50IGZvciBwYWRk
aW5nIGluY2x1ZGVkIGluIHRoZSBjZWxsIHRvIGFjY29tbW9kYXRlIHRoZSBjaGVja2JveAotICAg
IC8vIHNoYWRvdyIgYW5kIHRoZSBjaGVjay4gIFdlIGRvbid0IGNvbnNpZGVyIHRoaXMgcGFydCBv
ZiB0aGUgYm91bmRzIG9mIHRoZSBjb250cm9sIGluIFdlYktpdC4KLSAgICBOU0J1dHRvbkNlbGwq
IGNoZWNrYm94ID0gdGhpcy0+Y2hlY2tib3goKTsKLSAgICBJbnRTaXplIHNpemUgPSBjaGVja2Jv
eFNpemVzKClbW2NoZWNrYm94IGNvbnRyb2xTaXplXV07Ci0gICAgc2l6ZS5zZXRXaWR0aChzaXpl
LndpZHRoKCkgKiB6b29tTGV2ZWwpOwotICAgIHNpemUuc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkg
KiB6b29tTGV2ZWwpOwotICAgIEludFJlY3QgaW5mbGF0ZWRSZWN0ID0gaW5mbGF0ZVJlY3Qociwg
c2l6ZSwgY2hlY2tib3hNYXJnaW5zKCksIHpvb21MZXZlbCk7Ci0gICAgCi0gICAgaWYgKHpvb21M
ZXZlbCAhPSAxLjBmKSB7Ci0gICAgICAgIGluZmxhdGVkUmVjdC5zZXRXaWR0aChpbmZsYXRlZFJl
Y3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIGluZmxhdGVkUmVjdC5zZXRIZWlnaHQo
aW5mbGF0ZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKLSAgICAgICAgcGFpbnRJbmZvLmNv
bnRleHQtPnRyYW5zbGF0ZShpbmZsYXRlZFJlY3QueCgpLCBpbmZsYXRlZFJlY3QueSgpKTsKLSAg
ICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21M
ZXZlbCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC1pbmZsYXRlZFJl
Y3QueCgpLCAtaW5mbGF0ZWRSZWN0LnkoKSk7Ci0gICAgfQotICAgIAotICAgIFtjaGVja2JveCBk
cmF3V2l0aEZyYW1lOk5TUmVjdChpbmZsYXRlZFJlY3QpIGluVmlldzpvLT52aWV3KCktPmZyYW1l
VmlldygpLT5kb2N1bWVudFZpZXcoKV07Ci0gICAgW2NoZWNrYm94IHNldENvbnRyb2xWaWV3Om5p
bF07Ci0KLSAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotCi0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6Y2hlY2tib3hTaXplcygp
IGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUo
MTQsIDE0KSwgSW50U2l6ZSgxMiwgMTIpLCBJbnRTaXplKDEwLCAxMCkgfTsKLSAgICByZXR1cm4g
c2l6ZXM7Ci19Ci0KLWNvbnN0IGludCogUmVuZGVyVGhlbWVNYWM6OmNoZWNrYm94TWFyZ2lucygp
IGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IGludCBtYXJnaW5zWzNdWzRdID0KLSAgICB7Ci0g
ICAgICAgIHsgMywgNCwgNCwgMiB9LAotICAgICAgICB7IDQsIDMsIDMsIDMgfSwKLSAgICAgICAg
eyA0LCAzLCAzLCAzIH0sCi0gICAgfTsKLSAgICByZXR1cm4gbWFyZ2luc1tbY2hlY2tib3goKSBj
b250cm9sU2l6ZV1dOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjpzZXRDaGVja2JveENlbGxT
dGF0ZShjb25zdCBSZW5kZXJPYmplY3QqIG8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTlNC
dXR0b25DZWxsKiBjaGVja2JveCA9IHRoaXMtPmNoZWNrYm94KCk7Ci0KLSAgICAvLyBTZXQgdGhl
IGNvbnRyb2wgc2l6ZSBiYXNlZCBvZmYgdGhlIHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRv
LgotICAgIHNldENvbnRyb2xTaXplKGNoZWNrYm94LCBjaGVja2JveFNpemVzKCksIHIuc2l6ZSgp
LCBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOwotCi0gICAgLy8gVXBkYXRlIHRoZSB2YXJp
b3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgotICAgIHVwZGF0ZUNoZWNrZWRTdGF0ZShjaGVja2Jv
eCwgbyk7Ci0gICAgdXBkYXRlRW5hYmxlZFN0YXRlKGNoZWNrYm94LCBvKTsKLSAgICB1cGRhdGVQ
cmVzc2VkU3RhdGUoY2hlY2tib3gsIG8pOwotICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShjaGVja2Jv
eCwgbyk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldENoZWNrYm94U2l6ZShSZW5kZXJT
dHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJl
IGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KLSAgICBpZiAoIXN0
eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1
dG8oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVXNlIHRoZSBmb250IHNpemUgdG8gZGV0
ZXJtaW5lIHRoZSBpbnRyaW5zaWMgd2lkdGggb2YgdGhlIGNvbnRyb2wuCi0gICAgc2V0U2l6ZUZy
b21Gb250KHN0eWxlLCBjaGVja2JveFNpemVzKCkpOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFj
OjpwYWludFJhZGlvKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICAvLyBEZXRlcm1pbmUgdGhl
IHdpZHRoIGFuZCBoZWlnaHQgbmVlZGVkIGZvciB0aGUgY29udHJvbCBhbmQgcHJlcGFyZSB0aGUg
Y2VsbCBmb3IgcGFpbnRpbmcuCi0gICAgc2V0UmFkaW9DZWxsU3RhdGUobywgcik7Ci0KLSAgICBw
YWludEluZm8uY29udGV4dC0+c2F2ZSgpOwotCi0gICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5
bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gV2UgaW5mbGF0ZSB0aGUgcmVjdCBhcyBu
ZWVkZWQgdG8gYWNjb3VudCBmb3IgcGFkZGluZyBpbmNsdWRlZCBpbiB0aGUgY2VsbCB0byBhY2Nv
bW1vZGF0ZSB0aGUgY2hlY2tib3gKLSAgICAvLyBzaGFkb3ciIGFuZCB0aGUgY2hlY2suICBXZSBk
b24ndCBjb25zaWRlciB0aGlzIHBhcnQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgY29udHJvbCBpbiBX
ZWJLaXQuCi0gICAgTlNCdXR0b25DZWxsKiByYWRpbyA9IHRoaXMtPnJhZGlvKCk7Ci0gICAgSW50
U2l6ZSBzaXplID0gcmFkaW9TaXplcygpW1tyYWRpbyBjb250cm9sU2l6ZV1dOwotICAgIHNpemUu
c2V0V2lkdGgoc2l6ZS53aWR0aCgpICogem9vbUxldmVsKTsKLSAgICBzaXplLnNldEhlaWdodChz
aXplLmhlaWdodCgpICogem9vbUxldmVsKTsKLSAgICBJbnRSZWN0IGluZmxhdGVkUmVjdCA9IGlu
ZmxhdGVSZWN0KHIsIHNpemUsIHJhZGlvTWFyZ2lucygpLCB6b29tTGV2ZWwpOwotICAgIAotICAg
IGlmICh6b29tTGV2ZWwgIT0gMS4wZikgewotICAgICAgICBpbmZsYXRlZFJlY3Quc2V0V2lkdGgo
aW5mbGF0ZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOwotICAgICAgICBpbmZsYXRlZFJlY3Qu
c2V0SGVpZ2h0KGluZmxhdGVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIHBh
aW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoaW5mbGF0ZWRSZWN0LngoKSwgaW5mbGF0ZWRSZWN0
LnkoKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxl
dmVsLCB6b29tTGV2ZWwpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgt
aW5mbGF0ZWRSZWN0LngoKSwgLWluZmxhdGVkUmVjdC55KCkpOwotICAgIH0KLQotICAgIFtyYWRp
byBkcmF3V2l0aEZyYW1lOk5TUmVjdChpbmZsYXRlZFJlY3QpIGluVmlldzpvLT52aWV3KCktPmZy
YW1lVmlldygpLT5kb2N1bWVudFZpZXcoKV07Ci0gICAgW3JhZGlvIHNldENvbnRyb2xWaWV3Om5p
bF07Ci0KLSAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotCi0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6cmFkaW9TaXplcygpIGNv
bnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMTQs
IDE1KSwgSW50U2l6ZSgxMiwgMTMpLCBJbnRTaXplKDEwLCAxMCkgfTsKLSAgICByZXR1cm4gc2l6
ZXM7Ci19Ci0KLWNvbnN0IGludCogUmVuZGVyVGhlbWVNYWM6OnJhZGlvTWFyZ2lucygpIGNvbnN0
Ci17Ci0gICAgc3RhdGljIGNvbnN0IGludCBtYXJnaW5zWzNdWzRdID0KLSAgICB7Ci0gICAgICAg
IHsgMiwgMiwgNCwgMiB9LAotICAgICAgICB7IDMsIDIsIDMsIDIgfSwKLSAgICAgICAgeyAxLCAw
LCAyLCAwIH0sCi0gICAgfTsKLSAgICByZXR1cm4gbWFyZ2luc1tbcmFkaW8oKSBjb250cm9sU2l6
ZV1dOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjpzZXRSYWRpb0NlbGxTdGF0ZShjb25zdCBS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTlNCdXR0b25DZWxsKiBy
YWRpbyA9IHRoaXMtPnJhZGlvKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNvbnRyb2wgc2l6ZSBiYXNl
ZCBvZmYgdGhlIHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRvLgotICAgIHNldENvbnRyb2xT
aXplKHJhZGlvLCByYWRpb1NpemVzKCksIHIuc2l6ZSgpLCBvLT5zdHlsZSgpLT5lZmZlY3RpdmVa
b29tKCkpOwotCi0gICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25kIHRv
LgotICAgIHVwZGF0ZUNoZWNrZWRTdGF0ZShyYWRpbywgbyk7Ci0gICAgdXBkYXRlRW5hYmxlZFN0
YXRlKHJhZGlvLCBvKTsKLSAgICB1cGRhdGVQcmVzc2VkU3RhdGUocmFkaW8sIG8pOwotICAgIHVw
ZGF0ZUZvY3VzZWRTdGF0ZShyYWRpbywgbyk7Ci19Ci0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6
c2V0UmFkaW9TaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICAvLyBJZiB0aGUg
d2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3RoaW5n
IHRvIGRvLgotICAgIGlmICghc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAh
c3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBVc2Ug
dGhlIGZvbnQgc2l6ZSB0byBkZXRlcm1pbmUgdGhlIGludHJpbnNpYyB3aWR0aCBvZiB0aGUgY29u
dHJvbC4KLSAgICBzZXRTaXplRnJvbUZvbnQoc3R5bGUsIHJhZGlvU2l6ZXMoKSk7Ci19Ci0KIHZv
aWQgUmVuZGVyVGhlbWVNYWM6OnNldEJ1dHRvblBhZGRpbmdGcm9tQ29udHJvbFNpemUoUmVuZGVy
U3R5bGUqIHN0eWxlLCBOU0NvbnRyb2xTaXplIHNpemUpIGNvbnN0CiB7CiAgICAgLy8gSnVzdCB1
c2UgOHB4LiAgQXBwS2l0IHdhbnRzIHRvIHVzZSAxMXB4IGZvciBtaW5pIGJ1dHRvbnMsIGJ1dCB0
aGF0IHBhZGRpbmcgaXMganVzdCB0b28gbGFyZ2UKQEAgLTE4MDMsMzEgKzE2MzAsNiBAQCBib29s
IFJlbmRlclRoZW1lTWFjOjpwYWludE1lZGlhU2xpZGVyVGh1CiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCi1OU0J1dHRvbkNlbGwqIFJlbmRlclRoZW1lTWFjOjpjaGVja2JveCgpIGNvbnN0Ci17Ci0g
ICAgaWYgKCFtX2NoZWNrYm94KSB7Ci0gICAgICAgIG1fY2hlY2tib3guYWRvcHROUyhbW05TQnV0
dG9uQ2VsbCBhbGxvY10gaW5pdF0pOwotICAgICAgICBbbV9jaGVja2JveC5nZXQoKSBzZXRCdXR0
b25UeXBlOk5TU3dpdGNoQnV0dG9uXTsKLSAgICAgICAgW21fY2hlY2tib3guZ2V0KCkgc2V0VGl0
bGU6bmlsXTsKLSAgICAgICAgW21fY2hlY2tib3guZ2V0KCkgc2V0QWxsb3dzTWl4ZWRTdGF0ZTpZ
RVNdOwotICAgICAgICBbbV9jaGVja2JveC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNS
aW5nVHlwZUV4dGVyaW9yXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1fY2hlY2tib3guZ2V0
KCk7Ci19Ci0KLU5TQnV0dG9uQ2VsbCogUmVuZGVyVGhlbWVNYWM6OnJhZGlvKCkgY29uc3QKLXsK
LSAgICBpZiAoIW1fcmFkaW8pIHsKLSAgICAgICAgbV9yYWRpby5hZG9wdE5TKFtbTlNCdXR0b25D
ZWxsIGFsbG9jXSBpbml0XSk7Ci0gICAgICAgIFttX3JhZGlvLmdldCgpIHNldEJ1dHRvblR5cGU6
TlNSYWRpb0J1dHRvbl07Ci0gICAgICAgIFttX3JhZGlvLmdldCgpIHNldFRpdGxlOm5pbF07Ci0g
ICAgICAgIFttX3JhZGlvLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0
ZXJpb3JdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbV9yYWRpby5nZXQoKTsKLX0KLQogTlNC
dXR0b25DZWxsKiBSZW5kZXJUaGVtZU1hYzo6YnV0dG9uKCkgY29uc3QKIHsKICAgICBpZiAoIW1f
YnV0dG9uKSB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>24525</attachid>
            <date>2008-10-20 09:25:28 -0700</date>
            <delta_ts>2008-10-20 09:37:41 -0700</delta_ts>
            <desc>Patch #2</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>47329</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDM3NzI4
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzIgQEAKKzIwMDgtMTAt
MjAgIERhdmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgorCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTc1MQorCisgICAgICAgIENvbnZlcnQgY2hl
Y2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBvbiBPUyBYIG92ZXIgdG8gdGhlIG5ldyBUaGVtZSBB
UEkuCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBSb2JlbgorCisgICAgICAgICogY3NzL0NT
U0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDU1NDb21w
dXRlZFN0eWxlRGVjbGFyYXRpb246OmdldFByb3BlcnR5Q1NTVmFsdWUpOgorICAgICAgICAqIGNz
cy9DU1NTdHlsZVNlbGVjdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNTU1N0eWxlU2VsZWN0
b3I6Om1hcEZpbGxTaXplKToKKyAgICAgICAgKiBwbGF0Zm9ybS9MZW5ndGguaDoKKyAgICAgICAg
KFdlYkNvcmU6Okxlbmd0aFNpemU6Okxlbmd0aFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6TGVu
Z3RoU2l6ZTo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3JlOjpMZW5ndGhTaXplOjp3aWR0
aCk6CisgICAgICAgIChXZWJDb3JlOjpMZW5ndGhTaXplOjpoZWlnaHQpOgorICAgICAgICAoV2Vi
Q29yZTo6TGVuZ3RoU2l6ZTo6c2V0V2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6TGVuZ3RoU2l6
ZTo6c2V0SGVpZ2h0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9UaGVtZS5oOgorICAgICAgICAoV2Vi
Q29yZTo6VGhlbWU6OmNvbnRyb2xTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlRoZW1lOjpjb250
cm9sU3VwcG9ydHNCb3JkZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGhlbWU6OmNvbnRyb2xTdXBw
b3J0c1BhZGRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6VGhlbWU6OnBhaW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlRoZW1lOjppbmZsYXRlQ29udHJvbFBhaW50UmVjdCk6CisgICAgICAgICogcGxh
dGZvcm0vVGhlbWVUeXBlcy5oOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKiBwbGF0
Zm9ybS9tYWMvVGhlbWVNYWMuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvVGhlbWVNYWMubW06
CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6Y29udHJvbFNpemVGb3JG
b250KToKKyAgICAgICAgKFdlYkNvcmU6OnNpemVGcm9tRm9udCk6CisgICAgICAgIChXZWJDb3Jl
OjpzZXRDb250cm9sU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjp1cGRhdGVTdGF0ZXMpOgorICAg
ICAgICAoV2ViQ29yZTo6aW5mbGF0ZVJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tib3hT
aXplcyk6CisgICAgICAgIChXZWJDb3JlOjpjaGVja2JveE1hcmdpbnMpOgorICAgICAgICAoV2Vi
Q29yZTo6Y2hlY2tib3hTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrYm94KToKKyAgICAg
ICAgKFdlYkNvcmU6OnBhaW50Q2hlY2tib3gpOgorICAgICAgICAoV2ViQ29yZTo6cmFkaW9TaXpl
cyk6CisgICAgICAgIChXZWJDb3JlOjpyYWRpb01hcmdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6
cmFkaW9TaXplKToKKyAgICAgICAgKFdlYkNvcmU6OnJhZGlvKToKKyAgICAgICAgKFdlYkNvcmU6
OnBhaW50UmFkaW8pOgorICAgICAgICAoV2ViQ29yZTo6VGhlbWVNYWM6OmJhc2VsaW5lUG9zaXRp
b25BZGp1c3RtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlRoZW1lTWFjOjpjb250cm9sU2l6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpUaGVtZU1hYzo6Y29udHJvbFN1cHBvcnRzQm9yZGVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRoZW1lTWFjOjpjb250cm9sU3VwcG9ydHNQYWRkaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OlRoZW1lTWFjOjppbmZsYXRlQ29udHJvbFBhaW50UmVjdCk6CisgICAgICAg
IChXZWJDb3JlOjpUaGVtZU1hYzo6cGFpbnQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJC
b3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQm94OjpjYWxjdWxhdGVCYWNrZ3JvdW5k
U2l6ZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjptdXN0UmVwYWludEZpbGxMYXllcnMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5k
ZXJUaGVtZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZTo6YWRqdXN0U3R5bGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWU6OnBhaW50KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lOjpiYXNlbGluZVBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lOjphZGp1c3RSZXBhaW50UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZTo6Y29udHJvbFN0YXRlc0ZvclJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lOjppc0ZvY3VzZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZS5oOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5oOgorICAgICAgICAqIHJlbmRlcmlu
Zy9SZW5kZXJUaGVtZU1hYy5tbToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjph
ZGp1c3RSZXBhaW50UmVjdCk6CisgICAgICAgICogcmVuZGVyaW5nL3N0eWxlL0ZpbGxMYXllci5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpGaWxsTGF5ZXI6Om9wZXJhdG9yPT0pOgorCiAyMDA4LTEw
LTIwICBEYXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxlLmNvbT4KIAogICAgICAgICBNb3ZlIExlbmd0
aCB0byBwbGF0Zm9ybS8uCkluZGV4OiBjc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBjc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNwcAkocmV2
aXNpb24gMzc3MjYpCisrKyBjc3MvQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDgwLDggKzQ4MCw4IEBAIFBhc3NSZWZQdHI8Q1NTVmFsdWU+IENTU0Nv
bXB1dGVkU3R5bGVEZWMKICAgICAgICAgICAgIHJldHVybiBDU1NQcmltaXRpdmVWYWx1ZTo6Y3Jl
YXRlSWRlbnRpZmllcihDU1NWYWx1ZU5vbmUpOwogICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QmFja2dyb3VuZFNpemU6IHsKICAgICAgICAgICAgIFJlZlB0cjxDU1NWYWx1ZUxpc3Q+IGxp
c3QgPSBDU1NWYWx1ZUxpc3Q6OmNyZWF0ZVNwYWNlU2VwYXJhdGVkKCk7Ci0gICAgICAgICAgICBs
aXN0LT5hcHBlbmQoQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShzdHlsZS0+YmFja2dyb3VuZFNp
emUoKS53aWR0aCkpOwotICAgICAgICAgICAgbGlzdC0+YXBwZW5kKENTU1ByaW1pdGl2ZVZhbHVl
OjpjcmVhdGUoc3R5bGUtPmJhY2tncm91bmRTaXplKCkuaGVpZ2h0KSk7CisgICAgICAgICAgICBs
aXN0LT5hcHBlbmQoQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShzdHlsZS0+YmFja2dyb3VuZFNp
emUoKS53aWR0aCgpKSk7CisgICAgICAgICAgICBsaXN0LT5hcHBlbmQoQ1NTUHJpbWl0aXZlVmFs
dWU6OmNyZWF0ZShzdHlsZS0+YmFja2dyb3VuZFNpemUoKS5oZWlnaHQoKSkpOwogICAgICAgICAg
ICAgcmV0dXJuIGxpc3QucmVsZWFzZSgpOwogICAgICAgICB9ICAKICAgICAgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6CkBAIC03NDQsOCArNzQ0LDggQEAgUGFzc1JlZlB0cjxD
U1NWYWx1ZT4gQ1NTQ29tcHV0ZWRTdHlsZURlYwogICAgICAgICAgICAgcmV0dXJuIENTU1ByaW1p
dGl2ZVZhbHVlOjpjcmVhdGVJZGVudGlmaWVyKENTU1ZhbHVlTm9uZSk7CiAgICAgICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrU2l6ZTogewogICAgICAgICAgICAgUmVmUHRyPENTU1ZhbHVl
TGlzdD4gbGlzdCA9IENTU1ZhbHVlTGlzdDo6Y3JlYXRlU3BhY2VTZXBhcmF0ZWQoKTsKLSAgICAg
ICAgICAgIGxpc3QtPmFwcGVuZChDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHN0eWxlLT5tYXNr
U2l6ZSgpLndpZHRoKSk7Ci0gICAgICAgICAgICBsaXN0LT5hcHBlbmQoQ1NTUHJpbWl0aXZlVmFs
dWU6OmNyZWF0ZShzdHlsZS0+bWFza1NpemUoKS5oZWlnaHQpKTsKKyAgICAgICAgICAgIGxpc3Qt
PmFwcGVuZChDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHN0eWxlLT5tYXNrU2l6ZSgpLndpZHRo
KCkpKTsKKyAgICAgICAgICAgIGxpc3QtPmFwcGVuZChDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRl
KHN0eWxlLT5tYXNrU2l6ZSgpLmhlaWdodCgpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGlzdC5y
ZWxlYXNlKCk7CiAgICAgICAgIH0gIAogICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFz
a1JlcGVhdDoKSW5kZXg6IGNzcy9DU1NTdHlsZVNlbGVjdG9yLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBj
c3MvQ1NTU3R5bGVTZWxlY3Rvci5jcHAJKHJldmlzaW9uIDM3NzI2KQorKysgY3NzL0NTU1N0eWxl
U2VsZWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MTI5LDggKzUxMjksOCBAQCB2b2lkIENT
U1N0eWxlU2VsZWN0b3I6Om1hcEZpbGxTaXplKEZpbGxMCiAgICAgZWxzZQogICAgICAgICByZXR1
cm47CiAgICAgCi0gICAgYi53aWR0aCA9IGZpcnN0TGVuZ3RoOwotICAgIGIuaGVpZ2h0ID0gc2Vj
b25kTGVuZ3RoOworICAgIGIuc2V0V2lkdGgoZmlyc3RMZW5ndGgpOworICAgIGIuc2V0SGVpZ2h0
KHNlY29uZExlbmd0aCk7CiAgICAgbGF5ZXItPnNldFNpemUoYik7CiB9CiAKSW5kZXg6IHBsYXRm
b3JtL0xlbmd0aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL0xlbmd0aC5oCShyZXZpc2lvbiAz
NzcyNikKKysrIHBsYXRmb3JtL0xlbmd0aC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMjQsMTggKzIy
NCwzMSBAQCBzdHJ1Y3QgTGVuZ3RoQm94IHsKIH07CiAKIHN0cnVjdCBMZW5ndGhTaXplIHsKLSAg
ICBMZW5ndGggd2lkdGg7Ci0gICAgTGVuZ3RoIGhlaWdodDsKLQorcHVibGljOgogICAgIExlbmd0
aFNpemUoKQogICAgIHsKICAgICB9CiAgICAgCiAgICAgTGVuZ3RoU2l6ZShjb25zdCBMZW5ndGgm
IHcsIGNvbnN0IExlbmd0aCYgaCkKLSAgICAgICAgOiB3aWR0aCh3KQotICAgICAgICAsIGhlaWdo
dChoKQorICAgICAgICA6IG1fd2lkdGgodykKKyAgICAgICAgLCBtX2hlaWdodChoKQorICAgIHsK
KyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGVuZ3RoU2l6ZSYgbykgY29uc3QK
ICAgICB7CisgICAgICAgIHJldHVybiBtX3dpZHRoID09IG8ubV93aWR0aCAmJiBtX2hlaWdodCA9
PSBvLm1faGVpZ2h0OwogICAgIH0KKworICAgIExlbmd0aCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJu
IG1fd2lkdGg7IH0KKyAgICBMZW5ndGggaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7
IH0KKyAgICAKKyAgICB2b2lkIHNldFdpZHRoKExlbmd0aCB3KSB7IG1fd2lkdGggPSB3OyB9Cisg
ICAgdm9pZCBzZXRIZWlnaHQoTGVuZ3RoIGgpIHsgbV9oZWlnaHQgPSBoOyB9CisKK3ByaXZhdGU6
CisgICAgTGVuZ3RoIG1fd2lkdGg7CisgICAgTGVuZ3RoIG1faGVpZ2h0OwogfTsKIAogTGVuZ3Ro
KiBuZXdDb29yZHNBcnJheShjb25zdCBTdHJpbmcmLCBpbnQmIGxlbik7CkluZGV4OiBwbGF0Zm9y
bS9UaGVtZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL1RoZW1lLmgJKHJldmlzaW9uIDM3NzI2
KQorKysgcGxhdGZvcm0vVGhlbWUuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsMTQgKzI4LDE1IEBA
CiAKICNpbmNsdWRlICJDb2xvci5oIgogI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJJbnRT
aXplLmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkxlbmd0aC5oIgogI2luY2x1
ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSAiVGhlbWVUeXBlcy5oIgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIFNjcm9sbFZpZXc7
CiAKIC8vIFVubGlrZSBvdGhlciBwbGF0Zm9ybSBjbGFzc2VzLCBUaGVtZSBkb2VzIGV4dGVuc2l2
ZWx5IHVzZSB2aXJ0dWFsIGZ1bmN0aW9ucy4gIFRoaXMgZGVzaWduIGFsbG93cyBhIHBsYXRmb3Jt
IHRvIHN3aXRjaCBiZXR3ZWVuIG11bHRpcGxlIHRoZW1lcyBhdCBydW50aW1lLgogY2xhc3MgVGhl
bWUgewpAQCAtNDYsNiArNDcsNyBAQCBwdWJsaWM6CiAgICAgLy8gQSBtZXRob2QgdG8gb2J0YWlu
IHRoZSBiYXNlbGluZSBwb3NpdGlvbiBhZGp1c3RtZW50IGZvciBhICJsZWFmIiBjb250cm9sLiAg
VGhpcyB3aWxsIG9ubHkgYmUgdXNlZCBpZiBhIGJhc2VsaW5lCiAgICAgLy8gcG9zaXRpb24gY2Fu
bm90IGJlIGRldGVybWluZWQgYnkgZXhhbWluaW5nIGNoaWxkIGNvbnRlbnQuIENoZWNrYm94ZXMg
YW5kIHJhZGlvIGJ1dHRvbnMgYXJlIGV4YW1wbGVzIG9mCiAgICAgLy8gY29udHJvbHMgdGhhdCBu
ZWVkIHRvIGRvIHRoaXMuICBUaGUgYWRqdXN0bWVudCBpcyBhbiBvZmZzZXQgdGhhdCBhZGRzIHRv
IHRoZSBiYXNlbGluZSwgZS5nLiwgbWFyZ2luVG9wKCkgKyBoZWlnaHQoKSArIHxvZmZzZXR8Lgor
ICAgIC8vIFRoZSBvZmZzZXQgaXMgbm90IHpvb21lZC4KICAgICB2aXJ0dWFsIGludCBiYXNlbGlu
ZVBvc2l0aW9uQWRqdXN0bWVudChDb250cm9sUGFydCkgY29uc3QgeyByZXR1cm4gMDsgfQogCiAg
ICAgLy8gQSBtZXRob2QgYXNraW5nIGlmIHRoZSBjb250cm9sIGNoYW5nZXMgaXRzIGFwcGVhcmFu
Y2Ugd2hlbiB0aGUgd2luZG93IGlzIGluYWN0aXZlLgpAQCAtNzUsMjAgKzc3LDIxIEBAIHB1Ymxp
YzoKICAgICAvLyBOb3RpZmljYXRpb24gd2hlbiB0aGUgdGhlbWUgaGFzIGNoYW5nZWQKICAgICB2
aXJ0dWFsIHZvaWQgdGhlbWVDaGFuZ2VkKCkgeyB9CiAKLSAgICAvLyBNZXRob2RzIHVzZWQgdG8g
YWRqdXN0IHRoZSBSZW5kZXJTdHlsZXMgb2YgY29udHJvbHMuICAgIAotICAgIHZpcnR1YWwgSW50
U2l6ZSBjb250cm9sU2l6ZShDb250cm9sUGFydCwgY29uc3QgRm9udCYpIHsgcmV0dXJuIEludFNp
emUoKTsgfQotICAgIHZpcnR1YWwgRm9udCBjb250cm9sRm9udChDb250cm9sUGFydCwgY29uc3Qg
Rm9udCYgZm9udCkgeyByZXR1cm4gZm9udDsgfQotICAgIHZpcnR1YWwgQ29udHJvbEJveCBjb250
cm9sUGFkZGluZyhDb250cm9sUGFydCwgQ29udHJvbEJveCBib3gsIGNvbnN0IEZvbnQmKSB7IHJl
dHVybiBib3g7IH0KLSAgICB2aXJ0dWFsIENvbnRyb2xCb3ggY29udHJvbEludGVybmFsUGFkZGlu
ZyhDb250cm9sUGFydCkgeyByZXR1cm4gQ29udHJvbEJveCgpOyB9Ci0gICAgdmlydHVhbCBDb250
cm9sQm94IGNvbnRyb2xCb3JkZXIoQ29udHJvbFBhcnQsIENvbnRyb2xCb3ggYm94LCBjb25zdCBG
b250JikgeyByZXR1cm4gYm94OyB9Ci0gICAgdmlydHVhbCBpbnQgY29udHJvbEJvcmRlclJhZGl1
cyhDb250cm9sUGFydCwgY29uc3QgRm9udCYpIHsgcmV0dXJuIDA7IH0KLQotICAgIC8vIE1ldGhv
ZCBmb3IgcGFpbnRpbmcgYSBjb250cm9sLgotICAgIHZpcnR1YWwgdm9pZCBwYWludChDb250cm9s
UGFydCwgQ29udHJvbFN0YXRlcywgR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpIHsg
fTsKKyAgICAvLyBNZXRob2RzIHVzZWQgdG8gYWRqdXN0IHRoZSBSZW5kZXJTdHlsZXMgb2YgY29u
dHJvbHMuCisgICAgCisgICAgLy8gVGhlIHNpemUgaGVyZSBpcyBpbiB6b29tZWQgY29vcmRpbmF0
ZXMgYWxyZWFkeS4gIElmIGEgbmV3IHNpemUgaXMgcmV0dXJuZWQsIGl0IGFsc28gbmVlZHMgdG8g
YmUgaW4gem9vbWVkIGNvb3JkaW5hdGVzLgorICAgIHZpcnR1YWwgTGVuZ3RoU2l6ZSBjb250cm9s
U2l6ZShDb250cm9sUGFydCwgY29uc3QgRm9udCYsIGNvbnN0IExlbmd0aFNpemUmIHpvb21lZFNp
emUsIGZsb2F0IHpvb21GYWN0b3IpIGNvbnN0IHsgcmV0dXJuIHpvb21lZFNpemU7IH0KKyAgICB2
aXJ0dWFsIGJvb2wgY29udHJvbFN1cHBvcnRzQm9yZGVyKENvbnRyb2xQYXJ0KSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c1BhZGRpbmcoQ29u
dHJvbFBhcnQpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICAvLyBNZXRob2QgZm9y
IHBhaW50aW5nIGEgY29udHJvbC4gIFRoZSByZWN0IGlzIGluIHpvb21lZCBjb29yZGluYXRlcy4K
KyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoQ29udHJvbFBhcnQsIENvbnRyb2xTdGF0ZXMsIEdyYXBo
aWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmIHpvb21lZFJlY3QsIGZsb2F0IHpvb21GYWN0b3Is
IFNjcm9sbFZpZXcqKSBjb25zdCB7IH07CiAKICAgICAvLyBTb21lIGNvbnRyb2xzIG1heSBzcGls
bCBvdXQgb2YgdGhlaXIgY29udGFpbmVycyAoZS5nLiwgdGhlIGNoZWNrIG9uIGFuIE9TIFggY2hl
Y2tib3gpLiAgV2hlbiB0aGVzZSBjb250cm9scyByZXBhaW50LAogICAgIC8vIHRoZSB0aGVtZSBu
ZWVkcyB0byBjb21tdW5pY2F0ZSB0aGlzIGluZmxhdGVkIHJlY3QgdG8gdGhlIGVuZ2luZSBzbyB0
aGF0IGl0IGNhbiBpbnZhbGlkYXRlIHRoZSB3aG9sZSBjb250cm9sLgotICAgIHZpcnR1YWwgdm9p
ZCBpbmZsYXRlQ29udHJvbFBhaW50UmVjdChDb250cm9sUGFydCwgQ29udHJvbFN0YXRlcywgSW50
UmVjdCYpIHsgfQorICAgIC8vIFRoZSByZWN0IHBhc3NlZCBpbiBpcyBpbiB6b29tZWQgY29vcmRp
bmF0ZXMsIHNvIHRoZSBpbmZsYXRpb24gc2hvdWxkIHRha2UgdGhhdCBpbnRvIGFjY291bnQgYW5k
IG1ha2Ugc3VyZSB0aGUgaW5mbGF0aW9uCisgICAgLy8gYW1vdW50IGlzIGFsc28gc2NhbGVkIGJ5
IHRoZSB6b29tRmFjdG9yLgorICAgIHZpcnR1YWwgdm9pZCBpbmZsYXRlQ29udHJvbFBhaW50UmVj
dChDb250cm9sUGFydCwgQ29udHJvbFN0YXRlcywgSW50UmVjdCYgem9vbWVkUmVjdCwgZmxvYXQg
em9vbUZhY3RvcikgY29uc3QgeyB9CiAgICAgCiAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVk
IG9uY2UsIGZyb20gUmVuZGVyVGhlbWU6OmFkanVzdERlZmF1bHRTdHlsZVNoZWV0KCksIHRvIGxl
dCBlYWNoIHBsYXRmb3JtIGFkanVzdAogICAgIC8vIHRoZSBkZWZhdWx0IENTUyBydWxlcyBpbiBo
dG1sNC5jc3MuCkluZGV4OiBwbGF0Zm9ybS9UaGVtZVR5cGVzLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxh
dGZvcm0vVGhlbWVUeXBlcy5oCShyZXZpc2lvbiAzNzcyNikKKysrIHBsYXRmb3JtL1RoZW1lVHlw
ZXMuaAkod29ya2luZyBjb3B5KQpAQCAtMzcsNiArMzcsNyBAQCBlbnVtIENvbnRyb2xTdGF0ZSB7
CiAgICAgUmVhZE9ubHlTdGF0ZSA9IDEgPDwgNSwKICAgICBEZWZhdWx0U3RhdGUgPSAxIDw8IDYs
CiAgICAgV2luZG93SW5hY3RpdmVTdGF0ZSA9IDEgPDwgNywKKyAgICBJbmRldGVybWluYXRlU3Rh
dGUgPSAxIDw8IDgsCiAgICAgQWxsU3RhdGVzID0gMHhmZmZmZmZmZgogfTsKIApAQCAtNzAsMjYg
KzcxLDUgQEAgZW51bSBUaGVtZUNvbG9yIHsKICAgICBGb2N1c1JpbmdDb2xvcgogfTsKIAotY2xh
c3MgQ29udHJvbEJveCB7Ci1wdWJsaWM6Ci0gICAgQ29udHJvbEJveChpbnQgdCA9IDAsIGludCBy
ID0gMCwgaW50IGIgPSAwLCBpbnQgbCA9IDApCi0gICAgICAgIDogbV90b3AodCkKLSAgICAgICAg
LCBtX3JpZ2h0KHIpCi0gICAgICAgICwgbV9ib3R0b20oYikKLSAgICAgICAgLCBtX2xlZnQobCkK
LSAgICB7IH0KLQotICAgIGludCB0b3AoKSBjb25zdCB7IHJldHVybiBtX3RvcDsgfQotICAgIGlu
dCByaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcmlnaHQ7IH0KLSAgICBpbnQgYm90dG9tKCkgY29u
c3QgeyByZXR1cm4gbV9ib3R0b207IH0KLSAgICBpbnQgbGVmdCgpIGNvbnN0IHsgcmV0dXJuIG1f
bGVmdDsgfQotICAKLXByaXZhdGU6Ci0gICAgaW50IG1fdG9wOwotICAgIGludCBtX3JpZ2h0Owot
ICAgIGludCBtX2JvdHRvbTsKLSAgICBpbnQgbV9sZWZ0OwotfTsKLQogfQogI2VuZGlmCkluZGV4
OiBwbGF0Zm9ybS9tYWMvVGhlbWVNYWMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9tYWMvVGhl
bWVNYWMuaAkocmV2aXNpb24gMzc3MjYpCisrKyBwbGF0Zm9ybS9tYWMvVGhlbWVNYWMuaAkod29y
a2luZyBjb3B5KQpAQCAtMzQsNiArMzQsMTUgQEAgY2xhc3MgVGhlbWVNYWMgOiBwdWJsaWMgVGhl
bWUgewogcHVibGljOgogICAgIFRoZW1lTWFjKCkgeyB9CiAgICAgdmlydHVhbCB+VGhlbWVNYWMo
KSB7IH0KKyAgICAKKyAgICB2aXJ0dWFsIGludCBiYXNlbGluZVBvc2l0aW9uQWRqdXN0bWVudChD
b250cm9sUGFydCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIExlbmd0aFNpemUgY29udHJvbFNpemUo
Q29udHJvbFBhcnQsIGNvbnN0IEZvbnQmLCBjb25zdCBMZW5ndGhTaXplJiwgZmxvYXQgem9vbUZh
Y3RvcikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c0JvcmRlcihDb250
cm9sUGFydCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c1BhZGRpbmco
Q29udHJvbFBhcnQpIGNvbnN0OworICAgIAorICAgIHZpcnR1YWwgdm9pZCBwYWludChDb250cm9s
UGFydCwgQ29udHJvbFN0YXRlcywgR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYsIGZs
b2F0IHpvb21GYWN0b3IsIFNjcm9sbFZpZXcqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5m
bGF0ZUNvbnRyb2xQYWludFJlY3QoQ29udHJvbFBhcnQsIENvbnRyb2xTdGF0ZXMsIEludFJlY3Qm
LCBmbG9hdCB6b29tRmFjdG9yKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IHBsYXRmb3JtL21hYy9UaGVtZU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9t
YWMvVGhlbWVNYWMubW0JKHJldmlzaW9uIDM3NzI2KQorKysgcGxhdGZvcm0vbWFjL1RoZW1lTWFj
Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yMywxNSArMjMsMzY0IEBACiAgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
ICAqLwogCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVGhlbWVNYWMuaCIKKyNpbXBv
cnQgImNvbmZpZy5oIgorI2ltcG9ydCAiVGhlbWVNYWMuaCIKKworI2ltcG9ydCAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW1wb3J0ICJTY3JvbGxWaWV3LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorZW51bSB7CisgICAgdG9wTWFyZ2luLAorICAgIHJp
Z2h0TWFyZ2luLAorICAgIGJvdHRvbU1hcmdpbiwKKyAgICBsZWZ0TWFyZ2luCit9OworCiBUaGVt
ZSogcGxhdGZvcm1UaGVtZSgpCiB7CiAgICAgc3RhdGljIFRoZW1lTWFjIHRoZW1lTWFjOwogICAg
IHJldHVybiAmdGhlbWVNYWM7CiB9CiAKKy8vIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBhIGJ1
bmNoIG9mIGRpZmZlcmVudCBjb250cm9sIHBhcnRzLgorCitzdGF0aWMgTlNDb250cm9sU2l6ZSBj
b250cm9sU2l6ZUZvckZvbnQoY29uc3QgRm9udCYgZm9udCkKK3sKKyAgICBpbnQgZm9udFNpemUg
PSBmb250LnBpeGVsU2l6ZSgpOworICAgIGlmIChmb250U2l6ZSA+PSAxNikKKyAgICAgICAgcmV0
dXJuIE5TUmVndWxhckNvbnRyb2xTaXplOworICAgIGlmIChmb250U2l6ZSA+PSAxMSkKKyAgICAg
ICAgcmV0dXJuIE5TU21hbGxDb250cm9sU2l6ZTsKKyAgICByZXR1cm4gTlNNaW5pQ29udHJvbFNp
emU7Cit9CisKK3N0YXRpYyBMZW5ndGhTaXplIHNpemVGcm9tRm9udChjb25zdCBGb250JiBmb250
LCBjb25zdCBMZW5ndGhTaXplJiB6b29tZWRTaXplLCBmbG9hdCB6b29tRmFjdG9yLCBjb25zdCBJ
bnRTaXplKiBzaXplcykKK3sKKyAgICBJbnRTaXplIGNvbnRyb2xTaXplID0gc2l6ZXNbY29udHJv
bFNpemVGb3JGb250KGZvbnQpXTsKKyAgICBpZiAoem9vbUZhY3RvciAhPSAxLjBmKQorICAgICAg
ICBjb250cm9sU2l6ZSA9IEludFNpemUoY29udHJvbFNpemUud2lkdGgoKSAqIHpvb21GYWN0b3Is
IGNvbnRyb2xTaXplLmhlaWdodCgpICogem9vbUZhY3Rvcik7CisgICAgTGVuZ3RoU2l6ZSByZXN1
bHQgPSB6b29tZWRTaXplOworICAgIGlmICh6b29tZWRTaXplLndpZHRoKCkuaXNJbnRyaW5zaWNP
ckF1dG8oKSAmJiBjb250cm9sU2l6ZS53aWR0aCgpID4gMCkKKyAgICAgICAgcmVzdWx0LnNldFdp
ZHRoKExlbmd0aChjb250cm9sU2l6ZS53aWR0aCgpLCBGaXhlZCkpOworICAgIGlmICh6b29tZWRT
aXplLmhlaWdodCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgY29udHJvbFNpemUuaGVpZ2h0KCkg
PiAwKQorICAgICAgICByZXN1bHQuc2V0SGVpZ2h0KExlbmd0aChjb250cm9sU2l6ZS5oZWlnaHQo
KSwgRml4ZWQpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzZXRDb250
cm9sU2l6ZShOU0NlbGwqIGNlbGwsIGNvbnN0IEludFNpemUqIHNpemVzLCBjb25zdCBJbnRTaXpl
JiBtaW5ab29tZWRTaXplLCBmbG9hdCB6b29tRmFjdG9yKQoreworICAgIE5TQ29udHJvbFNpemUg
c2l6ZTsKKyAgICBpZiAobWluWm9vbWVkU2l6ZS53aWR0aCgpID49IHN0YXRpY19jYXN0PGludD4o
c2l6ZXNbTlNSZWd1bGFyQ29udHJvbFNpemVdLndpZHRoKCkgKiB6b29tRmFjdG9yKSAmJgorICAg
ICAgICBtaW5ab29tZWRTaXplLmhlaWdodCgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZXNbTlNS
ZWd1bGFyQ29udHJvbFNpemVdLmhlaWdodCgpICogem9vbUZhY3RvcikpCisgICAgICAgIHNpemUg
PSBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKKyAgICBlbHNlIGlmIChtaW5ab29tZWRTaXplLndpZHRo
KCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplc1tOU1NtYWxsQ29udHJvbFNpemVdLndpZHRoKCkg
KiB6b29tRmFjdG9yKSAmJgorICAgICAgICAgICAgIG1pblpvb21lZFNpemUuaGVpZ2h0KCkgPj0g
c3RhdGljX2Nhc3Q8aW50PihzaXplc1tOU1NtYWxsQ29udHJvbFNpemVdLmhlaWdodCgpICogem9v
bUZhY3RvcikpCisgICAgICAgIHNpemUgPSBOU1NtYWxsQ29udHJvbFNpemU7CisgICAgZWxzZQor
ICAgICAgICBzaXplID0gTlNNaW5pQ29udHJvbFNpemU7CisgICAgaWYgKHNpemUgIT0gW2NlbGwg
Y29udHJvbFNpemVdKSAvLyBPbmx5IHVwZGF0ZSBpZiB3ZSBoYXZlIHRvLCBzaW5jZSBBcHBLaXQg
ZG9lcyB3b3JrIGV2ZW4gaWYgdGhlIHNpemUgaXMgdGhlIHNhbWUuCisgICAgICAgIFtjZWxsIHNl
dENvbnRyb2xTaXplOnNpemVdOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVTdGF0ZXMoTlNDZWxs
KiBjZWxsLCBDb250cm9sU3RhdGVzIHN0YXRlcykKK3sKKyAgICAvLyBIb3ZlciBzdGF0ZSBpcyBu
b3Qgc3VwcG9ydGVkIGJ5IEFxdWEuCisgICAgCisgICAgLy8gUHJlc3NlZCBzdGF0ZQorICAgIGJv
b2wgb2xkUHJlc3NlZCA9IFtjZWxsIGlzSGlnaGxpZ2h0ZWRdOworICAgIGJvb2wgcHJlc3NlZCA9
IHN0YXRlcyAmIFByZXNzZWRTdGF0ZTsKKyAgICBpZiAocHJlc3NlZCAhPSBvbGRQcmVzc2VkKQor
ICAgICAgICBbY2VsbCBzZXRIaWdobGlnaHRlZDpwcmVzc2VkXTsKKyAgICAKKyAgICAvLyBFbmFi
bGVkIHN0YXRlCisgICAgYm9vbCBvbGRFbmFibGVkID0gW2NlbGwgaXNFbmFibGVkXTsKKyAgICBi
b29sIGVuYWJsZWQgPSBzdGF0ZXMgJiBFbmFibGVkU3RhdGU7CisgICAgaWYgKGVuYWJsZWQgIT0g
b2xkRW5hYmxlZCkKKyAgICAgICAgW2NlbGwgc2V0RW5hYmxlZDplbmFibGVkXTsKKyAgICAKKyAg
ICAvLyBGb2N1c2VkIHN0YXRlCisgICAgYm9vbCBvbGRGb2N1c2VkID0gW2NlbGwgc2hvd3NGaXJz
dFJlc3BvbmRlcl07CisgICAgYm9vbCBmb2N1c2VkID0gc3RhdGVzICYgRm9jdXNTdGF0ZTsKKyAg
ICBpZiAoZm9jdXNlZCAhPSBvbGRGb2N1c2VkKQorICAgICAgICBbY2VsbCBzZXRTaG93c0ZpcnN0
UmVzcG9uZGVyOmZvY3VzZWRdOworCisgICAgLy8gQ2hlY2tlZCBhbmQgSW5kZXRlcm1pbmF0ZQor
ICAgIGJvb2wgb2xkSW5kZXRlcm1pbmF0ZSA9IFtjZWxsIHN0YXRlXSA9PSBOU01peGVkU3RhdGU7
CisgICAgYm9vbCBpbmRldGVybWluYXRlID0gKHN0YXRlcyAmIEluZGV0ZXJtaW5hdGVTdGF0ZSk7
CisgICAgYm9vbCBjaGVja2VkID0gc3RhdGVzICYgQ2hlY2tlZFN0YXRlOworICAgIGJvb2wgb2xk
Q2hlY2tlZCA9IFtjZWxsIHN0YXRlXSA9PSBOU09uU3RhdGU7CisgICAgaWYgKG9sZEluZGV0ZXJt
aW5hdGUgIT0gaW5kZXRlcm1pbmF0ZSB8fCBjaGVja2VkICE9IG9sZENoZWNrZWQpIHsKKyAgICAg
ICAgW2NlbGwgc2V0U3RhdGU6aW5kZXRlcm1pbmF0ZSA/IE5TTWl4ZWRTdGF0ZSA6IChjaGVja2Vk
ID8gTlNPblN0YXRlIDogTlNPZmZTdGF0ZSldOworICAgICAgICByZXR1cm47CisgICAgfQorICAg
ICAgICAKKyAgICAvLyBXaW5kb3cgaW5hY3RpdmUgc3RhdGUgZG9lcyBub3QgbmVlZCB0byBiZSBj
aGVja2VkIGV4cGxpY2l0bHksIHNpbmNlIHdlIHBhaW50IHBhcmVudGVkIHRvIAorICAgIC8vIGEg
dmlldyBpbiBhIHdpbmRvdyB3aG9zZSBrZXkgc3RhdGUgY2FuIGJlIGRldGVjdGVkLgorfQorCitz
dGF0aWMgSW50UmVjdCBpbmZsYXRlUmVjdChjb25zdCBJbnRSZWN0JiB6b29tZWRSZWN0LCBjb25z
dCBJbnRTaXplJiB6b29tZWRTaXplLCBjb25zdCBpbnQqIG1hcmdpbnMsIGZsb2F0IHpvb21GYWN0
b3IpCit7CisgICAgLy8gT25seSBkbyB0aGUgaW5mbGF0aW9uIGlmIHRoZSBhdmFpbGFibGUgd2lk
dGgvaGVpZ2h0IGFyZSB0b28gc21hbGwuICBPdGhlcndpc2UgdHJ5IHRvCisgICAgLy8gZml0IHRo
ZSBnbG93L2NoZWNrIHNwYWNlIGludG8gdGhlIGF2YWlsYWJsZSBib3gncyB3aWR0aC9oZWlnaHQu
CisgICAgaW50IHdpZHRoRGVsdGEgPSB6b29tZWRSZWN0LndpZHRoKCkgLSAoem9vbWVkU2l6ZS53
aWR0aCgpICsgbWFyZ2luc1tsZWZ0TWFyZ2luXSAqIHpvb21GYWN0b3IgKyBtYXJnaW5zW3JpZ2h0
TWFyZ2luXSAqIHpvb21GYWN0b3IpOworICAgIGludCBoZWlnaHREZWx0YSA9IHpvb21lZFJlY3Qu
aGVpZ2h0KCkgLSAoem9vbWVkU2l6ZS5oZWlnaHQoKSArIG1hcmdpbnNbdG9wTWFyZ2luXSAqIHpv
b21GYWN0b3IgKyBtYXJnaW5zW2JvdHRvbU1hcmdpbl0gKiB6b29tRmFjdG9yKTsKKyAgICBJbnRS
ZWN0IHJlc3VsdCh6b29tZWRSZWN0KTsKKyAgICBpZiAod2lkdGhEZWx0YSA8IDApIHsKKyAgICAg
ICAgcmVzdWx0LnNldFgocmVzdWx0LngoKSAtIG1hcmdpbnNbbGVmdE1hcmdpbl0gKiB6b29tRmFj
dG9yKTsKKyAgICAgICAgcmVzdWx0LnNldFdpZHRoKHJlc3VsdC53aWR0aCgpIC0gd2lkdGhEZWx0
YSk7CisgICAgfQorICAgIGlmIChoZWlnaHREZWx0YSA8IDApIHsKKyAgICAgICAgcmVzdWx0LnNl
dFkocmVzdWx0LnkoKSAtIG1hcmdpbnNbdG9wTWFyZ2luXSAqIHpvb21GYWN0b3IpOworICAgICAg
ICByZXN1bHQuc2V0SGVpZ2h0KHJlc3VsdC5oZWlnaHQoKSAtIGhlaWdodERlbHRhKTsKKyAgICB9
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ2hlY2tib3hlcworCitzdGF0aWMgY29uc3Qg
SW50U2l6ZSogY2hlY2tib3hTaXplcygpCit7CisgICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6
ZXNbM10gPSB7IEludFNpemUoMTQsIDE0KSwgSW50U2l6ZSgxMiwgMTIpLCBJbnRTaXplKDEwLCAx
MCkgfTsKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQqIGNoZWNrYm94
TWFyZ2lucyhOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIHN0YXRpYyBjb25zdCBp
bnQgbWFyZ2luc1szXVs0XSA9CisgICAgeworICAgICAgICB7IDMsIDQsIDQsIDIgfSwKKyAgICAg
ICAgeyA0LCAzLCAzLCAzIH0sCisgICAgICAgIHsgNCwgMywgMywgMyB9LAorICAgIH07CisgICAg
cmV0dXJuIG1hcmdpbnNbY29udHJvbFNpemVdOworfQorCitzdGF0aWMgTGVuZ3RoU2l6ZSBjaGVj
a2JveFNpemUoQ29udHJvbFBhcnQgcGFydCwgY29uc3QgRm9udCYgZm9udCwgY29uc3QgTGVuZ3Ro
U2l6ZSYgem9vbWVkU2l6ZSwgZmxvYXQgem9vbUZhY3RvcikKK3sKKyAgICAvLyBJZiB0aGUgd2lk
dGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRv
IGRvLgorICAgIGlmICghem9vbWVkU2l6ZS53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYg
IXpvb21lZFNpemUuaGVpZ2h0KCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAgICAgcmV0dXJu
IHpvb21lZFNpemU7CisKKyAgICAvLyBVc2UgdGhlIGZvbnQgc2l6ZSB0byBkZXRlcm1pbmUgdGhl
IGludHJpbnNpYyB3aWR0aCBvZiB0aGUgY29udHJvbC4KKyAgICByZXR1cm4gc2l6ZUZyb21Gb250
KGZvbnQsIHpvb21lZFNpemUsIHpvb21GYWN0b3IsIGNoZWNrYm94U2l6ZXMoKSk7Cit9CisKK3N0
YXRpYyBOU0J1dHRvbkNlbGwqIGNoZWNrYm94KENvbnRyb2xTdGF0ZXMgc3RhdGVzLCBjb25zdCBJ
bnRSZWN0JiB6b29tZWRSZWN0LCBmbG9hdCB6b29tRmFjdG9yKQoreworICAgIHN0YXRpYyBOU0J1
dHRvbkNlbGwqIGNoZWNrYm94Q2VsbDsKKyAgICBpZiAoIWNoZWNrYm94Q2VsbCkgeworICAgICAg
ICBjaGVja2JveENlbGwgPSBbW05TQnV0dG9uQ2VsbCBhbGxvY10gaW5pdF07CisgICAgICAgIFtj
aGVja2JveENlbGwgc2V0QnV0dG9uVHlwZTpOU1N3aXRjaEJ1dHRvbl07CisgICAgICAgIFtjaGVj
a2JveENlbGwgc2V0VGl0bGU6bmlsXTsKKyAgICAgICAgW2NoZWNrYm94Q2VsbCBzZXRBbGxvd3NN
aXhlZFN0YXRlOllFU107CisgICAgICAgIFtjaGVja2JveENlbGwgc2V0Rm9jdXNSaW5nVHlwZTpO
U0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07CisgICAgfQorICAgIAorICAgIC8vIFNldCB0aGUgY29u
dHJvbCBzaXplIGJhc2VkIG9mZiB0aGUgcmVjdGFuZ2xlIHdlJ3JlIHBhaW50aW5nIGludG8uCisg
ICAgc2V0Q29udHJvbFNpemUoY2hlY2tib3hDZWxsLCBjaGVja2JveFNpemVzKCksIHpvb21lZFJl
Y3Quc2l6ZSgpLCB6b29tRmFjdG9yKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgdmFyaW91cyBzdGF0
ZXMgd2UgcmVzcG9uZCB0by4KKyAgICB1cGRhdGVTdGF0ZXMoY2hlY2tib3hDZWxsLCBzdGF0ZXMp
OworICAgIAorICAgIHJldHVybiBjaGVja2JveENlbGw7Cit9CisKK3N0YXRpYyB2b2lkIHBhaW50
Q2hlY2tib3goQ29udHJvbFN0YXRlcyBzdGF0ZXMsIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgSW50UmVjdCYgem9vbWVkUmVjdCwgZmxvYXQgem9vbUZhY3RvciwgU2Nyb2xsVmlldyog
c2Nyb2xsVmlldykKK3sKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgbmVl
ZGVkIGZvciB0aGUgY29udHJvbCBhbmQgcHJlcGFyZSB0aGUgY2VsbCBmb3IgcGFpbnRpbmcuCisg
ICAgTlNCdXR0b25DZWxsKiBjaGVja2JveENlbGwgPSBjaGVja2JveChzdGF0ZXMsIHpvb21lZFJl
Y3QsIHpvb21GYWN0b3IpOworCisgICAgY29udGV4dC0+c2F2ZSgpOworCisgICAgTlNDb250cm9s
U2l6ZSBjb250cm9sU2l6ZSA9IFtjaGVja2JveENlbGwgY29udHJvbFNpemVdOworICAgIEludFNp
emUgem9vbWVkU2l6ZSA9IGNoZWNrYm94U2l6ZXMoKVtjb250cm9sU2l6ZV07CisgICAgem9vbWVk
U2l6ZS5zZXRXaWR0aCh6b29tZWRTaXplLndpZHRoKCkgKiB6b29tRmFjdG9yKTsKKyAgICB6b29t
ZWRTaXplLnNldEhlaWdodCh6b29tZWRTaXplLmhlaWdodCgpICogem9vbUZhY3Rvcik7CisgICAg
SW50UmVjdCBpbmZsYXRlZFJlY3QgPSBpbmZsYXRlUmVjdCh6b29tZWRSZWN0LCB6b29tZWRTaXpl
LCBjaGVja2JveE1hcmdpbnMoY29udHJvbFNpemUpLCB6b29tRmFjdG9yKTsKKyAgICAKKyAgICBp
ZiAoem9vbUZhY3RvciAhPSAxLjBmKSB7CisgICAgICAgIGluZmxhdGVkUmVjdC5zZXRXaWR0aChp
bmZsYXRlZFJlY3Qud2lkdGgoKSAvIHpvb21GYWN0b3IpOworICAgICAgICBpbmZsYXRlZFJlY3Qu
c2V0SGVpZ2h0KGluZmxhdGVkUmVjdC5oZWlnaHQoKSAvIHpvb21GYWN0b3IpOworICAgICAgICBj
b250ZXh0LT50cmFuc2xhdGUoaW5mbGF0ZWRSZWN0LngoKSwgaW5mbGF0ZWRSZWN0LnkoKSk7Cisg
ICAgICAgIGNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tRmFjdG9yLCB6b29tRmFjdG9yKSk7
CisgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZSgtaW5mbGF0ZWRSZWN0LngoKSwgLWluZmxhdGVk
UmVjdC55KCkpOworICAgIH0KKyAgICAKKyAgICBbY2hlY2tib3hDZWxsIGRyYXdXaXRoRnJhbWU6
TlNSZWN0KGluZmxhdGVkUmVjdCkgaW5WaWV3OnNjcm9sbFZpZXctPmRvY3VtZW50VmlldygpXTsK
KyAgICBbY2hlY2tib3hDZWxsIHNldENvbnRyb2xWaWV3Om5pbF07CisKKyAgICBjb250ZXh0LT5y
ZXN0b3JlKCk7Cit9CisKKy8vIFJhZGlvIEJ1dHRvbnMKKworc3RhdGljIGNvbnN0IEludFNpemUq
IHJhZGlvU2l6ZXMoKQoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJ
bnRTaXplKDE0LCAxNSksIEludFNpemUoMTIsIDEzKSwgSW50U2l6ZSgxMCwgMTApIH07CisgICAg
cmV0dXJuIHNpemVzOworfQorCitzdGF0aWMgY29uc3QgaW50KiByYWRpb01hcmdpbnMoTlNDb250
cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IG1hcmdpbnNbM11b
NF0gPQorICAgIHsKKyAgICAgICAgeyAyLCAyLCA0LCAyIH0sCisgICAgICAgIHsgMywgMiwgMywg
MiB9LAorICAgICAgICB7IDEsIDAsIDIsIDAgfSwKKyAgICB9OworICAgIHJldHVybiBtYXJnaW5z
W2NvbnRyb2xTaXplXTsKK30KKworc3RhdGljIExlbmd0aFNpemUgcmFkaW9TaXplKENvbnRyb2xQ
YXJ0IHBhcnQsIGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IExlbmd0aFNpemUmIHpvb21lZFNpemUs
IGZsb2F0IHpvb21GYWN0b3IpCit7CisgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJl
IGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KKyAgICBpZiAoIXpv
b21lZFNpemUud2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICF6b29tZWRTaXplLmhlaWdo
dCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAgIHJldHVybiB6b29tZWRTaXplOworCisg
ICAgLy8gVXNlIHRoZSBmb250IHNpemUgdG8gZGV0ZXJtaW5lIHRoZSBpbnRyaW5zaWMgd2lkdGgg
b2YgdGhlIGNvbnRyb2wuCisgICAgcmV0dXJuIHNpemVGcm9tRm9udChmb250LCB6b29tZWRTaXpl
LCB6b29tRmFjdG9yLCByYWRpb1NpemVzKCkpOworfQorCitzdGF0aWMgTlNCdXR0b25DZWxsKiBy
YWRpbyhDb250cm9sU3RhdGVzIHN0YXRlcywgY29uc3QgSW50UmVjdCYgem9vbWVkUmVjdCwgZmxv
YXQgem9vbUZhY3RvcikKK3sKKyAgICBzdGF0aWMgTlNCdXR0b25DZWxsKiByYWRpb0NlbGw7Cisg
ICAgaWYgKCFyYWRpb0NlbGwpIHsKKyAgICAgICAgcmFkaW9DZWxsID0gW1tOU0J1dHRvbkNlbGwg
YWxsb2NdIGluaXRdOworICAgICAgICBbcmFkaW9DZWxsIHNldEJ1dHRvblR5cGU6TlNSYWRpb0J1
dHRvbl07CisgICAgICAgIFtyYWRpb0NlbGwgc2V0VGl0bGU6bmlsXTsKKyAgICAgICAgW3JhZGlv
Q2VsbCBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlwZUV4dGVyaW9yXTsKKyAgICB9Cisg
ICAgCisgICAgLy8gU2V0IHRoZSBjb250cm9sIHNpemUgYmFzZWQgb2ZmIHRoZSByZWN0YW5nbGUg
d2UncmUgcGFpbnRpbmcgaW50by4KKyAgICBzZXRDb250cm9sU2l6ZShyYWRpb0NlbGwsIHJhZGlv
U2l6ZXMoKSwgem9vbWVkUmVjdC5zaXplKCksIHpvb21GYWN0b3IpOworCisgICAgLy8gVXBkYXRl
IHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgorICAgIHVwZGF0ZVN0YXRlcyhyYWRp
b0NlbGwsIHN0YXRlcyk7CisgICAgCisgICAgcmV0dXJuIHJhZGlvQ2VsbDsKK30KKworc3RhdGlj
IHZvaWQgcGFpbnRSYWRpbyhDb250cm9sU3RhdGVzIHN0YXRlcywgR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0LCBjb25zdCBJbnRSZWN0JiB6b29tZWRSZWN0LCBmbG9hdCB6b29tRmFjdG9yLCBTY3Jv
bGxWaWV3KiBzY3JvbGxWaWV3KQoreworICAgIC8vIERldGVybWluZSB0aGUgd2lkdGggYW5kIGhl
aWdodCBuZWVkZWQgZm9yIHRoZSBjb250cm9sIGFuZCBwcmVwYXJlIHRoZSBjZWxsIGZvciBwYWlu
dGluZy4KKyAgICBOU0J1dHRvbkNlbGwqIHJhZGlvQ2VsbCA9IHJhZGlvKHN0YXRlcywgem9vbWVk
UmVjdCwgem9vbUZhY3Rvcik7CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisKKyAgICBOU0NvbnRy
b2xTaXplIGNvbnRyb2xTaXplID0gW3JhZGlvQ2VsbCBjb250cm9sU2l6ZV07CisgICAgSW50U2l6
ZSB6b29tZWRTaXplID0gcmFkaW9TaXplcygpW2NvbnRyb2xTaXplXTsKKyAgICB6b29tZWRTaXpl
LnNldFdpZHRoKHpvb21lZFNpemUud2lkdGgoKSAqIHpvb21GYWN0b3IpOworICAgIHpvb21lZFNp
emUuc2V0SGVpZ2h0KHpvb21lZFNpemUuaGVpZ2h0KCkgKiB6b29tRmFjdG9yKTsKKyAgICBJbnRS
ZWN0IGluZmxhdGVkUmVjdCA9IGluZmxhdGVSZWN0KHpvb21lZFJlY3QsIHpvb21lZFNpemUsIHJh
ZGlvTWFyZ2lucyhjb250cm9sU2l6ZSksIHpvb21GYWN0b3IpOworICAgIAorICAgIGlmICh6b29t
RmFjdG9yICE9IDEuMGYpIHsKKyAgICAgICAgaW5mbGF0ZWRSZWN0LnNldFdpZHRoKGluZmxhdGVk
UmVjdC53aWR0aCgpIC8gem9vbUZhY3Rvcik7CisgICAgICAgIGluZmxhdGVkUmVjdC5zZXRIZWln
aHQoaW5mbGF0ZWRSZWN0LmhlaWdodCgpIC8gem9vbUZhY3Rvcik7CisgICAgICAgIGNvbnRleHQt
PnRyYW5zbGF0ZShpbmZsYXRlZFJlY3QueCgpLCBpbmZsYXRlZFJlY3QueSgpKTsKKyAgICAgICAg
Y29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21GYWN0b3IsIHpvb21GYWN0b3IpKTsKKyAgICAg
ICAgY29udGV4dC0+dHJhbnNsYXRlKC1pbmZsYXRlZFJlY3QueCgpLCAtaW5mbGF0ZWRSZWN0Lnko
KSk7CisgICAgfQorICAgIAorICAgIFtyYWRpb0NlbGwgZHJhd1dpdGhGcmFtZTpOU1JlY3QoaW5m
bGF0ZWRSZWN0KSBpblZpZXc6c2Nyb2xsVmlldy0+ZG9jdW1lbnRWaWV3KCldOworICAgIFtyYWRp
b0NlbGwgc2V0Q29udHJvbFZpZXc6bmlsXTsKKworICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKK30K
KworLy8gVGhlbWUgb3ZlcnJpZGVzCisKK2ludCBUaGVtZU1hYzo6YmFzZWxpbmVQb3NpdGlvbkFk
anVzdG1lbnQoQ29udHJvbFBhcnQgcGFydCkgY29uc3QKK3sKKyAgICBpZiAocGFydCA9PSBDaGVj
a2JveFBhcnQgfHwgcGFydCA9PSBSYWRpb1BhcnQpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBy
ZXR1cm4gVGhlbWU6OmJhc2VsaW5lUG9zaXRpb25BZGp1c3RtZW50KHBhcnQpOworfQorCitMZW5n
dGhTaXplIFRoZW1lTWFjOjpjb250cm9sU2l6ZShDb250cm9sUGFydCBwYXJ0LCBjb25zdCBGb250
JiBmb250LCBjb25zdCBMZW5ndGhTaXplJiB6b29tZWRTaXplLCBmbG9hdCB6b29tRmFjdG9yKSBj
b25zdAoreworICAgIHN3aXRjaCAocGFydCkgeworICAgICAgICBjYXNlIENoZWNrYm94UGFydDoK
KyAgICAgICAgICAgIHJldHVybiBjaGVja2JveFNpemUocGFydCwgZm9udCwgem9vbWVkU2l6ZSwg
em9vbUZhY3Rvcik7CisgICAgICAgIGNhc2UgUmFkaW9QYXJ0OgorICAgICAgICAgICAgcmV0dXJu
IHJhZGlvU2l6ZShwYXJ0LCBmb250LCB6b29tZWRTaXplLCB6b29tRmFjdG9yKTsKKyAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB6b29tZWRTaXplOworICAgIH0KK30KKworYm9v
bCBUaGVtZU1hYzo6Y29udHJvbFN1cHBvcnRzQm9yZGVyKENvbnRyb2xQYXJ0IHBhcnQpIGNvbnN0
Cit7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6Cisg
ICAgICAgIGNhc2UgTWVudWxpc3RQYXJ0OgorICAgICAgICBjYXNlIFNlYXJjaEZpZWxkUGFydDoK
KyAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6CisgICAgICAgIGNhc2UgUmFkaW9QYXJ0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorfQorCitib29sIFRoZW1lTWFjOjpjb250cm9sU3VwcG9ydHNQYWRk
aW5nKENvbnRyb2xQYXJ0IHBhcnQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAg
ICAgIGNhc2UgTWVudWxpc3RQYXJ0OgorICAgICAgICBjYXNlIE1lbnVsaXN0QnV0dG9uUGFydDoK
KyAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6CisgICAgICAgIGNhc2UgUmFkaW9QYXJ0OgorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorfQorCit2b2lkIFRoZW1lTWFjOjppbmZsYXRlQ29udHJvbFBhaW50
UmVjdChDb250cm9sUGFydCBwYXJ0LCBDb250cm9sU3RhdGVzIHN0YXRlcywgSW50UmVjdCYgem9v
bWVkUmVjdCwgZmxvYXQgem9vbUZhY3RvcikgY29uc3QKK3sKKyAgICBzd2l0Y2ggKHBhcnQpIHsK
KyAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6IHsKKyAgICAgICAgICAgIC8vIFdlIGluZmxhdGUg
dGhlIHJlY3QgYXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIHBhZGRpbmcgaW5jbHVkZWQgaW4gdGhl
IGNlbGwgdG8gYWNjb21tb2RhdGUgdGhlIGNoZWNrYm94CisgICAgICAgICAgICAvLyBzaGFkb3ci
IGFuZCB0aGUgY2hlY2suICBXZSBkb24ndCBjb25zaWRlciB0aGlzIHBhcnQgb2YgdGhlIGJvdW5k
cyBvZiB0aGUgY29udHJvbCBpbiBXZWJLaXQuCisgICAgICAgICAgICBOU0NlbGwqIGNlbGwgPSBj
aGVja2JveChzdGF0ZXMsIHpvb21lZFJlY3QsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgTlND
b250cm9sU2l6ZSBjb250cm9sU2l6ZSA9IFtjZWxsIGNvbnRyb2xTaXplXTsKKyAgICAgICAgICAg
IEludFNpemUgem9vbWVkU2l6ZSA9IGNoZWNrYm94U2l6ZXMoKVtjb250cm9sU2l6ZV07CisgICAg
ICAgICAgICB6b29tZWRTaXplLnNldEhlaWdodCh6b29tZWRTaXplLmhlaWdodCgpICogem9vbUZh
Y3Rvcik7CisgICAgICAgICAgICB6b29tZWRTaXplLnNldFdpZHRoKHpvb21lZFNpemUud2lkdGgo
KSAqIHpvb21GYWN0b3IpOworICAgICAgICAgICAgem9vbWVkUmVjdCA9IGluZmxhdGVSZWN0KHpv
b21lZFJlY3QsIHpvb21lZFNpemUsIGNoZWNrYm94TWFyZ2lucyhjb250cm9sU2l6ZSksIHpvb21G
YWN0b3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBSYWRp
b1BhcnQ6IHsKKyAgICAgICAgICAgIC8vIFdlIGluZmxhdGUgdGhlIHJlY3QgYXMgbmVlZGVkIHRv
IGFjY291bnQgZm9yIHBhZGRpbmcgaW5jbHVkZWQgaW4gdGhlIGNlbGwgdG8gYWNjb21tb2RhdGUg
dGhlIHJhZGlvIGJ1dHRvbgorICAgICAgICAgICAgLy8gc2hhZG93Ii4gIFdlIGRvbid0IGNvbnNp
ZGVyIHRoaXMgcGFydCBvZiB0aGUgYm91bmRzIG9mIHRoZSBjb250cm9sIGluIFdlYktpdC4KKyAg
ICAgICAgICAgIE5TQ2VsbCogY2VsbCA9IHJhZGlvKHN0YXRlcywgem9vbWVkUmVjdCwgem9vbUZh
Y3Rvcik7CisgICAgICAgICAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplID0gW2NlbGwgY29u
dHJvbFNpemVdOworICAgICAgICAgICAgSW50U2l6ZSB6b29tZWRTaXplID0gcmFkaW9TaXplcygp
W2NvbnRyb2xTaXplXTsKKyAgICAgICAgICAgIHpvb21lZFNpemUuc2V0SGVpZ2h0KHpvb21lZFNp
emUuaGVpZ2h0KCkgKiB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIHpvb21lZFNpemUuc2V0V2lk
dGgoem9vbWVkU2l6ZS53aWR0aCgpICogem9vbUZhY3Rvcik7CisgICAgICAgICAgICB6b29tZWRS
ZWN0ID0gaW5mbGF0ZVJlY3Qoem9vbWVkUmVjdCwgem9vbWVkU2l6ZSwgcmFkaW9NYXJnaW5zKGNv
bnRyb2xTaXplKSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFRo
ZW1lTWFjOjpwYWludChDb250cm9sUGFydCBwYXJ0LCBDb250cm9sU3RhdGVzIHN0YXRlcywgR3Jh
cGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiB6b29tZWRSZWN0LCBmbG9hdCB6
b29tRmFjdG9yLCBTY3JvbGxWaWV3KiBzY3JvbGxWaWV3KSBjb25zdAoreworICAgIHN3aXRjaCAo
cGFydCkgeworICAgICAgICBjYXNlIENoZWNrYm94UGFydDoKKyAgICAgICAgICAgIHBhaW50Q2hl
Y2tib3goc3RhdGVzLCBjb250ZXh0LCB6b29tZWRSZWN0LCB6b29tRmFjdG9yLCBzY3JvbGxWaWV3
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJhZGlvUGFydDoKKyAgICAgICAg
ICAgIHBhaW50UmFkaW8oc3RhdGVzLCBjb250ZXh0LCB6b29tZWRSZWN0LCB6b29tRmFjdG9yLCBz
Y3JvbGxWaWV3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgYnJlYWs7CisgICAgfQorfQorCiB9CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyQm94LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNpb24gMzc3MjYp
CisrKyByZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTI1LDggKzUy
NSw4IEBAIEludFNpemUgUmVuZGVyQm94OjpjYWxjdWxhdGVCYWNrZ3JvdW5kU2kKICAgICBpZiAo
YmdMYXllci0+aXNTaXplU2V0KCkpIHsKICAgICAgICAgaW50IHcgPSBzY2FsZWRXaWR0aDsKICAg
ICAgICAgaW50IGggPSBzY2FsZWRIZWlnaHQ7Ci0gICAgICAgIExlbmd0aCBiZ1dpZHRoID0gYmdM
YXllci0+c2l6ZSgpLndpZHRoOwotICAgICAgICBMZW5ndGggYmdIZWlnaHQgPSBiZ0xheWVyLT5z
aXplKCkuaGVpZ2h0OworICAgICAgICBMZW5ndGggYmdXaWR0aCA9IGJnTGF5ZXItPnNpemUoKS53
aWR0aCgpOworICAgICAgICBMZW5ndGggYmdIZWlnaHQgPSBiZ0xheWVyLT5zaXplKCkuaGVpZ2h0
KCk7CiAKICAgICAgICAgaWYgKGJnV2lkdGguaXNGaXhlZCgpKQogICAgICAgICAgICAgdyA9IGJn
V2lkdGgudmFsdWUoKTsKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiAzNzcyNikKKysrIHJl
bmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04NTcsNyArODU3LDcg
QEAgc3RhdGljIGJvb2wgbXVzdFJlcGFpbnRGaWxsTGF5ZXJzKGNvbnN0IAogICAgIC8vIFRoZXNl
IGFyZSBhbHdheXMgcGVyY2VudHMgb3IgYXV0by4KICAgICBpZiAoc2hvdWxkUGFpbnRCYWNrZ3Jv
dW5kSW1hZ2UgJiYKICAgICAgICAgKCFsYXllci0+eFBvc2l0aW9uKCkuaXNaZXJvKCkgfHwgIWxh
eWVyLT55UG9zaXRpb24oKS5pc1plcm8oKSB8fAotICAgICAgICAgbGF5ZXItPnNpemUoKS53aWR0
aC5pc1BlcmNlbnQoKSB8fCBsYXllci0+c2l6ZSgpLmhlaWdodC5pc1BlcmNlbnQoKSkpCisgICAg
ICAgICBsYXllci0+c2l6ZSgpLndpZHRoKCkuaXNQZXJjZW50KCkgfHwgbGF5ZXItPnNpemUoKS5o
ZWlnaHQoKS5pc1BlcmNlbnQoKSkpCiAgICAgICAgIC8vIFRoZSBpbWFnZSB3aWxsIHNoaWZ0IHVu
cHJlZGljdGFibHkgaWYgdGhlIHNpemUgY2hhbmdlcy4KICAgICAgICAgcmV0dXJuIHRydWU7CiAK
SW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUaGVtZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5n
L1JlbmRlclRoZW1lLmNwcAkocmV2aXNpb24gMzc3MjYpCisrKyByZW5kZXJpbmcvUmVuZGVyVGhl
bWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiSFRNTE5h
bWVzLmgiCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCisjaW5j
bHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKICNp
bmNsdWRlICJTZXR0aW5ncy5oIgogCkBAIC01MSw2ICs1Miw3IEBAIHZvaWQgUmVuZGVyVGhlbWU6
OmFkanVzdFN0eWxlKENTU1N0eWxlU2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgVUFIYXNBcHBlYXJhbmNlLCBjb25zdCBCb3JkZXJEYXRhJiBib3JkZXIsIGNvbnN0IEZpbGxM
YXllciYgYmFja2dyb3VuZCwgY29uc3QgQ29sb3ImIGJhY2tncm91bmRDb2xvcikKIHsKICAgICAv
LyBGb3JjZSBpbmxpbmUgYW5kIHRhYmxlIGRpc3BsYXkgc3R5bGVzIHRvIGJlIGlubGluZS1ibG9j
ayAoZXhjZXB0IGZvciB0YWJsZS0gd2hpY2ggaXMgYmxvY2spCisgICAgQ29udHJvbFBhcnQgcGFy
dCA9IHN0eWxlLT5hcHBlYXJhbmNlKCk7CiAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5M
SU5FIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxFIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gVEFCTEVfUk9XX0dST1VQIHx8CiAgICAgICAgIHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFC
TEVfSEVBREVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQ
IHx8CiAgICAgICAgIHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XIHx8IHN0eWxlLT5kaXNw
bGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVf
Q09MVU1OIHx8CkBAIC02MCwxOCArNjIsNDMgQEAgdm9pZCBSZW5kZXJUaGVtZTo6YWRqdXN0U3R5
bGUoQ1NTU3R5bGVTZQogICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7CiAKICAgICBp
ZiAoVUFIYXNBcHBlYXJhbmNlICYmIHRoZW1lKCktPmlzQ29udHJvbFN0eWxlZChzdHlsZSwgYm9y
ZGVyLCBiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kQ29sb3IpKSB7Ci0gICAgICAgIGlmIChzdHlsZS0+
YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKKyAgICAgICAgaWYgKHBhcnQgPT0gTWVudWxp
c3RQYXJ0KQogICAgICAgICAgICAgc3R5bGUtPnNldEFwcGVhcmFuY2UoTWVudWxpc3RCdXR0b25Q
YXJ0KTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgc3R5bGUtPnNldEFwcGVhcmFuY2UoTm9D
b250cm9sUGFydCk7CiAgICAgfQogCisgICAgaWYgKCFzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICAvLyBOZXZlciBzdXBwb3J0IGJveC1zaGFkb3cgb24gbmF0
aXZlIGNvbnRyb2xzLgorICAgIHN0eWxlLT5zZXRCb3hTaGFkb3coMCk7CisgICAgCisjaWYgVVNF
KE5FV19USEVNRSkKKyAgICBpZiAocGFydCA9PSBDaGVja2JveFBhcnQgfHwgcGFydCA9PSBSYWRp
b1BhcnQpIHsKKyAgICAgICAgaWYgKCFtX3RoZW1lLT5jb250cm9sU3VwcG9ydHNCb3JkZXIocGFy
dCkpCisgICAgICAgICAgICBzdHlsZS0+cmVzZXRCb3JkZXIoKTsKKyAgICAgICAgaWYgKCFtX3Ro
ZW1lLT5jb250cm9sU3VwcG9ydHNQYWRkaW5nKHBhcnQpKQorICAgICAgICAgICAgc3R5bGUtPnJl
c2V0UGFkZGluZygpOworICAgICAgICAgICAgCisgICAgICAgIC8vIFRoZSB3aWR0aCBhbmQgaGVp
Z2h0IGhlcmUgYXJlIGFmZmVjdGVkIGJ5IHRoZSB6b29tLgorICAgICAgICAvLyBGSVhNRTogQ2hl
Y2sgaXMgZmxhd2VkLCBzaW5jZSBpdCBkb2Vzbid0IHRha2UgbWluLXdpZHRoL21heC13aWR0aCBp
bnRvIGFjY291bnQuCisgICAgICAgIExlbmd0aFNpemUgY29udHJvbFNpemUgPSBtX3RoZW1lLT5j
b250cm9sU2l6ZShwYXJ0LCBzdHlsZS0+Zm9udCgpLCBMZW5ndGhTaXplKHN0eWxlLT53aWR0aCgp
LCBzdHlsZS0+aGVpZ2h0KCkpLCBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICAgICAgaWYg
KGNvbnRyb2xTaXplLndpZHRoKCkgIT0gc3R5bGUtPndpZHRoKCkpCisgICAgICAgICAgICBzdHls
ZS0+c2V0V2lkdGgoY29udHJvbFNpemUud2lkdGgoKSk7CisgICAgICAgIGlmIChjb250cm9sU2l6
ZS5oZWlnaHQoKSAhPSBzdHlsZS0+aGVpZ2h0KCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0SGVp
Z2h0KGNvbnRyb2xTaXplLmhlaWdodCgpKTsKKyAgICB9CisjZW5kaWYKKwogICAgIC8vIENhbGwg
dGhlIGFwcHJvcHJpYXRlIHN0eWxlIGFkanVzdG1lbnQgbWV0aG9kIGJhc2VkIG9mZiB0aGUgYXBw
ZWFyYW5jZSB2YWx1ZS4KICAgICBzd2l0Y2ggKHN0eWxlLT5hcHBlYXJhbmNlKCkpIHsKKyNpZiBV
U0UoTkVXX1RIRU1FKQogICAgICAgICBjYXNlIENoZWNrYm94UGFydDoKICAgICAgICAgICAgIHJl
dHVybiBhZGp1c3RDaGVja2JveFN0eWxlKHNlbGVjdG9yLCBzdHlsZSwgZSk7CiAgICAgICAgIGNh
c2UgUmFkaW9QYXJ0OgogICAgICAgICAgICAgcmV0dXJuIGFkanVzdFJhZGlvU3R5bGUoc2VsZWN0
b3IsIHN0eWxlLCBlKTsKKyNlbmRpZgogICAgICAgICBjYXNlIFB1c2hCdXR0b25QYXJ0OgogICAg
ICAgICBjYXNlIFNxdWFyZUJ1dHRvblBhcnQ6CiAgICAgICAgIGNhc2UgRGVmYXVsdEJ1dHRvblBh
cnQ6CkBAIC0xMjYsMTIgKzE1MywyMyBAQCBib29sIFJlbmRlclRoZW1lOjpwYWludChSZW5kZXJP
YmplY3QqIG8sCiAgICAgaWYgKHBhaW50SW5mby5jb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKIAorICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBvLT5zdHls
ZSgpLT5hcHBlYXJhbmNlKCk7CisKKyNpZiBVU0UoTkVXX1RIRU1FKQorICAgIGlmIChwYXJ0ID09
IENoZWNrYm94UGFydCB8fCBwYXJ0ID09IFJhZGlvUGFydCkgeworICAgICAgICBtX3RoZW1lLT5w
YWludChwYXJ0LCBjb250cm9sU3RhdGVzRm9yUmVuZGVyZXIobyksIGNvbnN0X2Nhc3Q8R3JhcGhp
Y3NDb250ZXh0Kj4ocGFpbnRJbmZvLmNvbnRleHQpLCByLCBvLT5zdHlsZSgpLT5lZmZlY3RpdmVa
b29tKCksIG8tPnZpZXcoKS0+ZnJhbWVWaWV3KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorI2VuZGlmCisKICAgICAvLyBDYWxsIHRoZSBhcHByb3ByaWF0ZSBwYWludCBtZXRob2Qg
YmFzZWQgb2ZmIHRoZSBhcHBlYXJhbmNlIHZhbHVlLgotICAgIHN3aXRjaCAoby0+c3R5bGUoKS0+
YXBwZWFyYW5jZSgpKSB7CisgICAgc3dpdGNoIChwYXJ0KSB7CisjaWYgIVVTRShORVdfVEhFTUUp
CiAgICAgICAgIGNhc2UgQ2hlY2tib3hQYXJ0OgogICAgICAgICAgICAgcmV0dXJuIHBhaW50Q2hl
Y2tib3gobywgcGFpbnRJbmZvLCByKTsKICAgICAgICAgY2FzZSBSYWRpb1BhcnQ6CiAgICAgICAg
ICAgICByZXR1cm4gcGFpbnRSYWRpbyhvLCBwYWludEluZm8sIHIpOworI2VuZGlmCiAgICAgICAg
IGNhc2UgUHVzaEJ1dHRvblBhcnQ6CiAgICAgICAgIGNhc2UgU3F1YXJlQnV0dG9uUGFydDoKICAg
ICAgICAgY2FzZSBEZWZhdWx0QnV0dG9uUGFydDoKQEAgLTMxOCw3ICszNTYsMTEgQEAgQ29sb3Ig
UmVuZGVyVGhlbWU6OmluYWN0aXZlTGlzdEJveFNlbGVjdAogCiBpbnQgUmVuZGVyVGhlbWU6OmJh
c2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0KiBvKSBjb25zdAogeworI2lmIFVTRShO
RVdfVEhFTUUpCisgICAgcmV0dXJuIG8tPmhlaWdodCgpICsgby0+bWFyZ2luVG9wKCkgKyBtX3Ro
ZW1lLT5iYXNlbGluZVBvc2l0aW9uQWRqdXN0bWVudChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkp
ICogby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOworI2Vsc2UKICAgICByZXR1cm4gby0+aGVp
Z2h0KCkgKyBvLT5tYXJnaW5Ub3AoKTsKKyNlbmRpZgogfQogCiBib29sIFJlbmRlclRoZW1lOjpp
c0NvbnRyb2xDb250YWluZXIoQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkgY29uc3QKQEAgLTM1MSw2
ICszOTMsMTMgQEAgYm9vbCBSZW5kZXJUaGVtZTo6aXNDb250cm9sU3R5bGVkKGNvbnN0IAogICAg
IH0KIH0KIAordm9pZCBSZW5kZXJUaGVtZTo6YWRqdXN0UmVwYWludFJlY3QoY29uc3QgUmVuZGVy
T2JqZWN0KiBvLCBJbnRSZWN0JiByKQoreworI2lmIFVTRShORVdfVEhFTUUpCisgICAgbV90aGVt
ZS0+aW5mbGF0ZUNvbnRyb2xQYWludFJlY3Qoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpLCBjb250
cm9sU3RhdGVzRm9yUmVuZGVyZXIobyksIHIsIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7
CisjZW5kaWYKK30KKwogYm9vbCBSZW5kZXJUaGVtZTo6c3VwcG9ydHNGb2N1c1JpbmcoY29uc3Qg
UmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAogewogICAgIHJldHVybiAoc3R5bGUtPmhhc0FwcGVh
cmFuY2UoKSAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IFRleHRGaWVsZFBhcnQgJiYgc3R5bGUt
PmFwcGVhcmFuY2UoKSAhPSBUZXh0QXJlYVBhcnQgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBN
ZW51bGlzdEJ1dHRvblBhcnQgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBMaXN0Ym94UGFydCk7
CkBAIC0zNzEsOCArNDIwLDMwIEBAIGJvb2wgUmVuZGVyVGhlbWU6OnN0YXRlQ2hhbmdlZChSZW5k
ZXJPYmoKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5pY2Ug
dG8gc2V0IHRoaXMgc3RhdGUgb24gdGhlIFJlbmRlck9iamVjdHMgaW5zdGVhZCBvZgotLy8gaGF2
aW5nIHRvIGRpZyB1cCB0byB0aGUgRm9jdXNDb250cm9sbGVyIGF0IHBhaW50IHRpbWUuCitDb250
cm9sU3RhdGVzIFJlbmRlclRoZW1lOjpjb250cm9sU3RhdGVzRm9yUmVuZGVyZXIoY29uc3QgUmVu
ZGVyT2JqZWN0KiBvKSBjb25zdAoreworICAgIENvbnRyb2xTdGF0ZXMgcmVzdWx0ID0gMDsKKyAg
ICBpZiAoaXNIb3ZlcmVkKG8pKQorICAgICAgICByZXN1bHQgfD0gSG92ZXJTdGF0ZTsKKyAgICBp
ZiAoaXNQcmVzc2VkKG8pKQorICAgICAgICByZXN1bHQgfD0gUHJlc3NlZFN0YXRlOworICAgIGlm
IChpc0ZvY3VzZWQobykgJiYgby0+c3R5bGUoKS0+b3V0bGluZVN0eWxlSXNBdXRvKCkpCisgICAg
ICAgIHJlc3VsdCB8PSBGb2N1c1N0YXRlOworICAgIGlmIChpc0VuYWJsZWQobykpCisgICAgICAg
IHJlc3VsdCB8PSBFbmFibGVkU3RhdGU7CisgICAgaWYgKGlzQ2hlY2tlZChvKSkKKyAgICAgICAg
cmVzdWx0IHw9IENoZWNrZWRTdGF0ZTsKKyAgICBpZiAoaXNSZWFkT25seUNvbnRyb2wobykpCisg
ICAgICAgIHJlc3VsdCB8PSBSZWFkT25seVN0YXRlOworICAgIGlmIChpc0RlZmF1bHQobykpCisg
ICAgICAgIHJlc3VsdCB8PSBEZWZhdWx0U3RhdGU7CisgICAgaWYgKCFpc0FjdGl2ZShvKSkKKyAg
ICAgICAgcmVzdWx0IHw9IFdpbmRvd0luYWN0aXZlU3RhdGU7CisgICAgaWYgKGlzSW5kZXRlcm1p
bmF0ZShvKSkKKyAgICAgICAgcmVzdWx0IHw9IEluZGV0ZXJtaW5hdGVTdGF0ZTsKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCiBib29sIFJlbmRlclRoZW1lOjppc0FjdGl2ZShjb25zdCBSZW5kZXJP
YmplY3QqIG8pIGNvbnN0CiB7CiAgICAgTm9kZSogbm9kZSA9IG8tPmVsZW1lbnQoKTsKQEAgLTQx
OCw3ICs0ODksNyBAQCBib29sIFJlbmRlclRoZW1lOjppc0ZvY3VzZWQoY29uc3QgUmVuZGVyCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBub2RlLT5kb2N1
bWVudCgpOwogICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOwotICAgIHJldHVy
biBub2RlID09IGRvY3VtZW50LT5mb2N1c2VkTm9kZSgpICYmIGZyYW1lICYmIGZyYW1lLT5zZWxl
Y3Rpb24oKS0+aXNGb2N1c2VkQW5kQWN0aXZlKCk7CisgICAgcmV0dXJuIG5vZGUgPT0gZG9jdW1l
bnQtPmZvY3VzZWROb2RlKCkgJiYgZnJhbWUgJiYgZnJhbWUtPnNlbGVjdGlvbigpLT5pc0ZvY3Vz
ZWRBbmRBY3RpdmUoKSAmJiBvLT5zdHlsZSgpLT5vdXRsaW5lU3R5bGVJc0F1dG8oKTsKIH0KIAog
Ym9vbCBSZW5kZXJUaGVtZTo6aXNQcmVzc2VkKGNvbnN0IFJlbmRlck9iamVjdCogbykgY29uc3QK
SW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUaGVtZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9S
ZW5kZXJUaGVtZS5oCShyZXZpc2lvbiAzNzcyNikKKysrIHJlbmRlcmluZy9SZW5kZXJUaGVtZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC04NCw3ICs4NCw3IEBAIHB1YmxpYzoKIAogICAgIC8vIFNvbWUg
Y29udHJvbHMgbWF5IHNwaWxsIG91dCBvZiB0aGVpciBjb250YWluZXJzIChlLmcuLCB0aGUgY2hl
Y2sgb24gYW4gT1MgWCBjaGVja2JveCkuICBXaGVuIHRoZXNlIGNvbnRyb2xzIHJlcGFpbnQsCiAg
ICAgLy8gdGhlIHRoZW1lIG5lZWRzIHRvIGNvbW11bmljYXRlIHRoaXMgaW5mbGF0ZWQgcmVjdCB0
byB0aGUgZW5naW5lIHNvIHRoYXQgaXQgY2FuIGludmFsaWRhdGUgdGhlIHdob2xlIGNvbnRyb2wu
Ci0gICAgdmlydHVhbCB2b2lkIGFkanVzdFJlcGFpbnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCos
IEludFJlY3QmKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0UmVwYWludFJlY3QoY29uc3Qg
UmVuZGVyT2JqZWN0KiwgSW50UmVjdCYpOwogCiAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVk
IHdoZW5ldmVyIGEgcmVsZXZhbnQgc3RhdGUgY2hhbmdlcyBvbiBhIHBhcnRpY3VsYXIgdGhlbWVk
IG9iamVjdCwgZS5nLiwgdGhlIG1vdXNlIGJlY29tZXMgcHJlc3NlZAogICAgIC8vIG9yIGEgY29u
dHJvbCBiZWNvbWVzIGRpc2FibGVkLgpAQCAtMTMwLDE3ICsxMzAsNiBAQCBwdWJsaWM6CiAKICAg
ICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlck9iamVjdCopIGNvbnN0
OwogCi0gICAgLy8gTWV0aG9kcyBmb3Igc3RhdGUgcXVlcnlpbmcKLSAgICBib29sIGlzQWN0aXZl
KGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OwotICAgIGJvb2wgaXNDaGVja2VkKGNvbnN0IFJl
bmRlck9iamVjdCopIGNvbnN0OwotICAgIGJvb2wgaXNJbmRldGVybWluYXRlKGNvbnN0IFJlbmRl
ck9iamVjdCopIGNvbnN0OwotICAgIGJvb2wgaXNFbmFibGVkKGNvbnN0IFJlbmRlck9iamVjdCop
IGNvbnN0OwotICAgIGJvb2wgaXNGb2N1c2VkKGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0Owot
ICAgIGJvb2wgaXNQcmVzc2VkKGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OwotICAgIGJvb2wg
aXNIb3ZlcmVkKGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OwotICAgIGJvb2wgaXNSZWFkT25s
eUNvbnRyb2woY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7Ci0gICAgYm9vbCBpc0RlZmF1bHQo
Y29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIGludCBwb3B1cEludGVy
bmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmly
dHVhbCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSopIGNvbnN0IHsg
cmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIGludCBwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5k
ZXJTdHlsZSopIGNvbnN0IHsgcmV0dXJuIDA7IH0KQEAgLTIwNCw2ICsxOTMsMTkgQEAgcHJvdGVj
dGVkOgogICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0
KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0JikgeyByZXR1
cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVy
T2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jikg
eyByZXR1cm4gdHJ1ZTsgfQogCitwdWJsaWM6CisgICAgLy8gTWV0aG9kcyBmb3Igc3RhdGUgcXVl
cnlpbmcKKyAgICBDb250cm9sU3RhdGVzIGNvbnRyb2xTdGF0ZXNGb3JSZW5kZXJlcihjb25zdCBS
ZW5kZXJPYmplY3QqIG8pIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoY29uc3QgUmVuZGVyT2Jq
ZWN0KikgY29uc3Q7CisgICAgYm9vbCBpc0NoZWNrZWQoY29uc3QgUmVuZGVyT2JqZWN0KikgY29u
c3Q7CisgICAgYm9vbCBpc0luZGV0ZXJtaW5hdGUoY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7
CisgICAgYm9vbCBpc0VuYWJsZWQoY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7CisgICAgYm9v
bCBpc0ZvY3VzZWQoY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7CisgICAgYm9vbCBpc1ByZXNz
ZWQoY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7CisgICAgYm9vbCBpc0hvdmVyZWQoY29uc3Qg
UmVuZGVyT2JqZWN0KikgY29uc3Q7CisgICAgYm9vbCBpc1JlYWRPbmx5Q29udHJvbChjb25zdCBS
ZW5kZXJPYmplY3QqKSBjb25zdDsKKyAgICBib29sIGlzRGVmYXVsdChjb25zdCBSZW5kZXJPYmpl
Y3QqKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBtdXRhYmxlIENvbG9yIG1fYWN0aXZlU2VsZWN0
aW9uQ29sb3I7CiAgICAgbXV0YWJsZSBDb2xvciBtX2luYWN0aXZlU2VsZWN0aW9uQ29sb3I7Cklu
ZGV4OiByZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcv
UmVuZGVyVGhlbWVNYWMuaAkocmV2aXNpb24gMzc3MjYpCisrKyByZW5kZXJpbmcvUmVuZGVyVGhl
bWVNYWMuaAkod29ya2luZyBjb3B5KQpAQCAtNDIsMTEgKzQyLDYgQEAgcHVibGljOgogICAgIFJl
bmRlclRoZW1lTWFjKCk7CiAgICAgdmlydHVhbCB+UmVuZGVyVGhlbWVNYWMoKTsKIAotICAgIC8v
IEEgbWV0aG9kIHRvIG9idGFpbiB0aGUgYmFzZWxpbmUgcG9zaXRpb24gZm9yIGEgImxlYWYiIGNv
bnRyb2wuICBUaGlzIHdpbGwgb25seSBiZSB1c2VkIGlmIGEgYmFzZWxpbmUKLSAgICAvLyBwb3Np
dGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBleGFtaW5pbmcgY2hpbGQgY29udGVudC4gQ2hl
Y2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBhcmUgZXhhbXBsZXMgb2YKLSAgICAvLyBjb250cm9s
cyB0aGF0IG5lZWQgdG8gZG8gdGhpcy4KLSAgICB2aXJ0dWFsIGludCBiYXNlbGluZVBvc2l0aW9u
KGNvbnN0IFJlbmRlck9iamVjdCopIGNvbnN0OwotCiAgICAgLy8gQSBtZXRob2QgYXNraW5nIGlm
IHRoZSBjb250cm9sIGNoYW5nZXMgaXRzIHRpbnQgd2hlbiB0aGUgd2luZG93IGhhcyBmb2N1cyBv
ciBub3QuCiAgICAgdmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c1RpbnRzKGNvbnN0IFJlbmRl
ck9iamVjdCopIGNvbnN0OwogCkBAIC04MiwxMiArNzcsNiBAQCBwdWJsaWM6CiAKIHByb3RlY3Rl
ZDoKICAgICAvLyBNZXRob2RzIGZvciBlYWNoIGFwcGVhcmFuY2UgdmFsdWUuCi0gICAgdmlydHVh
bCBib29sIHBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIHNldENoZWNrYm94
U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OwotCi0gICAgdmlydHVhbCBib29sIHBhaW50UmFkaW8o
UmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRS
ZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIHNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0
OwotCiAgICAgdmlydHVhbCB2b2lkIGFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZSosIFdlYkNvcmU6OkVsZW1lbnQqKSBjb25zdDsKICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mLCBjb25zdCBJbnRSZWN0Jik7CiAgICAgdmlydHVhbCB2b2lkIHNldEJ1dHRvblNpemUoUmVu
ZGVyU3R5bGUqKSBjb25zdDsKQEAgLTE1MSwxMyArMTQwLDYgQEAgcHJpdmF0ZToKICAgICB2b2lk
IHVwZGF0ZVByZXNzZWRTdGF0ZShOU0NlbGwqLCBjb25zdCBSZW5kZXJPYmplY3QqKTsKIAogICAg
IC8vIEhlbHBlcnMgZm9yIGFkanVzdGluZyBhcHBlYXJhbmNlIGFuZCBmb3IgcGFpbnRpbmcKLSAg
ICBjb25zdCBJbnRTaXplKiBjaGVja2JveFNpemVzKCkgY29uc3Q7Ci0gICAgY29uc3QgaW50KiBj
aGVja2JveE1hcmdpbnMoKSBjb25zdDsKLSAgICB2b2lkIHNldENoZWNrYm94Q2VsbFN0YXRlKGNv
bnN0IFJlbmRlck9iamVjdCosIGNvbnN0IEludFJlY3QmKTsKLQotICAgIGNvbnN0IEludFNpemUq
IHJhZGlvU2l6ZXMoKSBjb25zdDsKLSAgICBjb25zdCBpbnQqIHJhZGlvTWFyZ2lucygpIGNvbnN0
OwotICAgIHZvaWQgc2V0UmFkaW9DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiwgY29uc3Qg
SW50UmVjdCYpOwogCiAgICAgdm9pZCBzZXRCdXR0b25QYWRkaW5nRnJvbUNvbnRyb2xTaXplKFJl
bmRlclN0eWxlKiwgTlNDb250cm9sU2l6ZSkgY29uc3Q7CiAgICAgY29uc3QgSW50U2l6ZSogYnV0
dG9uU2l6ZXMoKSBjb25zdDsKQEAgLTE3Nyw4ICsxNTksNiBAQCBwcml2YXRlOgogICAgIHZvaWQg
c2V0U2VhcmNoQ2VsbFN0YXRlKFJlbmRlck9iamVjdCosIGNvbnN0IEludFJlY3QmKTsKICAgICB2
b2lkIHNldFNlYXJjaEZpZWxkU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OwogICAgIAotICAgIE5T
QnV0dG9uQ2VsbCogY2hlY2tib3goKSBjb25zdDsKLSAgICBOU0J1dHRvbkNlbGwqIHJhZGlvKCkg
Y29uc3Q7CiAgICAgTlNCdXR0b25DZWxsKiBidXR0b24oKSBjb25zdDsKICAgICBOU1BvcFVwQnV0
dG9uQ2VsbCogcG9wdXBCdXR0b24oKSBjb25zdDsKICAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2Vh
cmNoKCkgY29uc3Q7CkBAIC0xODcsOCArMTY3LDYgQEAgcHJpdmF0ZToKICAgICBOU1NsaWRlckNl
bGwqIHNsaWRlclRodW1iVmVydGljYWwoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBtdXRhYmxl
IFJldGFpblB0cjxOU0J1dHRvbkNlbGw+IG1fY2hlY2tib3g7Ci0gICAgbXV0YWJsZSBSZXRhaW5Q
dHI8TlNCdXR0b25DZWxsPiBtX3JhZGlvOwogICAgIG11dGFibGUgUmV0YWluUHRyPE5TQnV0dG9u
Q2VsbD4gbV9idXR0b247CiAgICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNQb3BVcEJ1dHRvbkNlbGw+
IG1fcG9wdXBCdXR0b247CiAgICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNTZWFyY2hGaWVsZENlbGw+
IG1fc2VhcmNoOwpJbmRleDogcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbQkocmV2aXNpb24gMzc3MjYpCisrKyByZW5k
ZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTQyMSwzMyArNDIxLDE2
IEBAIGJvb2wgUmVuZGVyVGhlbWVNYWM6OmlzQ29udHJvbFN0eWxlZChjb24KIAogdm9pZCBSZW5k
ZXJUaGVtZU1hYzo6YWRqdXN0UmVwYWludFJlY3QoY29uc3QgUmVuZGVyT2JqZWN0KiBvLCBJbnRS
ZWN0JiByKQogeworICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNl
KCk7CisgICAgCisjaWYgVVNFKE5FV19USEVNRSkKKyAgICBpZiAocGFydCA9PSBDaGVja2JveFBh
cnQgfHwgcGFydCA9PSBSYWRpb1BhcnQpCisgICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6YWRq
dXN0UmVwYWludFJlY3Qobywgcik7CisjZW5kaWYKKwogICAgIGZsb2F0IHpvb21MZXZlbCA9IG8t
PnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKIAogICAgIHN3aXRjaCAoby0+c3R5bGUoKS0+YXBw
ZWFyYW5jZSgpKSB7Ci0gICAgICAgIGNhc2UgQ2hlY2tib3hQYXJ0OiB7Ci0gICAgICAgICAgICAv
LyBTaW5jZSB3ZSBxdWVyeSB0aGUgcHJvdG90eXBlIGNlbGwsIHdlIG5lZWQgdG8gdXBkYXRlIGl0
cyBzdGF0ZSB0byBtYXRjaC4KLSAgICAgICAgICAgIHNldENoZWNrYm94Q2VsbFN0YXRlKG8sIHIp
OwotCi0gICAgICAgICAgICAvLyBXZSBpbmZsYXRlIHRoZSByZWN0IGFzIG5lZWRlZCB0byBhY2Nv
dW50IGZvciBwYWRkaW5nIGluY2x1ZGVkIGluIHRoZSBjZWxsIHRvIGFjY29tbW9kYXRlIHRoZSBj
aGVja2JveAotICAgICAgICAgICAgLy8gc2hhZG93IiBhbmQgdGhlIGNoZWNrLiAgV2UgZG9uJ3Qg
Y29uc2lkZXIgdGhpcyBwYXJ0IG9mIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRyb2wgaW4gV2ViS2l0
LgotICAgICAgICAgICAgSW50U2l6ZSBzaXplID0gY2hlY2tib3hTaXplcygpW1tjaGVja2JveCgp
IGNvbnRyb2xTaXplXV07Ci0gICAgICAgICAgICBzaXplLnNldEhlaWdodChzaXplLmhlaWdodCgp
ICogem9vbUxldmVsKTsKLSAgICAgICAgICAgIHNpemUuc2V0V2lkdGgoc2l6ZS53aWR0aCgpICog
em9vbUxldmVsKTsKLSAgICAgICAgICAgIHIgPSBpbmZsYXRlUmVjdChyLCBzaXplLCBjaGVja2Jv
eE1hcmdpbnMoKSwgem9vbUxldmVsKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgICAgIGNhc2UgUmFkaW9QYXJ0OiB7Ci0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBxdWVyeSB0
aGUgcHJvdG90eXBlIGNlbGwsIHdlIG5lZWQgdG8gdXBkYXRlIGl0cyBzdGF0ZSB0byBtYXRjaC4K
LSAgICAgICAgICAgIHNldFJhZGlvQ2VsbFN0YXRlKG8sIHIpOwotCi0gICAgICAgICAgICAvLyBX
ZSBpbmZsYXRlIHRoZSByZWN0IGFzIG5lZWRlZCB0byBhY2NvdW50IGZvciBwYWRkaW5nIGluY2x1
ZGVkIGluIHRoZSBjZWxsIHRvIGFjY29tbW9kYXRlIHRoZSBjaGVja2JveAotICAgICAgICAgICAg
Ly8gc2hhZG93IiBhbmQgdGhlIGNoZWNrLiAgV2UgZG9uJ3QgY29uc2lkZXIgdGhpcyBwYXJ0IG9m
IHRoZSBib3VuZHMgb2YgdGhlIGNvbnRyb2wgaW4gV2ViS2l0LgotICAgICAgICAgICAgSW50U2l6
ZSBzaXplID0gcmFkaW9TaXplcygpW1tyYWRpbygpIGNvbnRyb2xTaXplXV07Ci0gICAgICAgICAg
ICBzaXplLnNldEhlaWdodChzaXplLmhlaWdodCgpICogem9vbUxldmVsKTsKLSAgICAgICAgICAg
IHNpemUuc2V0V2lkdGgoc2l6ZS53aWR0aCgpICogem9vbUxldmVsKTsKLSAgICAgICAgICAgIHIg
PSBpbmZsYXRlUmVjdChyLCBzaXplLCByYWRpb01hcmdpbnMoKSwgem9vbUxldmVsKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICB9CiAgICAgICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6CiAg
ICAgICAgIGNhc2UgRGVmYXVsdEJ1dHRvblBhcnQ6CiAgICAgICAgIGNhc2UgQnV0dG9uUGFydDog
ewpAQCAtNTM1LDEzICs1MTgsNiBAQCB2b2lkIFJlbmRlclRoZW1lTWFjOjp1cGRhdGVQcmVzc2Vk
U3RhdGUoCiAgICAgICAgIFtjZWxsIHNldEhpZ2hsaWdodGVkOnByZXNzZWRdOwogfQogCi1pbnQg
UmVuZGVyVGhlbWVNYWM6OmJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0KiBvKSBj
b25zdAotewotICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gQ2hlY2tib3hQYXJ0
IHx8IG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBSYWRpb1BhcnQpCi0gICAgICAgIHJldHVy
biBvLT5tYXJnaW5Ub3AoKSArIG8tPmhlaWdodCgpIC0gMiAqIG8tPnN0eWxlKCktPmVmZmVjdGl2
ZVpvb20oKTsgLy8gVGhlIGJhc2VsaW5lIGlzIDJweCB1cCBmcm9tIHRoZSBib3R0b20gb2YgdGhl
IGNoZWNrYm94L3JhZGlvIGluIEFwcEtpdC4KLSAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmJhc2Vs
aW5lUG9zaXRpb24obyk7Ci19Ci0KIGJvb2wgUmVuZGVyVGhlbWVNYWM6OmNvbnRyb2xTdXBwb3J0
c1RpbnRzKGNvbnN0IFJlbmRlck9iamVjdCogbykgY29uc3QKIHsKICAgICAvLyBBbiBhbHRlcm5h
dGUgd2F5IHRvIGltcGxlbWVudCB0aGlzIHdvdWxkIGJlIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUg
Y2VsbCBvYmplY3QKQEAgLTY0MSwxNTUgKzYxNyw2IEBAIE5TQ29udHJvbFNpemUgUmVuZGVyVGhl
bWVNYWM6OmNvbnRyb2xTaXoKICAgICByZXR1cm4gTlNNaW5pQ29udHJvbFNpemU7CiB9CiAKLWJv
b2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewot
ICAgIC8vIERldGVybWluZSB0aGUgd2lkdGggYW5kIGhlaWdodCBuZWVkZWQgZm9yIHRoZSBjb250
cm9sIGFuZCBwcmVwYXJlIHRoZSBjZWxsIGZvciBwYWludGluZy4KLSAgICBzZXRDaGVja2JveENl
bGxTdGF0ZShvLCByKTsKLQotICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7Ci0KLSAgICBm
bG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICAvLyBX
ZSBpbmZsYXRlIHRoZSByZWN0IGFzIG5lZWRlZCB0byBhY2NvdW50IGZvciBwYWRkaW5nIGluY2x1
ZGVkIGluIHRoZSBjZWxsIHRvIGFjY29tbW9kYXRlIHRoZSBjaGVja2JveAotICAgIC8vIHNoYWRv
dyIgYW5kIHRoZSBjaGVjay4gIFdlIGRvbid0IGNvbnNpZGVyIHRoaXMgcGFydCBvZiB0aGUgYm91
bmRzIG9mIHRoZSBjb250cm9sIGluIFdlYktpdC4KLSAgICBOU0J1dHRvbkNlbGwqIGNoZWNrYm94
ID0gdGhpcy0+Y2hlY2tib3goKTsKLSAgICBJbnRTaXplIHNpemUgPSBjaGVja2JveFNpemVzKClb
W2NoZWNrYm94IGNvbnRyb2xTaXplXV07Ci0gICAgc2l6ZS5zZXRXaWR0aChzaXplLndpZHRoKCkg
KiB6b29tTGV2ZWwpOwotICAgIHNpemUuc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tTGV2
ZWwpOwotICAgIEludFJlY3QgaW5mbGF0ZWRSZWN0ID0gaW5mbGF0ZVJlY3Qociwgc2l6ZSwgY2hl
Y2tib3hNYXJnaW5zKCksIHpvb21MZXZlbCk7Ci0gICAgCi0gICAgaWYgKHpvb21MZXZlbCAhPSAx
LjBmKSB7Ci0gICAgICAgIGluZmxhdGVkUmVjdC5zZXRXaWR0aChpbmZsYXRlZFJlY3Qud2lkdGgo
KSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIGluZmxhdGVkUmVjdC5zZXRIZWlnaHQoaW5mbGF0ZWRS
ZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRy
YW5zbGF0ZShpbmZsYXRlZFJlY3QueCgpLCBpbmZsYXRlZFJlY3QueSgpKTsKLSAgICAgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOwot
ICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC1pbmZsYXRlZFJlY3QueCgpLCAt
aW5mbGF0ZWRSZWN0LnkoKSk7Ci0gICAgfQotICAgIAotICAgIFtjaGVja2JveCBkcmF3V2l0aEZy
YW1lOk5TUmVjdChpbmZsYXRlZFJlY3QpIGluVmlldzpvLT52aWV3KCktPmZyYW1lVmlldygpLT5k
b2N1bWVudFZpZXcoKV07Ci0gICAgW2NoZWNrYm94IHNldENvbnRyb2xWaWV3Om5pbF07Ci0KLSAg
ICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6Y2hlY2tib3hTaXplcygpIGNvbnN0Ci17
Ci0gICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMTQsIDE0KSwg
SW50U2l6ZSgxMiwgMTIpLCBJbnRTaXplKDEwLCAxMCkgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19
Ci0KLWNvbnN0IGludCogUmVuZGVyVGhlbWVNYWM6OmNoZWNrYm94TWFyZ2lucygpIGNvbnN0Ci17
Ci0gICAgc3RhdGljIGNvbnN0IGludCBtYXJnaW5zWzNdWzRdID0KLSAgICB7Ci0gICAgICAgIHsg
MywgNCwgNCwgMiB9LAotICAgICAgICB7IDQsIDMsIDMsIDMgfSwKLSAgICAgICAgeyA0LCAzLCAz
LCAzIH0sCi0gICAgfTsKLSAgICByZXR1cm4gbWFyZ2luc1tbY2hlY2tib3goKSBjb250cm9sU2l6
ZV1dOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjOjpzZXRDaGVja2JveENlbGxTdGF0ZShjb25z
dCBSZW5kZXJPYmplY3QqIG8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTlNCdXR0b25DZWxs
KiBjaGVja2JveCA9IHRoaXMtPmNoZWNrYm94KCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNvbnRyb2wg
c2l6ZSBiYXNlZCBvZmYgdGhlIHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRvLgotICAgIHNl
dENvbnRyb2xTaXplKGNoZWNrYm94LCBjaGVja2JveFNpemVzKCksIHIuc2l6ZSgpLCBvLT5zdHls
ZSgpLT5lZmZlY3RpdmVab29tKCkpOwotCi0gICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRl
cyB3ZSByZXNwb25kIHRvLgotICAgIHVwZGF0ZUNoZWNrZWRTdGF0ZShjaGVja2JveCwgbyk7Ci0g
ICAgdXBkYXRlRW5hYmxlZFN0YXRlKGNoZWNrYm94LCBvKTsKLSAgICB1cGRhdGVQcmVzc2VkU3Rh
dGUoY2hlY2tib3gsIG8pOwotICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShjaGVja2JveCwgbyk7Ci19
Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5
bGUpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3Bl
Y2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KLSAgICBpZiAoIXN0eWxlLT53aWR0
aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gVXNlIHRoZSBmb250IHNpemUgdG8gZGV0ZXJtaW5lIHRo
ZSBpbnRyaW5zaWMgd2lkdGggb2YgdGhlIGNvbnRyb2wuCi0gICAgc2V0U2l6ZUZyb21Gb250KHN0
eWxlLCBjaGVja2JveFNpemVzKCkpOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjOjpwYWludFJh
ZGlvKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHdpZHRoIGFu
ZCBoZWlnaHQgbmVlZGVkIGZvciB0aGUgY29udHJvbCBhbmQgcHJlcGFyZSB0aGUgY2VsbCBmb3Ig
cGFpbnRpbmcuCi0gICAgc2V0UmFkaW9DZWxsU3RhdGUobywgcik7Ci0KLSAgICBwYWludEluZm8u
Y29udGV4dC0+c2F2ZSgpOwotCi0gICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZm
ZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gV2UgaW5mbGF0ZSB0aGUgcmVjdCBhcyBuZWVkZWQgdG8g
YWNjb3VudCBmb3IgcGFkZGluZyBpbmNsdWRlZCBpbiB0aGUgY2VsbCB0byBhY2NvbW1vZGF0ZSB0
aGUgY2hlY2tib3gKLSAgICAvLyBzaGFkb3ciIGFuZCB0aGUgY2hlY2suICBXZSBkb24ndCBjb25z
aWRlciB0aGlzIHBhcnQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgY29udHJvbCBpbiBXZWJLaXQuCi0g
ICAgTlNCdXR0b25DZWxsKiByYWRpbyA9IHRoaXMtPnJhZGlvKCk7Ci0gICAgSW50U2l6ZSBzaXpl
ID0gcmFkaW9TaXplcygpW1tyYWRpbyBjb250cm9sU2l6ZV1dOwotICAgIHNpemUuc2V0V2lkdGgo
c2l6ZS53aWR0aCgpICogem9vbUxldmVsKTsKLSAgICBzaXplLnNldEhlaWdodChzaXplLmhlaWdo
dCgpICogem9vbUxldmVsKTsKLSAgICBJbnRSZWN0IGluZmxhdGVkUmVjdCA9IGluZmxhdGVSZWN0
KHIsIHNpemUsIHJhZGlvTWFyZ2lucygpLCB6b29tTGV2ZWwpOwotICAgIAotICAgIGlmICh6b29t
TGV2ZWwgIT0gMS4wZikgewotICAgICAgICBpbmZsYXRlZFJlY3Quc2V0V2lkdGgoaW5mbGF0ZWRS
ZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOwotICAgICAgICBpbmZsYXRlZFJlY3Quc2V0SGVpZ2h0
KGluZmxhdGVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIHBhaW50SW5mby5j
b250ZXh0LT50cmFuc2xhdGUoaW5mbGF0ZWRSZWN0LngoKSwgaW5mbGF0ZWRSZWN0LnkoKSk7Ci0g
ICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29t
TGV2ZWwpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtaW5mbGF0ZWRS
ZWN0LngoKSwgLWluZmxhdGVkUmVjdC55KCkpOwotICAgIH0KLQotICAgIFtyYWRpbyBkcmF3V2l0
aEZyYW1lOk5TUmVjdChpbmZsYXRlZFJlY3QpIGluVmlldzpvLT52aWV3KCktPmZyYW1lVmlldygp
LT5kb2N1bWVudFZpZXcoKV07Ci0gICAgW3JhZGlvIHNldENvbnRyb2xWaWV3Om5pbF07Ci0KLSAg
ICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1jb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6cmFkaW9TaXplcygpIGNvbnN0Ci17Ci0g
ICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMTQsIDE1KSwgSW50
U2l6ZSgxMiwgMTMpLCBJbnRTaXplKDEwLCAxMCkgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0K
LWNvbnN0IGludCogUmVuZGVyVGhlbWVNYWM6OnJhZGlvTWFyZ2lucygpIGNvbnN0Ci17Ci0gICAg
c3RhdGljIGNvbnN0IGludCBtYXJnaW5zWzNdWzRdID0KLSAgICB7Ci0gICAgICAgIHsgMiwgMiwg
NCwgMiB9LAotICAgICAgICB7IDMsIDIsIDMsIDIgfSwKLSAgICAgICAgeyAxLCAwLCAyLCAwIH0s
Ci0gICAgfTsKLSAgICByZXR1cm4gbWFyZ2luc1tbcmFkaW8oKSBjb250cm9sU2l6ZV1dOwotfQot
Ci12b2lkIFJlbmRlclRoZW1lTWFjOjpzZXRSYWRpb0NlbGxTdGF0ZShjb25zdCBSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTlNCdXR0b25DZWxsKiByYWRpbyA9IHRo
aXMtPnJhZGlvKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNvbnRyb2wgc2l6ZSBiYXNlZCBvZmYgdGhl
IHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRvLgotICAgIHNldENvbnRyb2xTaXplKHJhZGlv
LCByYWRpb1NpemVzKCksIHIuc2l6ZSgpLCBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOwot
Ci0gICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgotICAgIHVw
ZGF0ZUNoZWNrZWRTdGF0ZShyYWRpbywgbyk7Ci0gICAgdXBkYXRlRW5hYmxlZFN0YXRlKHJhZGlv
LCBvKTsKLSAgICB1cGRhdGVQcmVzc2VkU3RhdGUocmFkaW8sIG8pOwotICAgIHVwZGF0ZUZvY3Vz
ZWRTdGF0ZShyYWRpbywgbyk7Ci19Ci0KLQotdm9pZCBSZW5kZXJUaGVtZU1hYzo6c2V0UmFkaW9T
aXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICAvLyBJZiB0aGUgd2lkdGggYW5k
IGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgot
ICAgIGlmICghc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUtPmhl
aWdodCgpLmlzQXV0bygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBVc2UgdGhlIGZvbnQg
c2l6ZSB0byBkZXRlcm1pbmUgdGhlIGludHJpbnNpYyB3aWR0aCBvZiB0aGUgY29udHJvbC4KLSAg
ICBzZXRTaXplRnJvbUZvbnQoc3R5bGUsIHJhZGlvU2l6ZXMoKSk7Ci19Ci0KIHZvaWQgUmVuZGVy
VGhlbWVNYWM6OnNldEJ1dHRvblBhZGRpbmdGcm9tQ29udHJvbFNpemUoUmVuZGVyU3R5bGUqIHN0
eWxlLCBOU0NvbnRyb2xTaXplIHNpemUpIGNvbnN0CiB7CiAgICAgLy8gSnVzdCB1c2UgOHB4LiAg
QXBwS2l0IHdhbnRzIHRvIHVzZSAxMXB4IGZvciBtaW5pIGJ1dHRvbnMsIGJ1dCB0aGF0IHBhZGRp
bmcgaXMganVzdCB0b28gbGFyZ2UKQEAgLTE4MDMsMzEgKzE2MzAsNiBAQCBib29sIFJlbmRlclRo
ZW1lTWFjOjpwYWludE1lZGlhU2xpZGVyVGh1CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1OU0J1
dHRvbkNlbGwqIFJlbmRlclRoZW1lTWFjOjpjaGVja2JveCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFt
X2NoZWNrYm94KSB7Ci0gICAgICAgIG1fY2hlY2tib3guYWRvcHROUyhbW05TQnV0dG9uQ2VsbCBh
bGxvY10gaW5pdF0pOwotICAgICAgICBbbV9jaGVja2JveC5nZXQoKSBzZXRCdXR0b25UeXBlOk5T
U3dpdGNoQnV0dG9uXTsKLSAgICAgICAgW21fY2hlY2tib3guZ2V0KCkgc2V0VGl0bGU6bmlsXTsK
LSAgICAgICAgW21fY2hlY2tib3guZ2V0KCkgc2V0QWxsb3dzTWl4ZWRTdGF0ZTpZRVNdOwotICAg
ICAgICBbbV9jaGVja2JveC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlwZUV4
dGVyaW9yXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1fY2hlY2tib3guZ2V0KCk7Ci19Ci0K
LU5TQnV0dG9uQ2VsbCogUmVuZGVyVGhlbWVNYWM6OnJhZGlvKCkgY29uc3QKLXsKLSAgICBpZiAo
IW1fcmFkaW8pIHsKLSAgICAgICAgbV9yYWRpby5hZG9wdE5TKFtbTlNCdXR0b25DZWxsIGFsbG9j
XSBpbml0XSk7Ci0gICAgICAgIFttX3JhZGlvLmdldCgpIHNldEJ1dHRvblR5cGU6TlNSYWRpb0J1
dHRvbl07Ci0gICAgICAgIFttX3JhZGlvLmdldCgpIHNldFRpdGxlOm5pbF07Ci0gICAgICAgIFtt
X3JhZGlvLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOwot
ICAgIH0KLSAgICAKLSAgICByZXR1cm4gbV9yYWRpby5nZXQoKTsKLX0KLQogTlNCdXR0b25DZWxs
KiBSZW5kZXJUaGVtZU1hYzo6YnV0dG9uKCkgY29uc3QKIHsKICAgICBpZiAoIW1fYnV0dG9uKSB7
CkluZGV4OiByZW5kZXJpbmcvc3R5bGUvRmlsbExheWVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5k
ZXJpbmcvc3R5bGUvRmlsbExheWVyLmNwcAkocmV2aXNpb24gMzc3MjYpCisrKyByZW5kZXJpbmcv
c3R5bGUvRmlsbExheWVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE2LDcgKzExNiw3IEBAIGJv
b2wgRmlsbExheWVyOjpvcGVyYXRvcj09KGNvbnN0IEZpbGxMYXkKICAgICByZXR1cm4gU3R5bGVJ
bWFnZTo6aW1hZ2VzRXF1aXZhbGVudChtX2ltYWdlLmdldCgpLCBvLm1faW1hZ2UuZ2V0KCkpICYm
IG1feFBvc2l0aW9uID09IG8ubV94UG9zaXRpb24gJiYgbV95UG9zaXRpb24gPT0gby5tX3lQb3Np
dGlvbiAmJgogICAgICAgICAgICBtX2F0dGFjaG1lbnQgPT0gby5tX2F0dGFjaG1lbnQgJiYgbV9j
bGlwID09IG8ubV9jbGlwICYmIAogICAgICAgICAgICBtX2NvbXBvc2l0ZSA9PSBvLm1fY29tcG9z
aXRlICYmIG1fb3JpZ2luID09IG8ubV9vcmlnaW4gJiYgbV9yZXBlYXQgPT0gby5tX3JlcGVhdCAm
JgotICAgICAgICAgICBtX3NpemUud2lkdGggPT0gby5tX3NpemUud2lkdGggJiYgbV9zaXplLmhl
aWdodCA9PSBvLm1fc2l6ZS5oZWlnaHQgJiYgbV90eXBlID09IG8ubV90eXBlICYmCisgICAgICAg
ICAgIG1fc2l6ZSA9PSBvLm1fc2l6ZSAmJiBtX3R5cGUgPT0gby5tX3R5cGUgJiYKICAgICAgICAg
ICAgKChtX25leHQgJiYgby5tX25leHQpID8gKm1fbmV4dCA9PSAqby5tX25leHQgOiBtX25leHQg
PT0gby5tX25leHQpOwogfQogCg==
</data>
<flag name="review"
          id="11170"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
      

    </bug>

</bugzilla>