<?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>84935</bug_id>
          
          <creation_ts>2012-04-26 01:47:43 -0700</creation_ts>
          <short_desc>[Chromium/Windows] Add LocalizedDateWin</short_desc>
          <delta_ts>2012-05-01 00:53:43 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>84388</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Kent Tamura">tkent</assigned_to>
          <cc>haraken</cc>
    
    <cc>morrita</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>610426</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-04-26 01:47:43 -0700</bug_when>
    <thetext>[Chromium/Windows] Add LocalizedDateWin</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>610482</commentid>
    <comment_count>1</comment_count>
      <attachid>138968</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-04-26 03:52:00 -0700</bug_when>
    <thetext>Created attachment 138968
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>610483</commentid>
    <comment_count>2</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-04-26 03:53:17 -0700</bug_when>
    <thetext>Morita-san, Haraken-san,
This patch is for Windows, but the majority of the code is string manipulation.  So I hope you can review this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>610708</commentid>
    <comment_count>3</comment_count>
      <attachid>138968</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-04-26 10:22:44 -0700</bug_when>
    <thetext>Comment on attachment 138968
Patch

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

&gt; Source/WebCore/ChangeLog:17
&gt; +        No new tests. The behavior depends on system settings.

Landing this patch without tests seems a bit dangerous. Isn&apos;t there any way to make it testable?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:67
&gt; +    buffer.shrink(bufferSizeWithNUL - 1);

Is this needed?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:87
&gt; +    OwnPtr&lt;Vector&lt;String&gt; &gt; labels = adoptPtr(new Vector&lt;String&gt;);

Shall we put labels-&gt;reserveCapacity(WTF_ARRAY_LENGTH(types))?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:91
&gt; +            labels-&gt;shrink(0);

Nit: I would prefer labels-&gt;clear() for such cases.

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:103
&gt; +    static Vector&lt;String&gt;* labels = createShortMonthLabels().leakPtr();

- Please use DEFINE_STATIC_LOCAL() for a static variable declaration.

- I know this code is correct, but using adoptPtr() =&gt; release() =&gt; leakPtr() seems a bit dirty. How about writing like this?

static const Vector&lt;String&gt;&amp; shortMonthLabels()
{
    DEFINE_STATIC_LOCAL(Vector&lt;String&gt;, labels, ());
    if (!labels.isEmpty())
        return labels;

    ...; /* The code in createShortMonthLabels() */
}

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:152
&gt; +static unsigned countContinuousLetters(const String&amp; format, unsigned i)

Nit: &apos;i&apos; =&gt; &apos;index&apos;, for clarification? You are using &apos;index&apos; in parseNumberXXX().

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:184
&gt; +                if (format[i - 1] == &apos;\&apos;&apos;)

Maybe I am missing something, why do we need to handle &apos;&apos; specially? In other words, why do we need a different logic for &apos;&apos; and &apos;foo&apos;?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:193
&gt; +            if (i &gt; 0 &amp;&amp; format[i-1] == &apos;\&apos;&apos;)

When can this happen?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:227
&gt; +            // HTML5 date supports only A.D.

Nit: It would be interesting if HTML5 supported B.C.:)

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:261
&gt; +        if (input.substring(index, shortLabels[i].length()) == shortLabels[i]) {

What happens if input=&quot;Mayyyyyy&quot; and shortLabels[i]=&quot;May&quot;. This will return 4, but is it expected?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:268
&gt; +        if (input.substring(index, labels[i].length()) == labels[i]) {

Ditto.

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:293
&gt; +            if (day &lt; 1 || day &gt; 31)

Just an out-of-curiosity question: Where is the difference of the number of monthly dates treated? e.g. There are only 30 days in April.

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:355
&gt; +static void appendTwoDigitNumber(int value, StringBuilder&amp; buffer)

appendTwoDigit*s*Number()? Dunno.

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:362
&gt; +static void appendFourDigitNumber(int value, StringBuilder&amp; buffer)

appendFourDigit*s*Number?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:405
&gt; +            appendFourDigitNumber(year, buffer);

Maybe I am missing something, but isn&apos;t it &apos;else { appendFourDigitNumber(year, buffer); }&apos;?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:413
&gt; +            appendFourDigitNumber(year, buffer);

Ditto.

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:508
&gt; +    OwnPtr&lt;Vector&lt;String&gt; &gt; labels = adoptPtr(new Vector&lt;String&gt;);

You can put labels-&gt;reserveCapacity(WTF_ARRAY_LENGTH(types));

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:512
&gt; +            labels-&gt;shrink(0);

labels-&gt;clear() is better?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:525
&gt; +            labels-&gt;append(&quot;January&quot;);
&gt; +            labels-&gt;append(&quot;February&quot;);
&gt; +            labels-&gt;append(&quot;March&quot;);
&gt; +            labels-&gt;append(&quot;April&quot;);
&gt; +            labels-&gt;append(&quot;May&quot;);
&gt; +            labels-&gt;append(&quot;June&quot;);
&gt; +            labels-&gt;append(&quot;July&quot;);
&gt; +            labels-&gt;append(&quot;August&quot;);
&gt; +            labels-&gt;append(&quot;September&quot;);
&gt; +            labels-&gt;append(&quot;October&quot;);
&gt; +            labels-&gt;append(&quot;November&quot;);
&gt; +            labels-&gt;append(&quot;December&quot;);

Why didn&apos;t you use WTF::monthName[i]?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:534
&gt; +    static Vector&lt;String&gt;* labels = createMonthLabels().leakPtr();

The same comment for shortMonthLabels().

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:549
&gt; +    OwnPtr&lt;Vector&lt;String&gt; &gt; labels = adoptPtr(new Vector&lt;String&gt;);

You can put labels.reserveCapacity(WTF_ARRAY_LENGTH(types));

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:553
&gt; +            labels-&gt;shrink(0);

labels-&gt;clear() is better?

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:567
&gt; +    static Vector&lt;String&gt;* labels = createWeekDayShortLabels().leakPtr();

The same comment for shortMonthLabels().

&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:582
&gt; +    static unsigned firstDayOfWeek = createFirstDayOfWeek();

Please use DEFINE_STATIC_LOCAL().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>611247</commentid>
    <comment_count>4</comment_count>
      <attachid>138968</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-04-26 22:30:55 -0700</bug_when>
    <thetext>Comment on attachment 138968
Patch

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

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:67
&gt;&gt; +    buffer.shrink(bufferSizeWithNUL - 1);
&gt; 
&gt; Is this needed?

Yes.  GetLocaleInfo adds a terminating &apos;\0&apos;.  We don&apos;t need it.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:87
&gt;&gt; +    OwnPtr&lt;Vector&lt;String&gt; &gt; labels = adoptPtr(new Vector&lt;String&gt;);
&gt; 
&gt; Shall we put labels-&gt;reserveCapacity(WTF_ARRAY_LENGTH(types))?

done

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:91
&gt;&gt; +            labels-&gt;shrink(0);
&gt; 
&gt; Nit: I would prefer labels-&gt;clear() for such cases.

clear() is inefficient in this case because it shrink the capacity.  We&apos;d like to keep the capacity.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:152
&gt;&gt; +static unsigned countContinuousLetters(const String&amp; format, unsigned i)
&gt; 
&gt; Nit: &apos;i&apos; =&gt; &apos;index&apos;, for clarification? You are using &apos;index&apos; in parseNumberXXX().

done.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:184
&gt;&gt; +                if (format[i - 1] == &apos;\&apos;&apos;)
&gt; 
&gt; Maybe I am missing something, why do we need to handle &apos;&apos; specially? In other words, why do we need a different logic for &apos;&apos; and &apos;foo&apos;?

According to MSDN,  &apos;&apos; produces one single quote though &apos;foo&apos; produces foo.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:193
&gt;&gt; +            if (i &gt; 0 &amp;&amp; format[i-1] == &apos;\&apos;&apos;)
&gt; 
&gt; When can this happen?

According to MSDn, &apos;foo&apos;&apos;bar&apos; produces foo&apos;bar
That is to say, &apos;&apos; always produces one single quote regardless of inQuote.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:261
&gt;&gt; +        if (input.substring(index, shortLabels[i].length()) == shortLabels[i]) {
&gt; 
&gt; What happens if input=&quot;Mayyyyyy&quot; and shortLabels[i]=&quot;May&quot;. This will return 4, but is it expected?

Yes, parsing the month succeeds, then probably remaining &quot;yyyy&quot; causes an error.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:293
&gt;&gt; +            if (day &lt; 1 || day &gt; 31)
&gt; 
&gt; Just an out-of-curiosity question: Where is the difference of the number of monthly dates treated? e.g. There are only 30 days in April.

April 31 will be recognized as May 1 by dateToDaysFrom1970().  I don&apos;t have strong preference to this behavior.  It&apos;s easy to implement.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:355
&gt;&gt; +static void appendTwoDigitNumber(int value, StringBuilder&amp; buffer)
&gt; 
&gt; appendTwoDigit*s*Number()? Dunno.

done

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:405
&gt;&gt; +            appendFourDigitNumber(year, buffer);
&gt; 
&gt; Maybe I am missing something, but isn&apos;t it &apos;else { appendFourDigitNumber(year, buffer); }&apos;?

You&apos;re right!

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:508
&gt;&gt; +    OwnPtr&lt;Vector&lt;String&gt; &gt; labels = adoptPtr(new Vector&lt;String&gt;);
&gt; 
&gt; You can put labels-&gt;reserveCapacity(WTF_ARRAY_LENGTH(types));

done

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:525
&gt;&gt; +            labels-&gt;append(&quot;December&quot;);
&gt; 
&gt; Why didn&apos;t you use WTF::monthName[i]?

WTF::monthName is a set of short names such as &quot;Jan&quot;. We need full names.

&gt;&gt; Source/WebCore/platform/text/LocalizedDateWin.cpp:549
&gt;&gt; +    OwnPtr&lt;Vector&lt;String&gt; &gt; labels = adoptPtr(new Vector&lt;String&gt;);
&gt; 
&gt; You can put labels.reserveCapacity(WTF_ARRAY_LENGTH(types));

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>611267</commentid>
    <comment_count>5</comment_count>
      <attachid>139136</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-04-26 23:11:27 -0700</bug_when>
    <thetext>Created attachment 139136
Patch 2

Add tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>611672</commentid>
    <comment_count>6</comment_count>
      <attachid>139136</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-04-27 10:54:05 -0700</bug_when>
    <thetext>Comment on attachment 139136
Patch 2

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

&gt; Source/WebCore/platform/text/LocaleWin.cpp:55
&gt; +    : m_lcid(lcid)

Shall we initialize m_shortMonthLabels etc? WebKit requires to initialize all member variables unless there is a performance concern.
See http://www.webkit.org/coding/coding-style.html (Other punctuations - 1.)

&gt; Source/WebCore/platform/text/LocaleWin.cpp:81
&gt; +PassOwnPtr&lt;LocaleWin&gt; LocaleWin::create(LCID lcid)
&gt; +{
&gt; +    return adoptPtr(new LocaleWin(lcid));
&gt; +}
&gt; +
&gt; +LocaleWin* LocaleWin::currentLocale()
&gt; +{
&gt; +    // Ideally we should make LCID from defaultLanguage(). But
&gt; +    // ::LocaleNameToLCID() is available since Windows Vista.
&gt; +    static LocaleWin* currentLocale = LocaleWin::create(LOCALE_USER_DEFAULT).leakPtr();
&gt; +    return currentLocale;
&gt; +}

Shall we eliminate adoptPtr() and leakPtr(), in the same way as initializeShortMonthLabels()?

&gt; Source/WebCore/platform/text/LocaleWin.cpp:98
&gt; +void LocaleWin::initializeShortMonthLabels()

ensureShortMonthLabels() might be a better name?

&gt; Source/WebCore/platform/text/LocaleWin.cpp:101
&gt; +    if (m_shortMonthLabels.size())
&gt; +        return;

Do we need to call .size()? &apos;if (m_shortMonthLabels)&apos; is not enough?

I like the approach of using m_shortMonthLabels, but how many LocalWin objects will be generated? If it can be many, using static variables would be a better approach.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:194
&gt; +        UChar ch = format[i];

Let&apos;s add ASSERT(i &lt; format.length()).

&gt; Source/WebCore/platform/text/LocaleWin.cpp:277
&gt; +        if (equalIgnoringCase(input.substring(index, m_monthLabels[i].length()), m_monthLabels[i])) {
&gt; +            index += m_monthLabels[i].length();

Please use &apos;unsigned length = m_monthLabels[i].length();&apos; in order to avoid accessing .length() twice.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:283
&gt; +        if (equalIgnoringCase(input.substring(index, m_shortMonthLabels[i].length()), m_shortMonthLabels[i])) {
&gt; +            index += m_shortMonthLabels[i].length();

Ditto.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:313
&gt; +            if (input.substring(inputIndex, data.length()) == data)
&gt; +                inputIndex += data.length();

Ditto.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:465
&gt; +void LocaleWin::initializeShortDateTokens()

ensureShortDateTokens() would be a better name?

&gt; Source/WebCore/platform/text/LocaleWin.cpp:468
&gt; +    if (m_shortDateTokens.size())
&gt; +        return;

Same comment for m_shortMonthLabels.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:482
&gt; +            buffer.append(dayText.isEmpty() ? &quot;Day&quot; : dayText);

Let&apos;s write

    String dayTextString = dayText.isEmpty() ? &quot;Day&quot; : dayText;

outside of the for loop, and then use dayTextString here. (I hope the complier will do the optimization though.)

&gt; Source/WebCore/platform/text/LocaleWin.cpp:488
&gt; +            buffer.append(monthText.isEmpty() ? &quot;Month&quot; : monthText);

Ditto.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:493
&gt; +            buffer.append(yearText.isEmpty() ? &quot;Year&quot; : yearText);

Ditto.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:511
&gt; +void LocaleWin::initializeMonthLabels()

ensureMonthLabels() would be a better name?

&gt; Source/WebCore/platform/text/LocaleWin.cpp:514
&gt; +    if (m_monthLabels.size())
&gt; +        return;

Same comment for m_monthShortLabels.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:546
&gt; +            m_monthLabels.reserveCapacity(12);
&gt; +            m_monthLabels.append(&quot;January&quot;);
&gt; +            m_monthLabels.append(&quot;February&quot;);
&gt; +            m_monthLabels.append(&quot;March&quot;);
&gt; +            m_monthLabels.append(&quot;April&quot;);
&gt; +            m_monthLabels.append(&quot;May&quot;);
&gt; +            m_monthLabels.append(&quot;June&quot;);
&gt; +            m_monthLabels.append(&quot;July&quot;);
&gt; +            m_monthLabels.append(&quot;August&quot;);
&gt; +            m_monthLabels.append(&quot;September&quot;);
&gt; +            m_monthLabels.append(&quot;October&quot;);
&gt; +            m_monthLabels.append(&quot;November&quot;);
&gt; +            m_monthLabels.append(&quot;December&quot;);

It is OK, but it might be better to implement WTF::monthFullName[] and use it here.

&gt; Source/WebCore/platform/text/LocaleWin.cpp:552
&gt; +void LocaleWin::initializeWeekDayShortLabels()

ensureWeekDayShortLabels()?

&gt; Source/WebCore/platform/text/LocaleWin.cpp:555
&gt; +    if (m_weekDayShortLabels.size())
&gt; +        return;

Same comment for m_monthShortLabels.

&gt; Source/WebCore/platform/text/LocaleWin.h:63
&gt; +    LocaleWin(LCID);

&apos;explicit&apos; please.

&gt; Source/WebCore/platform/text/LocaleWin.h:79
&gt; +    Vector&lt;String&gt; m_monthLabels;

Shouldn&apos;t this be in #if ENABLE(CALENDAR_PICKER)? I am not sure why only m_weekDayShortLabels and m_firstDayOfWeek are in the enable flag.

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:58
&gt; +    EXPECT_STREQ(&quot;year/month/day&quot;, LocaleWin::dateFormatText(&quot;yyyy/MMMM/dddd&quot;, &quot;year&quot;, &quot;month&quot;, &quot;day&quot;).utf8().data());

+ EXPECT_STREQ(&quot;year/month/day/year/month/day&quot;, LocaleWin::dateFormatText(&quot;yyyy/MMMM/dddd/yyyy/MMMM/dddd&quot;, &quot;year&quot;, &quot;month&quot;, &quot;day&quot;).utf8().data());
+ EXPECT_STREQ(&quot;YY/mm/DD&quot;, LocaleWin::dateFormatText(&quot;YY/mm/DD&quot;, &quot;year&quot;, &quot;month&quot;, &quot;day&quot;).utf8().data());

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:71
&gt; +    EXPECT_STREQ(&quot;4/7/8&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2008, April, 7).utf8().data());

Please add tests for the &quot;both-side&quot; of edge cases.
+ EXPECT_STREQ(&quot;4/7/2007&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2007, April, 7).utf8().data());

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:72
&gt; +    EXPECT_STREQ(&quot;4/7/7&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2017, April, 7).utf8().data());

+ EXPECT_STREQ(&quot;4/7/2018&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2018, April, 7).utf8().data());

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:78
&gt; +    EXPECT_STREQ(&quot;04/07/63&quot;, locale-&gt;formatDate(&quot;MM/dd/yy&quot;, 2012, 1963, April, 7).utf8().data());

+ EXPECT_STREQ(&quot;04/07/1962&quot;, locale-&gt;formatDate(&quot;MM/dd/yy&quot;, 2012, 1962, April, 7).utf8().data());

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:87
&gt; +    EXPECT_STREQ(&quot;Jan/7/2012&quot;, locale-&gt;formatDate(&quot;MMM/d/yyyy&quot;, 2012, 2012, January, 7).utf8().data());
&gt; +    EXPECT_STREQ(&quot;Feb/7/2008&quot;, locale-&gt;formatDate(&quot;MMM/d/yyyy&quot;, 2012, 2008, February, 7).utf8().data());
&gt; +    EXPECT_STREQ(&quot;Mar/7/2017&quot;, locale-&gt;formatDate(&quot;MMM/d/yyyy&quot;, 2012, 2017, March, 7).utf8().data());
&gt; +    EXPECT_STREQ(&quot;Dec/31/2062&quot;, locale-&gt;formatDate(&quot;MMM/d/yyyy&quot;, 2012, 2062, December, 31).utf8().data());
&gt; +    EXPECT_STREQ(&quot;May/7/0002&quot;, locale-&gt;formatDate(&quot;MMM/d/yyyy&quot;, 2012, 2, May, 7).utf8().data());

Let&apos;s add test cases for other months.

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:93
&gt; +    EXPECT_STREQ(&quot;June-7-22012&quot;, locale-&gt;formatDate(&quot;MMMM-d-yyyy&quot;, 2012, 22012, June, 7).utf8().data());
&gt; +    EXPECT_STREQ(&quot;July-7-12008&quot;, locale-&gt;formatDate(&quot;MMMM-d-yyyy&quot;, 2012, 12008, July, 7).utf8().data());
&gt; +    EXPECT_STREQ(&quot;August-7-2017&quot;, locale-&gt;formatDate(&quot;MMMM-d-yyyy&quot;, 2012, 2017, August, 7).utf8().data());
&gt; +    EXPECT_STREQ(&quot;September-31-2062&quot;, locale-&gt;formatDate(&quot;MMMM-d-yyyy&quot;, 2012, 2062, September, 31).utf8().data());
&gt; +    EXPECT_STREQ(&quot;October-7-0002&quot;, locale-&gt;formatDate(&quot;MMMM-d-yyyy&quot;, 2012, 2, October, 7).utf8().data());

Let&apos;s add test cases for other months.

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:94
&gt; +}

Please add test cases for invalid baseyear, year, month and date. baseyear=-1, year=-1, month=12, date=32 etc.

&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:122
&gt; +}

Please add test cases for invalid baseyear, year, month and date. e.g. &quot;Mayyyy/4/2012&quot;, &quot;May/0/2012&quot;, &quot;May/32/2012&quot;, &quot;May/4/-1&quot; etc

Please add test cases that include spaces. e.g. &quot; May / 4 / 2012 &quot; etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>613224</commentid>
    <comment_count>7</comment_count>
      <attachid>139136</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-04-30 21:54:45 -0700</bug_when>
    <thetext>Comment on attachment 139136
Patch 2

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

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:55
&gt;&gt; +    : m_lcid(lcid)
&gt; 
&gt; Shall we initialize m_shortMonthLabels etc? WebKit requires to initialize all member variables unless there is a performance concern.
&gt; See http://www.webkit.org/coding/coding-style.html (Other punctuations - 1.)

We don&apos;t need to initialize m_shortMonthLabels, etc. because they are Vector&lt;&gt; and initialized automatically.

BTW, you can refer to a specific style rule by a URL; e.g. http://www.webkit.org/coding/coding-style.html#punctuation-member-init

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:81
&gt;&gt; +}
&gt; 
&gt; Shall we eliminate adoptPtr() and leakPtr(), in the same way as initializeShortMonthLabels()?

We shouldn&apos;t.  We have &quot;PassOwnPtr&lt;LocaleWin&gt; create()&quot;, and always use it.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:98
&gt;&gt; +void LocaleWin::initializeShortMonthLabels()
&gt; 
&gt; ensureShortMonthLabels() might be a better name?

Renamed.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:101
&gt;&gt; +        return;
&gt; 
&gt; Do we need to call .size()? &apos;if (m_shortMonthLabels)&apos; is not enough?
&gt; 
&gt; I like the approach of using m_shortMonthLabels, but how many LocalWin objects will be generated? If it can be many, using static variables would be a better approach.

AFAIK, Vector-&gt;bool conversion is not defined.

It is possible to have multiple LocaleWin objects for various locales at the same time in the future.  So we should make this a data member.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:194
&gt;&gt; +        UChar ch = format[i];
&gt; 
&gt; Let&apos;s add ASSERT(i &lt; format.length()).

I don&apos;t think it is helpful.  The above &apos;for&apos; ensures it.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:277
&gt;&gt; +            index += m_monthLabels[i].length();
&gt; 
&gt; Please use &apos;unsigned length = m_monthLabels[i].length();&apos; in order to avoid accessing .length() twice.

done.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:482
&gt;&gt; +            buffer.append(dayText.isEmpty() ? &quot;Day&quot; : dayText);
&gt; 
&gt; Let&apos;s write
&gt; 
&gt;     String dayTextString = dayText.isEmpty() ? &quot;Day&quot; : dayText;
&gt; 
&gt; outside of the for loop, and then use dayTextString here. (I hope the complier will do the optimization though.)

done.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:546
&gt;&gt; +            m_monthLabels.append(&quot;December&quot;);
&gt; 
&gt; It is OK, but it might be better to implement WTF::monthFullName[] and use it here.

done.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.h:63
&gt;&gt; +    LocaleWin(LCID);
&gt; 
&gt; &apos;explicit&apos; please.

done.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.h:79
&gt;&gt; +    Vector&lt;String&gt; m_monthLabels;
&gt; 
&gt; Shouldn&apos;t this be in #if ENABLE(CALENDAR_PICKER)? I am not sure why only m_weekDayShortLabels and m_firstDayOfWeek are in the enable flag.

m_monthLabels is used by parseDate() and monthLabels().  parseDate() is used even if CALENDAR_PICKER is disabled. monthLabels() is called only if CALENDAR_PICKER is enabled.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:58
&gt;&gt; +    EXPECT_STREQ(&quot;year/month/day&quot;, LocaleWin::dateFormatText(&quot;yyyy/MMMM/dddd&quot;, &quot;year&quot;, &quot;month&quot;, &quot;day&quot;).utf8().data());
&gt; 
&gt; + EXPECT_STREQ(&quot;year/month/day/year/month/day&quot;, LocaleWin::dateFormatText(&quot;yyyy/MMMM/dddd/yyyy/MMMM/dddd&quot;, &quot;year&quot;, &quot;month&quot;, &quot;day&quot;).utf8().data());
&gt; + EXPECT_STREQ(&quot;YY/mm/DD&quot;, LocaleWin::dateFormatText(&quot;YY/mm/DD&quot;, &quot;year&quot;, &quot;month&quot;, &quot;day&quot;).utf8().data());

done.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:71
&gt;&gt; +    EXPECT_STREQ(&quot;4/7/8&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2008, April, 7).utf8().data());
&gt; 
&gt; Please add tests for the &quot;both-side&quot; of edge cases.
&gt; + EXPECT_STREQ(&quot;4/7/2007&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2007, April, 7).utf8().data());

done.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:72
&gt;&gt; +    EXPECT_STREQ(&quot;4/7/7&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2017, April, 7).utf8().data());
&gt; 
&gt; + EXPECT_STREQ(&quot;4/7/2018&quot;, locale-&gt;formatDate(&quot;M/d/y&quot;, 2012, 2018, April, 7).utf8().data());

done.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:78
&gt;&gt; +    EXPECT_STREQ(&quot;04/07/63&quot;, locale-&gt;formatDate(&quot;MM/dd/yy&quot;, 2012, 1963, April, 7).utf8().data());
&gt; 
&gt; + EXPECT_STREQ(&quot;04/07/1962&quot;, locale-&gt;formatDate(&quot;MM/dd/yy&quot;, 2012, 1962, April, 7).utf8().data());

done.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:87
&gt;&gt; +    EXPECT_STREQ(&quot;May/7/0002&quot;, locale-&gt;formatDate(&quot;MMM/d/yyyy&quot;, 2012, 2, May, 7).utf8().data());
&gt; 
&gt; Let&apos;s add test cases for other months.

done.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:93
&gt;&gt; +    EXPECT_STREQ(&quot;October-7-0002&quot;, locale-&gt;formatDate(&quot;MMMM-d-yyyy&quot;, 2012, 2, October, 7).utf8().data());
&gt; 
&gt; Let&apos;s add test cases for other months.

done.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:94
&gt;&gt; +}
&gt; 
&gt; Please add test cases for invalid baseyear, year, month and date. baseyear=-1, year=-1, month=12, date=32 etc.

done.

&gt;&gt; Source/WebKit/chromium/tests/LocaleWinTest.cpp:122
&gt;&gt; +}
&gt; 
&gt; Please add test cases for invalid baseyear, year, month and date. e.g. &quot;Mayyyy/4/2012&quot;, &quot;May/0/2012&quot;, &quot;May/32/2012&quot;, &quot;May/4/-1&quot; etc
&gt; 
&gt; Please add test cases that include spaces. e.g. &quot; May / 4 / 2012 &quot; etc.

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>613236</commentid>
    <comment_count>8</comment_count>
      <attachid>139583</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-04-30 22:20:51 -0700</bug_when>
    <thetext>Created attachment 139583
Patch 3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>613277</commentid>
    <comment_count>9</comment_count>
      <attachid>139583</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-05-01 00:20:52 -0700</bug_when>
    <thetext>Comment on attachment 139583
Patch 3

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

Looks good to me

&gt; Source/WebCore/ChangeLog:72
&gt; +        Added. The follwoing functions simply delegate to LocaleWin::currentLocale().

Nit: follwoing =&gt; following

&gt; Source/WebCore/platform/text/LocaleWin.cpp:79
&gt; +    static LocaleWin *currentLocale = LocaleWin::create(LOCALE_USER_DEFAULT).leakPtr();

Can&apos;t we use DEFINE_STATIC_LOCAL()?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>613290</commentid>
    <comment_count>10</comment_count>
      <attachid>139583</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-05-01 00:50:29 -0700</bug_when>
    <thetext>Comment on attachment 139583
Patch 3

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

Thank you for the review!



&gt;&gt; Source/WebCore/ChangeLog:72
&gt;&gt; +        Added. The follwoing functions simply delegate to LocaleWin::currentLocale().
&gt; 
&gt; Nit: follwoing =&gt; following

will fix.

&gt;&gt; Source/WebCore/platform/text/LocaleWin.cpp:79
&gt;&gt; +    static LocaleWin *currentLocale = LocaleWin::create(LOCALE_USER_DEFAULT).leakPtr();
&gt; 
&gt; Can&apos;t we use DEFINE_STATIC_LOCAL()?

We can&apos;t. DEFINE_STATIC_LOCAL always uses &quot;new&quot; in it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>613293</commentid>
    <comment_count>11</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2012-05-01 00:53:43 -0700</bug_when>
    <thetext>Committed r115713: &lt;http://trac.webkit.org/changeset/115713&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>138968</attachid>
            <date>2012-04-26 03:52:00 -0700</date>
            <delta_ts>2012-04-26 23:11:21 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-84935-20120426195157.patch</filename>
            <type>text/plain</type>
            <size>25037</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTE1MjY4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzBmOGZkNmVhZDZhYzU1
MGM0MWYzZGY2N2MwY2FmYjY1ZTgwZGFlNy4uNzk3NzEzNGFiODI0ODZhYzY2N2U4ZmM0MDAzZDRk
ZTIxZDNlMGFjNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY3IEBACisyMDEyLTA0LTI2ICBLZW50
IFRhbXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KKworICAgICAgICBbQ2hyb21pdW0vV2luZG93
c10gQWRkIExvY2FsaXplZERhdGVXaW4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTg0OTM1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgTG9jYWxpemVkRGF0ZUlDVS5jcHAgZG9lc24ndCByZWZsZWN0IHN5c3Rl
bSBzZXR0aW5ncy4gU28gdGhlcmUgd2VyZSBzb21lCisgICAgICAgIHByb2JsZW1zIHN1Y2ggYXMg
PGlucHV0IHR5cGU9ZGF0ZT4gZG9lc24ndCB1c2Ugc3lzdGVtJ3MgZGF0ZSBmb3JtYXQuCisKKyAg
ICAgICAgV2UgbmVlZCB0byB1c2UgV2luZG93cyBBUEkgdG8gZ2V0IGEgZGF0ZSBmb3JtYXQgYW5k
IGNhbGVuZGFyIHBhcmFtZXRlcnMuCisKKyAgICAgICAgV2Ugb2J0YWluIGEgZGF0ZSBmb3JtYXQg
bGlrZSAiTU0vZGQveXkiIHZpYSBXaW5kb3dzIEFQSSwgYW5kCisgICAgICAgIGZvcm1hdC9wYXJz
ZSBkYXRlcyBmb3IgdGhlIGZvcm1hdCBieSBvdXIgb3duIGNvZGUgYmVjYXVzZSBXaW5kb3dzIEFQ
SQorICAgICAgICBjYW4ndCBoYW5kbGUgeWVhcnMgb2xkZXIgdGhhbiAxNjAxIGFuZCBkb2Vzbid0
IGhhdmUgZGF0ZSBwYXJzaW5nIEFQSS4KKworICAgICAgICBObyBuZXcgdGVzdHMuIFRoZSBiZWhh
dmlvciBkZXBlbmRzIG9uIHN5c3RlbSBzZXR0aW5ncy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lw
aTogQWRkIExvY2FsaXplZERhdGVXaW4uY3BwLgorICAgICAgICAqIFdlYkNvcmUuZ3lwL1dlYkNv
cmUuZ3lwOgorICAgICAgICBGb3IgV2luZG93cywgcmVtb3ZlIExvY2FsaXplZERhdGVJQ1UuY3Bw
IGFuZCBhZGQgTG9jYWxpemVkRGF0ZVdpbi5jcHAuCisgICAgICAgIEFsbCBvZiAqV2luLmNwcCBm
aWxlcyBhcmUgZXhjbHVkZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L0xv
Y2FsaXplZERhdGVXaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKGRlZmF1bHRMQ0lEKTogQSByZWRh
YmlsaXR5IGhlbHBlciBmdW5jdGlvbi4KKyAgICAgICAgKGdldExvY2FsZUluZm9TdHJpbmcpOgor
ICAgICAgICBBIGhlbHBlciBmdW5jdGlvbiB0byBvYnRhaW4gYSBzdHJpbmcgYnkgR2V0TG9jYWxl
SW5mbygpLgorICAgICAgICAoY3JlYXRlU2hvcnRNb250aExhYmVscyk6IE9idGFpbiBzaG9ydCBt
b250aCBuYW1lcyBmcm9tIFdpbmRvd3MuCisgICAgICAgIChzaG9ydE1vbnRoTGFiZWxzKTogQWNj
ZXNzb3IgZnVuY3Rpb24gZm9yIHNob3J0IG1vbnRoIG5hbWVzLgorICAgICAgICAoY3VycmVudFll
YXIpOiBBIGhlbHBlciBmdW5jdGlvbi4KKworICAgICAgICAoV2ViQ29yZTo6RGF0ZUZvcm1hdFRv
a2VuKTogQSBzdHJ1Y3QgdG8gcmVwcmVzZW50IGEgdG9rZW4gaW4gYSBkYXRlIGZvcm1hdC4KKyAg
ICAgICAgZS5nLiBBIGZvcm1hdCBzdHJpbmcgIk1NL2RkL3l5IiBnZW5lcmF0ZXMgZml2ZSBEYXRl
Rm9ybWF0VG9rZW46CisgICAgICAgICBNb250aDIsIExpdGVyYWwsIERheTIsIExpdGVyYWwsIFll
YXIyLgorICAgICAgICAoaXNFcmFTeW1ib2wpOiBBIHJlYWRhYmlsaXR5IGhlbHBlciBmdW5jdGlv
bi4KKyAgICAgICAgKGlzWWVhclN5bWJvbCk6IGRpdHRvLgorICAgICAgICAoaXNNb250aFN5bWJv
bCk6IGRpdHRvLgorICAgICAgICAoaXNEYXlTeW1ib2wpOiBkaXR0by4KKyAgICAgICAgKGNvdW50
Q29udGludW91c0xldHRlcnMpOgorICAgICAgICAoY29tbWl0TGl0ZXJhbFRva2VuKTogQSBoZWxw
ZXIgZm9yIHBhcnNlRGF0ZUZvcm1hdCgpLgorICAgICAgICAocGFyc2VEYXRlRm9ybWF0KToKKyAg
ICAgICAgUGFyc2UgYSBmb3JtYXQgc3RyaW5nLCBhbmQgZ2VuZXJhdGUgYSBsaXN0IG9mIERhdGVG
b3JtYXRUb2tlbi4KKworICAgICAgICAocGFyc2VOdW1iZXIpOiBBIGhlbHBlciBmb3IgcGFyc2VE
YXRlKCkuCisgICAgICAgIChwYXJzZU51bWJlck9yTW9udGgpOiBkaXR0by4KKyAgICAgICAgKHBh
cnNlRGF0ZSk6IFBhcnNlIGEgdXNlci1wcm92aWRlZCBkYXRlIHN0cmluZyBieSBtYXRjaGluZyB3
aXRoIGEKKyAgICAgICAgRGF0ZUZvcm1hdFRva2VuIGxpc3QuCisKKyAgICAgICAgKGFwcGVuZE51
bWJlcik6IEEgaGVscGVyIGZvciBmb3JtYXREYXRlKCkuCisgICAgICAgIChhcHBlbmRUd29EaWdp
dE51bWJlcik6IGRpdHRvLiBXcml0ZSBhdCBsZWFzdCB0d28gZGlnaXRzLgorICAgICAgICAoYXBw
ZW5kRm91ckRpZ2l0TnVtYmVyKTogZGl0dG8uIFdyaXRlIGF0IGxlYXN0IGZvdXIgZGlnaXRzLgor
ICAgICAgICAoZm9ybWF0RGF0ZSk6CisgICAgICAgIEZvcm1hdCBhIERhdGVDb21wb25lbnRzIGJ5
IGl0ZXJhdGluZyBhIERhdGVGb3JtYXRUb2tlbiBsaXN0LgorCisgICAgICAgIChXZWJDb3JlOjpw
YXJzZUxvY2FsaWVkRGF0ZSk6IENhbGxzIHBhcnNlRGF0ZSgpIGZvciB0aGUgZGF0ZSB0eXBlLgor
ICAgICAgICAoV2ViQ29yZTo6Zm9ybWF0TG9jYWxpemVkRGF0ZSk6IENhbGxzIGZvcm1hdERhdGUo
KSBmb3IgdGhlIGRhdGUgdHlwZS4KKyAgICAgICAgKFdlYkNvcmU6OmxvY2FsaXplZERhdGVGb3Jt
YXRUZXh0KToKKyAgICAgICAgQ3JlYXRlcyBhIHVzZXItdmlzaWJsZSBmb3JtYXQgc3RyaW5nIGJ5
IGl0ZXJhdGluZyBhIERhdGVGb3JtYXRUb2tlbiBsaXN0LgorICAgICAgICAoY3JlYXRlTW9udGhM
YWJlbHMpOiBDcmVhdGVzIG1vbnRoIG5hbWVzIGJ5IFdpbmRvd3MgQVBJLgorICAgICAgICAoV2Vi
Q29yZTo6bW9udGhMYWJlbHMpOiBBY2Nlc3NvciBmdW5jdGlvbiBmb3IgbW9udGggbmFtZXMuCisg
ICAgICAgIChjcmVhdGVXZWVrRGF5U2hvcnRMYWJlbHMpOiBDcmVhdGVzIGRheSBuYW1lcyBieSBX
aW5kb3dzIEFQSS4KKyAgICAgICAgKFdlYkNvcmU6OndlZWtEYXlTaG9ydExhYmVscyk6IEFjY2Vz
c29yIGZ1bmN0aW9uIGZvciBkYXkgbmFtZXMuCisgICAgICAgIChjcmVhdGVGaXJzdERheU9mV2Vl
ayk6IE9idGFpbiB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgZnJvbSBzeXN0ZW0uCisgICAgICAgIChX
ZWJDb3JlOjpmaXJzdERheU9mV2Vlayk6IEFjY2Vzc29yIGZ1bmN0aW9uIGZvciBmaXJzdCBkYXkg
b2Ygd2Vlay4KKwogMjAxMi0wNC0yNCAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+
CiAKICAgICAgICAgQ2FsZW5kYXIgUGlja2VyOiBSZXNpemUgdG8gbWluaW1hbCBzaXplIHRvIGZp
dCB0aGUgY29udGVudApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2Vi
Q29yZS5neXAgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAppbmRleCBh
MWYxMzJmM2E3MWMwNDYyZmY0YWMwYWQ2NTcwNjk1YjA0MTQ1OTI3Li5lYjA3MjY5NmQ2NGYzZjIy
YTcxOGZjMTY2NWY5MTQzY2VkYWY4NWRlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLmd5cC9XZWJDb3JlLmd5cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJD
b3JlLmd5cApAQCAtMTY2NCw2ICsxNjY0LDkgQEAKIAogICAgICAgICAgICAgIyBTeXN0ZW1JbmZv
LmNwcCBpcyB1c2VmdWwgYW5kIHdlIGRvbid0IHdhbnQgdG8gY29weSBpdC4KICAgICAgICAgICAg
IFsnaW5jbHVkZScsICdwbGF0Zm9ybS93aW4vU3lzdGVtSW5mb1xcLmNwcCQnXSwKKworICAgICAg
ICAgICAgWydleGNsdWRlJywgJ3BsYXRmb3JtL3RleHQvTG9jYWxpemVkRGF0ZUlDVVwuY3BwJCdd
LAorICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL3RleHQvTG9jYWxpemVkRGF0ZVdp
blwuY3BwJCddLAogICAgICAgICAgIF0sCiAgICAgICAgIH0seyAjIE9TIT0id2luIgogICAgICAg
ICAgICdzb3VyY2VzLyc6IFsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lw
aSBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCBkOGU3ZjAwNDMwZDUyYzM4MWQ5
NjUwNmQ2ZWMxY2Y5MmFmNWY4OTMzLi4wZmExN2FjNjMxYjc5MGVhNzY2N2FmODFjNGFiMGUxOWZk
ZDY5YTkxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC00NDc3LDYgKzQ0NzcsNyBAQAogICAgICAgICAg
ICAgJ3BsYXRmb3JtL3RleHQvTG9jYWxpemVkRGF0ZS5oJywKICAgICAgICAgICAgICdwbGF0Zm9y
bS90ZXh0L0xvY2FsaXplZERhdGVJQ1UuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS90ZXh0
L0xvY2FsaXplZERhdGVOb25lLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2Nh
bGl6ZWREYXRlV2luLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWRO
dW1iZXIuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWROdW1iZXJJQ1Uu
Y3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS90ZXh0L0xvY2FsaXplZE51bWJlck5vbmUuY3Bw
JywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTG9jYWxpemVkRGF0
ZVdpbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xvY2FsaXplZERhdGVXaW4u
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmNhNTRiNWFkODVhNjM4OTVlZGY5N2U0MGM2MWU0YjA4NzcwYmFiNDQK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xvY2FsaXpl
ZERhdGVXaW4uY3BwCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEy
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAq
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkxvY2FsaXplZERhdGUuaCIKKworI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKKyNp
bmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHd0Zi9DdXJy
ZW50VGltZS5oPgorI2luY2x1ZGUgPHd0Zi9EYXRlTWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25Q
dHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0
cmluZ0J1aWxkZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCisvLyBXaW5kb3dzIGRvZXNuJ3QgaGF2ZSBhbiBBUEkgdG8gcGFyc2UgbG9jYWxlLXNw
ZWNpZmljIGRhdGUgc3RyaW5nLAorLy8gYW5kIEdldERhdGVGb3JtYXQoKSBhbmQgR2V0RGF0ZUZv
cm1hdEV4KCkgZG9uJ3Qgc3VwcG9ydCB5ZWFycyBvbGRlcgorLy8gdGhhbiAxNjAwLCB3aGljaCB3
ZSBzaG91bGQgc3VwcG9ydCBhY2NvcmRpbmcgdG8gdGhlIEhUTUwKKy8vIHN0YW5kYXJkLiBTbywg
d2Ugb2J0YWluIHRoZSBkYXRlIGZvcm1hdCBmcm9tIHRoZSBzeXN0ZW0sIGJ1dCB3ZQorLy8gZm9y
bWF0L3BhcnNlIGEgZGF0ZSBieSBvdXIgb3duIGNvZGUuCisKK2lubGluZSBMQ0lEIGRlZmF1bHRM
Q0lEKCkKK3sKKyAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBtYWtlIExDSUQgZnJvbSBkZWZhdWx0
TGFuZ3VhZ2UoKS4gQnV0CisgICAgLy8gOjpMb2NhbGVOYW1lVG9MQ0lEKCkgaXMgYXZhaWxhYmxl
IHNpbmNlIFdpbmRvd3MgVmlzdGEuCisgICAgcmV0dXJuIExPQ0FMRV9VU0VSX0RFRkFVTFQ7Cit9
CisKK3N0YXRpYyBTdHJpbmcgZ2V0TG9jYWxlSW5mb1N0cmluZyhMQ1RZUEUgdHlwZSkKK3sKKyAg
ICBpbnQgYnVmZmVyU2l6ZVdpdGhOVUwgPSA6OkdldExvY2FsZUluZm8oZGVmYXVsdExDSUQoKSwg
dHlwZSwgMCwgMCk7CisgICAgaWYgKGJ1ZmZlclNpemVXaXRoTlVMIDw9IDApCisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKyAgICBWZWN0b3I8VUNoYXI+IGJ1ZmZlcihidWZmZXJTaXplV2l0aE5V
TCk7CisgICAgOjpHZXRMb2NhbGVJbmZvKGRlZmF1bHRMQ0lEKCksIHR5cGUsIGJ1ZmZlci5kYXRh
KCksIGJ1ZmZlclNpemVXaXRoTlVMKTsKKyAgICBidWZmZXIuc2hyaW5rKGJ1ZmZlclNpemVXaXRo
TlVMIC0gMSk7CisgICAgcmV0dXJuIFN0cmluZzo6YWRvcHQoYnVmZmVyKTsKK30KKworc3RhdGlj
IFBhc3NPd25QdHI8VmVjdG9yPFN0cmluZz4gPiBjcmVhdGVTaG9ydE1vbnRoTGFiZWxzKCkKK3sK
KyAgICBjb25zdCBMQ1RZUEUgdHlwZXNbMTJdID0geworICAgICAgICBMT0NBTEVfU0FCQlJFVk1P
TlRITkFNRTEsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwKKyAgICAgICAgTE9D
QUxFX1NBQkJSRVZNT05USE5BTUUzLAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQs
CisgICAgICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwKKyAgICAgICAgTE9DQUxFX1NBQkJS
RVZNT05USE5BTUU2LAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsCisgICAgICAg
IExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05USE5B
TUU5LAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLAorICAgICAgICBMT0NBTEVf
U0FCQlJFVk1PTlRITkFNRTExLAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLAor
ICAgIH07CisgICAgT3duUHRyPFZlY3RvcjxTdHJpbmc+ID4gbGFiZWxzID0gYWRvcHRQdHIobmV3
IFZlY3RvcjxTdHJpbmc+KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZ
X0xFTkdUSCh0eXBlcyk7ICsraSkgeworICAgICAgICBsYWJlbHMtPmFwcGVuZChnZXRMb2NhbGVJ
bmZvU3RyaW5nKHR5cGVzW2ldKSk7CisgICAgICAgIGlmIChsYWJlbHMtPmxhc3QoKS5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIGxhYmVscy0+c2hyaW5rKDApOworICAgICAgICAgICAgbGFiZWxz
LT5yZXNlcnZlQ2FwYWNpdHkoV1RGX0FSUkFZX0xFTkdUSChXVEY6Om1vbnRoTmFtZSkpOworICAg
ICAgICAgICAgZm9yICh1bnNpZ25lZCBtID0gMDsgbSA8IFdURl9BUlJBWV9MRU5HVEgoV1RGOjpt
b250aE5hbWUpOyArK20pCisgICAgICAgICAgICAgICAgbGFiZWxzLT5hcHBlbmQoV1RGOjptb250
aE5hbWVbbV0pOworICAgICAgICAgICAgcmV0dXJuIGxhYmVscy5yZWxlYXNlKCk7CisgICAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIGxhYmVscy5yZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBjb25z
dCBWZWN0b3I8U3RyaW5nPiYgc2hvcnRNb250aExhYmVscygpCit7CisgICAgc3RhdGljIFZlY3Rv
cjxTdHJpbmc+KiBsYWJlbHMgPSBjcmVhdGVTaG9ydE1vbnRoTGFiZWxzKCkubGVha1B0cigpOwor
ICAgIHJldHVybiAqbGFiZWxzOworfQorCitzdGF0aWMgaW50IGN1cnJlbnRZZWFyKCkKK3sKKyAg
ICBzdHJ1Y3QgdG0gdG07CisgICAgZ2V0Q3VycmVudExvY2FsVGltZSgmdG0pOworICAgIHJldHVy
biB0bS50bV95ZWFyICsgMTkwMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gVG9rZW5pemVkIGRhdGUgZm9ybWF0CisKK3N0cnVjdCBEYXRlRm9ybWF0VG9rZW4gewor
ICAgIGVudW0gVHlwZSB7CisgICAgICAgIExpdGVyYWwsCisgICAgICAgIERheTEsCisgICAgICAg
IERheTIsCisgICAgICAgIE1vbnRoMSwKKyAgICAgICAgTW9udGgyLAorICAgICAgICBNb250aDMs
CisgICAgICAgIE1vbnRoNCwKKyAgICAgICAgWWVhcjEsCisgICAgICAgIFllYXIyLAorICAgICAg
ICBZZWFyNCwKKyAgICB9OworICAgIFR5cGUgdHlwZTsKKyAgICBTdHJpbmcgZGF0YTsgLy8gVGhp
cyBpcyB2YWxpZCBvbmx5IGlmIHR5cGU9PUxpdGVyYWwuCisKKyAgICBEYXRlRm9ybWF0VG9rZW4o
VHlwZSB0eXBlKQorICAgICAgICA6IHR5cGUodHlwZSkKKyAgICB7IH0KKworICAgIERhdGVGb3Jt
YXRUb2tlbihjb25zdCBTdHJpbmcmIGRhdGEpCisgICAgICAgIDogdHlwZShMaXRlcmFsKQorICAg
ICAgICAsIGRhdGEoZGF0YSkKKyAgICB7IH0KKworICAgIERhdGVGb3JtYXRUb2tlbihjb25zdCBE
YXRlRm9ybWF0VG9rZW4mIHRva2VuKQorICAgICAgICA6IHR5cGUodG9rZW4udHlwZSkKKyAgICAg
ICAgLCBkYXRhKHRva2VuLmRhdGEpCisgICAgeyB9Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wg
aXNFcmFTeW1ib2woVUNoYXIgbGV0dGVyKSB7IHJldHVybiBsZXR0ZXIgPT0gJ2cnOyB9CitzdGF0
aWMgaW5saW5lIGJvb2wgaXNZZWFyU3ltYm9sKFVDaGFyIGxldHRlcikgeyByZXR1cm4gbGV0dGVy
ID09ICd5JzsgfQorc3RhdGljIGlubGluZSBib29sIGlzTW9udGhTeW1ib2woVUNoYXIgbGV0dGVy
KSB7IHJldHVybiBsZXR0ZXIgPT0gJ00nOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNEYXlTeW1i
b2woVUNoYXIgbGV0dGVyKSB7IHJldHVybiBsZXR0ZXIgPT0gJ2QnOyB9CisKK3N0YXRpYyB1bnNp
Z25lZCBjb3VudENvbnRpbnVvdXNMZXR0ZXJzKGNvbnN0IFN0cmluZyYgZm9ybWF0LCB1bnNpZ25l
ZCBpKQoreworICAgIHVuc2lnbmVkIGNvdW50ID0gMTsKKyAgICBVQ2hhciByZWZlcmVuY2UgPSBm
b3JtYXRbaV07CisgICAgd2hpbGUgKGkgKyAxIDwgZm9ybWF0Lmxlbmd0aCgpKSB7CisgICAgICAg
IGlmIChmb3JtYXRbKytpXSAhPSByZWZlcmVuY2UpCisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgKytjb3VudDsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCBj
b21taXRMaXRlcmFsVG9rZW4oU3RyaW5nQnVpbGRlciYgbGl0ZXJhbEJ1ZmZlciwgVmVjdG9yPERh
dGVGb3JtYXRUb2tlbj4mIHRva2VucykKK3sKKyAgICBpZiAobGl0ZXJhbEJ1ZmZlci5sZW5ndGgo
KSA8PSAwKQorICAgICAgICByZXR1cm47CisgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0VG9r
ZW4obGl0ZXJhbEJ1ZmZlci50b1N0cmluZygpKSk7CisgICAgbGl0ZXJhbEJ1ZmZlci5jbGVhcigp
OworfQorCisvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2Rk
MzE3Nzg3KHY9dnMuODUpLmFzcHgKK3N0YXRpYyBWZWN0b3I8RGF0ZUZvcm1hdFRva2VuPiBwYXJz
ZURhdGVGb3JtYXQoY29uc3QgU3RyaW5nIGZvcm1hdCkKK3sKKyAgICBWZWN0b3I8RGF0ZUZvcm1h
dFRva2VuPiB0b2tlbnM7CisgICAgU3RyaW5nQnVpbGRlciBsaXRlcmFsQnVmZmVyOworICAgIGJv
b2wgaW5RdW90ZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtYXQu
bGVuZ3RoKCk7ICsraSkgeworICAgICAgICBVQ2hhciBjaCA9IGZvcm1hdFtpXTsKKyAgICAgICAg
aWYgKGluUXVvdGUpIHsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXCcnKSB7CisgICAgICAgICAg
ICAgICAgaW5RdW90ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIEFTU0VSVChpKTsKKyAgICAg
ICAgICAgICAgICBpZiAoZm9ybWF0W2kgLSAxXSA9PSAnXCcnKQorICAgICAgICAgICAgICAgICAg
ICBsaXRlcmFsQnVmZmVyLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgICAgIGxpdGVyYWxCdWZmZXIuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoID09ICdcJycpIHsKKyAgICAgICAgICAgIGlu
UXVvdGUgPSB0cnVlOworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGZvcm1hdFtpLTFdID09ICdc
JycpCisgICAgICAgICAgICAgICAgbGl0ZXJhbEJ1ZmZlci5hcHBlbmQoY2gpOworICAgICAgICB9
IGVsc2UgaWYgKGlzWWVhclN5bWJvbChjaCkpIHsKKyAgICAgICAgICAgIGNvbW1pdExpdGVyYWxU
b2tlbihsaXRlcmFsQnVmZmVyLCB0b2tlbnMpOworICAgICAgICAgICAgdW5zaWduZWQgY291bnQg
PSBjb3VudENvbnRpbnVvdXNMZXR0ZXJzKGZvcm1hdCwgaSk7CisgICAgICAgICAgICBpICs9IGNv
dW50IC0gMTsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKQorICAgICAgICAgICAgICAgIHRv
a2Vucy5hcHBlbmQoRGF0ZUZvcm1hdFRva2VuKERhdGVGb3JtYXRUb2tlbjo6WWVhcjEpKTsKKyAg
ICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID09IDIpCisgICAgICAgICAgICAgICAgdG9rZW5zLmFw
cGVuZChEYXRlRm9ybWF0VG9rZW4oRGF0ZUZvcm1hdFRva2VuOjpZZWFyMikpOworICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoRGF0ZUZvcm1hdFRva2VuKERh
dGVGb3JtYXRUb2tlbjo6WWVhcjQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc01vbnRoU3ltYm9s
KGNoKSkgeworICAgICAgICAgICAgY29tbWl0TGl0ZXJhbFRva2VuKGxpdGVyYWxCdWZmZXIsIHRv
a2Vucyk7CisgICAgICAgICAgICB1bnNpZ25lZCBjb3VudCA9IGNvdW50Q29udGludW91c0xldHRl
cnMoZm9ybWF0LCBpKTsKKyAgICAgICAgICAgIGkgKz0gY291bnQgLSAxOworICAgICAgICAgICAg
aWYgKGNvdW50ID09IDEpCisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0
VG9rZW4oRGF0ZUZvcm1hdFRva2VuOjpNb250aDEpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNv
dW50ID09IDIpCisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0VG9rZW4o
RGF0ZUZvcm1hdFRva2VuOjpNb250aDIpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID09
IDMpCisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0VG9rZW4oRGF0ZUZv
cm1hdFRva2VuOjpNb250aDMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0
b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0VG9rZW46Ok1vbnRoNCkpOwor
ICAgICAgICB9IGVsc2UgaWYgKGlzRGF5U3ltYm9sKGNoKSkgeworICAgICAgICAgICAgY29tbWl0
TGl0ZXJhbFRva2VuKGxpdGVyYWxCdWZmZXIsIHRva2Vucyk7CisgICAgICAgICAgICB1bnNpZ25l
ZCBjb3VudCA9IGNvdW50Q29udGludW91c0xldHRlcnMoZm9ybWF0LCBpKTsKKyAgICAgICAgICAg
IGkgKz0gY291bnQgLSAxOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpCisgICAgICAgICAg
ICAgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0VG9rZW4oRGF0ZUZvcm1hdFRva2VuOjpEYXkx
KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChEYXRl
Rm9ybWF0VG9rZW4oRGF0ZUZvcm1hdFRva2VuOjpEYXkyKSk7CisgICAgICAgIH0gZWxzZSBpZiAo
aXNFcmFTeW1ib2woY2gpKSB7CisgICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSBlcmEuCisgICAg
ICAgICAgICAvLyBIVE1MNSBkYXRlIHN1cHBvcnRzIG9ubHkgQS5ELgorICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgIGxpdGVyYWxCdWZmZXIuYXBwZW5kKGNoKTsKKyAgICB9CisgICAgY29tbWl0
TGl0ZXJhbFRva2VuKGxpdGVyYWxCdWZmZXIsIHRva2Vucyk7CisgICAgcmV0dXJuIHRva2VuczsK
K30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFyc2luZworCisvLyBS
ZXR1cm5zIC0xIGlmIHBhcnNpbmcgZmFpbHMuCitzdGF0aWMgaW50IHBhcnNlTnVtYmVyKGNvbnN0
IFN0cmluZyYgaW5wdXQsIHVuc2lnbmVkJiBpbmRleCkKK3sKKyAgICB1bnNpZ25lZCBkaWdpdHNT
dGFydCA9IGluZGV4OworICAgIHdoaWxlIChpbmRleCA8IGlucHV0Lmxlbmd0aCgpICYmIGlzQVND
SUlEaWdpdChpbnB1dFtpbmRleF0pKQorICAgICAgICBpbmRleCsrOworICAgIGlmIChkaWdpdHNT
dGFydCA9PSBpbmRleCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGJvb2wgb2sgPSBmYWxzZTsK
KyAgICBpbnQgbnVtYmVyID0gaW5wdXQuc3Vic3RyaW5nKGRpZ2l0c1N0YXJ0LCBpbmRleCAtIGRp
Z2l0c1N0YXJ0KS50b0ludCgmb2spOworICAgIHJldHVybiBvayA/IG51bWJlciA6IC0xOworfQor
CisvLyBSZXR1cm5zIDAtYmFzZWQgbW9udGggbnVtYmVyLiBSZXR1cm5zIC0xIGlmIHBhcnNpbmcg
ZmFpbHMuCitzdGF0aWMgaW50IHBhcnNlTnVtYmVyT3JNb250aChjb25zdCBTdHJpbmcmIGlucHV0
LCB1bnNpZ25lZCYgaW5kZXgpCit7CisgICAgaW50IHJlc3VsdCA9IHBhcnNlTnVtYmVyKGlucHV0
LCBpbmRleCk7CisgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAgIGlmIChyZXN1bHQgPCAx
IHx8IHJlc3VsdCA+IDEyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4g
cmVzdWx0IC0gMTsKKyAgICB9CisgICAgY29uc3QgVmVjdG9yPFN0cmluZz4mIHNob3J0TGFiZWxz
ID0gc2hvcnRNb250aExhYmVscygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAxMjsg
KytpKSB7CisgICAgICAgIGlmIChpbnB1dC5zdWJzdHJpbmcoaW5kZXgsIHNob3J0TGFiZWxzW2ld
Lmxlbmd0aCgpKSA9PSBzaG9ydExhYmVsc1tpXSkgeworICAgICAgICAgICAgaW5kZXggKz0gc2hv
cnRMYWJlbHNbaV0ubGVuZ3RoKCk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICBjb25zdCBWZWN0b3I8U3RyaW5nPiYgbGFiZWxzID0gbW9udGhMYWJlbHMoKTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMTI7ICsraSkgeworICAgICAgICBpZiAoaW5w
dXQuc3Vic3RyaW5nKGluZGV4LCBsYWJlbHNbaV0ubGVuZ3RoKCkpID09IGxhYmVsc1tpXSkgewor
ICAgICAgICAgICAgaW5kZXggKz0gbGFiZWxzW2ldLmxlbmd0aCgpOworICAgICAgICAgICAgcmV0
dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgZG91
YmxlIHBhcnNlRGF0ZShjb25zdCBTdHJpbmcmIGlucHV0KQoreworICAgIGNvbnN0IGRvdWJsZSBO
YU4gPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKKyAgICBWZWN0b3I8RGF0
ZUZvcm1hdFRva2VuPiB0b2tlbnMgPSBwYXJzZURhdGVGb3JtYXQoZ2V0TG9jYWxlSW5mb1N0cmlu
ZyhMT0NBTEVfU1NIT1JUREFURSkpOworICAgIHVuc2lnbmVkIGlucHV0SW5kZXggPSAwOworICAg
IGludCBkYXkgPSAtMSwgbW9udGggPSAtMSwgeWVhciA9IC0xOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3dpdGNoICh0b2tlbnNb
aV0udHlwZSkgeworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TGl0ZXJhbDogeworICAg
ICAgICAgICAgU3RyaW5nIGRhdGEgPSB0b2tlbnNbaV0uZGF0YTsKKyAgICAgICAgICAgIGlmIChp
bnB1dC5zdWJzdHJpbmcoaW5wdXRJbmRleCwgZGF0YS5sZW5ndGgoKSkgPT0gZGF0YSkKKyAgICAg
ICAgICAgICAgICBpbnB1dEluZGV4ICs9IGRhdGEubGVuZ3RoKCk7CisgICAgICAgICAgICAvLyBH
byBhaGVhZCBldmVuIGlmIHRoZSBpbnB1dCBkb2Vzbid0IGhhdmUgdGhpcyBzdHJpbmcuCisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OkRheTE6CisgICAg
ICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpEYXkyOgorICAgICAgICAgICAgZGF5ID0gcGFyc2VO
dW1iZXIoaW5wdXQsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgaWYgKGRheSA8IDEgfHwgZGF5
ID4gMzEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGgxOgorICAgICAgICBjYXNlIERhdGVG
b3JtYXRUb2tlbjo6TW9udGgyOgorICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGgz
OgorICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGg0OgorICAgICAgICAgICAgbW9u
dGggPSBwYXJzZU51bWJlck9yTW9udGgoaW5wdXQsIGlucHV0SW5kZXgpOworICAgICAgICAgICAg
aWYgKG1vbnRoIDwgMCB8fCBtb250aCA+IDExKQorICAgICAgICAgICAgICAgIHJldHVybiBOYU47
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OlllYXIx
OiB7CisgICAgICAgICAgICB1bnNpZ25lZCBvbGRJbmRleCA9IGlucHV0SW5kZXg7CisgICAgICAg
ICAgICB5ZWFyID0gcGFyc2VOdW1iZXIoaW5wdXQsIGlucHV0SW5kZXgpOworICAgICAgICAgICAg
aWYgKHllYXIgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTmFOOworICAgICAgICAgICAg
aWYgKGlucHV0SW5kZXggLSBvbGRJbmRleCA9PSAxKSB7CisgICAgICAgICAgICAgICAgaW50IHRo
aXNZZWFyID0gY3VycmVudFllYXIoKTsKKyAgICAgICAgICAgICAgICBpbnQgc2hvcnRZZWFyID0g
dGhpc1llYXIgJSAxMDsKKyAgICAgICAgICAgICAgICBpbnQgZGVjYWRlID0gdGhpc1llYXIgLSBz
aG9ydFllYXI7CisgICAgICAgICAgICAgICAgaWYgKHNob3J0WWVhciA+PSA1KQorICAgICAgICAg
ICAgICAgICAgICB5ZWFyICs9IHNob3J0WWVhciAtIDQgPD0geWVhciA/IGRlY2FkZSA6IGRlY2Fk
ZSArIDEwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeWVhciAr
PSBzaG9ydFllYXIgKyA1ID49IHllYXIgPyBkZWNhZGUgOiBkZWNhZGUgLSAxMDsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRGF0ZUZv
cm1hdFRva2VuOjpZZWFyMjogeworICAgICAgICAgICAgdW5zaWduZWQgb2xkSW5kZXggPSBpbnB1
dEluZGV4OworICAgICAgICAgICAgeWVhciA9IHBhcnNlTnVtYmVyKGlucHV0LCBpbnB1dEluZGV4
KTsKKyAgICAgICAgICAgIGlmICh5ZWFyIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5h
TjsKKyAgICAgICAgICAgIGlmIChpbnB1dEluZGV4IC0gb2xkSW5kZXggPT0gMikgeworICAgICAg
ICAgICAgICAgIGludCB0aGlzWWVhciA9IGN1cnJlbnRZZWFyKCk7CisgICAgICAgICAgICAgICAg
aW50IHNob3J0WWVhciA9IHRoaXNZZWFyICUgMTAwOworICAgICAgICAgICAgICAgIGludCBjZW50
dXJ5ID0gdGhpc1llYXIgLSBzaG9ydFllYXI7CisgICAgICAgICAgICAgICAgaWYgKHNob3J0WWVh
ciA+PSA1MCkKKyAgICAgICAgICAgICAgICAgICAgeWVhciArPSBzaG9ydFllYXIgLSA0OSA8PSB5
ZWFyID8gY2VudHVyeSA6IGNlbnR1cnkgKyAxMDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICB5ZWFyICs9IHNob3J0WWVhciArIDUwID49IHllYXIgPyBjZW50dXJ5
IDogY2VudHVyeSAtIDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpZZWFyNDoKKyAgICAgICAgICAg
IHllYXIgPSBwYXJzZU51bWJlcihpbnB1dCwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICBpZiAo
eWVhciA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOYU47CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoeWVhciA8PSAwIHx8IG1vbnRoIDwgMCB8fCBk
YXkgPD0gMCkKKyAgICAgICAgcmV0dXJuIE5hTjsKKyAgICByZXR1cm4gZGF0ZVRvRGF5c0Zyb20x
OTcwKHllYXIsIG1vbnRoLCBkYXkpICogbXNQZXJEYXk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIEZvcm1hdHRpbmcKKworc3RhdGljIGlubGluZSB2b2lkIGFwcGVu
ZE51bWJlcihpbnQgdmFsdWUsIFN0cmluZ0J1aWxkZXImIGJ1ZmZlcikKK3sKKyAgICBidWZmZXIu
YXBwZW5kKFN0cmluZzo6bnVtYmVyKHZhbHVlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZFR3
b0RpZ2l0TnVtYmVyKGludCB2YWx1ZSwgU3RyaW5nQnVpbGRlciYgYnVmZmVyKQoreworICAgIGlm
ICh2YWx1ZSA8IDEwKQorICAgICAgICBidWZmZXIuYXBwZW5kKCIwIik7CisgICAgYnVmZmVyLmFw
cGVuZChTdHJpbmc6Om51bWJlcih2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRGb3Vy
RGlnaXROdW1iZXIoaW50IHZhbHVlLCBTdHJpbmdCdWlsZGVyJiBidWZmZXIpCit7CisgICAgaWYg
KHZhbHVlIDwgMTApCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjAwMCIpOworICAgIGVsc2UgaWYg
KHZhbHVlIDwgMTAwKQorICAgICAgICBidWZmZXIuYXBwZW5kKCIwMCIpOworICAgIGVsc2UgaWYg
KHZhbHVlIDwgMTAwMCkKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiMCIpOworICAgIGJ1ZmZlci5h
cHBlbmQoU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKK30KKworc3RhdGljIFN0cmluZyBmb3JtYXRE
YXRlKGNvbnN0IERhdGVDb21wb25lbnRzJiBkYXRlQ29tcG9uZW50cykKK3sKKyAgICBWZWN0b3I8
RGF0ZUZvcm1hdFRva2VuPiB0b2tlbnMgPSBwYXJzZURhdGVGb3JtYXQoZ2V0TG9jYWxlSW5mb1N0
cmluZyhMT0NBTEVfU1NIT1JUREFURSkpOworICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAg
c3dpdGNoICh0b2tlbnNbaV0udHlwZSkgeworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6
TGl0ZXJhbDoKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodG9rZW5zW2ldLmRhdGEpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpEYXkxOgorICAg
ICAgICAgICAgYXBwZW5kTnVtYmVyKGRhdGVDb21wb25lbnRzLm1vbnRoRGF5KCksIGJ1ZmZlcik7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OkRheTI6
CisgICAgICAgICAgICBhcHBlbmRUd29EaWdpdE51bWJlcihkYXRlQ29tcG9uZW50cy5tb250aERh
eSgpLCBidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1h
dFRva2VuOjpNb250aDE6CisgICAgICAgICAgICBhcHBlbmROdW1iZXIoZGF0ZUNvbXBvbmVudHMu
bW9udGgoKSArIDEsIGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBE
YXRlRm9ybWF0VG9rZW46Ok1vbnRoMjoKKyAgICAgICAgICAgIGFwcGVuZFR3b0RpZ2l0TnVtYmVy
KGRhdGVDb21wb25lbnRzLm1vbnRoKCkgKyAxLCBidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpNb250aDM6CisgICAgICAgICAgICBidWZm
ZXIuYXBwZW5kKHNob3J0TW9udGhMYWJlbHMoKVtkYXRlQ29tcG9uZW50cy5tb250aCgpXSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46Ok1vbnRoNDoK
KyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobW9udGhMYWJlbHMoKVtkYXRlQ29tcG9uZW50cy5t
b250aCgpXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9r
ZW46OlllYXIxOiB7CisgICAgICAgICAgICBpbnQgdGhpc1llYXIgPSBjdXJyZW50WWVhcigpOwor
ICAgICAgICAgICAgaW50IHllYXIgPSBkYXRlQ29tcG9uZW50cy5mdWxsWWVhcigpOworICAgICAg
ICAgICAgaWYgKHRoaXNZZWFyIC0gNCA8PSB5ZWFyICYmIHllYXIgPD0gdGhpc1llYXIgKyA1KQor
ICAgICAgICAgICAgICAgIGFwcGVuZE51bWJlcih5ZWFyICUgMTAsIGJ1ZmZlcik7CisgICAgICAg
ICAgICBhcHBlbmRGb3VyRGlnaXROdW1iZXIoeWVhciwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpZZWFyMjogewor
ICAgICAgICAgICAgaW50IHRoaXNZZWFyID0gY3VycmVudFllYXIoKTsKKyAgICAgICAgICAgIGlu
dCB5ZWFyID0gZGF0ZUNvbXBvbmVudHMuZnVsbFllYXIoKTsKKyAgICAgICAgICAgIGlmICh0aGlz
WWVhciAtIDQ5IDw9IHllYXIgJiYgeWVhciA8PSB0aGlzWWVhciArIDUwKQorICAgICAgICAgICAg
ICAgIGFwcGVuZFR3b0RpZ2l0TnVtYmVyKHllYXIgJSAxMDAsIGJ1ZmZlcik7CisgICAgICAgICAg
ICBhcHBlbmRGb3VyRGlnaXROdW1iZXIoeWVhciwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpZZWFyNDoKKyAgICAg
ICAgICAgIGFwcGVuZE51bWJlcihkYXRlQ29tcG9uZW50cy5mdWxsWWVhcigpLCBidWZmZXIpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlci50
b1N0cmluZygpOworfQorCitkb3VibGUgcGFyc2VMb2NhbGl6ZWREYXRlKGNvbnN0IFN0cmluZyYg
aW5wdXQsIERhdGVDb21wb25lbnRzOjpUeXBlIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7
CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6RGF0ZToKKyAgICAgICAgcmV0dXJuIHBhcnNlRGF0
ZShpbnB1dCk7CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6RGF0ZVRpbWU6CisgICAgY2FzZSBE
YXRlQ29tcG9uZW50czo6RGF0ZVRpbWVMb2NhbDoKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpN
b250aDoKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpUaW1lOgorICAgIGNhc2UgRGF0ZUNvbXBv
bmVudHM6OldlZWs6CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6SW52YWxpZDoKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICAgIHJldHVybiBudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9O
YU4oKTsKK30KKworU3RyaW5nIGZvcm1hdExvY2FsaXplZERhdGUoY29uc3QgRGF0ZUNvbXBvbmVu
dHMmIGRhdGVDb21wb25lbnRzKQoreworICAgIHN3aXRjaCAoZGF0ZUNvbXBvbmVudHMudHlwZSgp
KSB7CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6RGF0ZToKKyAgICAgICAgcmV0dXJuIGZvcm1h
dERhdGUoZGF0ZUNvbXBvbmVudHMpOworICAgIGNhc2UgRGF0ZUNvbXBvbmVudHM6OkRhdGVUaW1l
OgorICAgIGNhc2UgRGF0ZUNvbXBvbmVudHM6OkRhdGVUaW1lTG9jYWw6CisgICAgY2FzZSBEYXRl
Q29tcG9uZW50czo6TW9udGg6CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6VGltZToKKyAgICBj
YXNlIERhdGVDb21wb25lbnRzOjpXZWVrOgorICAgIGNhc2UgRGF0ZUNvbXBvbmVudHM6OkludmFs
aWQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKKyNp
ZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VSKQorU3RyaW5nIGxvY2FsaXplZERhdGVGb3JtYXRUZXh0
KCkKK3sKKyAgICBWZWN0b3I8RGF0ZUZvcm1hdFRva2VuPiB0b2tlbnMgPSBwYXJzZURhdGVGb3Jt
YXQoZ2V0TG9jYWxlSW5mb1N0cmluZyhMT0NBTEVfU1NIT1JUREFURSkpOworICAgIFN0cmluZ0J1
aWxkZXIgYnVmZmVyOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgc3dpdGNoICh0b2tlbnNbaV0udHlwZSkgeworICAgICAgICBjYXNl
IERhdGVGb3JtYXRUb2tlbjo6TGl0ZXJhbDoKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodG9r
ZW5zW2ldLmRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1h
dFRva2VuOjpEYXkxOgorICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6RGF5MjogeworICAg
ICAgICAgICAgU3RyaW5nIGRheVRleHQgPSBkYXRlRm9ybWF0RGF5SW5Nb250aFRleHQoKTsKKyAg
ICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZGF5VGV4dC5pc0VtcHR5KCkgPyAiRGF5IiA6IGRheVRl
eHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBEYXRlRm9y
bWF0VG9rZW46Ok1vbnRoMToKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46Ok1vbnRoMjoK
KyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46Ok1vbnRoMzoKKyAgICAgICAgY2FzZSBEYXRl
Rm9ybWF0VG9rZW46Ok1vbnRoNDogeworICAgICAgICAgICAgU3RyaW5nIG1vbnRoVGV4dCA9IGRh
dGVGb3JtYXRNb250aFRleHQoKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobW9udGhUZXh0
LmlzRW1wdHkoKSA/ICJNb250aCIgOiBtb250aFRleHQpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OlllYXIxOgorICAgICAgICBj
YXNlIERhdGVGb3JtYXRUb2tlbjo6WWVhcjI6CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2Vu
OjpZZWFyNDogeworICAgICAgICAgICAgU3RyaW5nIHllYXJUZXh0ID0gZGF0ZUZvcm1hdFllYXJU
ZXh0KCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHllYXJUZXh0LmlzRW1wdHkoKSA/ICJZ
ZWFyIiA6IHllYXJUZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworfQorCitzdGF0aWMgUGFz
c093blB0cjxWZWN0b3I8U3RyaW5nPiA+IGNyZWF0ZU1vbnRoTGFiZWxzKCkKK3sKKyAgICBjb25z
dCBMQ1RZUEUgdHlwZXNbMTJdID0geworICAgICAgICBMT0NBTEVfU01PTlRITkFNRTEsCisgICAg
ICAgIExPQ0FMRV9TTU9OVEhOQU1FMiwKKyAgICAgICAgTE9DQUxFX1NNT05USE5BTUUzLAorICAg
ICAgICBMT0NBTEVfU01PTlRITkFNRTQsCisgICAgICAgIExPQ0FMRV9TTU9OVEhOQU1FNSwKKyAg
ICAgICAgTE9DQUxFX1NNT05USE5BTUU2LAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTcsCisg
ICAgICAgIExPQ0FMRV9TTU9OVEhOQU1FOCwKKyAgICAgICAgTE9DQUxFX1NNT05USE5BTUU5LAor
ICAgICAgICBMT0NBTEVfU01PTlRITkFNRTEwLAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTEx
LAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTEyLAorICAgIH07CisgICAgT3duUHRyPFZlY3Rv
cjxTdHJpbmc+ID4gbGFiZWxzID0gYWRvcHRQdHIobmV3IFZlY3RvcjxTdHJpbmc+KTsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSCh0eXBlcyk7ICsraSkgewor
ICAgICAgICBsYWJlbHMtPmFwcGVuZChnZXRMb2NhbGVJbmZvU3RyaW5nKHR5cGVzW2ldKSk7Cisg
ICAgICAgIGlmIChsYWJlbHMtPmxhc3QoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxhYmVs
cy0+c2hyaW5rKDApOworICAgICAgICAgICAgbGFiZWxzLT5yZXNlcnZlQ2FwYWNpdHkoMTIpOwor
ICAgICAgICAgICAgbGFiZWxzLT5hcHBlbmQoIkphbnVhcnkiKTsKKyAgICAgICAgICAgIGxhYmVs
cy0+YXBwZW5kKCJGZWJydWFyeSIpOworICAgICAgICAgICAgbGFiZWxzLT5hcHBlbmQoIk1hcmNo
Iik7CisgICAgICAgICAgICBsYWJlbHMtPmFwcGVuZCgiQXByaWwiKTsKKyAgICAgICAgICAgIGxh
YmVscy0+YXBwZW5kKCJNYXkiKTsKKyAgICAgICAgICAgIGxhYmVscy0+YXBwZW5kKCJKdW5lIik7
CisgICAgICAgICAgICBsYWJlbHMtPmFwcGVuZCgiSnVseSIpOworICAgICAgICAgICAgbGFiZWxz
LT5hcHBlbmQoIkF1Z3VzdCIpOworICAgICAgICAgICAgbGFiZWxzLT5hcHBlbmQoIlNlcHRlbWJl
ciIpOworICAgICAgICAgICAgbGFiZWxzLT5hcHBlbmQoIk9jdG9iZXIiKTsKKyAgICAgICAgICAg
IGxhYmVscy0+YXBwZW5kKCJOb3ZlbWJlciIpOworICAgICAgICAgICAgbGFiZWxzLT5hcHBlbmQo
IkRlY2VtYmVyIik7CisgICAgICAgICAgICByZXR1cm4gbGFiZWxzLnJlbGVhc2UoKTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gbGFiZWxzLnJlbGVhc2UoKTsKK30KKworY29uc3QgVmVj
dG9yPFN0cmluZz4mIG1vbnRoTGFiZWxzKCkKK3sKKyAgICBzdGF0aWMgVmVjdG9yPFN0cmluZz4q
IGxhYmVscyA9IGNyZWF0ZU1vbnRoTGFiZWxzKCkubGVha1B0cigpOworICAgIHJldHVybiAqbGFi
ZWxzOworfQorCitzdGF0aWMgUGFzc093blB0cjxWZWN0b3I8U3RyaW5nPiA+IGNyZWF0ZVdlZWtE
YXlTaG9ydExhYmVscygpCit7CisgICAgY29uc3QgTENUWVBFIHR5cGVzWzddID0geworICAgICAg
ICBMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCAvLyBTdW5kYXkKKyAgICAgICAgTE9DQUxFX1NBQkJS
RVZEQVlOQU1FMSwgLy8gTW9uZGF5CisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsCisg
ICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZ
TkFNRTQsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsCisgICAgICAgIExPQ0FMRV9T
QUJCUkVWREFZTkFNRTYKKyAgICB9OworICAgIE93blB0cjxWZWN0b3I8U3RyaW5nPiA+IGxhYmVs
cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8U3RyaW5nPik7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IFdURl9BUlJBWV9MRU5HVEgodHlwZXMpOyArK2kpIHsKKyAgICAgICAgbGFiZWxzLT5h
cHBlbmQoZ2V0TG9jYWxlSW5mb1N0cmluZyh0eXBlc1tpXSkpOworICAgICAgICBpZiAobGFiZWxz
LT5sYXN0KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsYWJlbHMtPnNocmluaygwKTsKKyAg
ICAgICAgICAgIGxhYmVscy0+cmVzZXJ2ZUNhcGFjaXR5KFdURl9BUlJBWV9MRU5HVEgoV1RGOjp3
ZWVrZGF5TmFtZSkpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCB3ID0gMDsgdyA8IFdURl9B
UlJBWV9MRU5HVEgoV1RGOjp3ZWVrZGF5TmFtZSk7ICsrdykgeworICAgICAgICAgICAgICAgIC8v
IHdlZWtkYXlOYW1lIHN0YXJ0cyB3aXRoIE1vbmRheS4KKyAgICAgICAgICAgICAgICBsYWJlbHMt
PmFwcGVuZChXVEY6OndlZWtkYXlOYW1lWyh3ICsgNikgJSA3XSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICByZXR1cm4gbGFiZWxzLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICByZXR1cm4gbGFiZWxzLnJlbGVhc2UoKTsKK30KKworY29uc3QgVmVjdG9yPFN0cmluZz4mIHdl
ZWtEYXlTaG9ydExhYmVscygpCit7CisgICAgc3RhdGljIFZlY3RvcjxTdHJpbmc+KiBsYWJlbHMg
PSBjcmVhdGVXZWVrRGF5U2hvcnRMYWJlbHMoKS5sZWFrUHRyKCk7CisgICAgcmV0dXJuICpsYWJl
bHM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjcmVhdGVGaXJzdERheU9mV2VlaygpCit7CisgICAg
RFdPUkQgdmFsdWUgPSAwOworICAgIDo6R2V0TG9jYWxlSW5mbyhkZWZhdWx0TENJRCgpLCBMT0NB
TEVfSUZJUlNUREFZT0ZXRUVLIHwgTE9DQUxFX1JFVFVSTl9OVU1CRVIsIHJlaW50ZXJwcmV0X2Nh
c3Q8TFBXU1RSPigmdmFsdWUpLCBzaXplb2YodmFsdWUpIC8gc2l6ZW9mKFRDSEFSKSk7CisgICAg
Ly8gMDpNb25kYXksIC4uLiwgNjpTdW5kYXkuCisgICAgLy8gV2UgbmVlZCAxIGZvciBNb25kYXks
IDAgZm9yIFN1bmRheS4KKyAgICByZXR1cm4gKHZhbHVlICsgMSkgJSA3OworfQorCit1bnNpZ25l
ZCBmaXJzdERheU9mV2VlaygpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGZpcnN0RGF5T2ZXZWVr
ID0gY3JlYXRlRmlyc3REYXlPZldlZWsoKTsKKyAgICByZXR1cm4gZmlyc3REYXlPZldlZWs7Cit9
CisjZW5kaWYKKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>139136</attachid>
            <date>2012-04-26 23:11:27 -0700</date>
            <delta_ts>2012-04-30 22:20:44 -0700</delta_ts>
            <desc>Patch 2</desc>
            <filename>bug-84935-20120427151125.patch</filename>
            <type>text/plain</type>
            <size>42467</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTE1Mzg4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOWNmZDhiZTA2NzYwYTdm
NDVjMjZlYWI0Yzk2MjY2ZDBhYjZlNzMwNS4uYmZiNzFhMmQ1NmMwZDQwNjZhOTU0MzNlN2EzOTFl
NDQyODliNTEzYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDgyIEBACisyMDEyLTA0LTI2ICBLZW50
IFRhbXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KKworICAgICAgICBbQ2hyb21pdW0vV2luZG93
c10gQWRkIExvY2FsaXplZERhdGVXaW4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTg0OTM1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgTG9jYWxpemVkRGF0ZUlDVS5jcHAgZG9lc24ndCByZWZsZWN0IHN5c3Rl
bSBzZXR0aW5ncy4gU28gdGhlcmUgd2VyZSBzb21lCisgICAgICAgIHByb2JsZW1zIHN1Y2ggYXMg
PGlucHV0IHR5cGU9ZGF0ZT4gZG9lc24ndCB1c2Ugc3lzdGVtJ3MgZGF0ZSBmb3JtYXQuCisKKyAg
ICAgICAgV2UgbmVlZCB0byB1c2UgV2luZG93cyBBUEkgdG8gZ2V0IGEgZGF0ZSBmb3JtYXQgYW5k
IGNhbGVuZGFyIHBhcmFtZXRlcnMuCisKKyAgICAgICAgV2Ugb2J0YWluIGEgZGF0ZSBmb3JtYXQg
bGlrZSAiTU0vZGQveXkiIHZpYSBXaW5kb3dzIEFQSSwgYW5kCisgICAgICAgIGZvcm1hdC9wYXJz
ZSBkYXRlcyBmb3IgdGhlIGZvcm1hdCBieSBvdXIgb3duIGNvZGUgYmVjYXVzZSBXaW5kb3dzIEFQ
SQorICAgICAgICBjYW4ndCBoYW5kbGUgeWVhcnMgb2xkZXIgdGhhbiAxNjAxIGFuZCBkb2Vzbid0
IGhhdmUgZGF0ZSBwYXJzaW5nIEFQSS4KKworICAgICAgICBVbml0IHRlc3Q6IFNvdXJjZS9XZWJL
aXQvY2hyb21pdW0vdGVzdHMvTG9jYWxlV2luVGVzdC5jcHAKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaTogQWRkIExvY2FsaXplZERhdGVXaW4uY3BwLgorICAgICAgICAqIFdlYkNvcmUuZ3lwL1dl
YkNvcmUuZ3lwOgorICAgICAgICBGb3IgV2luZG93cywgcmVtb3ZlIExvY2FsaXplZERhdGVJQ1Uu
Y3BwIGFuZCBhZGQgTG9jYWxpemVkRGF0ZVdpbi5jcHAuCisgICAgICAgIEFsbCBvZiAqV2luLmNw
cCBmaWxlcyBhcmUgZXhjbHVkZWQgYnkgZGVmYXVsdC4KKworICAgICAgICAqIHBsYXRmb3JtL3Rl
eHQvTG9jYWxlV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46Okxv
Y2FsZVdpbik6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46OmNyZWF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpMb2NhbGVXaW46OmN1cnJlbnRMb2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6
TG9jYWxlV2luOjp+TG9jYWxlV2luKToKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsZVdpbjo6Z2V0
TG9jYWxlSW5mb1N0cmluZyk6CisgICAgICAgIEEgaGVscGVyIGZ1bmN0aW9uIHRvIG9idGFpbiBh
IHN0cmluZyBieSBHZXRMb2NhbGVJbmZvKCkuCisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46
OmluaXRpYWxpemVTaG9ydE1vbnRoTGFiZWxzKToKKyAgICAgICAgT2J0YWluIHNob3J0IG1vbnRo
IG5hbWVzIGZyb20gV2luZG93cy4KKworICAgICAgICAoV2ViQ29yZTo6RGF0ZUZvcm1hdFRva2Vu
KTogQSBzdHJ1Y3QgdG8gcmVwcmVzZW50IGEgdG9rZW4gaW4gYSBkYXRlIGZvcm1hdC4KKyAgICAg
ICAgZS5nLiBBIGZvcm1hdCBzdHJpbmcgIk1NL2RkL3l5IiBnZW5lcmF0ZXMgZml2ZSBEYXRlRm9y
bWF0VG9rZW46CisgICAgICAgICBNb250aDIsIExpdGVyYWwsIERheTIsIExpdGVyYWwsIFllYXIy
LgorICAgICAgICAoaXNFcmFTeW1ib2wpOiBBIHJlYWRhYmlsaXR5IGhlbHBlciBmdW5jdGlvbi4K
KyAgICAgICAgKGlzWWVhclN5bWJvbCk6IGRpdHRvLgorICAgICAgICAoaXNNb250aFN5bWJvbCk6
IGRpdHRvLgorICAgICAgICAoaXNEYXlTeW1ib2wpOiBkaXR0by4KKyAgICAgICAgKGNvdW50Q29u
dGludW91c0xldHRlcnMpOgorICAgICAgICAoY29tbWl0TGl0ZXJhbFRva2VuKTogQSBoZWxwZXIg
Zm9yIHBhcnNlRGF0ZUZvcm1hdCgpLgorICAgICAgICAocGFyc2VEYXRlRm9ybWF0KToKKyAgICAg
ICAgUGFyc2UgYSBmb3JtYXQgc3RyaW5nLCBhbmQgZ2VuZXJhdGUgYSBsaXN0IG9mIERhdGVGb3Jt
YXRUb2tlbi4KKworICAgICAgICAoV2ViQ29yZTo6cGFyc2VOdW1iZXIpOiBBIGhlbHBlciBmb3Ig
cGFyc2VEYXRlKCkuCisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46OnBhcnNlTnVtYmVyT3JN
b250aCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjpwYXJzZURhdGUpOgor
ICAgICAgICBQYXJzZSBhIHVzZXItcHJvdmlkZWQgZGF0ZSBzdHJpbmcgYnkgbWF0Y2hpbmcgd2l0
aCBhIERhdGVGb3JtYXRUb2tlbiBsaXN0LgorCisgICAgICAgIChXZWJDb3JlOjphcHBlbmROdW1i
ZXIpOiBBIGhlbHBlciBmb3IgZm9ybWF0RGF0ZSgpLgorICAgICAgICAoV2ViQ29yZTo6YXBwZW5k
VHdvRGlnaXRzTnVtYmVyKTogZGl0dG8uIFdyaXRlIGF0IGxlYXN0IHR3byBkaWdpdHMuCisgICAg
ICAgIChXZWJDb3JlOjphcHBlbmRGb3VyRGlnaXRzTnVtYmVyKTogZGl0dG8uIFdyaXRlIGF0IGxl
YXN0IGZvdXIgZGlnaXRzLgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjpmb3JtYXREYXRl
KToKKyAgICAgICAgRm9ybWF0IGEgRGF0ZUNvbXBvbmVudHMgYnkgaXRlcmF0aW5nIGEgRGF0ZUZv
cm1hdFRva2VuIGxpc3QuCisKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsZVdpbjo6aW5pdGlhbGl6
ZVNob3J0RGF0ZVRva2Vucyk6CisgICAgICAgIChXZWJDb3JlOjpzdWJzdGl0dXRlTGFiZWxzSW50
b0Zvcm1hdCk6CisgICAgICAgIENyZWF0ZXMgYSB1c2VyLXZpc2libGUgZm9ybWF0IHN0cmluZyBi
eSBpdGVyYXRpbmcgYSBEYXRlRm9ybWF0VG9rZW4gbGlzdC4KKyAgICAgICAgKFdlYkNvcmU6Okxv
Y2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjpp
bml0aWFsaXplTW9udGhMYWJlbHMpOgorICAgICAgICBDcmVhdGVzIG1vbnRoIG5hbWVzIGJ5IFdp
bmRvd3MgQVBJLgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjppbml0aWFsaXplV2Vla0Rh
eVNob3J0TGFiZWxzKToKKyAgICAgICAgIENyZWF0ZXMgZGF5IG5hbWVzIGJ5IFdpbmRvd3MgQVBJ
LgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjptb250aExhYmVscyk6CisgICAgICAgIFB1
YmxpYyBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgbW9udGggbmFtZXMuCisgICAgICAgIChXZWJDb3Jl
OjpMb2NhbGVXaW46OndlZWtEYXlTaG9ydExhYmVscyk6CisgICAgICAgIFB1YmxpYyBhY2Nlc3Nv
ciBmdW5jdGlvbiBmb3IgZGF5IG5hbWVzLgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvTG9jYWxl
V2luLmg6IEFkZGVkLgorCisgICAgICAgICogcGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWREYXRlV2lu
LmNwcDoKKyAgICAgICAgQWRkZWQuIFRoZSBmb2xsd29pbmcgZnVuY3Rpb25zIHNpbXBseSBkZWxl
Z2F0ZSB0byBMb2NhbGVXaW46OmN1cnJlbnRMb2NhbGUoKS4KKyAgICAgICAgKFdlYkNvcmU6OnBh
cnNlTG9jYWxpemVkRGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpmb3JtYXRMb2NhbGl6ZWREYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OmxvY2FsaXplZERhdGVGb3JtYXRUZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6Om1vbnRoTGFiZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OndlZWtEYXlTaG9ydExh
YmVscyk6CisgICAgICAgIChXZWJDb3JlOjpmaXJzdERheU9mV2Vlayk6CisKIDIwMTItMDQtMjYg
IFNoYXduIFNpbmdoICA8c2hhd25zaW5naEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmUtaW1w
bGVtZW50IGJhY2tGYWNlVmlzaWJpbGl0eSB0byBhdm9pZCBkZWFsaW5nIHdpdGggcGVyc3BlY3Rp
dmUgdyA8IDAgcHJvYmxlbQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFu
Z2VMb2cgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRleCA1NDc1YzUxNWVk
NTFjZDJhMTYyZGY5YjZjODk4NzVkNzc4NGVlYjAxLi43Nzc4MWQxMGE3YWU2OWU5NDlhNDgyZjQ5
ZTk2NDhkMDUwZjMwZmE4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3
IEBACisyMDEyLTA0LTI2ICBLZW50IFRhbXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KKworICAg
ICAgICBbQ2hyb21pdW0vV2luZG93c10gQWRkIExvY2FsaXplZERhdGVXaW4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg0OTM1CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIHRlc3QgZm9yIExvY2FsZVdp
bi5jcHAuCisKKyAgICAgICAgKiBXZWJLaXQuZ3lwaToKKyAgICAgICAgKiB0ZXN0cy9Mb2NhbGVX
aW5UZXN0LmNwcDogQWRkZWQuCisgICAgICAgIChtc0ZvckRhdGUpOiBBIGhlbHBlciBmdW5jdGlv
bi4KKyAgICAgICAgKFRFU1QpOgorCiAyMDEyLTA0LTI2ICBTaGF3biBTaW5naCAgPHNoYXduc2lu
Z2hAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gcmUtaW1wbGVtZW50IGJhY2tG
YWNlVmlzaWJpbGl0eSB0byBhdm9pZCBkZWFsaW5nIHdpdGggcGVyc3BlY3RpdmUgdzwwIHByb2Js
ZW0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwIGIv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKaW5kZXggYTFmMTMyZjNhNzFj
MDQ2MmZmNGFjMGFkNjU3MDY5NWIwNDE0NTkyNy4uYTBiZDE1OTc2MmYxMDU4OWNhMmM1OWU0MTlh
YzBlYWZiYmU3NTYzMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2Vi
Q29yZS5neXAKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKQEAg
LTE2NjQsNiArMTY2NCwxMSBAQAogCiAgICAgICAgICAgICAjIFN5c3RlbUluZm8uY3BwIGlzIHVz
ZWZ1bCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjb3B5IGl0LgogICAgICAgICAgICAgWydpbmNsdWRl
JywgJ3BsYXRmb3JtL3dpbi9TeXN0ZW1JbmZvXFwuY3BwJCddLAorCisgICAgICAgICAgICBbJ2V4
Y2x1ZGUnLCAncGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWREYXRlSUNVXC5jcHAkJ10sCisgICAgICAg
ICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWREYXRlV2luXC5jcHAkJ10s
CisgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vdGV4dC9Mb2NhbGVXaW5cLmNwcCQn
XSwKKyAgICAgICAgICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS90ZXh0L0xvY2FsZVdpblwuaCQn
XSwKICAgICAgICAgICBdLAogICAgICAgICB9LHsgIyBPUyE9IndpbiIKICAgICAgICAgICAnc291
cmNlcy8nOiBbCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9Tb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggZTAzZGQxNzI3YmUyMGQ5NWMxNjhiN2Q0MDNj
YjEyYmE2MzUxMzBkNy4uY2E2YWJiOWJkMzQ4N2QzYjcwOTc1NDdjNjE1YjFjNjE3M2M4NGFhNiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUuZ3lwaQpAQCAtNDQ3NCw5ICs0NDc0LDEyIEBACiAgICAgICAgICAgICAncGxh
dGZvcm0vdGV4dC9Mb2NhbGVUb1NjcmlwdE1hcHBpbmcuaCcsCiAgICAgICAgICAgICAncGxhdGZv
cm0vdGV4dC9Mb2NhbGVUb1NjcmlwdE1hcHBpbmdEZWZhdWx0LmNwcCcsCiAgICAgICAgICAgICAn
cGxhdGZvcm0vdGV4dC9Mb2NhbGVUb1NjcmlwdE1hcHBpbmdJQ1UuY3BwJywKKyAgICAgICAgICAg
ICdwbGF0Zm9ybS90ZXh0L0xvY2FsZVdpbi5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL3Rl
eHQvTG9jYWxlV2luLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL3RleHQvTG9jYWxpemVkRGF0
ZS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS90ZXh0L0xvY2FsaXplZERhdGVJQ1UuY3BwJywK
ICAgICAgICAgICAgICdwbGF0Zm9ybS90ZXh0L0xvY2FsaXplZERhdGVOb25lLmNwcCcsCisgICAg
ICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWREYXRlV2luLmNwcCcsCiAgICAgICAgICAg
ICAncGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWROdW1iZXIuaCcsCiAgICAgICAgICAgICAncGxhdGZv
cm0vdGV4dC9Mb2NhbGl6ZWROdW1iZXJJQ1UuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS90
ZXh0L0xvY2FsaXplZE51bWJlck5vbmUuY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL3RleHQvTG9jYWxlV2luLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3Rl
eHQvTG9jYWxlV2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zMTIwOTQxM2NkMGViZGZhNTAzNDc1YTFmYjU0
NWE2ZTlmY2Y3YjkwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
dGV4dC9Mb2NhbGVXaW4uY3BwCkBAIC0wLDAgKzEsNTk0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAq
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkxvY2FsZVdpbi5oIgorCisjaW5jbHVkZSAiRGF0ZUNvbXBvbmVudHMuaCIKKyNp
bmNsdWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUg
PHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYv
RGF0ZU1hdGguaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NP
d25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisKK3VzaW5nIG5h
bWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gV2luZG93cyBkb2Vzbid0
IGhhdmUgYW4gQVBJIHRvIHBhcnNlIGxvY2FsZS1zcGVjaWZpYyBkYXRlIHN0cmluZywKKy8vIGFu
ZCBHZXREYXRlRm9ybWF0KCkgYW5kIEdldERhdGVGb3JtYXRFeCgpIGRvbid0IHN1cHBvcnQgeWVh
cnMgb2xkZXIKKy8vIHRoYW4gMTYwMCwgd2hpY2ggd2Ugc2hvdWxkIHN1cHBvcnQgYWNjb3JkaW5n
IHRvIHRoZSBIVE1MCisvLyBzdGFuZGFyZC4gU28sIHdlIG9idGFpbiB0aGUgZGF0ZSBmb3JtYXQg
ZnJvbSB0aGUgc3lzdGVtLCBidXQgd2UKKy8vIGZvcm1hdC9wYXJzZSBhIGRhdGUgYnkgb3VyIG93
biBjb2RlLgorCitpbmxpbmUgTG9jYWxlV2luOjpMb2NhbGVXaW4oTENJRCBsY2lkKQorICAgIDog
bV9sY2lkKGxjaWQpCit7CisgICAgc3RydWN0IHRtIHRtOworICAgIGdldEN1cnJlbnRMb2NhbFRp
bWUoJnRtKTsKKyAgICBtX2Jhc2VZZWFyID0gdG0udG1feWVhciArIDE5MDA7CisKKyNpZiBFTkFC
TEUoQ0FMRU5EQVJfUElDS0VSKQorICAgIERXT1JEIHZhbHVlID0gMDsKKyAgICA6OkdldExvY2Fs
ZUluZm8obV9sY2lkLCBMT0NBTEVfSUZJUlNUREFZT0ZXRUVLIHwgTE9DQUxFX1JFVFVSTl9OVU1C
RVIsIHJlaW50ZXJwcmV0X2Nhc3Q8TFBXU1RSPigmdmFsdWUpLCBzaXplb2YodmFsdWUpIC8gc2l6
ZW9mKFRDSEFSKSk7CisgICAgLy8gMDpNb25kYXksIC4uLiwgNjpTdW5kYXkuCisgICAgLy8gV2Ug
bmVlZCAxIGZvciBNb25kYXksIDAgZm9yIFN1bmRheS4KKyAgICBtX2ZpcnN0RGF5T2ZXZWVrID0g
KHZhbHVlICsgMSkgJSA3OworI2VuZGlmCit9CisKK1Bhc3NPd25QdHI8TG9jYWxlV2luPiBMb2Nh
bGVXaW46OmNyZWF0ZShMQ0lEIGxjaWQpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBMb2Nh
bGVXaW4obGNpZCkpOworfQorCitMb2NhbGVXaW4qIExvY2FsZVdpbjo6Y3VycmVudExvY2FsZSgp
Cit7CisgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgbWFrZSBMQ0lEIGZyb20gZGVmYXVsdExhbmd1
YWdlKCkuIEJ1dAorICAgIC8vIDo6TG9jYWxlTmFtZVRvTENJRCgpIGlzIGF2YWlsYWJsZSBzaW5j
ZSBXaW5kb3dzIFZpc3RhLgorICAgIHN0YXRpYyBMb2NhbGVXaW4qIGN1cnJlbnRMb2NhbGUgPSBM
b2NhbGVXaW46OmNyZWF0ZShMT0NBTEVfVVNFUl9ERUZBVUxUKS5sZWFrUHRyKCk7CisgICAgcmV0
dXJuIGN1cnJlbnRMb2NhbGU7Cit9CisKK0xvY2FsZVdpbjo6fkxvY2FsZVdpbigpCit7Cit9CisK
K1N0cmluZyBMb2NhbGVXaW46OmdldExvY2FsZUluZm9TdHJpbmcoTENUWVBFIHR5cGUpCit7Cisg
ICAgaW50IGJ1ZmZlclNpemVXaXRoTlVMID0gOjpHZXRMb2NhbGVJbmZvKG1fbGNpZCwgdHlwZSwg
MCwgMCk7CisgICAgaWYgKGJ1ZmZlclNpemVXaXRoTlVMIDw9IDApCisgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKKyAgICBWZWN0b3I8VUNoYXI+IGJ1ZmZlcihidWZmZXJTaXplV2l0aE5VTCk7Cisg
ICAgOjpHZXRMb2NhbGVJbmZvKG1fbGNpZCwgdHlwZSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyU2l6
ZVdpdGhOVUwpOworICAgIGJ1ZmZlci5zaHJpbmsoYnVmZmVyU2l6ZVdpdGhOVUwgLSAxKTsKKyAg
ICByZXR1cm4gU3RyaW5nOjphZG9wdChidWZmZXIpOworfQorCit2b2lkIExvY2FsZVdpbjo6aW5p
dGlhbGl6ZVNob3J0TW9udGhMYWJlbHMoKQoreworICAgIGlmIChtX3Nob3J0TW9udGhMYWJlbHMu
c2l6ZSgpKQorICAgICAgICByZXR1cm47CisgICAgY29uc3QgTENUWVBFIHR5cGVzWzEyXSA9IHsK
KyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLAorICAgICAgICBMT0NBTEVfU0FCQlJF
Vk1PTlRITkFNRTIsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywKKyAgICAgICAg
TE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFN
RTUsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwKKyAgICAgICAgTE9DQUxFX1NB
QkJSRVZNT05USE5BTUU3LAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsCisgICAg
ICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05U
SE5BTUUxMCwKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwKKyAgICAgICAgTE9D
QUxFX1NBQkJSRVZNT05USE5BTUUxMiwKKyAgICB9OworICAgIG1fc2hvcnRNb250aExhYmVscy5y
ZXNlcnZlQ2FwYWNpdHkoV1RGX0FSUkFZX0xFTkdUSCh0eXBlcykpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKHR5cGVzKTsgKytpKSB7CisgICAgICAgIG1f
c2hvcnRNb250aExhYmVscy5hcHBlbmQoZ2V0TG9jYWxlSW5mb1N0cmluZyh0eXBlc1tpXSkpOwor
ICAgICAgICBpZiAobV9zaG9ydE1vbnRoTGFiZWxzLmxhc3QoKS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgIG1fc2hvcnRNb250aExhYmVscy5zaHJpbmsoMCk7CisgICAgICAgICAgICBtX3Nob3J0
TW9udGhMYWJlbHMucmVzZXJ2ZUNhcGFjaXR5KFdURl9BUlJBWV9MRU5HVEgoV1RGOjptb250aE5h
bWUpKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgbSA9IDA7IG0gPCBXVEZfQVJSQVlfTEVO
R1RIKFdURjo6bW9udGhOYW1lKTsgKyttKQorICAgICAgICAgICAgICAgIG1fc2hvcnRNb250aExh
YmVscy5hcHBlbmQoV1RGOjptb250aE5hbWVbbV0pOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBU
b2tlbml6ZWQgZGF0ZSBmb3JtYXQKKworc3RydWN0IERhdGVGb3JtYXRUb2tlbiB7CisgICAgZW51
bSBUeXBlIHsKKyAgICAgICAgTGl0ZXJhbCwKKyAgICAgICAgRGF5MSwKKyAgICAgICAgRGF5MiwK
KyAgICAgICAgTW9udGgxLAorICAgICAgICBNb250aDIsCisgICAgICAgIE1vbnRoMywKKyAgICAg
ICAgTW9udGg0LAorICAgICAgICBZZWFyMSwKKyAgICAgICAgWWVhcjIsCisgICAgICAgIFllYXI0
LAorICAgIH07CisgICAgVHlwZSB0eXBlOworICAgIFN0cmluZyBkYXRhOyAvLyBUaGlzIGlzIHZh
bGlkIG9ubHkgaWYgdHlwZT09TGl0ZXJhbC4KKworICAgIERhdGVGb3JtYXRUb2tlbihUeXBlIHR5
cGUpCisgICAgICAgIDogdHlwZSh0eXBlKQorICAgIHsgfQorCisgICAgRGF0ZUZvcm1hdFRva2Vu
KGNvbnN0IFN0cmluZyYgZGF0YSkKKyAgICAgICAgOiB0eXBlKExpdGVyYWwpCisgICAgICAgICwg
ZGF0YShkYXRhKQorICAgIHsgfQorCisgICAgRGF0ZUZvcm1hdFRva2VuKGNvbnN0IERhdGVGb3Jt
YXRUb2tlbiYgdG9rZW4pCisgICAgICAgIDogdHlwZSh0b2tlbi50eXBlKQorICAgICAgICAsIGRh
dGEodG9rZW4uZGF0YSkKKyAgICB7IH0KK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0VyYVN5
bWJvbChVQ2hhciBsZXR0ZXIpIHsgcmV0dXJuIGxldHRlciA9PSAnZyc7IH0KK3N0YXRpYyBpbmxp
bmUgYm9vbCBpc1llYXJTeW1ib2woVUNoYXIgbGV0dGVyKSB7IHJldHVybiBsZXR0ZXIgPT0gJ3kn
OyB9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNNb250aFN5bWJvbChVQ2hhciBsZXR0ZXIpIHsgcmV0
dXJuIGxldHRlciA9PSAnTSc7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0RheVN5bWJvbChVQ2hh
ciBsZXR0ZXIpIHsgcmV0dXJuIGxldHRlciA9PSAnZCc7IH0KKworc3RhdGljIHVuc2lnbmVkIGNv
dW50Q29udGludW91c0xldHRlcnMoY29uc3QgU3RyaW5nJiBmb3JtYXQsIHVuc2lnbmVkIGluZGV4
KQoreworICAgIHVuc2lnbmVkIGNvdW50ID0gMTsKKyAgICBVQ2hhciByZWZlcmVuY2UgPSBmb3Jt
YXRbaW5kZXhdOworICAgIHdoaWxlIChpbmRleCArIDEgPCBmb3JtYXQubGVuZ3RoKCkpIHsKKyAg
ICAgICAgaWYgKGZvcm1hdFsrK2luZGV4XSAhPSByZWZlcmVuY2UpCisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgKytjb3VudDsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0
aWMgdm9pZCBjb21taXRMaXRlcmFsVG9rZW4oU3RyaW5nQnVpbGRlciYgbGl0ZXJhbEJ1ZmZlciwg
VmVjdG9yPERhdGVGb3JtYXRUb2tlbj4mIHRva2VucykKK3sKKyAgICBpZiAobGl0ZXJhbEJ1ZmZl
ci5sZW5ndGgoKSA8PSAwKQorICAgICAgICByZXR1cm47CisgICAgdG9rZW5zLmFwcGVuZChEYXRl
Rm9ybWF0VG9rZW4obGl0ZXJhbEJ1ZmZlci50b1N0cmluZygpKSk7CisgICAgbGl0ZXJhbEJ1ZmZl
ci5jbGVhcigpOworfQorCisvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9s
aWJyYXJ5L2RkMzE3Nzg3KHY9dnMuODUpLmFzcHgKK3N0YXRpYyBWZWN0b3I8RGF0ZUZvcm1hdFRv
a2VuPiBwYXJzZURhdGVGb3JtYXQoY29uc3QgU3RyaW5nIGZvcm1hdCkKK3sKKyAgICBWZWN0b3I8
RGF0ZUZvcm1hdFRva2VuPiB0b2tlbnM7CisgICAgU3RyaW5nQnVpbGRlciBsaXRlcmFsQnVmZmVy
OworICAgIGJvb2wgaW5RdW90ZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBmb3JtYXQubGVuZ3RoKCk7ICsraSkgeworICAgICAgICBVQ2hhciBjaCA9IGZvcm1hdFtpXTsK
KyAgICAgICAgaWYgKGluUXVvdGUpIHsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXCcnKSB7Cisg
ICAgICAgICAgICAgICAgaW5RdW90ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIEFTU0VSVChp
KTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0W2kgLSAxXSA9PSAnXCcnKQorICAgICAgICAg
ICAgICAgICAgICBsaXRlcmFsQnVmZmVyLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgICAgIGxpdGVyYWxCdWZmZXIuYXBwZW5kKGNoKTsKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoID09ICdcJycpIHsKKyAgICAg
ICAgICAgIGluUXVvdGUgPSB0cnVlOworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGZvcm1hdFtp
IC0gMV0gPT0gJ1wnJykKKyAgICAgICAgICAgICAgICBsaXRlcmFsQnVmZmVyLmFwcGVuZChjaCk7
CisgICAgICAgIH0gZWxzZSBpZiAoaXNZZWFyU3ltYm9sKGNoKSkgeworICAgICAgICAgICAgY29t
bWl0TGl0ZXJhbFRva2VuKGxpdGVyYWxCdWZmZXIsIHRva2Vucyk7CisgICAgICAgICAgICB1bnNp
Z25lZCBjb3VudCA9IGNvdW50Q29udGludW91c0xldHRlcnMoZm9ybWF0LCBpKTsKKyAgICAgICAg
ICAgIGkgKz0gY291bnQgLSAxOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpCisgICAgICAg
ICAgICAgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0VG9rZW4oRGF0ZUZvcm1hdFRva2VuOjpZ
ZWFyMSkpOworICAgICAgICAgICAgZWxzZSBpZiAoY291bnQgPT0gMikKKyAgICAgICAgICAgICAg
ICB0b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0VG9rZW46OlllYXIyKSk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9y
bWF0VG9rZW4oRGF0ZUZvcm1hdFRva2VuOjpZZWFyNCkpOworICAgICAgICB9IGVsc2UgaWYgKGlz
TW9udGhTeW1ib2woY2gpKSB7CisgICAgICAgICAgICBjb21taXRMaXRlcmFsVG9rZW4obGl0ZXJh
bEJ1ZmZlciwgdG9rZW5zKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50ID0gY291bnRDb250
aW51b3VzTGV0dGVycyhmb3JtYXQsIGkpOworICAgICAgICAgICAgaSArPSBjb3VudCAtIDE7Cisg
ICAgICAgICAgICBpZiAoY291bnQgPT0gMSkKKyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5k
KERhdGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0VG9rZW46Ok1vbnRoMSkpOworICAgICAgICAgICAg
ZWxzZSBpZiAoY291bnQgPT0gMikKKyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERhdGVG
b3JtYXRUb2tlbihEYXRlRm9ybWF0VG9rZW46Ok1vbnRoMikpOworICAgICAgICAgICAgZWxzZSBp
ZiAoY291bnQgPT0gMykKKyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRU
b2tlbihEYXRlRm9ybWF0VG9rZW46Ok1vbnRoMykpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIHRva2Vucy5hcHBlbmQoRGF0ZUZvcm1hdFRva2VuKERhdGVGb3JtYXRUb2tlbjo6
TW9udGg0KSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNEYXlTeW1ib2woY2gpKSB7CisgICAgICAg
ICAgICBjb21taXRMaXRlcmFsVG9rZW4obGl0ZXJhbEJ1ZmZlciwgdG9rZW5zKTsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIGNvdW50ID0gY291bnRDb250aW51b3VzTGV0dGVycyhmb3JtYXQsIGkpOwor
ICAgICAgICAgICAgaSArPSBjb3VudCAtIDE7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gMSkK
KyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0
VG9rZW46OkRheTEpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0b2tlbnMu
YXBwZW5kKERhdGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0VG9rZW46OkRheTIpKTsKKyAgICAgICAg
fSBlbHNlIGlmIChpc0VyYVN5bWJvbChjaCkpIHsKKyAgICAgICAgICAgIC8vIEp1c3QgaWdub3Jl
IGVyYS4KKyAgICAgICAgICAgIC8vIEhUTUw1IGRhdGUgc3VwcG9ydHMgb25seSBBLkQuCisgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgbGl0ZXJhbEJ1ZmZlci5hcHBlbmQoY2gpOworICAgIH0K
KyAgICBjb21taXRMaXRlcmFsVG9rZW4obGl0ZXJhbEJ1ZmZlciwgdG9rZW5zKTsKKyAgICByZXR1
cm4gdG9rZW5zOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJz
aW5nCisKKy8vIFJldHVybnMgLTEgaWYgcGFyc2luZyBmYWlscy4KK3N0YXRpYyBpbnQgcGFyc2VO
dW1iZXIoY29uc3QgU3RyaW5nJiBpbnB1dCwgdW5zaWduZWQmIGluZGV4KQoreworICAgIHVuc2ln
bmVkIGRpZ2l0c1N0YXJ0ID0gaW5kZXg7CisgICAgd2hpbGUgKGluZGV4IDwgaW5wdXQubGVuZ3Ro
KCkgJiYgaXNBU0NJSURpZ2l0KGlucHV0W2luZGV4XSkpCisgICAgICAgIGluZGV4Kys7CisgICAg
aWYgKGRpZ2l0c1N0YXJ0ID09IGluZGV4KQorICAgICAgICByZXR1cm4gLTE7CisgICAgYm9vbCBv
ayA9IGZhbHNlOworICAgIGludCBudW1iZXIgPSBpbnB1dC5zdWJzdHJpbmcoZGlnaXRzU3RhcnQs
IGluZGV4IC0gZGlnaXRzU3RhcnQpLnRvSW50KCZvayk7CisgICAgcmV0dXJuIG9rID8gbnVtYmVy
IDogLTE7Cit9CisKKy8vIFJldHVybnMgMC1iYXNlZCBtb250aCBudW1iZXIuIFJldHVybnMgLTEg
aWYgcGFyc2luZyBmYWlscy4KK2ludCBMb2NhbGVXaW46OnBhcnNlTnVtYmVyT3JNb250aChjb25z
dCBTdHJpbmcmIGlucHV0LCB1bnNpZ25lZCYgaW5kZXgpCit7CisgICAgaW50IHJlc3VsdCA9IHBh
cnNlTnVtYmVyKGlucHV0LCBpbmRleCk7CisgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAg
IGlmIChyZXN1bHQgPCAxIHx8IHJlc3VsdCA+IDEyKQorICAgICAgICAgICAgcmV0dXJuIC0xOwor
ICAgICAgICByZXR1cm4gcmVzdWx0IC0gMTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG1fbW9udGhMYWJlbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gRklYTUU6IGln
bm9yZSBjYXNlCisgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShpbnB1dC5zdWJzdHJpbmco
aW5kZXgsIG1fbW9udGhMYWJlbHNbaV0ubGVuZ3RoKCkpLCBtX21vbnRoTGFiZWxzW2ldKSkgewor
ICAgICAgICAgICAgaW5kZXggKz0gbV9tb250aExhYmVsc1tpXS5sZW5ndGgoKTsKKyAgICAgICAg
ICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBtX3Nob3J0TW9udGhMYWJlbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKGlucHV0LnN1YnN0cmluZyhpbmRleCwgbV9zaG9ydE1vbnRoTGFiZWxzW2ld
Lmxlbmd0aCgpKSwgbV9zaG9ydE1vbnRoTGFiZWxzW2ldKSkgeworICAgICAgICAgICAgaW5kZXgg
Kz0gbV9zaG9ydE1vbnRoTGFiZWxzW2ldLmxlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIGk7
CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitkb3VibGUgTG9jYWxlV2lu
OjpwYXJzZURhdGUoY29uc3QgU3RyaW5nJiBpbnB1dCkKK3sKKyAgICBpbml0aWFsaXplU2hvcnRE
YXRlVG9rZW5zKCk7CisgICAgcmV0dXJuIHBhcnNlRGF0ZShtX3Nob3J0RGF0ZVRva2VucywgbV9i
YXNlWWVhciwgaW5wdXQpOworfQorCitkb3VibGUgTG9jYWxlV2luOjpwYXJzZURhdGUoY29uc3Qg
U3RyaW5nJiBmb3JtYXQsIGludCBiYXNlWWVhciwgY29uc3QgU3RyaW5nJiBpbnB1dCkKK3sKKyAg
ICByZXR1cm4gcGFyc2VEYXRlKHBhcnNlRGF0ZUZvcm1hdChmb3JtYXQpLCBiYXNlWWVhciwgaW5w
dXQpOworfQorCitkb3VibGUgTG9jYWxlV2luOjpwYXJzZURhdGUoY29uc3QgVmVjdG9yPERhdGVG
b3JtYXRUb2tlbj4mIHRva2VucywgaW50IGJhc2VZZWFyLCBjb25zdCBTdHJpbmcmIGlucHV0KQor
eworICAgIGluaXRpYWxpemVTaG9ydE1vbnRoTGFiZWxzKCk7CisgICAgaW5pdGlhbGl6ZU1vbnRo
TGFiZWxzKCk7CisgICAgY29uc3QgZG91YmxlIE5hTiA9IG51bWVyaWNfbGltaXRzPGRvdWJsZT46
OnF1aWV0X05hTigpOworICAgIHVuc2lnbmVkIGlucHV0SW5kZXggPSAwOworICAgIGludCBkYXkg
PSAtMSwgbW9udGggPSAtMSwgeWVhciA9IC0xOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCB0b2tlbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3dpdGNoICh0b2tlbnNbaV0udHlwZSkg
eworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TGl0ZXJhbDogeworICAgICAgICAgICAg
U3RyaW5nIGRhdGEgPSB0b2tlbnNbaV0uZGF0YTsKKyAgICAgICAgICAgIGlmIChpbnB1dC5zdWJz
dHJpbmcoaW5wdXRJbmRleCwgZGF0YS5sZW5ndGgoKSkgPT0gZGF0YSkKKyAgICAgICAgICAgICAg
ICBpbnB1dEluZGV4ICs9IGRhdGEubGVuZ3RoKCk7CisgICAgICAgICAgICAvLyBHbyBhaGVhZCBl
dmVuIGlmIHRoZSBpbnB1dCBkb2Vzbid0IGhhdmUgdGhpcyBzdHJpbmcuCisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6RGF5MToKKyAg
ICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OkRheTI6CisgICAgICAgICAgICBkYXkgPSBwYXJz
ZU51bWJlcihpbnB1dCwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICBpZiAoZGF5IDwgMSB8fCBk
YXkgPiAzMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTmFOOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpNb250aDE6CisgICAgICAgIGNhc2UgRGF0
ZUZvcm1hdFRva2VuOjpNb250aDI6CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpNb250
aDM6CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpNb250aDQ6CisgICAgICAgICAgICBt
b250aCA9IHBhcnNlTnVtYmVyT3JNb250aChpbnB1dCwgaW5wdXRJbmRleCk7CisgICAgICAgICAg
ICBpZiAobW9udGggPCAwIHx8IG1vbnRoID4gMTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5h
TjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6WWVh
cjE6IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG9sZEluZGV4ID0gaW5wdXRJbmRleDsKKyAgICAg
ICAgICAgIHllYXIgPSBwYXJzZU51bWJlcihpbnB1dCwgaW5wdXRJbmRleCk7CisgICAgICAgICAg
ICBpZiAoeWVhciA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOYU47CisgICAgICAgICAg
ICBpZiAoaW5wdXRJbmRleCAtIG9sZEluZGV4ID09IDEpIHsKKyAgICAgICAgICAgICAgICBpbnQg
c2hvcnRZZWFyID0gYmFzZVllYXIgJSAxMDsKKyAgICAgICAgICAgICAgICBpbnQgZGVjYWRlID0g
YmFzZVllYXIgLSBzaG9ydFllYXI7CisgICAgICAgICAgICAgICAgaWYgKHNob3J0WWVhciA+PSA1
KQorICAgICAgICAgICAgICAgICAgICB5ZWFyICs9IHNob3J0WWVhciAtIDQgPD0geWVhciA/IGRl
Y2FkZSA6IGRlY2FkZSArIDEwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICAgICAgeWVhciArPSBzaG9ydFllYXIgKyA1ID49IHllYXIgPyBkZWNhZGUgOiBkZWNhZGUgLSAx
MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpZZWFyMjogeworICAgICAgICAgICAgdW5zaWduZWQgb2xk
SW5kZXggPSBpbnB1dEluZGV4OworICAgICAgICAgICAgeWVhciA9IHBhcnNlTnVtYmVyKGlucHV0
LCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIGlmICh5ZWFyIDw9IDApCisgICAgICAgICAgICAg
ICAgcmV0dXJuIE5hTjsKKyAgICAgICAgICAgIGlmIChpbnB1dEluZGV4IC0gb2xkSW5kZXggPT0g
MikgeworICAgICAgICAgICAgICAgIGludCBzaG9ydFllYXIgPSBiYXNlWWVhciAlIDEwMDsKKyAg
ICAgICAgICAgICAgICBpbnQgY2VudHVyeSA9IGJhc2VZZWFyIC0gc2hvcnRZZWFyOworICAgICAg
ICAgICAgICAgIGlmIChzaG9ydFllYXIgPj0gNTApCisgICAgICAgICAgICAgICAgICAgIHllYXIg
Kz0gc2hvcnRZZWFyIC0gNDkgPD0geWVhciA/IGNlbnR1cnkgOiBjZW50dXJ5ICsgMTAwOworICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeWVhciArPSBzaG9ydFllYXIg
KyA1MCA+PSB5ZWFyID8gY2VudHVyeSA6IGNlbnR1cnkgLSAxMDA7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tl
bjo6WWVhcjQ6CisgICAgICAgICAgICB5ZWFyID0gcGFyc2VOdW1iZXIoaW5wdXQsIGlucHV0SW5k
ZXgpOworICAgICAgICAgICAgaWYgKHllYXIgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4g
TmFOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHllYXIg
PD0gMCB8fCBtb250aCA8IDAgfHwgZGF5IDw9IDApCisgICAgICAgIHJldHVybiBOYU47CisgICAg
cmV0dXJuIGRhdGVUb0RheXNGcm9tMTk3MCh5ZWFyLCBtb250aCwgZGF5KSAqIG1zUGVyRGF5Owor
fQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGb3JtYXR0aW5nCisKK3N0
YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmROdW1iZXIoaW50IHZhbHVlLCBTdHJpbmdCdWlsZGVyJiBi
dWZmZXIpCit7CisgICAgYnVmZmVyLmFwcGVuZChTdHJpbmc6Om51bWJlcih2YWx1ZSkpOworfQor
CitzdGF0aWMgdm9pZCBhcHBlbmRUd29EaWdpdHNOdW1iZXIoaW50IHZhbHVlLCBTdHJpbmdCdWls
ZGVyJiBidWZmZXIpCit7CisgICAgaWYgKHZhbHVlIDwgMTApCisgICAgICAgIGJ1ZmZlci5hcHBl
bmQoIjAiKTsKKyAgICBidWZmZXIuYXBwZW5kKFN0cmluZzo6bnVtYmVyKHZhbHVlKSk7Cit9CisK
K3N0YXRpYyB2b2lkIGFwcGVuZEZvdXJEaWdpdHNOdW1iZXIoaW50IHZhbHVlLCBTdHJpbmdCdWls
ZGVyJiBidWZmZXIpCit7CisgICAgaWYgKHZhbHVlIDwgMTApCisgICAgICAgIGJ1ZmZlci5hcHBl
bmQoIjAwMCIpOworICAgIGVsc2UgaWYgKHZhbHVlIDwgMTAwKQorICAgICAgICBidWZmZXIuYXBw
ZW5kKCIwMCIpOworICAgIGVsc2UgaWYgKHZhbHVlIDwgMTAwMCkKKyAgICAgICAgYnVmZmVyLmFw
cGVuZCgiMCIpOworICAgIGJ1ZmZlci5hcHBlbmQoU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKK30K
KworU3RyaW5nIExvY2FsZVdpbjo6Zm9ybWF0RGF0ZShjb25zdCBEYXRlQ29tcG9uZW50cyYgZGF0
ZUNvbXBvbmVudHMpCit7CisgICAgaW5pdGlhbGl6ZVNob3J0RGF0ZVRva2VucygpOworICAgIHJl
dHVybiBmb3JtYXREYXRlKG1fc2hvcnREYXRlVG9rZW5zLCBtX2Jhc2VZZWFyLCBkYXRlQ29tcG9u
ZW50cy5mdWxsWWVhcigpLCBkYXRlQ29tcG9uZW50cy5tb250aCgpLCBkYXRlQ29tcG9uZW50cy5t
b250aERheSgpKTsKK30KKworU3RyaW5nIExvY2FsZVdpbjo6Zm9ybWF0RGF0ZShjb25zdCBTdHJp
bmcmIGZvcm1hdCwgaW50IGJhc2VZZWFyLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KQor
eworICAgIHJldHVybiBmb3JtYXREYXRlKHBhcnNlRGF0ZUZvcm1hdChmb3JtYXQpLCBiYXNlWWVh
ciwgeWVhciwgbW9udGgsIGRheSk7Cit9CisKK1N0cmluZyBMb2NhbGVXaW46OmZvcm1hdERhdGUo
Y29uc3QgVmVjdG9yPERhdGVGb3JtYXRUb2tlbj4mIHRva2VucywgaW50IGJhc2VZZWFyLCBpbnQg
eWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KQoreworICAgIGluaXRpYWxpemVTaG9ydE1vbnRoTGFi
ZWxzKCk7CisgICAgaW5pdGlhbGl6ZU1vbnRoTGFiZWxzKCk7CisgICAgU3RyaW5nQnVpbGRlciBi
dWZmZXI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSkg
eworICAgICAgICBzd2l0Y2ggKHRva2Vuc1tpXS50eXBlKSB7CisgICAgICAgIGNhc2UgRGF0ZUZv
cm1hdFRva2VuOjpMaXRlcmFsOgorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0u
ZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46
OkRheTE6CisgICAgICAgICAgICBhcHBlbmROdW1iZXIoZGF5LCBidWZmZXIpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpEYXkyOgorICAgICAgICAg
ICAgYXBwZW5kVHdvRGlnaXRzTnVtYmVyKGRheSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGgxOgorICAgICAgICAgICAgYXBw
ZW5kTnVtYmVyKG1vbnRoICsgMSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGgyOgorICAgICAgICAgICAgYXBwZW5kVHdvRGln
aXRzTnVtYmVyKG1vbnRoICsgMSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGgzOgorICAgICAgICAgICAgaWYgKDAgPD0gbW9u
dGggJiYgbW9udGggPCBzdGF0aWNfY2FzdDxpbnQ+KG1fc2hvcnRNb250aExhYmVscy5zaXplKCkp
KQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobV9zaG9ydE1vbnRoTGFiZWxzW21vbnRo
XSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXBwZW5kTnVtYmVyKG1vbnRo
ICsgMSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERhdGVGb3Jt
YXRUb2tlbjo6TW9udGg0OgorICAgICAgICAgICAgaWYgKDAgPD0gbW9udGggJiYgbW9udGggPCBz
dGF0aWNfY2FzdDxpbnQ+KG1fbW9udGhMYWJlbHMuc2l6ZSgpKSkKKyAgICAgICAgICAgICAgICBi
dWZmZXIuYXBwZW5kKG1fbW9udGhMYWJlbHNbbW9udGhdKTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBhcHBlbmROdW1iZXIobW9udGggKyAxLCBidWZmZXIpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpZZWFyMTogeworICAgICAg
ICAgICAgaWYgKGJhc2VZZWFyIC0gNCA8PSB5ZWFyICYmIHllYXIgPD0gYmFzZVllYXIgKyA1KQor
ICAgICAgICAgICAgICAgIGFwcGVuZE51bWJlcih5ZWFyICUgMTAsIGJ1ZmZlcik7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXBwZW5kRm91ckRpZ2l0c051bWJlcih5ZWFyLCBi
dWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBEYXRl
Rm9ybWF0VG9rZW46OlllYXIyOiB7CisgICAgICAgICAgICBpZiAoYmFzZVllYXIgLSA0OSA8PSB5
ZWFyICYmIHllYXIgPD0gYmFzZVllYXIgKyA1MCkKKyAgICAgICAgICAgICAgICBhcHBlbmRUd29E
aWdpdHNOdW1iZXIoeWVhciAlIDEwMCwgYnVmZmVyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICBhcHBlbmRGb3VyRGlnaXRzTnVtYmVyKHllYXIsIGJ1ZmZlcik7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6WWVh
cjQ6CisgICAgICAgICAgICBhcHBlbmRGb3VyRGlnaXRzTnVtYmVyKHllYXIsIGJ1ZmZlcik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnVmZmVyLnRv
U3RyaW5nKCk7Cit9CisKK3ZvaWQgTG9jYWxlV2luOjppbml0aWFsaXplU2hvcnREYXRlVG9rZW5z
KCkKK3sKKyAgICBpZiAobV9zaG9ydERhdGVUb2tlbnMuc2l6ZSgpKQorICAgICAgICByZXR1cm47
CisgICAgbV9zaG9ydERhdGVUb2tlbnMgPSBwYXJzZURhdGVGb3JtYXQoZ2V0TG9jYWxlSW5mb1N0
cmluZyhMT0NBTEVfU1NIT1JUREFURSkpOworfQorCitzdGF0aWMgU3RyaW5nIHN1YnN0aXR1dGVM
YWJlbHNJbnRvRm9ybWF0KGNvbnN0IFZlY3RvcjxEYXRlRm9ybWF0VG9rZW4+JiB0b2tlbnMsIGNv
bnN0IFN0cmluZyYgeWVhclRleHQsIGNvbnN0IFN0cmluZyYgbW9udGhUZXh0LCBjb25zdCBTdHJp
bmcmIGRheVRleHQpCit7CisgICAgU3RyaW5nQnVpbGRlciBidWZmZXI7CisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSkgeworICAgICAgICBzd2l0Y2ggKHRv
a2Vuc1tpXS50eXBlKSB7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpMaXRlcmFsOgor
ICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0uZGF0YSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OkRheTE6CisgICAgICAgIGNhc2Ug
RGF0ZUZvcm1hdFRva2VuOjpEYXkyOgorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChkYXlUZXh0
LmlzRW1wdHkoKSA/ICJEYXkiIDogZGF5VGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46Ok1vbnRoMToKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0
VG9rZW46Ok1vbnRoMjoKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46Ok1vbnRoMzoKKyAg
ICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46Ok1vbnRoNDoKKyAgICAgICAgICAgIGJ1ZmZlci5h
cHBlbmQobW9udGhUZXh0LmlzRW1wdHkoKSA/ICJNb250aCIgOiBtb250aFRleHQpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpZZWFyMToKKyAgICAg
ICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OlllYXIyOgorICAgICAgICBjYXNlIERhdGVGb3JtYXRU
b2tlbjo6WWVhcjQ6CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHllYXJUZXh0LmlzRW1wdHko
KSA/ICJZZWFyIiA6IHllYXJUZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworU3RyaW5nIExvY2FsZVdp
bjo6ZGF0ZUZvcm1hdFRleHQoKQoreworICAgIGluaXRpYWxpemVTaG9ydERhdGVUb2tlbnMoKTsK
KyAgICByZXR1cm4gc3Vic3RpdHV0ZUxhYmVsc0ludG9Gb3JtYXQobV9zaG9ydERhdGVUb2tlbnMs
IGRhdGVGb3JtYXRZZWFyVGV4dCgpLCBkYXRlRm9ybWF0TW9udGhUZXh0KCksIGRhdGVGb3JtYXRE
YXlJbk1vbnRoVGV4dCgpKTsKK30KKworU3RyaW5nIExvY2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQo
Y29uc3QgU3RyaW5nJiBmb3JtYXQsIGNvbnN0IFN0cmluZyYgeWVhclRleHQsIGNvbnN0IFN0cmlu
ZyYgbW9udGhUZXh0LCBjb25zdCBTdHJpbmcmIGRheVRleHQpCit7CisgICAgcmV0dXJuIHN1YnN0
aXR1dGVMYWJlbHNJbnRvRm9ybWF0KHBhcnNlRGF0ZUZvcm1hdChmb3JtYXQpLCB5ZWFyVGV4dCwg
bW9udGhUZXh0LCBkYXlUZXh0KTsKK30KKwordm9pZCBMb2NhbGVXaW46OmluaXRpYWxpemVNb250
aExhYmVscygpCit7CisgICAgaWYgKG1fbW9udGhMYWJlbHMuc2l6ZSgpKQorICAgICAgICByZXR1
cm47CisgICAgY29uc3QgTENUWVBFIHR5cGVzWzEyXSA9IHsKKyAgICAgICAgTE9DQUxFX1NNT05U
SE5BTUUxLAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTIsCisgICAgICAgIExPQ0FMRV9TTU9O
VEhOQU1FMywKKyAgICAgICAgTE9DQUxFX1NNT05USE5BTUU0LAorICAgICAgICBMT0NBTEVfU01P
TlRITkFNRTUsCisgICAgICAgIExPQ0FMRV9TTU9OVEhOQU1FNiwKKyAgICAgICAgTE9DQUxFX1NN
T05USE5BTUU3LAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTgsCisgICAgICAgIExPQ0FMRV9T
TU9OVEhOQU1FOSwKKyAgICAgICAgTE9DQUxFX1NNT05USE5BTUUxMCwKKyAgICAgICAgTE9DQUxF
X1NNT05USE5BTUUxMSwKKyAgICAgICAgTE9DQUxFX1NNT05USE5BTUUxMiwKKyAgICB9OworICAg
IG1fbW9udGhMYWJlbHMucmVzZXJ2ZUNhcGFjaXR5KFdURl9BUlJBWV9MRU5HVEgodHlwZXMpKTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSCh0eXBlcyk7ICsr
aSkgeworICAgICAgICBtX21vbnRoTGFiZWxzLmFwcGVuZChnZXRMb2NhbGVJbmZvU3RyaW5nKHR5
cGVzW2ldKSk7CisgICAgICAgIGlmIChtX21vbnRoTGFiZWxzLmxhc3QoKS5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIG1fbW9udGhMYWJlbHMuc2hyaW5rKDApOworICAgICAgICAgICAgbV9tb250
aExhYmVscy5yZXNlcnZlQ2FwYWNpdHkoMTIpOworICAgICAgICAgICAgbV9tb250aExhYmVscy5h
cHBlbmQoIkphbnVhcnkiKTsKKyAgICAgICAgICAgIG1fbW9udGhMYWJlbHMuYXBwZW5kKCJGZWJy
dWFyeSIpOworICAgICAgICAgICAgbV9tb250aExhYmVscy5hcHBlbmQoIk1hcmNoIik7CisgICAg
ICAgICAgICBtX21vbnRoTGFiZWxzLmFwcGVuZCgiQXByaWwiKTsKKyAgICAgICAgICAgIG1fbW9u
dGhMYWJlbHMuYXBwZW5kKCJNYXkiKTsKKyAgICAgICAgICAgIG1fbW9udGhMYWJlbHMuYXBwZW5k
KCJKdW5lIik7CisgICAgICAgICAgICBtX21vbnRoTGFiZWxzLmFwcGVuZCgiSnVseSIpOworICAg
ICAgICAgICAgbV9tb250aExhYmVscy5hcHBlbmQoIkF1Z3VzdCIpOworICAgICAgICAgICAgbV9t
b250aExhYmVscy5hcHBlbmQoIlNlcHRlbWJlciIpOworICAgICAgICAgICAgbV9tb250aExhYmVs
cy5hcHBlbmQoIk9jdG9iZXIiKTsKKyAgICAgICAgICAgIG1fbW9udGhMYWJlbHMuYXBwZW5kKCJO
b3ZlbWJlciIpOworICAgICAgICAgICAgbV9tb250aExhYmVscy5hcHBlbmQoIkRlY2VtYmVyIik7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTG9jYWxl
V2luOjppbml0aWFsaXplV2Vla0RheVNob3J0TGFiZWxzKCkKK3sKKyAgICBpZiAobV93ZWVrRGF5
U2hvcnRMYWJlbHMuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisgICAgY29uc3QgTENUWVBFIHR5
cGVzWzddID0geworICAgICAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCAvLyBTdW5kYXkKKyAg
ICAgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwgLy8gTW9uZGF5CisgICAgICAgIExPQ0FMRV9T
QUJCUkVWREFZTkFNRTIsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsCisgICAgICAg
IExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTUs
CisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTYKKyAgICB9OworICAgIG1fd2Vla0RheVNo
b3J0TGFiZWxzLnJlc2VydmVDYXBhY2l0eShXVEZfQVJSQVlfTEVOR1RIKHR5cGVzKSk7CisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFdURl9BUlJBWV9MRU5HVEgodHlwZXMpOyArK2kpIHsK
KyAgICAgICAgbV93ZWVrRGF5U2hvcnRMYWJlbHMuYXBwZW5kKGdldExvY2FsZUluZm9TdHJpbmco
dHlwZXNbaV0pKTsKKyAgICAgICAgaWYgKG1fd2Vla0RheVNob3J0TGFiZWxzLmxhc3QoKS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgIG1fd2Vla0RheVNob3J0TGFiZWxzLnNocmluaygwKTsKKyAg
ICAgICAgICAgIG1fd2Vla0RheVNob3J0TGFiZWxzLnJlc2VydmVDYXBhY2l0eShXVEZfQVJSQVlf
TEVOR1RIKFdURjo6d2Vla2RheU5hbWUpKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgdyA9
IDA7IHcgPCBXVEZfQVJSQVlfTEVOR1RIKFdURjo6d2Vla2RheU5hbWUpOyArK3cpIHsKKyAgICAg
ICAgICAgICAgICAvLyB3ZWVrZGF5TmFtZSBzdGFydHMgd2l0aCBNb25kYXkuCisgICAgICAgICAg
ICAgICAgbV93ZWVrRGF5U2hvcnRMYWJlbHMuYXBwZW5kKFdURjo6d2Vla2RheU5hbWVbKHcgKyA2
KSAlIDddKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgIH0KK30KKworI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCitjb25zdCBWZWN0b3I8U3Ry
aW5nPiYgTG9jYWxlV2luOjptb250aExhYmVscygpCit7CisgICAgaW5pdGlhbGl6ZU1vbnRoTGFi
ZWxzKCk7CisgICAgcmV0dXJuIG1fbW9udGhMYWJlbHM7Cit9CisKK2NvbnN0IFZlY3RvcjxTdHJp
bmc+JiBMb2NhbGVXaW46OndlZWtEYXlTaG9ydExhYmVscygpCit7CisgICAgaW5pdGlhbGl6ZVdl
ZWtEYXlTaG9ydExhYmVscygpOworICAgIHJldHVybiBtX3dlZWtEYXlTaG9ydExhYmVsczsKK30K
KyNlbmRpZgorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xv
Y2FsZVdpbi5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9Mb2NhbGVXaW4uaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4xMmExYzU0NWUzNGEzMzc3ZDgyYjUzMDAyZjUwNDkxYTI2ODBkMWJhCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9Mb2NhbGVXaW4uaApAQCAt
MCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBMb2NhbGVXaW5faAorI2RlZmluZSBMb2NhbGVXaW5faAorCisj
aW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIERhdGVDb21wb25l
bnRzOworc3RydWN0IERhdGVGb3JtYXRUb2tlbjsKKworY2xhc3MgTG9jYWxlV2luIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxMb2NhbGVXaW4+IGNyZWF0ZShMQ0lEKTsKKyAgICBz
dGF0aWMgTG9jYWxlV2luKiBjdXJyZW50TG9jYWxlKCk7CisgICAgfkxvY2FsZVdpbigpOworICAg
IGRvdWJsZSBwYXJzZURhdGUoY29uc3QgU3RyaW5nJik7CisgICAgU3RyaW5nIGZvcm1hdERhdGUo
Y29uc3QgRGF0ZUNvbXBvbmVudHMmKTsKKyNpZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VSKQorICAg
IFN0cmluZyBkYXRlRm9ybWF0VGV4dCgpOworICAgIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBtb250
aExhYmVscygpOworICAgIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiB3ZWVrRGF5U2hvcnRMYWJlbHMo
KTsKKyAgICB1bnNpZ25lZCBmaXJzdERheU9mV2VlaygpIHsgcmV0dXJuIG1fZmlyc3REYXlPZldl
ZWs7IH0KKyNlbmRpZgorCisgICAgLy8gRm9yIHRlc3RpbmcuCisgICAgZG91YmxlIHBhcnNlRGF0
ZShjb25zdCBTdHJpbmcmIGZvcm1hdCwgaW50IGJhc2VZZWFyLCBjb25zdCBTdHJpbmcmIGlucHV0
KTsKKyAgICBTdHJpbmcgZm9ybWF0RGF0ZShjb25zdCBTdHJpbmcmIGZvcm1hdCwgaW50IGJhc2VZ
ZWFyLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KTsKKyAgICBzdGF0aWMgU3RyaW5nIGRh
dGVGb3JtYXRUZXh0KGNvbnN0IFN0cmluZyYgZm9ybWF0LCBjb25zdCBTdHJpbmcmIHllYXJUZXh0
LCBjb25zdCBTdHJpbmcmIG1vbnRoVGV4dCwgY29uc3QgU3RyaW5nJiBkYXlUZXh0KTsKKworcHJp
dmF0ZToKKyAgICBMb2NhbGVXaW4oTENJRCk7CisgICAgU3RyaW5nIGdldExvY2FsZUluZm9TdHJp
bmcoTENUWVBFKTsKKyAgICB2b2lkIGluaXRpYWxpemVTaG9ydE1vbnRoTGFiZWxzKCk7CisgICAg
dm9pZCBpbml0aWFsaXplTW9udGhMYWJlbHMoKTsKKyAgICB2b2lkIGluaXRpYWxpemVTaG9ydERh
dGVUb2tlbnMoKTsKKyAgICBpbnQgcGFyc2VOdW1iZXJPck1vbnRoKGNvbnN0IFN0cmluZyYsIHVu
c2lnbmVkJiBpbmRleCk7CisgICAgZG91YmxlIHBhcnNlRGF0ZShjb25zdCBWZWN0b3I8RGF0ZUZv
cm1hdFRva2VuPiYsIGludCBiYXNlWWVhciwgY29uc3QgU3RyaW5nJik7CisgICAgU3RyaW5nIGZv
cm1hdERhdGUoY29uc3QgVmVjdG9yPERhdGVGb3JtYXRUb2tlbj4mLCBpbnQgYmFzZVllYXIsIGlu
dCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpOworI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIp
CisgICAgdm9pZCBpbml0aWFsaXplV2Vla0RheVNob3J0TGFiZWxzKCk7CisjZW5kaWYKKworICAg
IExDSUQgbV9sY2lkOworICAgIGludCBtX2Jhc2VZZWFyOworICAgIFZlY3RvcjxEYXRlRm9ybWF0
VG9rZW4+IG1fc2hvcnREYXRlVG9rZW5zOworICAgIFZlY3RvcjxTdHJpbmc+IG1fc2hvcnRNb250
aExhYmVsczsKKyAgICBWZWN0b3I8U3RyaW5nPiBtX21vbnRoTGFiZWxzOworI2lmIEVOQUJMRShD
QUxFTkRBUl9QSUNLRVIpCisgICAgVmVjdG9yPFN0cmluZz4gbV93ZWVrRGF5U2hvcnRMYWJlbHM7
CisgICAgdW5zaWduZWQgbV9maXJzdERheU9mV2VlazsKKyNlbmRpZgorCit9OworCit9CisjZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTG9jYWxpemVkRGF0
ZVdpbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xvY2FsaXplZERhdGVXaW4u
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmJkOGYzNjdmM2E1ZGMxYjg5YzVkNzhlMDJlNWUzNDdhZmM4NDdhYjUK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xvY2FsaXpl
ZERhdGVXaW4uY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICog
TmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICog
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiTG9jYWxpemVkRGF0ZS5oIgorCisjaW5jbHVkZSAiTG9jYWxlV2luLmgiCisjaW5jbHVkZSA8
bGltaXRzPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2RvdWJsZSBwYXJzZUxvY2FsaXplZERhdGUoY29uc3QgU3RyaW5nJiBpbnB1dCwgRGF0ZUNvbXBv
bmVudHM6OlR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERhdGVD
b21wb25lbnRzOjpEYXRlOgorICAgICAgICByZXR1cm4gTG9jYWxlV2luOjpjdXJyZW50TG9jYWxl
KCktPnBhcnNlRGF0ZShpbnB1dCk7CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6RGF0ZVRpbWU6
CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6RGF0ZVRpbWVMb2NhbDoKKyAgICBjYXNlIERhdGVD
b21wb25lbnRzOjpNb250aDoKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpUaW1lOgorICAgIGNh
c2UgRGF0ZUNvbXBvbmVudHM6OldlZWs6CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6SW52YWxp
ZDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBudW1lcmljX2xpbWl0czxkb3Vi
bGU+OjpxdWlldF9OYU4oKTsKK30KKworU3RyaW5nIGZvcm1hdExvY2FsaXplZERhdGUoY29uc3Qg
RGF0ZUNvbXBvbmVudHMmIGRhdGVDb21wb25lbnRzKQoreworICAgIHN3aXRjaCAoZGF0ZUNvbXBv
bmVudHMudHlwZSgpKSB7CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6RGF0ZToKKyAgICAgICAg
cmV0dXJuIExvY2FsZVdpbjo6Y3VycmVudExvY2FsZSgpLT5mb3JtYXREYXRlKGRhdGVDb21wb25l
bnRzKTsKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpEYXRlVGltZToKKyAgICBjYXNlIERhdGVD
b21wb25lbnRzOjpEYXRlVGltZUxvY2FsOgorICAgIGNhc2UgRGF0ZUNvbXBvbmVudHM6Ok1vbnRo
OgorICAgIGNhc2UgRGF0ZUNvbXBvbmVudHM6OlRpbWU6CisgICAgY2FzZSBEYXRlQ29tcG9uZW50
czo6V2VlazoKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpJbnZhbGlkOgorICAgICAgICBicmVh
azsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCisjaWYgRU5BQkxFKENBTEVOREFS
X1BJQ0tFUikKK1N0cmluZyBsb2NhbGl6ZWREYXRlRm9ybWF0VGV4dCgpCit7CisgICAgcmV0dXJu
IExvY2FsZVdpbjo6Y3VycmVudExvY2FsZSgpLT5kYXRlRm9ybWF0VGV4dCgpOworfQorCitjb25z
dCBWZWN0b3I8U3RyaW5nPiYgbW9udGhMYWJlbHMoKQoreworICAgIHJldHVybiBMb2NhbGVXaW46
OmN1cnJlbnRMb2NhbGUoKS0+bW9udGhMYWJlbHMoKTsKK30KKworY29uc3QgVmVjdG9yPFN0cmlu
Zz4mIHdlZWtEYXlTaG9ydExhYmVscygpCit7CisgICAgcmV0dXJuIExvY2FsZVdpbjo6Y3VycmVu
dExvY2FsZSgpLT53ZWVrRGF5U2hvcnRMYWJlbHMoKTsKK30KKwordW5zaWduZWQgZmlyc3REYXlP
ZldlZWsoKQoreworICAgIHJldHVybiBMb2NhbGVXaW46OmN1cnJlbnRMb2NhbGUoKS0+Zmlyc3RE
YXlPZldlZWsoKTsKK30KKyNlbmRpZgorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL1dlYktpdC5neXBpIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQpp
bmRleCAwZTgyMjhhNmU4OTBkNWYzNzQwNDdmYzNhODE3MWI4OWQxMzg5YWE5Li4wMWQ1ZTZlZDUy
YTE2NDQ3ZGRmZDNjZWY2MTEyZTVlODMwZTE0YTMwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2Nocm9taXVtL1dlYktpdC5neXBpCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0
Lmd5cGkKQEAgLTE0Niw2ICsxNDYsNyBAQAogICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAg
ICAgICAgIFsnT1M9PSJ3aW4iJywgewogICAgICAgICAgICAgICAgICd3ZWJraXRfdW5pdHRlc3Rf
ZmlsZXMnOiBbCisgICAgICAgICAgICAgICAgICAgICd0ZXN0cy9Mb2NhbGVXaW5UZXN0LmNwcCcs
CiAgICAgICAgICAgICAgICAgICAgICMgRklYTUU6IFBvcnQgUG9wdXBNZW51VGVzdCB0byBMaW51
eCBhbmQgTWFjLgogICAgICAgICAgICAgICAgICAgICAndGVzdHMvUG9wdXBNZW51VGVzdC5jcHAn
LAogICAgICAgICAgICAgICAgICAgICAndGVzdHMvVHJhbnNwYXJlbmN5V2luVGVzdC5jcHAnLApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9Mb2NhbGVXaW5UZXN0LmNw
cCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvTG9jYWxlV2luVGVzdC5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uOGIwZTgxZWQ1YzdjYjE1Nzc1N2Q3OWUxNWQzMjA0M2U1ZGEzNmRjMgotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvTG9jYWxlV2luVGVzdC5jcHAK
QEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTG9jYWxlV2lu
LmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHd0Zi9EYXRlTWF0aC5o
PgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmlu
Zy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworZW51bSB7CisgICAgSmFudWFyeSA9
IDAsIEZlYnJ1YXJ5LCBNYXJjaCwKKyAgICBBcHJpbCwgTWF5LCBKdW5lLAorICAgIEp1bHksIEF1
Z3VzdCwgU2VwdGVtYmVyLAorICAgIE9jdG9iZXIsIE5vdmVtYmVyLCBEZWNlbWJlciwKK307CisK
K3N0YXRpYyBkb3VibGUgbXNGb3JEYXRlKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpCit7
CisgICAgcmV0dXJuIGRhdGVUb0RheXNGcm9tMTk3MCh5ZWFyLCBtb250aCwgZGF5KSAqIG1zUGVy
RGF5OworfQorCitURVNUKExvY2FsZVdpblRlc3QsIFRlc3RMb2NhbGl6ZWREYXRlRm9ybWF0VGV4
dCkKK3sKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5IiwgTG9jYWxlV2luOjpkYXRl
Rm9ybWF0VGV4dCgieS9NL2QiLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgp
KTsKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5IiwgTG9jYWxlV2luOjpkYXRlRm9y
bWF0VGV4dCgieXkvTU0vZGQiLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgp
KTsKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5IiwgTG9jYWxlV2luOjpkYXRlRm9y
bWF0VGV4dCgieXl5L01NTS9kZGQiLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0
YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5IiwgTG9jYWxlV2luOjpkYXRl
Rm9ybWF0VGV4dCgieXl5eS9NTU1NL2RkZGQiLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4
KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIi9tb250aC9kYXksIHllYXIiLCBMb2NhbGVX
aW46OmRhdGVGb3JtYXRUZXh0KCIvTU0vZGQsIHl5eXkiLCAieWVhciIsICJtb250aCIsICJkYXki
KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIm1vbnRoL2RheSwgeWVhcj15ZWFy
LiIsIExvY2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQoIk1NL2RkLCAneWVhcj0neXl5eS4iLCAieWVh
ciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIm1v
bnRoLWRheSAneWVhciIsIExvY2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQoIk1NLWRkICcneXl5Iiwg
InllYXIiLCAibW9udGgiLCAiZGF5IikudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVR
KCJtb250aC1kYXkgYWFhJ2JiYiB5ZWFyIiwgTG9jYWxlV2luOjpkYXRlRm9ybWF0VGV4dCgiTU0t
ZGQgJ2FhYScnYmJiJyB5eXkiLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgp
KTsKK30KKworVEVTVChMb2NhbGVXaW5UZXN0LCBUZXN0Rm9ybWF0KQoreworICAgIGNvbnN0IExD
SUQgRW5nbGlzaFVTID0gMHgwNDA5OworICAgIE93blB0cjxMb2NhbGVXaW4+IGxvY2FsZSA9IExv
Y2FsZVdpbjo6Y3JlYXRlKEVuZ2xpc2hVUyk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIjQvNy8yIiwg
bG9jYWxlLT5mb3JtYXREYXRlKCJNL2QveSIsIDIwMTIsIDIwMTIsIEFwcmlsLCA3KS51dGY4KCku
ZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjQvNy84IiwgbG9jYWxlLT5mb3JtYXREYXRlKCJN
L2QveSIsIDIwMTIsIDIwMDgsIEFwcmlsLCA3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1Rf
U1RSRVEoIjQvNy83IiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNL2QveSIsIDIwMTIsIDIwMTcsIEFw
cmlsLCA3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEyLzMxLzIwNjIiLCBs
b2NhbGUtPmZvcm1hdERhdGUoIk0vZC95IiwgMjAxMiwgMjA2MiwgRGVjZW1iZXIsIDMxKS51dGY4
KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjQvNy8wMDAyIiwgbG9jYWxlLT5mb3JtYXRE
YXRlKCJNL2QveSIsIDIwMTIsIDIsIEFwcmlsLCA3KS51dGY4KCkuZGF0YSgpKTsKKworICAgIEVY
UEVDVF9TVFJFUSgiMDQvMjcvMTIiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NL2RkL3l5IiwgMjAx
MiwgMjAxMiwgQXByaWwsIDI3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjA0
LzA3LzYyIiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNTS9kZC95eSIsIDIwMTIsIDIwNjIsIEFwcmls
LCA3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjA0LzA3LzYzIiwgbG9jYWxl
LT5mb3JtYXREYXRlKCJNTS9kZC95eSIsIDIwMTIsIDE5NjMsIEFwcmlsLCA3KS51dGY4KCkuZGF0
YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjAxLzMxLzAwIiwgbG9jYWxlLT5mb3JtYXREYXRlKCJN
TS9kZC95eSIsIDIwMTIsIDIwMDAsIEphbnVhcnksIDMxKS51dGY4KCkuZGF0YSgpKTsKKyAgICBF
WFBFQ1RfU1RSRVEoIjA0LzA3LzIwNjMiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NL2RkL3l5Iiwg
MjAxMiwgMjA2MywgQXByaWwsIDcpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgi
MDQvMDcvMDAwMSIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU0vZGQveXkiLCAyMDEyLCAxLCBBcHJp
bCwgNykudXRmOCgpLmRhdGEoKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIkphbi83LzIwMTIiLCBs
b2NhbGUtPmZvcm1hdERhdGUoIk1NTS9kL3l5eXkiLCAyMDEyLCAyMDEyLCBKYW51YXJ5LCA3KS51
dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkZlYi83LzIwMDgiLCBsb2NhbGUtPmZv
cm1hdERhdGUoIk1NTS9kL3l5eXkiLCAyMDEyLCAyMDA4LCBGZWJydWFyeSwgNykudXRmOCgpLmRh
dGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJNYXIvNy8yMDE3IiwgbG9jYWxlLT5mb3JtYXREYXRl
KCJNTU0vZC95eXl5IiwgMjAxMiwgMjAxNywgTWFyY2gsIDcpLnV0ZjgoKS5kYXRhKCkpOworICAg
IEVYUEVDVF9TVFJFUSgiRGVjLzMxLzIwNjIiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NTS9kL3l5
eXkiLCAyMDEyLCAyMDYyLCBEZWNlbWJlciwgMzEpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVD
VF9TVFJFUSgiTWF5LzcvMDAwMiIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NL2QveXl5eSIsIDIw
MTIsIDIsIE1heSwgNykudXRmOCgpLmRhdGEoKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIkp1bmUt
Ny0yMjAxMiIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEyLCAyMjAxMiwg
SnVuZSwgNykudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJKdWx5LTctMTIwMDgi
LCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NTU0tZC15eXl5IiwgMjAxMiwgMTIwMDgsIEp1bHksIDcp
LnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXVndXN0LTctMjAxNyIsIGxvY2Fs
ZS0+Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEyLCAyMDE3LCBBdWd1c3QsIDcpLnV0Zjgo
KS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiU2VwdGVtYmVyLTMxLTIwNjIiLCBsb2NhbGUt
PmZvcm1hdERhdGUoIk1NTU0tZC15eXl5IiwgMjAxMiwgMjA2MiwgU2VwdGVtYmVyLCAzMSkudXRm
OCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJPY3RvYmVyLTctMDAwMiIsIGxvY2FsZS0+
Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEyLCAyLCBPY3RvYmVyLCA3KS51dGY4KCkuZGF0
YSgpKTsKK30KKworVEVTVChMb2NhbGVXaW5UZXN0LCBUZXN0UGFyc2UpCit7CisgICAgY29uc3Qg
TENJRCBFbmdsaXNoVVMgPSAweDA0MDk7CisgICAgT3duUHRyPExvY2FsZVdpbj4gbG9jYWxlID0g
TG9jYWxlV2luOjpjcmVhdGUoRW5nbGlzaFVTKTsKKworICAgIEVYUEVDVF9FUShtc0ZvckRhdGUo
MjAxMiwgQXByaWwsIDI3KSwgbG9jYWxlLT5wYXJzZURhdGUoIk1NL2RkL3l5IiwgMjAxMiwgIjA0
LzI3LzEyIikpOworICAgIEVYUEVDVF9FUShtc0ZvckRhdGUoMjA2MiwgQXByaWwsIDI3KSwgbG9j
YWxlLT5wYXJzZURhdGUoIk1NL2RkL3l5IiwgMjAxMiwgIjA0LzI3LzYyIikpOworICAgIEVYUEVD
VF9FUShtc0ZvckRhdGUoMTk2MywgQXByaWwsIDI3KSwgbG9jYWxlLT5wYXJzZURhdGUoIk1NL2Rk
L3l5IiwgMjAxMiwgIjA0LzI3LzYzIikpOworICAgIEVYUEVDVF9FUShtc0ZvckRhdGUoMjAxMiwg
QXByaWwsIDI3KSwgbG9jYWxlLT5wYXJzZURhdGUoIk1NL2RkL3l5IiwgMjAxMiwgIjQvMjcvMjAx
MiIpKTsKKyAgICBFWFBFQ1RfRVEobXNGb3JEYXRlKDIwMTIsIEFwcmlsLCAyNyksIGxvY2FsZS0+
cGFyc2VEYXRlKCJNTS9kZC95eSIsIDIwMTIsICJBcHIvMjcvMjAxMiIpKTsKKyAgICBFWFBFQ1Rf
RVEobXNGb3JEYXRlKDIsIEFwcmlsLCAyNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJNTS9kL3l5Iiwg
MjAxMiwgIkFwcmlsLzI3LzIiKSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyLCBBcHJpbCwg
MjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU0vZC95eSIsIDIwMTIsICJhcHJpbC8yNy8yIikpOwor
CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgxMiwgQXByaWwsIDcpLCBsb2NhbGUtPnBhcnNlRGF0
ZSgiTU1NL2QveXl5eSIsIDIwMTIsICIwNC83LzEyIikpOworICAgIEVYUEVDVF9FUShtc0ZvckRh
dGUoNjIsIEFwcmlsLCA3KSwgbG9jYWxlLT5wYXJzZURhdGUoIk1NTS9kL3l5eXkiLCAyMDEyLCAi
MDQvMDcvNjIiKSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSg2MywgQXByaWwsIDcpLCBsb2Nh
bGUtPnBhcnNlRGF0ZSgiTU1NL2QveXl5eSIsIDIwMTIsICIwNC8wNy82MyIpKTsKKyAgICBFWFBF
Q1RfRVEobXNGb3JEYXRlKDIwMTIsIEFwcmlsLCA3KSwgbG9jYWxlLT5wYXJzZURhdGUoIk1NTS9k
L3l5eXkiLCAyMDEyLCAiNC83LzIwMTIiKSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDEy
LCBNYXksIDcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NL2QveXl5eSIsIDIwMTIsICJNYXkvMDA3
LzIwMTIiKSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyLCBNYXksIDI3KSwgbG9jYWxlLT5w
YXJzZURhdGUoIk1NL2QveXl5eSIsIDIwMTIsICJNYXkvMDAyNy8yIikpOworCisgICAgRVhQRUNU
X0VRKG1zRm9yRGF0ZSgyMDEyLCBBcHJpbCwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NTS9k
ZC95IiwgMjAxMiwgIjA0LzI3LzIiKSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDE3LCBB
cHJpbCwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NTS9kZC95IiwgMjAxMiwgIjA0LzI3Lzci
KSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDA4LCBBcHJpbCwgMjcpLCBsb2NhbGUtPnBh
cnNlRGF0ZSgiTU1NTS9kZC95IiwgMjAxMiwgIjA0LzI3LzgiKSk7CisgICAgRVhQRUNUX0VRKG1z
Rm9yRGF0ZSgyMDEyLCBBcHJpbCwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NTS9kZC95Iiwg
MjAxMiwgIjQvMjcvMjAxMiIpKTsKKyAgICBFWFBFQ1RfRVEobXNGb3JEYXRlKDIwMTIsIERlY2Vt
YmVyLCAyNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJNTU1NL2RkL3kiLCAyMDEyLCAiRGVjZW1iZXIv
MjcvMjAxMiIpKTsKKyAgICBFWFBFQ1RfRVEobXNGb3JEYXRlKDIwMTIsIE5vdmVtYmVyLCAyNyks
IGxvY2FsZS0+cGFyc2VEYXRlKCJNTU1NL2QveSIsIDIwMTIsICJOb3ZlbWJlci8yNy8yIikpOwor
fQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>139583</attachid>
            <date>2012-04-30 22:20:51 -0700</date>
            <delta_ts>2012-05-01 00:50:29 -0700</delta_ts>
            <desc>Patch 3</desc>
            <filename>bug-84935-20120501142049.patch</filename>
            <type>text/plain</type>
            <size>45738</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTE1NzEwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYzI3Y2I0NGQ1MjMzOTkx
ZGRmZTM4MWRmYWNiZDZmZWYwMjRjNjNkMS4uYmE1ZGIyNGE4ODQ5NjJmNjZjZjRlYzUzNzFjOTVi
OTVkZjNkZmZmNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDgyIEBACisyMDEyLTA0LTMwICBLZW50
IFRhbXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KKworICAgICAgICBbQ2hyb21pdW0vV2luZG93
c10gQWRkIExvY2FsaXplZERhdGVXaW4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTg0OTM1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgTG9jYWxpemVkRGF0ZUlDVS5jcHAgZG9lc24ndCByZWZsZWN0IHN5c3Rl
bSBzZXR0aW5ncy4gU28gdGhlcmUgd2VyZSBzb21lCisgICAgICAgIHByb2JsZW1zIHN1Y2ggYXMg
PGlucHV0IHR5cGU9ZGF0ZT4gZG9lc24ndCB1c2Ugc3lzdGVtJ3MgZGF0ZSBmb3JtYXQuCisKKyAg
ICAgICAgV2UgbmVlZCB0byB1c2UgV2luZG93cyBBUEkgdG8gZ2V0IGEgZGF0ZSBmb3JtYXQgYW5k
IGNhbGVuZGFyIHBhcmFtZXRlcnMuCisKKyAgICAgICAgV2Ugb2J0YWluIGEgZGF0ZSBmb3JtYXQg
bGlrZSAiTU0vZGQveXkiIHZpYSBXaW5kb3dzIEFQSSwgYW5kCisgICAgICAgIGZvcm1hdC9wYXJz
ZSBkYXRlcyBmb3IgdGhlIGZvcm1hdCBieSBvdXIgb3duIGNvZGUgYmVjYXVzZSBXaW5kb3dzIEFQ
SQorICAgICAgICBjYW4ndCBoYW5kbGUgeWVhcnMgb2xkZXIgdGhhbiAxNjAxIGFuZCBkb2Vzbid0
IGhhdmUgZGF0ZSBwYXJzaW5nIEFQSS4KKworICAgICAgICBVbml0IHRlc3Q6IFNvdXJjZS9XZWJL
aXQvY2hyb21pdW0vdGVzdHMvTG9jYWxlV2luVGVzdC5jcHAKKworICAgICAgICAqIFdlYkNvcmUu
Z3lwaTogQWRkIExvY2FsaXplZERhdGVXaW4uY3BwLgorICAgICAgICAqIFdlYkNvcmUuZ3lwL1dl
YkNvcmUuZ3lwOgorICAgICAgICBGb3IgV2luZG93cywgcmVtb3ZlIExvY2FsaXplZERhdGVJQ1Uu
Y3BwIGFuZCBhZGQgTG9jYWxpemVkRGF0ZVdpbi5jcHAuCisgICAgICAgIEFsbCBvZiAqV2luLmNw
cCBmaWxlcyBhcmUgZXhjbHVkZWQgYnkgZGVmYXVsdC4KKworICAgICAgICAqIHBsYXRmb3JtL3Rl
eHQvTG9jYWxlV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46Okxv
Y2FsZVdpbik6CisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46OmNyZWF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpMb2NhbGVXaW46OmN1cnJlbnRMb2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6
TG9jYWxlV2luOjp+TG9jYWxlV2luKToKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsZVdpbjo6Z2V0
TG9jYWxlSW5mb1N0cmluZyk6CisgICAgICAgIEEgaGVscGVyIGZ1bmN0aW9uIHRvIG9idGFpbiBh
IHN0cmluZyBieSBHZXRMb2NhbGVJbmZvKCkuCisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46
OmluaXRpYWxpemVTaG9ydE1vbnRoTGFiZWxzKToKKyAgICAgICAgT2J0YWluIHNob3J0IG1vbnRo
IG5hbWVzIGZyb20gV2luZG93cy4KKworICAgICAgICAoV2ViQ29yZTo6RGF0ZUZvcm1hdFRva2Vu
KTogQSBzdHJ1Y3QgdG8gcmVwcmVzZW50IGEgdG9rZW4gaW4gYSBkYXRlIGZvcm1hdC4KKyAgICAg
ICAgZS5nLiBBIGZvcm1hdCBzdHJpbmcgIk1NL2RkL3l5IiBnZW5lcmF0ZXMgZml2ZSBEYXRlRm9y
bWF0VG9rZW46CisgICAgICAgICBNb250aDIsIExpdGVyYWwsIERheTIsIExpdGVyYWwsIFllYXIy
LgorICAgICAgICAoaXNFcmFTeW1ib2wpOiBBIHJlYWRhYmlsaXR5IGhlbHBlciBmdW5jdGlvbi4K
KyAgICAgICAgKGlzWWVhclN5bWJvbCk6IGRpdHRvLgorICAgICAgICAoaXNNb250aFN5bWJvbCk6
IGRpdHRvLgorICAgICAgICAoaXNEYXlTeW1ib2wpOiBkaXR0by4KKyAgICAgICAgKGNvdW50Q29u
dGludW91c0xldHRlcnMpOgorICAgICAgICAoY29tbWl0TGl0ZXJhbFRva2VuKTogQSBoZWxwZXIg
Zm9yIHBhcnNlRGF0ZUZvcm1hdCgpLgorICAgICAgICAocGFyc2VEYXRlRm9ybWF0KToKKyAgICAg
ICAgUGFyc2UgYSBmb3JtYXQgc3RyaW5nLCBhbmQgZ2VuZXJhdGUgYSBsaXN0IG9mIERhdGVGb3Jt
YXRUb2tlbi4KKworICAgICAgICAoV2ViQ29yZTo6cGFyc2VOdW1iZXIpOiBBIGhlbHBlciBmb3Ig
cGFyc2VEYXRlKCkuCisgICAgICAgIChXZWJDb3JlOjpMb2NhbGVXaW46OnBhcnNlTnVtYmVyT3JN
b250aCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjpwYXJzZURhdGUpOgor
ICAgICAgICBQYXJzZSBhIHVzZXItcHJvdmlkZWQgZGF0ZSBzdHJpbmcgYnkgbWF0Y2hpbmcgd2l0
aCBhIERhdGVGb3JtYXRUb2tlbiBsaXN0LgorCisgICAgICAgIChXZWJDb3JlOjphcHBlbmROdW1i
ZXIpOiBBIGhlbHBlciBmb3IgZm9ybWF0RGF0ZSgpLgorICAgICAgICAoV2ViQ29yZTo6YXBwZW5k
VHdvRGlnaXRzTnVtYmVyKTogZGl0dG8uIFdyaXRlIGF0IGxlYXN0IHR3byBkaWdpdHMuCisgICAg
ICAgIChXZWJDb3JlOjphcHBlbmRGb3VyRGlnaXRzTnVtYmVyKTogZGl0dG8uIFdyaXRlIGF0IGxl
YXN0IGZvdXIgZGlnaXRzLgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjpmb3JtYXREYXRl
KToKKyAgICAgICAgRm9ybWF0IGEgRGF0ZUNvbXBvbmVudHMgYnkgaXRlcmF0aW5nIGEgRGF0ZUZv
cm1hdFRva2VuIGxpc3QuCisKKyAgICAgICAgKFdlYkNvcmU6OkxvY2FsZVdpbjo6aW5pdGlhbGl6
ZVNob3J0RGF0ZVRva2Vucyk6CisgICAgICAgIChXZWJDb3JlOjpzdWJzdGl0dXRlTGFiZWxzSW50
b0Zvcm1hdCk6CisgICAgICAgIENyZWF0ZXMgYSB1c2VyLXZpc2libGUgZm9ybWF0IHN0cmluZyBi
eSBpdGVyYXRpbmcgYSBEYXRlRm9ybWF0VG9rZW4gbGlzdC4KKyAgICAgICAgKFdlYkNvcmU6Okxv
Y2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjpp
bml0aWFsaXplTW9udGhMYWJlbHMpOgorICAgICAgICBDcmVhdGVzIG1vbnRoIG5hbWVzIGJ5IFdp
bmRvd3MgQVBJLgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjppbml0aWFsaXplV2Vla0Rh
eVNob3J0TGFiZWxzKToKKyAgICAgICAgIENyZWF0ZXMgZGF5IG5hbWVzIGJ5IFdpbmRvd3MgQVBJ
LgorICAgICAgICAoV2ViQ29yZTo6TG9jYWxlV2luOjptb250aExhYmVscyk6CisgICAgICAgIFB1
YmxpYyBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgbW9udGggbmFtZXMuCisgICAgICAgIChXZWJDb3Jl
OjpMb2NhbGVXaW46OndlZWtEYXlTaG9ydExhYmVscyk6CisgICAgICAgIFB1YmxpYyBhY2Nlc3Nv
ciBmdW5jdGlvbiBmb3IgZGF5IG5hbWVzLgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvTG9jYWxl
V2luLmg6IEFkZGVkLgorCisgICAgICAgICogcGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWREYXRlV2lu
LmNwcDoKKyAgICAgICAgQWRkZWQuIFRoZSBmb2xsd29pbmcgZnVuY3Rpb25zIHNpbXBseSBkZWxl
Z2F0ZSB0byBMb2NhbGVXaW46OmN1cnJlbnRMb2NhbGUoKS4KKyAgICAgICAgKFdlYkNvcmU6OnBh
cnNlTG9jYWxpemVkRGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpmb3JtYXRMb2NhbGl6ZWREYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OmxvY2FsaXplZERhdGVGb3JtYXRUZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6Om1vbnRoTGFiZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OndlZWtEYXlTaG9ydExh
YmVscyk6CisgICAgICAgIChXZWJDb3JlOjpmaXJzdERheU9mV2Vlayk6CisKIDIwMTItMDQtMzAg
IE1hcmsgUm93ZSAgPG1yb3dlQGFwcGxlLmNvbT4KIAogICAgICAgICBGaXggYW5vdGhlciBsZWFr
IGR1ZSB0byBtaXN1c2Ugb2YgY3JlYXRlQ0ZTdHJpbmcuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
CmluZGV4IGEzYzI2ZTAzMzNjODJmOGZmMmRlYmI3NGI4OWNkZjM2NWU4MzEyNjYuLjU1YTMzOWFi
Y2RjYTNhNmU3ODFmYmVlZTk2YjU1ZWYyZjEwYTVjMDggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJL
aXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdl
TG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTItMDQtMzAgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIFtDaHJvbWl1bS9XaW5kb3dzXSBBZGQgTG9jYWxpemVkRGF0
ZVdpbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODQ5
MzUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQg
dGVzdCBmb3IgTG9jYWxlV2luLmNwcC4KKworICAgICAgICAqIFdlYktpdC5neXBpOgorICAgICAg
ICAqIHRlc3RzL0xvY2FsZVdpblRlc3QuY3BwOiBBZGRlZC4KKyAgICAgICAgKG1zRm9yRGF0ZSk6
IEEgaGVscGVyIGZ1bmN0aW9uLgorICAgICAgICAoVEVTVCk6CisKIDIwMTItMDQtMzAgIEp1bGll
biBDaGFmZnJhaXggIDxqY2hhZmZyYWl4QHdlYmtpdC5vcmc+CiAKICAgICAgICAgTW92ZSBSZW5k
ZXJUYWJsZUNlbGwncyByb3cgaW5kZXggdG8gUmVuZGVyVGFibGVSb3cKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lwIGIvU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS5neXAvV2ViQ29yZS5neXAKaW5kZXggY2EzYzcyNzI2NGQ3ODBkMzEzZjkwZDVlYzM1YmQ2
M2VjZmYyMDMyZS4uYjBlMDJjYWE1MDMyZDNiZDMxMTg3MTk2ZDg3YmIyMDY2ZTVlZTczZCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKKysrIGIvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKQEAgLTE2NjgsNiArMTY2OCwxMSBA
QAogCiAgICAgICAgICAgICAjIFN5c3RlbUluZm8uY3BwIGlzIHVzZWZ1bCBhbmQgd2UgZG9uJ3Qg
d2FudCB0byBjb3B5IGl0LgogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL3dpbi9T
eXN0ZW1JbmZvXFwuY3BwJCddLAorCisgICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAncGxhdGZvcm0v
dGV4dC9Mb2NhbGl6ZWREYXRlSUNVXC5jcHAkJ10sCisgICAgICAgICAgICBbJ2luY2x1ZGUnLCAn
cGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWREYXRlV2luXC5jcHAkJ10sCisgICAgICAgICAgICBbJ2lu
Y2x1ZGUnLCAncGxhdGZvcm0vdGV4dC9Mb2NhbGVXaW5cLmNwcCQnXSwKKyAgICAgICAgICAgIFsn
aW5jbHVkZScsICdwbGF0Zm9ybS90ZXh0L0xvY2FsZVdpblwuaCQnXSwKICAgICAgICAgICBdLAog
ICAgICAgICB9LHsgIyBPUyE9IndpbiIKICAgICAgICAgICAnc291cmNlcy8nOiBbCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3Jl
Lmd5cGkKaW5kZXggNjY4NGI0NWEzZWFiMzI3ZTViOTQ0ODk5YzE2OTQ2YjYxNGMzNGE5ZC4uNDZh
NTQ0Mzg1Mjk1MzMxN2NhNjY2MjU1NzFkMzc0ZDQxM2NmNDk4MCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpA
QCAtNDQ4Miw5ICs0NDgyLDEyIEBACiAgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2NhbGVU
b1NjcmlwdE1hcHBpbmcuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2NhbGVUb1Nj
cmlwdE1hcHBpbmdEZWZhdWx0LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2Nh
bGVUb1NjcmlwdE1hcHBpbmdJQ1UuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS90ZXh0L0xv
Y2FsZVdpbi5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL3RleHQvTG9jYWxlV2luLmgnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL3RleHQvTG9jYWxpemVkRGF0ZS5oJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS90ZXh0L0xvY2FsaXplZERhdGVJQ1UuY3BwJywKICAgICAgICAgICAgICdwbGF0
Zm9ybS90ZXh0L0xvY2FsaXplZERhdGVOb25lLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0v
dGV4dC9Mb2NhbGl6ZWREYXRlV2luLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9M
b2NhbGl6ZWROdW1iZXIuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vdGV4dC9Mb2NhbGl6ZWRO
dW1iZXJJQ1UuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS90ZXh0L0xvY2FsaXplZE51bWJl
ck5vbmUuY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTG9j
YWxlV2luLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTG9jYWxlV2luLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4zMzJiMjI5MWNkOTk3NjVhNDFmNGQ3YzA5M2EwZTExNjU0Mzk3YzU5Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9Mb2NhbGVXaW4uY3Bw
CkBAIC0wLDAgKzEsNTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxvY2FsZVdp
bi5oIgorCisjaW5jbHVkZSAiRGF0ZUNvbXBvbmVudHMuaCIKKyNpbmNsdWRlICJMb2NhbGl6ZWRT
dHJpbmdzLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNs
dWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvRGF0ZU1hdGguaD4KKyNpbmNs
dWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworLy8gV2luZG93cyBkb2Vzbid0IGhhdmUgYW4gQVBJIHRvIHBh
cnNlIGxvY2FsZS1zcGVjaWZpYyBkYXRlIHN0cmluZywKKy8vIGFuZCBHZXREYXRlRm9ybWF0KCkg
YW5kIEdldERhdGVGb3JtYXRFeCgpIGRvbid0IHN1cHBvcnQgeWVhcnMgb2xkZXIKKy8vIHRoYW4g
MTYwMCwgd2hpY2ggd2Ugc2hvdWxkIHN1cHBvcnQgYWNjb3JkaW5nIHRvIHRoZSBIVE1MCisvLyBz
dGFuZGFyZC4gU28sIHdlIG9idGFpbiB0aGUgZGF0ZSBmb3JtYXQgZnJvbSB0aGUgc3lzdGVtLCBi
dXQgd2UKKy8vIGZvcm1hdC9wYXJzZSBhIGRhdGUgYnkgb3VyIG93biBjb2RlLgorCitpbmxpbmUg
TG9jYWxlV2luOjpMb2NhbGVXaW4oTENJRCBsY2lkKQorICAgIDogbV9sY2lkKGxjaWQpCit7Cisg
ICAgc3RydWN0IHRtIHRtOworICAgIGdldEN1cnJlbnRMb2NhbFRpbWUoJnRtKTsKKyAgICBtX2Jh
c2VZZWFyID0gdG0udG1feWVhciArIDE5MDA7CisKKyNpZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VS
KQorICAgIERXT1JEIHZhbHVlID0gMDsKKyAgICA6OkdldExvY2FsZUluZm8obV9sY2lkLCBMT0NB
TEVfSUZJUlNUREFZT0ZXRUVLIHwgTE9DQUxFX1JFVFVSTl9OVU1CRVIsIHJlaW50ZXJwcmV0X2Nh
c3Q8TFBXU1RSPigmdmFsdWUpLCBzaXplb2YodmFsdWUpIC8gc2l6ZW9mKFRDSEFSKSk7CisgICAg
Ly8gMDpNb25kYXksIC4uLiwgNjpTdW5kYXkuCisgICAgLy8gV2UgbmVlZCAxIGZvciBNb25kYXks
IDAgZm9yIFN1bmRheS4KKyAgICBtX2ZpcnN0RGF5T2ZXZWVrID0gKHZhbHVlICsgMSkgJSA3Owor
I2VuZGlmCit9CisKK1Bhc3NPd25QdHI8TG9jYWxlV2luPiBMb2NhbGVXaW46OmNyZWF0ZShMQ0lE
IGxjaWQpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBMb2NhbGVXaW4obGNpZCkpOworfQor
CitMb2NhbGVXaW4qIExvY2FsZVdpbjo6Y3VycmVudExvY2FsZSgpCit7CisgICAgLy8gSWRlYWxs
eSB3ZSBzaG91bGQgbWFrZSBMQ0lEIGZyb20gZGVmYXVsdExhbmd1YWdlKCkuIEJ1dAorICAgIC8v
IDo6TG9jYWxlTmFtZVRvTENJRCgpIGlzIGF2YWlsYWJsZSBzaW5jZSBXaW5kb3dzIFZpc3RhLgor
ICAgIHN0YXRpYyBMb2NhbGVXaW4gKmN1cnJlbnRMb2NhbGUgPSBMb2NhbGVXaW46OmNyZWF0ZShM
T0NBTEVfVVNFUl9ERUZBVUxUKS5sZWFrUHRyKCk7CisgICAgcmV0dXJuIGN1cnJlbnRMb2NhbGU7
Cit9CisKK0xvY2FsZVdpbjo6fkxvY2FsZVdpbigpCit7Cit9CisKK1N0cmluZyBMb2NhbGVXaW46
OmdldExvY2FsZUluZm9TdHJpbmcoTENUWVBFIHR5cGUpCit7CisgICAgaW50IGJ1ZmZlclNpemVX
aXRoTlVMID0gOjpHZXRMb2NhbGVJbmZvKG1fbGNpZCwgdHlwZSwgMCwgMCk7CisgICAgaWYgKGJ1
ZmZlclNpemVXaXRoTlVMIDw9IDApCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICBWZWN0
b3I8VUNoYXI+IGJ1ZmZlcihidWZmZXJTaXplV2l0aE5VTCk7CisgICAgOjpHZXRMb2NhbGVJbmZv
KG1fbGNpZCwgdHlwZSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyU2l6ZVdpdGhOVUwpOworICAgIGJ1
ZmZlci5zaHJpbmsoYnVmZmVyU2l6ZVdpdGhOVUwgLSAxKTsKKyAgICByZXR1cm4gU3RyaW5nOjph
ZG9wdChidWZmZXIpOworfQorCit2b2lkIExvY2FsZVdpbjo6ZW5zdXJlU2hvcnRNb250aExhYmVs
cygpCit7CisgICAgaWYgKCFtX3Nob3J0TW9udGhMYWJlbHMuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisgICAgY29uc3QgTENUWVBFIHR5cGVzWzEyXSA9IHsKKyAgICAgICAgTE9DQUxFX1NB
QkJSRVZNT05USE5BTUUxLAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsCisgICAg
ICAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05U
SE5BTUU0LAorICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsCisgICAgICAgIExPQ0FM
RV9TQUJCUkVWTU9OVEhOQU1FNiwKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LAor
ICAgICAgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsCisgICAgICAgIExPQ0FMRV9TQUJCUkVW
TU9OVEhOQU1FOSwKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwKKyAgICAgICAg
TE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZNT05USE5B
TUUxMiwKKyAgICB9OworICAgIG1fc2hvcnRNb250aExhYmVscy5yZXNlcnZlQ2FwYWNpdHkoV1RG
X0FSUkFZX0xFTkdUSCh0eXBlcykpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZf
QVJSQVlfTEVOR1RIKHR5cGVzKTsgKytpKSB7CisgICAgICAgIG1fc2hvcnRNb250aExhYmVscy5h
cHBlbmQoZ2V0TG9jYWxlSW5mb1N0cmluZyh0eXBlc1tpXSkpOworICAgICAgICBpZiAobV9zaG9y
dE1vbnRoTGFiZWxzLmxhc3QoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG1fc2hvcnRNb250
aExhYmVscy5zaHJpbmsoMCk7CisgICAgICAgICAgICBtX3Nob3J0TW9udGhMYWJlbHMucmVzZXJ2
ZUNhcGFjaXR5KFdURl9BUlJBWV9MRU5HVEgoV1RGOjptb250aE5hbWUpKTsKKyAgICAgICAgICAg
IGZvciAodW5zaWduZWQgbSA9IDA7IG0gPCBXVEZfQVJSQVlfTEVOR1RIKFdURjo6bW9udGhOYW1l
KTsgKyttKQorICAgICAgICAgICAgICAgIG1fc2hvcnRNb250aExhYmVscy5hcHBlbmQoV1RGOjpt
b250aE5hbWVbbV0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQor
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUb2tlbml6ZWQgZGF0ZSBmb3Jt
YXQKKworc3RydWN0IERhdGVGb3JtYXRUb2tlbiB7CisgICAgZW51bSBUeXBlIHsKKyAgICAgICAg
TGl0ZXJhbCwKKyAgICAgICAgRGF5MSwKKyAgICAgICAgRGF5MiwKKyAgICAgICAgTW9udGgxLAor
ICAgICAgICBNb250aDIsCisgICAgICAgIE1vbnRoMywKKyAgICAgICAgTW9udGg0LAorICAgICAg
ICBZZWFyMSwKKyAgICAgICAgWWVhcjIsCisgICAgICAgIFllYXI0LAorICAgIH07CisgICAgVHlw
ZSB0eXBlOworICAgIFN0cmluZyBkYXRhOyAvLyBUaGlzIGlzIHZhbGlkIG9ubHkgaWYgdHlwZT09
TGl0ZXJhbC4KKworICAgIERhdGVGb3JtYXRUb2tlbihUeXBlIHR5cGUpCisgICAgICAgIDogdHlw
ZSh0eXBlKQorICAgIHsgfQorCisgICAgRGF0ZUZvcm1hdFRva2VuKGNvbnN0IFN0cmluZyYgZGF0
YSkKKyAgICAgICAgOiB0eXBlKExpdGVyYWwpCisgICAgICAgICwgZGF0YShkYXRhKQorICAgIHsg
fQorCisgICAgRGF0ZUZvcm1hdFRva2VuKGNvbnN0IERhdGVGb3JtYXRUb2tlbiYgdG9rZW4pCisg
ICAgICAgIDogdHlwZSh0b2tlbi50eXBlKQorICAgICAgICAsIGRhdGEodG9rZW4uZGF0YSkKKyAg
ICB7IH0KK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0VyYVN5bWJvbChVQ2hhciBsZXR0ZXIp
IHsgcmV0dXJuIGxldHRlciA9PSAnZyc7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1llYXJTeW1i
b2woVUNoYXIgbGV0dGVyKSB7IHJldHVybiBsZXR0ZXIgPT0gJ3knOyB9CitzdGF0aWMgaW5saW5l
IGJvb2wgaXNNb250aFN5bWJvbChVQ2hhciBsZXR0ZXIpIHsgcmV0dXJuIGxldHRlciA9PSAnTSc7
IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0RheVN5bWJvbChVQ2hhciBsZXR0ZXIpIHsgcmV0dXJu
IGxldHRlciA9PSAnZCc7IH0KKworc3RhdGljIHVuc2lnbmVkIGNvdW50Q29udGludW91c0xldHRl
cnMoY29uc3QgU3RyaW5nJiBmb3JtYXQsIHVuc2lnbmVkIGluZGV4KQoreworICAgIHVuc2lnbmVk
IGNvdW50ID0gMTsKKyAgICBVQ2hhciByZWZlcmVuY2UgPSBmb3JtYXRbaW5kZXhdOworICAgIHdo
aWxlIChpbmRleCArIDEgPCBmb3JtYXQubGVuZ3RoKCkpIHsKKyAgICAgICAgaWYgKGZvcm1hdFsr
K2luZGV4XSAhPSByZWZlcmVuY2UpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytjb3Vu
dDsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCBjb21taXRMaXRl
cmFsVG9rZW4oU3RyaW5nQnVpbGRlciYgbGl0ZXJhbEJ1ZmZlciwgVmVjdG9yPERhdGVGb3JtYXRU
b2tlbj4mIHRva2VucykKK3sKKyAgICBpZiAobGl0ZXJhbEJ1ZmZlci5sZW5ndGgoKSA8PSAwKQor
ICAgICAgICByZXR1cm47CisgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0VG9rZW4obGl0ZXJh
bEJ1ZmZlci50b1N0cmluZygpKSk7CisgICAgbGl0ZXJhbEJ1ZmZlci5jbGVhcigpOworfQorCisv
LyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMzE3Nzg3KHY9
dnMuODUpLmFzcHgKK3N0YXRpYyBWZWN0b3I8RGF0ZUZvcm1hdFRva2VuPiBwYXJzZURhdGVGb3Jt
YXQoY29uc3QgU3RyaW5nIGZvcm1hdCkKK3sKKyAgICBWZWN0b3I8RGF0ZUZvcm1hdFRva2VuPiB0
b2tlbnM7CisgICAgU3RyaW5nQnVpbGRlciBsaXRlcmFsQnVmZmVyOworICAgIGJvb2wgaW5RdW90
ZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoKCk7
ICsraSkgeworICAgICAgICBVQ2hhciBjaCA9IGZvcm1hdFtpXTsKKyAgICAgICAgaWYgKGluUXVv
dGUpIHsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXCcnKSB7CisgICAgICAgICAgICAgICAgaW5R
dW90ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIEFTU0VSVChpKTsKKyAgICAgICAgICAgICAg
ICBpZiAoZm9ybWF0W2kgLSAxXSA9PSAnXCcnKQorICAgICAgICAgICAgICAgICAgICBsaXRlcmFs
QnVmZmVyLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAg
IGxpdGVyYWxCdWZmZXIuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICB9CisKKyAgICAgICAgaWYgKGNoID09ICdcJycpIHsKKyAgICAgICAgICAgIGluUXVvdGUgPSB0
cnVlOworICAgICAgICAgICAgaWYgKGkgPiAwICYmIGZvcm1hdFtpIC0gMV0gPT0gJ1wnJykKKyAg
ICAgICAgICAgICAgICBsaXRlcmFsQnVmZmVyLmFwcGVuZChjaCk7CisgICAgICAgIH0gZWxzZSBp
ZiAoaXNZZWFyU3ltYm9sKGNoKSkgeworICAgICAgICAgICAgY29tbWl0TGl0ZXJhbFRva2VuKGxp
dGVyYWxCdWZmZXIsIHRva2Vucyk7CisgICAgICAgICAgICB1bnNpZ25lZCBjb3VudCA9IGNvdW50
Q29udGludW91c0xldHRlcnMoZm9ybWF0LCBpKTsKKyAgICAgICAgICAgIGkgKz0gY291bnQgLSAx
OworICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpCisgICAgICAgICAgICAgICAgdG9rZW5zLmFw
cGVuZChEYXRlRm9ybWF0VG9rZW4oRGF0ZUZvcm1hdFRva2VuOjpZZWFyMSkpOworICAgICAgICAg
ICAgZWxzZSBpZiAoY291bnQgPT0gMikKKyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERh
dGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0VG9rZW46OlllYXIyKSk7CisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChEYXRlRm9ybWF0VG9rZW4oRGF0ZUZvcm1h
dFRva2VuOjpZZWFyNCkpOworICAgICAgICB9IGVsc2UgaWYgKGlzTW9udGhTeW1ib2woY2gpKSB7
CisgICAgICAgICAgICBjb21taXRMaXRlcmFsVG9rZW4obGl0ZXJhbEJ1ZmZlciwgdG9rZW5zKTsK
KyAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50ID0gY291bnRDb250aW51b3VzTGV0dGVycyhmb3Jt
YXQsIGkpOworICAgICAgICAgICAgaSArPSBjb3VudCAtIDE7CisgICAgICAgICAgICBpZiAoY291
bnQgPT0gMSkKKyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRUb2tlbihE
YXRlRm9ybWF0VG9rZW46Ok1vbnRoMSkpOworICAgICAgICAgICAgZWxzZSBpZiAoY291bnQgPT0g
MikKKyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRUb2tlbihEYXRlRm9y
bWF0VG9rZW46Ok1vbnRoMikpOworICAgICAgICAgICAgZWxzZSBpZiAoY291bnQgPT0gMykKKyAg
ICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0VG9r
ZW46Ok1vbnRoMykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRva2Vucy5h
cHBlbmQoRGF0ZUZvcm1hdFRva2VuKERhdGVGb3JtYXRUb2tlbjo6TW9udGg0KSk7CisgICAgICAg
IH0gZWxzZSBpZiAoaXNEYXlTeW1ib2woY2gpKSB7CisgICAgICAgICAgICBjb21taXRMaXRlcmFs
VG9rZW4obGl0ZXJhbEJ1ZmZlciwgdG9rZW5zKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50
ID0gY291bnRDb250aW51b3VzTGV0dGVycyhmb3JtYXQsIGkpOworICAgICAgICAgICAgaSArPSBj
b3VudCAtIDE7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gMSkKKyAgICAgICAgICAgICAgICB0
b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRUb2tlbihEYXRlRm9ybWF0VG9rZW46OkRheTEpKTsKKyAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKERhdGVGb3JtYXRU
b2tlbihEYXRlRm9ybWF0VG9rZW46OkRheTIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0VyYVN5
bWJvbChjaCkpIHsKKyAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIGVyYS4KKyAgICAgICAgICAg
IC8vIEhUTUw1IGRhdGUgc3VwcG9ydHMgb25seSBBLkQuCisgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgbGl0ZXJhbEJ1ZmZlci5hcHBlbmQoY2gpOworICAgIH0KKyAgICBjb21taXRMaXRlcmFs
VG9rZW4obGl0ZXJhbEJ1ZmZlciwgdG9rZW5zKTsKKyAgICByZXR1cm4gdG9rZW5zOworfQorCisv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJzaW5nCisKKy8vIFJldHVybnMg
LTEgaWYgcGFyc2luZyBmYWlscy4KK3N0YXRpYyBpbnQgcGFyc2VOdW1iZXIoY29uc3QgU3RyaW5n
JiBpbnB1dCwgdW5zaWduZWQmIGluZGV4KQoreworICAgIHVuc2lnbmVkIGRpZ2l0c1N0YXJ0ID0g
aW5kZXg7CisgICAgd2hpbGUgKGluZGV4IDwgaW5wdXQubGVuZ3RoKCkgJiYgaXNBU0NJSURpZ2l0
KGlucHV0W2luZGV4XSkpCisgICAgICAgIGluZGV4Kys7CisgICAgaWYgKGRpZ2l0c1N0YXJ0ID09
IGluZGV4KQorICAgICAgICByZXR1cm4gLTE7CisgICAgYm9vbCBvayA9IGZhbHNlOworICAgIGlu
dCBudW1iZXIgPSBpbnB1dC5zdWJzdHJpbmcoZGlnaXRzU3RhcnQsIGluZGV4IC0gZGlnaXRzU3Rh
cnQpLnRvSW50KCZvayk7CisgICAgcmV0dXJuIG9rID8gbnVtYmVyIDogLTE7Cit9CisKKy8vIFJl
dHVybnMgMC1iYXNlZCBtb250aCBudW1iZXIuIFJldHVybnMgLTEgaWYgcGFyc2luZyBmYWlscy4K
K2ludCBMb2NhbGVXaW46OnBhcnNlTnVtYmVyT3JNb250aChjb25zdCBTdHJpbmcmIGlucHV0LCB1
bnNpZ25lZCYgaW5kZXgpCit7CisgICAgaW50IHJlc3VsdCA9IHBhcnNlTnVtYmVyKGlucHV0LCBp
bmRleCk7CisgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAgIGlmIChyZXN1bHQgPCAxIHx8
IHJlc3VsdCA+IDEyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gcmVz
dWx0IC0gMTsKKyAgICB9CisgICAgZm9yICh1bnNpZ25lZCBtID0gMDsgbSA8IG1fbW9udGhMYWJl
bHMuc2l6ZSgpOyArK20pIHsKKyAgICAgICAgdW5zaWduZWQgbGFiZWxMZW5ndGggPSBtX21vbnRo
TGFiZWxzW21dLmxlbmd0aCgpOworICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoaW5wdXQu
c3Vic3RyaW5nKGluZGV4LCBsYWJlbExlbmd0aCksIG1fbW9udGhMYWJlbHNbbV0pKSB7CisgICAg
ICAgICAgICBpbmRleCArPSBsYWJlbExlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBtOworICAg
ICAgICB9CisgICAgfQorICAgIGZvciAodW5zaWduZWQgbSA9IDA7IG0gPCBtX3Nob3J0TW9udGhM
YWJlbHMuc2l6ZSgpOyArK20pIHsKKyAgICAgICAgdW5zaWduZWQgbGFiZWxMZW5ndGggPSBtX3No
b3J0TW9udGhMYWJlbHNbbV0ubGVuZ3RoKCk7CisgICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZShpbnB1dC5zdWJzdHJpbmcoaW5kZXgsIGxhYmVsTGVuZ3RoKSwgbV9zaG9ydE1vbnRoTGFiZWxz
W21dKSkgeworICAgICAgICAgICAgaW5kZXggKz0gbGFiZWxMZW5ndGg7CisgICAgICAgICAgICBy
ZXR1cm4gbTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2RvdWJsZSBM
b2NhbGVXaW46OnBhcnNlRGF0ZShjb25zdCBTdHJpbmcmIGlucHV0KQoreworICAgIGVuc3VyZVNo
b3J0RGF0ZVRva2VucygpOworICAgIHJldHVybiBwYXJzZURhdGUobV9zaG9ydERhdGVUb2tlbnMs
IG1fYmFzZVllYXIsIGlucHV0KTsKK30KKworZG91YmxlIExvY2FsZVdpbjo6cGFyc2VEYXRlKGNv
bnN0IFN0cmluZyYgZm9ybWF0LCBpbnQgYmFzZVllYXIsIGNvbnN0IFN0cmluZyYgaW5wdXQpCit7
CisgICAgcmV0dXJuIHBhcnNlRGF0ZShwYXJzZURhdGVGb3JtYXQoZm9ybWF0KSwgYmFzZVllYXIs
IGlucHV0KTsKK30KKworZG91YmxlIExvY2FsZVdpbjo6cGFyc2VEYXRlKGNvbnN0IFZlY3RvcjxE
YXRlRm9ybWF0VG9rZW4+JiB0b2tlbnMsIGludCBiYXNlWWVhciwgY29uc3QgU3RyaW5nJiBpbnB1
dCkKK3sKKyAgICBlbnN1cmVTaG9ydE1vbnRoTGFiZWxzKCk7CisgICAgZW5zdXJlTW9udGhMYWJl
bHMoKTsKKyAgICBjb25zdCBkb3VibGUgTmFOID0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVp
ZXRfTmFOKCk7CisgICAgdW5zaWduZWQgaW5wdXRJbmRleCA9IDA7CisgICAgaW50IGRheSA9IC0x
LCBtb250aCA9IC0xLCB5ZWFyID0gLTE7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRv
a2Vucy5zaXplKCk7ICsraSkgeworICAgICAgICBzd2l0Y2ggKHRva2Vuc1tpXS50eXBlKSB7Cisg
ICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpMaXRlcmFsOiB7CisgICAgICAgICAgICBTdHJp
bmcgZGF0YSA9IHRva2Vuc1tpXS5kYXRhOworICAgICAgICAgICAgdW5zaWduZWQgbGl0ZXJhbExl
bmd0aCA9IGRhdGEubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyaW5nKGlu
cHV0SW5kZXgsIGxpdGVyYWxMZW5ndGgpID09IGRhdGEpCisgICAgICAgICAgICAgICAgaW5wdXRJ
bmRleCArPSBsaXRlcmFsTGVuZ3RoOworICAgICAgICAgICAgLy8gR28gYWhlYWQgZXZlbiBpZiB0
aGUgaW5wdXQgZG9lc24ndCBoYXZlIHRoaXMgc3RyaW5nLgorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OkRheTE6CisgICAgICAgIGNh
c2UgRGF0ZUZvcm1hdFRva2VuOjpEYXkyOgorICAgICAgICAgICAgZGF5ID0gcGFyc2VOdW1iZXIo
aW5wdXQsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gMzEp
CisgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGgxOgorICAgICAgICBjYXNlIERhdGVGb3JtYXRU
b2tlbjo6TW9udGgyOgorICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGgzOgorICAg
ICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGg0OgorICAgICAgICAgICAgbW9udGggPSBw
YXJzZU51bWJlck9yTW9udGgoaW5wdXQsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgaWYgKG1v
bnRoIDwgMCB8fCBtb250aCA+IDExKQorICAgICAgICAgICAgICAgIHJldHVybiBOYU47CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OlllYXIxOiB7Cisg
ICAgICAgICAgICB1bnNpZ25lZCBvbGRJbmRleCA9IGlucHV0SW5kZXg7CisgICAgICAgICAgICB5
ZWFyID0gcGFyc2VOdW1iZXIoaW5wdXQsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgaWYgKHll
YXIgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTmFOOworICAgICAgICAgICAgaWYgKGlu
cHV0SW5kZXggLSBvbGRJbmRleCA9PSAxKSB7CisgICAgICAgICAgICAgICAgaW50IHNob3J0WWVh
ciA9IGJhc2VZZWFyICUgMTA7CisgICAgICAgICAgICAgICAgaW50IGRlY2FkZSA9IGJhc2VZZWFy
IC0gc2hvcnRZZWFyOworICAgICAgICAgICAgICAgIGlmIChzaG9ydFllYXIgPj0gNSkKKyAgICAg
ICAgICAgICAgICAgICAgeWVhciArPSBzaG9ydFllYXIgLSA0IDw9IHllYXIgPyBkZWNhZGUgOiBk
ZWNhZGUgKyAxMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHll
YXIgKz0gc2hvcnRZZWFyICsgNSA+PSB5ZWFyID8gZGVjYWRlIDogZGVjYWRlIC0gMTA7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERh
dGVGb3JtYXRUb2tlbjo6WWVhcjI6IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG9sZEluZGV4ID0g
aW5wdXRJbmRleDsKKyAgICAgICAgICAgIHllYXIgPSBwYXJzZU51bWJlcihpbnB1dCwgaW5wdXRJ
bmRleCk7CisgICAgICAgICAgICBpZiAoeWVhciA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVy
biBOYU47CisgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCAtIG9sZEluZGV4ID09IDIpIHsKKyAg
ICAgICAgICAgICAgICBpbnQgc2hvcnRZZWFyID0gYmFzZVllYXIgJSAxMDA7CisgICAgICAgICAg
ICAgICAgaW50IGNlbnR1cnkgPSBiYXNlWWVhciAtIHNob3J0WWVhcjsKKyAgICAgICAgICAgICAg
ICBpZiAoc2hvcnRZZWFyID49IDUwKQorICAgICAgICAgICAgICAgICAgICB5ZWFyICs9IHNob3J0
WWVhciAtIDQ5IDw9IHllYXIgPyBjZW50dXJ5IDogY2VudHVyeSArIDEwMDsKKyAgICAgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHllYXIgKz0gc2hvcnRZZWFyICsgNTAgPj0g
eWVhciA/IGNlbnR1cnkgOiBjZW50dXJ5IC0gMTAwOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OlllYXI0
OgorICAgICAgICAgICAgeWVhciA9IHBhcnNlTnVtYmVyKGlucHV0LCBpbnB1dEluZGV4KTsKKyAg
ICAgICAgICAgIGlmICh5ZWFyIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh5ZWFyIDw9IDAgfHwg
bW9udGggPCAwIHx8IGRheSA8PSAwKQorICAgICAgICByZXR1cm4gTmFOOworICAgIHJldHVybiBk
YXRlVG9EYXlzRnJvbTE5NzAoeWVhciwgbW9udGgsIGRheSkgKiBtc1BlckRheTsKK30KKworLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRm9ybWF0dGluZworCitzdGF0aWMgaW5s
aW5lIHZvaWQgYXBwZW5kTnVtYmVyKGludCB2YWx1ZSwgU3RyaW5nQnVpbGRlciYgYnVmZmVyKQor
eworICAgIGJ1ZmZlci5hcHBlbmQoU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKK30KKworc3RhdGlj
IHZvaWQgYXBwZW5kVHdvRGlnaXRzTnVtYmVyKGludCB2YWx1ZSwgU3RyaW5nQnVpbGRlciYgYnVm
ZmVyKQoreworICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDwgMTApCisgICAgICAgIGJ1ZmZl
ci5hcHBlbmQoIjAiKTsKKyAgICBidWZmZXIuYXBwZW5kKFN0cmluZzo6bnVtYmVyKHZhbHVlKSk7
Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZEZvdXJEaWdpdHNOdW1iZXIoaW50IHZhbHVlLCBTdHJp
bmdCdWlsZGVyJiBidWZmZXIpCit7CisgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICBidWZm
ZXIuYXBwZW5kKFN0cmluZzo6bnVtYmVyKHZhbHVlKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisgICAgaWYgKHZhbHVlIDwgMTApCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjAwMCIpOworICAg
IGVsc2UgaWYgKHZhbHVlIDwgMTAwKQorICAgICAgICBidWZmZXIuYXBwZW5kKCIwMCIpOworICAg
IGVsc2UgaWYgKHZhbHVlIDwgMTAwMCkKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiMCIpOworICAg
IGJ1ZmZlci5hcHBlbmQoU3RyaW5nOjpudW1iZXIodmFsdWUpKTsKK30KKworU3RyaW5nIExvY2Fs
ZVdpbjo6Zm9ybWF0RGF0ZShjb25zdCBEYXRlQ29tcG9uZW50cyYgZGF0ZUNvbXBvbmVudHMpCit7
CisgICAgZW5zdXJlU2hvcnREYXRlVG9rZW5zKCk7CisgICAgcmV0dXJuIGZvcm1hdERhdGUobV9z
aG9ydERhdGVUb2tlbnMsIG1fYmFzZVllYXIsIGRhdGVDb21wb25lbnRzLmZ1bGxZZWFyKCksIGRh
dGVDb21wb25lbnRzLm1vbnRoKCksIGRhdGVDb21wb25lbnRzLm1vbnRoRGF5KCkpOworfQorCitT
dHJpbmcgTG9jYWxlV2luOjpmb3JtYXREYXRlKGNvbnN0IFN0cmluZyYgZm9ybWF0LCBpbnQgYmFz
ZVllYXIsIGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXkpCit7CisgICAgcmV0dXJuIGZvcm1h
dERhdGUocGFyc2VEYXRlRm9ybWF0KGZvcm1hdCksIGJhc2VZZWFyLCB5ZWFyLCBtb250aCwgZGF5
KTsKK30KKworU3RyaW5nIExvY2FsZVdpbjo6Zm9ybWF0RGF0ZShjb25zdCBWZWN0b3I8RGF0ZUZv
cm1hdFRva2VuPiYgdG9rZW5zLCBpbnQgYmFzZVllYXIsIGludCB5ZWFyLCBpbnQgbW9udGgsIGlu
dCBkYXkpCit7CisgICAgZW5zdXJlU2hvcnRNb250aExhYmVscygpOworICAgIGVuc3VyZU1vbnRo
TGFiZWxzKCk7CisgICAgU3RyaW5nQnVpbGRlciBidWZmZXI7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSkgeworICAgICAgICBzd2l0Y2ggKHRva2Vuc1tp
XS50eXBlKSB7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpMaXRlcmFsOgorICAgICAg
ICAgICAgYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0uZGF0YSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OkRheTE6CisgICAgICAgICAgICBhcHBlbmRO
dW1iZXIoZGF5LCBidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0
ZUZvcm1hdFRva2VuOjpEYXkyOgorICAgICAgICAgICAgYXBwZW5kVHdvRGlnaXRzTnVtYmVyKGRh
eSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERhdGVGb3JtYXRU
b2tlbjo6TW9udGgxOgorICAgICAgICAgICAgYXBwZW5kTnVtYmVyKG1vbnRoICsgMSwgYnVmZmVy
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9u
dGgyOgorICAgICAgICAgICAgYXBwZW5kVHdvRGlnaXRzTnVtYmVyKG1vbnRoICsgMSwgYnVmZmVy
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9u
dGgzOgorICAgICAgICAgICAgaWYgKDAgPD0gbW9udGggJiYgbW9udGggPCBzdGF0aWNfY2FzdDxp
bnQ+KG1fc2hvcnRNb250aExhYmVscy5zaXplKCkpKQorICAgICAgICAgICAgICAgIGJ1ZmZlci5h
cHBlbmQobV9zaG9ydE1vbnRoTGFiZWxzW21vbnRoXSk7CisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgYXBwZW5kTnVtYmVyKG1vbnRoICsgMSwgYnVmZmVyKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6TW9udGg0OgorICAgICAgICAg
ICAgaWYgKDAgPD0gbW9udGggJiYgbW9udGggPCBzdGF0aWNfY2FzdDxpbnQ+KG1fbW9udGhMYWJl
bHMuc2l6ZSgpKSkKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG1fbW9udGhMYWJlbHNb
bW9udGhdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhcHBlbmROdW1iZXIo
bW9udGggKyAxLCBidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGF0
ZUZvcm1hdFRva2VuOjpZZWFyMTogeworICAgICAgICAgICAgaWYgKGJhc2VZZWFyIC0gNCA8PSB5
ZWFyICYmIHllYXIgPD0gYmFzZVllYXIgKyA1KQorICAgICAgICAgICAgICAgIGFwcGVuZE51bWJl
cih5ZWFyICUgMTAsIGJ1ZmZlcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
YXBwZW5kRm91ckRpZ2l0c051bWJlcih5ZWFyLCBidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OlllYXIyOiB7CisgICAg
ICAgICAgICBpZiAoYmFzZVllYXIgLSA0OSA8PSB5ZWFyICYmIHllYXIgPD0gYmFzZVllYXIgKyA1
MCkKKyAgICAgICAgICAgICAgICBhcHBlbmRUd29EaWdpdHNOdW1iZXIoeWVhciAlIDEwMCwgYnVm
ZmVyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhcHBlbmRGb3VyRGlnaXRz
TnVtYmVyKHllYXIsIGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIERhdGVGb3JtYXRUb2tlbjo6WWVhcjQ6CisgICAgICAgICAgICBhcHBlbmRGb3Vy
RGlnaXRzTnVtYmVyKHllYXIsIGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgIH0KKyAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Cit9CisKK3ZvaWQgTG9jYWxl
V2luOjplbnN1cmVTaG9ydERhdGVUb2tlbnMoKQoreworICAgIGlmICghbV9zaG9ydERhdGVUb2tl
bnMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgbV9zaG9ydERhdGVUb2tlbnMgPSBw
YXJzZURhdGVGb3JtYXQoZ2V0TG9jYWxlSW5mb1N0cmluZyhMT0NBTEVfU1NIT1JUREFURSkpOwor
fQorCitzdGF0aWMgU3RyaW5nIHN1YnN0aXR1dGVMYWJlbHNJbnRvRm9ybWF0KGNvbnN0IFZlY3Rv
cjxEYXRlRm9ybWF0VG9rZW4+JiB0b2tlbnMsIGNvbnN0IFN0cmluZyYgeWVhclRleHQsIGNvbnN0
IFN0cmluZyYgbW9udGhUZXh0LCBjb25zdCBTdHJpbmcmIGRheVRleHQpCit7CisgICAgU3RyaW5n
IG5vbkVtcHR5RGF5VGV4dCA9IGRheVRleHQuaXNFbXB0eSgpID8gIkRheSIgOiBkYXlUZXh0Owor
ICAgIFN0cmluZyBub25FbXB0eU1vbnRoVGV4dCA9IG1vbnRoVGV4dC5pc0VtcHR5KCkgPyAiTW9u
dGgiIDogbW9udGhUZXh0OworICAgIFN0cmluZyBub25FbXB0eVllYXJUZXh0ID0geWVhclRleHQu
aXNFbXB0eSgpID8gIlllYXIiIDogeWVhclRleHQ7CisgICAgU3RyaW5nQnVpbGRlciBidWZmZXI7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSkgeworICAg
ICAgICBzd2l0Y2ggKHRva2Vuc1tpXS50eXBlKSB7CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRv
a2VuOjpMaXRlcmFsOgorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0b2tlbnNbaV0uZGF0YSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OkRheTE6
CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpEYXkyOgorICAgICAgICAgICAgYnVmZmVy
LmFwcGVuZChub25FbXB0eURheVRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgRGF0ZUZvcm1hdFRva2VuOjpNb250aDE6CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2Vu
OjpNb250aDI6CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpNb250aDM6CisgICAgICAg
IGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpNb250aDQ6CisgICAgICAgICAgICBidWZmZXIuYXBwZW5k
KG5vbkVtcHR5TW9udGhUZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERh
dGVGb3JtYXRUb2tlbjo6WWVhcjE6CisgICAgICAgIGNhc2UgRGF0ZUZvcm1hdFRva2VuOjpZZWFy
MjoKKyAgICAgICAgY2FzZSBEYXRlRm9ybWF0VG9rZW46OlllYXI0OgorICAgICAgICAgICAgYnVm
ZmVyLmFwcGVuZChub25FbXB0eVllYXJUZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgfQorICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKK30KKworU3RyaW5nIExv
Y2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQoKQoreworICAgIGVuc3VyZVNob3J0RGF0ZVRva2Vucygp
OworICAgIHJldHVybiBzdWJzdGl0dXRlTGFiZWxzSW50b0Zvcm1hdChtX3Nob3J0RGF0ZVRva2Vu
cywgZGF0ZUZvcm1hdFllYXJUZXh0KCksIGRhdGVGb3JtYXRNb250aFRleHQoKSwgZGF0ZUZvcm1h
dERheUluTW9udGhUZXh0KCkpOworfQorCitTdHJpbmcgTG9jYWxlV2luOjpkYXRlRm9ybWF0VGV4
dChjb25zdCBTdHJpbmcmIGZvcm1hdCwgY29uc3QgU3RyaW5nJiB5ZWFyVGV4dCwgY29uc3QgU3Ry
aW5nJiBtb250aFRleHQsIGNvbnN0IFN0cmluZyYgZGF5VGV4dCkKK3sKKyAgICByZXR1cm4gc3Vi
c3RpdHV0ZUxhYmVsc0ludG9Gb3JtYXQocGFyc2VEYXRlRm9ybWF0KGZvcm1hdCksIHllYXJUZXh0
LCBtb250aFRleHQsIGRheVRleHQpOworfQorCit2b2lkIExvY2FsZVdpbjo6ZW5zdXJlTW9udGhM
YWJlbHMoKQoreworICAgIGlmICghbV9tb250aExhYmVscy5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKyAgICBjb25zdCBMQ1RZUEUgdHlwZXNbMTJdID0geworICAgICAgICBMT0NBTEVfU01P
TlRITkFNRTEsCisgICAgICAgIExPQ0FMRV9TTU9OVEhOQU1FMiwKKyAgICAgICAgTE9DQUxFX1NN
T05USE5BTUUzLAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTQsCisgICAgICAgIExPQ0FMRV9T
TU9OVEhOQU1FNSwKKyAgICAgICAgTE9DQUxFX1NNT05USE5BTUU2LAorICAgICAgICBMT0NBTEVf
U01PTlRITkFNRTcsCisgICAgICAgIExPQ0FMRV9TTU9OVEhOQU1FOCwKKyAgICAgICAgTE9DQUxF
X1NNT05USE5BTUU5LAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTEwLAorICAgICAgICBMT0NB
TEVfU01PTlRITkFNRTExLAorICAgICAgICBMT0NBTEVfU01PTlRITkFNRTEyLAorICAgIH07Cisg
ICAgbV9tb250aExhYmVscy5yZXNlcnZlQ2FwYWNpdHkoV1RGX0FSUkFZX0xFTkdUSCh0eXBlcykp
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKHR5cGVzKTsg
KytpKSB7CisgICAgICAgIG1fbW9udGhMYWJlbHMuYXBwZW5kKGdldExvY2FsZUluZm9TdHJpbmco
dHlwZXNbaV0pKTsKKyAgICAgICAgaWYgKG1fbW9udGhMYWJlbHMubGFzdCgpLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgbV9tb250aExhYmVscy5zaHJpbmsoMCk7CisgICAgICAgICAgICBtX21v
bnRoTGFiZWxzLnJlc2VydmVDYXBhY2l0eShXVEZfQVJSQVlfTEVOR1RIKFdURjo6bW9udGhGdWxs
TmFtZSkpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBtID0gMDsgbSA8IFdURl9BUlJBWV9M
RU5HVEgoV1RGOjptb250aEZ1bGxOYW1lKTsgKyttKQorICAgICAgICAgICAgICAgIG1fbW9udGhM
YWJlbHMuYXBwZW5kKFdURjo6bW9udGhGdWxsTmFtZVttXSk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTG9jYWxlV2luOjplbnN1cmVXZWVrRGF5U2hv
cnRMYWJlbHMoKQoreworICAgIGlmICghbV93ZWVrRGF5U2hvcnRMYWJlbHMuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisgICAgY29uc3QgTENUWVBFIHR5cGVzWzddID0geworICAgICAgICBM
T0NBTEVfU0FCQlJFVkRBWU5BTUU3LCAvLyBTdW5kYXkKKyAgICAgICAgTE9DQUxFX1NBQkJSRVZE
QVlOQU1FMSwgLy8gTW9uZGF5CisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsCisgICAg
ICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFN
RTQsCisgICAgICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsCisgICAgICAgIExPQ0FMRV9TQUJC
UkVWREFZTkFNRTYKKyAgICB9OworICAgIG1fd2Vla0RheVNob3J0TGFiZWxzLnJlc2VydmVDYXBh
Y2l0eShXVEZfQVJSQVlfTEVOR1RIKHR5cGVzKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IFdURl9BUlJBWV9MRU5HVEgodHlwZXMpOyArK2kpIHsKKyAgICAgICAgbV93ZWVrRGF5U2hv
cnRMYWJlbHMuYXBwZW5kKGdldExvY2FsZUluZm9TdHJpbmcodHlwZXNbaV0pKTsKKyAgICAgICAg
aWYgKG1fd2Vla0RheVNob3J0TGFiZWxzLmxhc3QoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAg
IG1fd2Vla0RheVNob3J0TGFiZWxzLnNocmluaygwKTsKKyAgICAgICAgICAgIG1fd2Vla0RheVNo
b3J0TGFiZWxzLnJlc2VydmVDYXBhY2l0eShXVEZfQVJSQVlfTEVOR1RIKFdURjo6d2Vla2RheU5h
bWUpKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgdyA9IDA7IHcgPCBXVEZfQVJSQVlfTEVO
R1RIKFdURjo6d2Vla2RheU5hbWUpOyArK3cpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZWVrZGF5
TmFtZSBzdGFydHMgd2l0aCBNb25kYXkuCisgICAgICAgICAgICAgICAgbV93ZWVrRGF5U2hvcnRM
YWJlbHMuYXBwZW5kKFdURjo6d2Vla2RheU5hbWVbKHcgKyA2KSAlIDddKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmIEVOQUJM
RShDQUxFTkRBUl9QSUNLRVIpCitjb25zdCBWZWN0b3I8U3RyaW5nPiYgTG9jYWxlV2luOjptb250
aExhYmVscygpCit7CisgICAgZW5zdXJlTW9udGhMYWJlbHMoKTsKKyAgICByZXR1cm4gbV9tb250
aExhYmVsczsKK30KKworY29uc3QgVmVjdG9yPFN0cmluZz4mIExvY2FsZVdpbjo6d2Vla0RheVNo
b3J0TGFiZWxzKCkKK3sKKyAgICBlbnN1cmVXZWVrRGF5U2hvcnRMYWJlbHMoKTsKKyAgICByZXR1
cm4gbV93ZWVrRGF5U2hvcnRMYWJlbHM7Cit9CisjZW5kaWYKKworfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9Mb2NhbGVXaW4uaCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL3RleHQvTG9jYWxlV2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNmE3NWM5OTQ1NTdmNTcwYTk4Y2Jm
N2Y2MDliNDU2ZjNkY2UyM2M0NAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL3RleHQvTG9jYWxlV2luLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTG9jYWxlV2lu
X2gKKyNkZWZpbmUgTG9jYWxlV2luX2gKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRl
IDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBEYXRlQ29tcG9uZW50czsKK3N0cnVjdCBEYXRlRm9ybWF0VG9rZW47
CisKK2NsYXNzIExvY2FsZVdpbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8TG9j
YWxlV2luPiBjcmVhdGUoTENJRCk7CisgICAgc3RhdGljIExvY2FsZVdpbiogY3VycmVudExvY2Fs
ZSgpOworICAgIH5Mb2NhbGVXaW4oKTsKKyAgICBkb3VibGUgcGFyc2VEYXRlKGNvbnN0IFN0cmlu
ZyYpOworICAgIFN0cmluZyBmb3JtYXREYXRlKGNvbnN0IERhdGVDb21wb25lbnRzJik7CisjaWYg
RU5BQkxFKENBTEVOREFSX1BJQ0tFUikKKyAgICBTdHJpbmcgZGF0ZUZvcm1hdFRleHQoKTsKKyAg
ICBjb25zdCBWZWN0b3I8U3RyaW5nPiYgbW9udGhMYWJlbHMoKTsKKyAgICBjb25zdCBWZWN0b3I8
U3RyaW5nPiYgd2Vla0RheVNob3J0TGFiZWxzKCk7CisgICAgdW5zaWduZWQgZmlyc3REYXlPZldl
ZWsoKSB7IHJldHVybiBtX2ZpcnN0RGF5T2ZXZWVrOyB9CisjZW5kaWYKKworICAgIC8vIEZvciB0
ZXN0aW5nLgorICAgIGRvdWJsZSBwYXJzZURhdGUoY29uc3QgU3RyaW5nJiBmb3JtYXQsIGludCBi
YXNlWWVhciwgY29uc3QgU3RyaW5nJiBpbnB1dCk7CisgICAgU3RyaW5nIGZvcm1hdERhdGUoY29u
c3QgU3RyaW5nJiBmb3JtYXQsIGludCBiYXNlWWVhciwgaW50IHllYXIsIGludCBtb250aCwgaW50
IGRheSk7CisgICAgc3RhdGljIFN0cmluZyBkYXRlRm9ybWF0VGV4dChjb25zdCBTdHJpbmcmIGZv
cm1hdCwgY29uc3QgU3RyaW5nJiB5ZWFyVGV4dCwgY29uc3QgU3RyaW5nJiBtb250aFRleHQsIGNv
bnN0IFN0cmluZyYgZGF5VGV4dCk7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgTG9jYWxlV2lu
KExDSUQpOworICAgIFN0cmluZyBnZXRMb2NhbGVJbmZvU3RyaW5nKExDVFlQRSk7CisgICAgdm9p
ZCBlbnN1cmVTaG9ydE1vbnRoTGFiZWxzKCk7CisgICAgdm9pZCBlbnN1cmVNb250aExhYmVscygp
OworICAgIHZvaWQgZW5zdXJlU2hvcnREYXRlVG9rZW5zKCk7CisgICAgaW50IHBhcnNlTnVtYmVy
T3JNb250aChjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCYgaW5kZXgpOworICAgIGRvdWJsZSBwYXJz
ZURhdGUoY29uc3QgVmVjdG9yPERhdGVGb3JtYXRUb2tlbj4mLCBpbnQgYmFzZVllYXIsIGNvbnN0
IFN0cmluZyYpOworICAgIFN0cmluZyBmb3JtYXREYXRlKGNvbnN0IFZlY3RvcjxEYXRlRm9ybWF0
VG9rZW4+JiwgaW50IGJhc2VZZWFyLCBpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KTsKKyNp
ZiBFTkFCTEUoQ0FMRU5EQVJfUElDS0VSKQorICAgIHZvaWQgZW5zdXJlV2Vla0RheVNob3J0TGFi
ZWxzKCk7CisjZW5kaWYKKworICAgIExDSUQgbV9sY2lkOworICAgIGludCBtX2Jhc2VZZWFyOwor
ICAgIFZlY3RvcjxEYXRlRm9ybWF0VG9rZW4+IG1fc2hvcnREYXRlVG9rZW5zOworICAgIFZlY3Rv
cjxTdHJpbmc+IG1fc2hvcnRNb250aExhYmVsczsKKyAgICBWZWN0b3I8U3RyaW5nPiBtX21vbnRo
TGFiZWxzOworI2lmIEVOQUJMRShDQUxFTkRBUl9QSUNLRVIpCisgICAgVmVjdG9yPFN0cmluZz4g
bV93ZWVrRGF5U2hvcnRMYWJlbHM7CisgICAgdW5zaWduZWQgbV9maXJzdERheU9mV2VlazsKKyNl
bmRpZgorCit9OworCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3RleHQvTG9jYWxpemVkRGF0ZVdpbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90
ZXh0L0xvY2FsaXplZERhdGVXaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmJkOGYzNjdmM2E1ZGMxYjg5YzVk
NzhlMDJlNWUzNDdhZmM4NDdhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS90ZXh0L0xvY2FsaXplZERhdGVXaW4uY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlz
dHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3Ig
dGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTG9jYWxpemVkRGF0ZS5oIgorCisjaW5jbHVkZSAiTG9j
YWxlV2luLmgiCisjaW5jbHVkZSA8bGltaXRzPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2RvdWJsZSBwYXJzZUxvY2FsaXplZERhdGUoY29uc3QgU3Ry
aW5nJiBpbnB1dCwgRGF0ZUNvbXBvbmVudHM6OlR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5
cGUpIHsKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpEYXRlOgorICAgICAgICByZXR1cm4gTG9j
YWxlV2luOjpjdXJyZW50TG9jYWxlKCktPnBhcnNlRGF0ZShpbnB1dCk7CisgICAgY2FzZSBEYXRl
Q29tcG9uZW50czo6RGF0ZVRpbWU6CisgICAgY2FzZSBEYXRlQ29tcG9uZW50czo6RGF0ZVRpbWVM
b2NhbDoKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpNb250aDoKKyAgICBjYXNlIERhdGVDb21w
b25lbnRzOjpUaW1lOgorICAgIGNhc2UgRGF0ZUNvbXBvbmVudHM6OldlZWs6CisgICAgY2FzZSBE
YXRlQ29tcG9uZW50czo6SW52YWxpZDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVy
biBudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKK30KKworU3RyaW5nIGZvcm1h
dExvY2FsaXplZERhdGUoY29uc3QgRGF0ZUNvbXBvbmVudHMmIGRhdGVDb21wb25lbnRzKQorewor
ICAgIHN3aXRjaCAoZGF0ZUNvbXBvbmVudHMudHlwZSgpKSB7CisgICAgY2FzZSBEYXRlQ29tcG9u
ZW50czo6RGF0ZToKKyAgICAgICAgcmV0dXJuIExvY2FsZVdpbjo6Y3VycmVudExvY2FsZSgpLT5m
b3JtYXREYXRlKGRhdGVDb21wb25lbnRzKTsKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpEYXRl
VGltZToKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpEYXRlVGltZUxvY2FsOgorICAgIGNhc2Ug
RGF0ZUNvbXBvbmVudHM6Ok1vbnRoOgorICAgIGNhc2UgRGF0ZUNvbXBvbmVudHM6OlRpbWU6Cisg
ICAgY2FzZSBEYXRlQ29tcG9uZW50czo6V2VlazoKKyAgICBjYXNlIERhdGVDb21wb25lbnRzOjpJ
bnZhbGlkOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZygpOworfQor
CisjaWYgRU5BQkxFKENBTEVOREFSX1BJQ0tFUikKK1N0cmluZyBsb2NhbGl6ZWREYXRlRm9ybWF0
VGV4dCgpCit7CisgICAgcmV0dXJuIExvY2FsZVdpbjo6Y3VycmVudExvY2FsZSgpLT5kYXRlRm9y
bWF0VGV4dCgpOworfQorCitjb25zdCBWZWN0b3I8U3RyaW5nPiYgbW9udGhMYWJlbHMoKQorewor
ICAgIHJldHVybiBMb2NhbGVXaW46OmN1cnJlbnRMb2NhbGUoKS0+bW9udGhMYWJlbHMoKTsKK30K
KworY29uc3QgVmVjdG9yPFN0cmluZz4mIHdlZWtEYXlTaG9ydExhYmVscygpCit7CisgICAgcmV0
dXJuIExvY2FsZVdpbjo6Y3VycmVudExvY2FsZSgpLT53ZWVrRGF5U2hvcnRMYWJlbHMoKTsKK30K
KwordW5zaWduZWQgZmlyc3REYXlPZldlZWsoKQoreworICAgIHJldHVybiBMb2NhbGVXaW46OmN1
cnJlbnRMb2NhbGUoKS0+Zmlyc3REYXlPZldlZWsoKTsKK30KKyNlbmRpZgorCit9CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpIGIvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9XZWJLaXQuZ3lwaQppbmRleCAwZTgyMjhhNmU4OTBkNWYzNzQwNDdmYzNhODE3MWI4
OWQxMzg5YWE5Li4wMWQ1ZTZlZDUyYTE2NDQ3ZGRmZDNjZWY2MTEyZTVlODMwZTE0YTMwIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpCisrKyBiL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cGkKQEAgLTE0Niw2ICsxNDYsNyBAQAogICAgICAgICAn
Y29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgIFsnT1M9PSJ3aW4iJywgewogICAgICAgICAgICAg
ICAgICd3ZWJraXRfdW5pdHRlc3RfZmlsZXMnOiBbCisgICAgICAgICAgICAgICAgICAgICd0ZXN0
cy9Mb2NhbGVXaW5UZXN0LmNwcCcsCiAgICAgICAgICAgICAgICAgICAgICMgRklYTUU6IFBvcnQg
UG9wdXBNZW51VGVzdCB0byBMaW51eCBhbmQgTWFjLgogICAgICAgICAgICAgICAgICAgICAndGVz
dHMvUG9wdXBNZW51VGVzdC5jcHAnLAogICAgICAgICAgICAgICAgICAgICAndGVzdHMvVHJhbnNw
YXJlbmN5V2luVGVzdC5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90
ZXN0cy9Mb2NhbGVXaW5UZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvTG9j
YWxlV2luVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDY0ZTkwMmE1NWM0YmIyYjQ2OTQxYmQ5NmQxOGEz
ZGU4ZDQxNzc4OQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVz
dHMvTG9jYWxlV2luVGVzdC5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgor
ICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiTG9jYWxlV2luLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2lu
Y2x1ZGUgPHd0Zi9EYXRlTWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5j
bHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisK
K3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworZW51bSB7
CisgICAgSmFudWFyeSA9IDAsIEZlYnJ1YXJ5LCBNYXJjaCwKKyAgICBBcHJpbCwgTWF5LCBKdW5l
LAorICAgIEp1bHksIEF1Z3VzdCwgU2VwdGVtYmVyLAorICAgIE9jdG9iZXIsIE5vdmVtYmVyLCBE
ZWNlbWJlciwKK307CisKK3N0YXRpYyBkb3VibGUgbXNGb3JEYXRlKGludCB5ZWFyLCBpbnQgbW9u
dGgsIGludCBkYXkpCit7CisgICAgcmV0dXJuIGRhdGVUb0RheXNGcm9tMTk3MCh5ZWFyLCBtb250
aCwgZGF5KSAqIG1zUGVyRGF5OworfQorCitURVNUKExvY2FsZVdpblRlc3QsIFRlc3RMb2NhbGl6
ZWREYXRlRm9ybWF0VGV4dCkKK3sKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5Iiwg
TG9jYWxlV2luOjpkYXRlRm9ybWF0VGV4dCgieS9NL2QiLCAieWVhciIsICJtb250aCIsICJkYXki
KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5IiwgTG9j
YWxlV2luOjpkYXRlRm9ybWF0VGV4dCgieXkvTU0vZGQiLCAieWVhciIsICJtb250aCIsICJkYXki
KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5IiwgTG9j
YWxlV2luOjpkYXRlRm9ybWF0VGV4dCgieXl5L01NTS9kZGQiLCAieWVhciIsICJtb250aCIsICJk
YXkiKS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5Iiwg
TG9jYWxlV2luOjpkYXRlRm9ybWF0VGV4dCgieXl5eS9NTU1NL2RkZGQiLCAieWVhciIsICJtb250
aCIsICJkYXkiKS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIi9tb250aC9kYXks
IHllYXIiLCBMb2NhbGVXaW46OmRhdGVGb3JtYXRUZXh0KCIvTU0vZGQsIHl5eXkiLCAieWVhciIs
ICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIm1vbnRo
L2RheSwgeWVhcj15ZWFyLiIsIExvY2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQoIk1NL2RkLCAneWVh
cj0neXl5eS4iLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgpKTsKKyAgICBF
WFBFQ1RfU1RSRVEoIm1vbnRoLWRheSAneWVhciIsIExvY2FsZVdpbjo6ZGF0ZUZvcm1hdFRleHQo
Ik1NLWRkICcneXl5IiwgInllYXIiLCAibW9udGgiLCAiZGF5IikudXRmOCgpLmRhdGEoKSk7Cisg
ICAgRVhQRUNUX1NUUkVRKCJtb250aC1kYXkgYWFhJ2JiYiB5ZWFyIiwgTG9jYWxlV2luOjpkYXRl
Rm9ybWF0VGV4dCgiTU0tZGQgJ2FhYScnYmJiJyB5eXkiLCAieWVhciIsICJtb250aCIsICJkYXki
KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInllYXIvbW9udGgvZGF5L3llYXIv
bW9udGgvZGF5IiwgTG9jYWxlV2luOjpkYXRlRm9ybWF0VGV4dCgieXl5eS9NTU1NL2RkZGQveXl5
eS9NTU1NL2RkZGQiLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgpKTsKKyAg
ICBFWFBFQ1RfU1RSRVEoIllZL21tL0REIiwgTG9jYWxlV2luOjpkYXRlRm9ybWF0VGV4dCgiWVkv
bW0vREQiLCAieWVhciIsICJtb250aCIsICJkYXkiKS51dGY4KCkuZGF0YSgpKTsKK30KKworVEVT
VChMb2NhbGVXaW5UZXN0LCBUZXN0Rm9ybWF0KQoreworICAgIGNvbnN0IExDSUQgRW5nbGlzaFVT
ID0gMHgwNDA5OworICAgIE93blB0cjxMb2NhbGVXaW4+IGxvY2FsZSA9IExvY2FsZVdpbjo6Y3Jl
YXRlKEVuZ2xpc2hVUyk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIjQvNy8yIiwgbG9jYWxlLT5mb3Jt
YXREYXRlKCJNL2QveSIsIDIwMTIsIDIwMTIsIEFwcmlsLCA3KS51dGY4KCkuZGF0YSgpKTsKKyAg
ICBFWFBFQ1RfU1RSRVEoIjQvNy8yMDA3IiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNL2QveSIsIDIw
MTIsIDIwMDcsIEFwcmlsLCA3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjQv
Ny84IiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNL2QveSIsIDIwMTIsIDIwMDgsIEFwcmlsLCA3KS51
dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjQvNy83IiwgbG9jYWxlLT5mb3JtYXRE
YXRlKCJNL2QveSIsIDIwMTIsIDIwMTcsIEFwcmlsLCA3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBF
WFBFQ1RfU1RSRVEoIjQvNy8yMDE4IiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNL2QveSIsIDIwMTIs
IDIwMTgsIEFwcmlsLCA3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEyLzMx
LzIwNjIiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk0vZC95IiwgMjAxMiwgMjA2MiwgRGVjZW1iZXIs
IDMxKS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjQvNy8wMDAyIiwgbG9jYWxl
LT5mb3JtYXREYXRlKCJNL2QveSIsIDIwMTIsIDIsIEFwcmlsLCA3KS51dGY4KCkuZGF0YSgpKTsK
KworICAgIEVYUEVDVF9TVFJFUSgiMDQvMjcvMTIiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NL2Rk
L3l5IiwgMjAxMiwgMjAxMiwgQXByaWwsIDI3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1Rf
U1RSRVEoIjA0LzA3LzE5NjIiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NL2RkL3l5IiwgMjAxMiwg
MTk2MiwgQXByaWwsIDcpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMDQvMDcv
NjMiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NL2RkL3l5IiwgMjAxMiwgMTk2MywgQXByaWwsIDcp
LnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMDEvMzEvMDAiLCBsb2NhbGUtPmZv
cm1hdERhdGUoIk1NL2RkL3l5IiwgMjAxMiwgMjAwMCwgSmFudWFyeSwgMzEpLnV0ZjgoKS5kYXRh
KCkpOworICAgIEVYUEVDVF9TVFJFUSgiMDQvMDcvNjIiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1N
L2RkL3l5IiwgMjAxMiwgMjA2MiwgQXByaWwsIDcpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVD
VF9TVFJFUSgiMDQvMDcvMjA2MyIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU0vZGQveXkiLCAyMDEy
LCAyMDYzLCBBcHJpbCwgNykudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIwNC8w
Ny8wMDAxIiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNTS9kZC95eSIsIDIwMTIsIDEsIEFwcmlsLCA3
KS51dGY4KCkuZGF0YSgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiSmFuLzcvMjAxMiIsIGxvY2Fs
ZS0+Zm9ybWF0RGF0ZSgiTU1NL2QveXl5eSIsIDIwMTIsIDIwMTIsIEphbnVhcnksIDcpLnV0Zjgo
KS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiRmViLzcvMjAwOCIsIGxvY2FsZS0+Zm9ybWF0
RGF0ZSgiTU1NL2QveXl5eSIsIDIwMTIsIDIwMDgsIEZlYnJ1YXJ5LCA3KS51dGY4KCkuZGF0YSgp
KTsKKyAgICBFWFBFQ1RfU1RSRVEoIk1hci83LzIwMTciLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1N
TS9kL3l5eXkiLCAyMDEyLCAyMDE3LCBNYXJjaCwgNykudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQ
RUNUX1NUUkVRKCJBcHIvNy8yMDEyIiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNTU0vZC95eXl5Iiwg
MjAxMiwgMjAxMiwgQXByaWwsIDcpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgi
TWF5LzcvMDAwMiIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NL2QveXl5eSIsIDIwMTIsIDIsIE1h
eSwgNykudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJKdW4vNy8yMDA4IiwgbG9j
YWxlLT5mb3JtYXREYXRlKCJNTU0vZC95eXl5IiwgMjAxMiwgMjAwOCwgSnVuZSwgNykudXRmOCgp
LmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJKdWwvNy8yMDE3IiwgbG9jYWxlLT5mb3JtYXRE
YXRlKCJNTU0vZC95eXl5IiwgMjAxMiwgMjAxNywgSnVseSwgNykudXRmOCgpLmRhdGEoKSk7Cisg
ICAgRVhQRUNUX1NUUkVRKCJBdWcvMzEvMjA2MiIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NL2Qv
eXl5eSIsIDIwMTIsIDIwNjIsIEF1Z3VzdCwgMzEpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVD
VF9TVFJFUSgiU2VwLzcvMDAwMiIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NL2QveXl5eSIsIDIw
MTIsIDIsIFNlcHRlbWJlciwgNykudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJP
Y3QvNy8yMDEyIiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNTU0vZC95eXl5IiwgMjAxMiwgMjAxMiwg
T2N0b2JlciwgNykudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJOb3YvNy8yMDA4
IiwgbG9jYWxlLT5mb3JtYXREYXRlKCJNTU0vZC95eXl5IiwgMjAxMiwgMjAwOCwgTm92ZW1iZXIs
IDcpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiRGVjLzMxLzIwNjIiLCBsb2Nh
bGUtPmZvcm1hdERhdGUoIk1NTS9kL3l5eXkiLCAyMDEyLCAyMDYyLCBEZWNlbWJlciwgMzEpLnV0
ZjgoKS5kYXRhKCkpOworCisgICAgRVhQRUNUX1NUUkVRKCJKYW51YXJ5LTctMjAxNyIsIGxvY2Fs
ZS0+Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEyLCAyMDE3LCBKYW51YXJ5LCA3KS51dGY4
KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkZlYnJ1YXJ5LTMxLTIwNjIiLCBsb2NhbGUt
PmZvcm1hdERhdGUoIk1NTU0tZC15eXl5IiwgMjAxMiwgMjA2MiwgRmVicnVhcnksIDMxKS51dGY4
KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIk1hcmNoLTctMDAwMiIsIGxvY2FsZS0+Zm9y
bWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEyLCAyLCBNYXJjaCwgNykudXRmOCgpLmRhdGEoKSk7
CisgICAgRVhQRUNUX1NUUkVRKCJBcHJpbC03LTIyMDEyIiwgbG9jYWxlLT5mb3JtYXREYXRlKCJN
TU1NLWQteXl5eSIsIDIwMTIsIDIyMDEyLCBBcHJpbCwgNykudXRmOCgpLmRhdGEoKSk7CisgICAg
RVhQRUNUX1NUUkVRKCJNYXktNy0xMjAwOCIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5
eXkiLCAyMDEyLCAxMjAwOCwgTWF5LCA3KS51dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RS
RVEoIkp1bmUtNy0yMjAxMiIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEy
LCAyMjAxMiwgSnVuZSwgNykudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJKdWx5
LTctMTIwMDgiLCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NTU0tZC15eXl5IiwgMjAxMiwgMTIwMDgs
IEp1bHksIDcpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiQXVndXN0LTctMjAx
NyIsIGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEyLCAyMDE3LCBBdWd1c3Qs
IDcpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVYUEVDVF9TVFJFUSgiU2VwdGVtYmVyLTMxLTIwNjIi
LCBsb2NhbGUtPmZvcm1hdERhdGUoIk1NTU0tZC15eXl5IiwgMjAxMiwgMjA2MiwgU2VwdGVtYmVy
LCAzMSkudXRmOCgpLmRhdGEoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJPY3RvYmVyLTctMDAwMiIs
IGxvY2FsZS0+Zm9ybWF0RGF0ZSgiTU1NTS1kLXl5eXkiLCAyMDEyLCAyLCBPY3RvYmVyLCA3KS51
dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIk5vdmVtYmVyLTctMjIwMTIiLCBsb2Nh
bGUtPmZvcm1hdERhdGUoIk1NTU0tZC15eXl5IiwgMjAxMiwgMjIwMTIsIE5vdmVtYmVyLCA3KS51
dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkRlY2VtYmVyLTctMTIwMDgiLCBsb2Nh
bGUtPmZvcm1hdERhdGUoIk1NTU0tZC15eXl5IiwgMjAxMiwgMTIwMDgsIERlY2VtYmVyLCA3KS51
dGY4KCkuZGF0YSgpKTsKKworICAgIEVYUEVDVF9TVFJFUSgiSmFuLTEtMDAwMSIsIGxvY2FsZS0+
Zm9ybWF0RGF0ZSgiTU1NLWQteXl5eSIsIDIwMTIsIDEsIEphbnVhcnksIDEpLnV0ZjgoKS5kYXRh
KCkpOworICAgIEVYUEVDVF9TVFJFUSgiU2VwLTEzLTI3NTc2MCIsIGxvY2FsZS0+Zm9ybWF0RGF0
ZSgiTU1NLWQteXl5eSIsIDIwMTIsIDI3NTc2MCwgU2VwdGVtYmVyLCAxMykudXRmOCgpLmRhdGEo
KSk7CisgICAgCisKKyAgICAvLyBGb3IgdGhlIGZvbGxvd2luZyB0ZXN0LCB3ZSdkIGxpa2UgdG8g
Y29uZmlybSB0aGV5IGRvbid0IGNyYXNoIGFuZCB0aGVpcgorICAgIC8vIHJlc3VsdHMgYXJlIG5v
dCBpbXBvcnRhbnQgYmVjYXVzZSB3ZSBjYW4gYXNzdW1lIGludmFsaWQgYXJndW1lbnRzIGFyZQor
ICAgIC8vIG5ldmVyIHBhc3NlZC4KKyAgICBFWFBFQ1RfU1RSRVEoIjIwMTItMTMtMDAiLCBsb2Nh
bGUtPmZvcm1hdERhdGUoInl5eXktTU0tZGQiLCAtMSwgMjAxMiwgRGVjZW1iZXIgKyAxLCAwKS51
dGY4KCkuZGF0YSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIi0xLTAwLS0xIiwgbG9jYWxlLT5mb3Jt
YXREYXRlKCJ5LU1NLWRkIiwgLTEsIC0xLCAtMSwgLTEpLnV0ZjgoKS5kYXRhKCkpOworICAgIEVY
UEVDVF9TVFJFUSgiLTEtMTI0LTMzIiwgbG9jYWxlLT5mb3JtYXREYXRlKCJ5LU1NLWRkIiwgMjAx
MiwgLTEsIDEyMywgMzMpLnV0ZjgoKS5kYXRhKCkpOworICAgIAorfQorCitURVNUKExvY2FsZVdp
blRlc3QsIFRlc3RQYXJzZSkKK3sKKyAgICBjb25zdCBMQ0lEIEVuZ2xpc2hVUyA9IDB4MDQwOTsK
KyAgICBPd25QdHI8TG9jYWxlV2luPiBsb2NhbGUgPSBMb2NhbGVXaW46OmNyZWF0ZShFbmdsaXNo
VVMpOworCisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDEyLCBBcHJpbCwgMjcpLCBsb2NhbGUt
PnBhcnNlRGF0ZSgiTU0vZGQveXkiLCAyMDEyLCAiMDQvMjcvMTIiKSk7CisgICAgRVhQRUNUX0VR
KG1zRm9yRGF0ZSgyMDYyLCBBcHJpbCwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU0vZGQveXki
LCAyMDEyLCAiMDQvMjcvNjIiKSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgxOTYzLCBBcHJp
bCwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU0vZGQveXkiLCAyMDEyLCAiMDQvMjcvNjMiKSk7
CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDEyLCBBcHJpbCwgMjcpLCBsb2NhbGUtPnBhcnNl
RGF0ZSgiTU0vZGQveXkiLCAyMDEyLCAiNC8yNy8yMDEyIikpOworICAgIEVYUEVDVF9FUShtc0Zv
ckRhdGUoMjAxMiwgQXByaWwsIDI3KSwgbG9jYWxlLT5wYXJzZURhdGUoIk1NL2RkL3l5IiwgMjAx
MiwgIkFwci8yNy8yMDEyIikpOworICAgIEVYUEVDVF9FUShtc0ZvckRhdGUoMiwgQXByaWwsIDI3
KSwgbG9jYWxlLT5wYXJzZURhdGUoIk1NL2QveXkiLCAyMDEyLCAiQXByaWwvMjcvMiIpKTsKKyAg
ICBFWFBFQ1RfRVEobXNGb3JEYXRlKDIsIEFwcmlsLCAyNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJN
TS9kL3l5IiwgMjAxMiwgImFwcmlsLzI3LzIiKSk7CisgICAgRVhQRUNUX1RSVUUoaXNuYW4obG9j
YWxlLT5wYXJzZURhdGUoIk1NL2QveXkiLCAyMDEyLCAiYXByaWwvMjciKSkpOworICAgIEVYUEVD
VF9UUlVFKGlzbmFuKGxvY2FsZS0+cGFyc2VEYXRlKCJNTS9kL3l5IiwgMjAxMiwgImFwcmlsLzI3
LyIpKSk7CisgICAgRVhQRUNUX1RSVUUoaXNuYW4obG9jYWxlLT5wYXJzZURhdGUoIk1NL2QveXki
LCAyMDEyLCAiIGFwcmlsLzI3LyIpKSk7CisKKyAgICBFWFBFQ1RfRVEobXNGb3JEYXRlKDEyLCBB
cHJpbCwgNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJNTU0vZC95eXl5IiwgMjAxMiwgIjA0LzcvMTIi
KSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSg2MiwgQXByaWwsIDcpLCBsb2NhbGUtPnBhcnNl
RGF0ZSgiTU1NL2QveXl5eSIsIDIwMTIsICIwNC8wNy82MiIpKTsKKyAgICBFWFBFQ1RfRVEobXNG
b3JEYXRlKDYzLCBBcHJpbCwgNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJNTU0vZC95eXl5IiwgMjAx
MiwgIjA0LzA3LzYzIikpOworICAgIEVYUEVDVF9FUShtc0ZvckRhdGUoMjAxMiwgQXByaWwsIDcp
LCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NL2QveXl5eSIsIDIwMTIsICI0LzcvMjAxMiIpKTsKKyAg
ICBFWFBFQ1RfRVEobXNGb3JEYXRlKDIwMTIsIE1heSwgNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJN
TU0vZC95eXl5IiwgMjAxMiwgIk1heS8wMDcvMjAxMiIpKTsKKyAgICBFWFBFQ1RfRVEobXNGb3JE
YXRlKDIsIE1heSwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU0vZC95eXl5IiwgMjAxMiwgIk1h
eS8wMDI3LzIiKSk7CisgICAgRVhQRUNUX1RSVUUoaXNuYW4obG9jYWxlLT5wYXJzZURhdGUoIk1N
L2QveXl5eSIsIDIwMTIsICJNYXkvLy8wMDI3Ly8vMiIpKSk7CisgICAgRVhQRUNUX1RSVUUoaXNu
YW4obG9jYWxlLT5wYXJzZURhdGUoIk1NL2QveXl5eSIsIDIwMTIsICJNYXl5eXl5eS8wMDI3LzIi
KSkpOworCisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDEyLCBBcHJpbCwgMjcpLCBsb2NhbGUt
PnBhcnNlRGF0ZSgiTU1NTS9kZC95IiwgMjAxMiwgIjA0LzI3LzIiKSk7CisgICAgRVhQRUNUX0VR
KG1zRm9yRGF0ZSgyMDE3LCBBcHJpbCwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NTS9kZC95
IiwgMjAxMiwgIjA0LzI3LzciKSk7CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDA4LCBBcHJp
bCwgMjcpLCBsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NTS9kZC95IiwgMjAxMiwgIjA0LzI3LzgiKSk7
CisgICAgRVhQRUNUX0VRKG1zRm9yRGF0ZSgyMDEyLCBBcHJpbCwgMjcpLCBsb2NhbGUtPnBhcnNl
RGF0ZSgiTU1NTS9kZC95IiwgMjAxMiwgIjQvMjcvMjAxMiIpKTsKKyAgICBFWFBFQ1RfRVEobXNG
b3JEYXRlKDIwMTIsIERlY2VtYmVyLCAyNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJNTU1NL2RkL3ki
LCAyMDEyLCAiRGVjZW1iZXIvMjcvMjAxMiIpKTsKKyAgICBFWFBFQ1RfRVEobXNGb3JEYXRlKDIw
MTIsIE5vdmVtYmVyLCAyNyksIGxvY2FsZS0+cGFyc2VEYXRlKCJNTU1NL2QveSIsIDIwMTIsICJO
b3ZlbWJlci8yNy8yIikpOworICAgIEVYUEVDVF9UUlVFKGlzbmFuKGxvY2FsZS0+cGFyc2VEYXRl
KCJNTU1NL2QveSIsIDIwMTIsICJOb3ZlbWJlciAyNyAyIikpKTsKKyAgICBFWFBFQ1RfVFJVRShp
c25hbihsb2NhbGUtPnBhcnNlRGF0ZSgiTU1NTS9kL3kiLCAyMDEyLCAiTm92ZW1iZXIgMzIgMiIp
KSk7CisgICAgRVhQRUNUX1RSVUUoaXNuYW4obG9jYWxlLT5wYXJzZURhdGUoIk1NTU0vZC95Iiwg
MjAxMiwgIi0xLy0xLy0xIikpKTsKK30K
</data>
<flag name="review"
          id="145236"
          type_id="1"
          status="+"
          setter="haraken"
    />
          </attachment>
      

    </bug>

</bugzilla>