<?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>20953</bug_id>
          
          <creation_ts>2008-09-19 19:26:54 -0700</creation_ts>
          <short_desc>Rework the Font handling in QtWebKit</short_desc>
          <delta_ts>2008-12-15 05:56:39 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Qt</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Holger Freyther">zecke</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>hausmann</cc>
    
    <cc>hyatt</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>91857</commentid>
    <comment_count>0</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-09-19 19:26:54 -0700</bug_when>
    <thetext>QtWebKit should use more of the common font codepaths. One constraint QtWebKit has is to always use the &quot;complex&quot; text paths to match the output of the other qt widgets when it comes to text.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91858</commentid>
    <comment_count>1</comment_count>
      <attachid>23591</attachid>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-09-19 19:28:41 -0700</bug_when>
    <thetext>Created attachment 23591
Split WidthIterator out of Font.cpp

Move WidthIterator to a separate file. svn cp should be used, build systems still need adjustments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91859</commentid>
    <comment_count>2</comment_count>
      <attachid>23592</attachid>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-09-19 19:30:03 -0700</bug_when>
    <thetext>Created attachment 23592
Move the &quot;fast&quot; WebCore Font path to a separate file

Move the implementation of the fast webcore font path to a separate file. svn cp should be used, buildsystems need adjustment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91860</commentid>
    <comment_count>3</comment_count>
      <attachid>23593</attachid>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-09-19 19:36:02 -0700</bug_when>
    <thetext>Created attachment 23593
Add compiletime option to not use the fast path

For QtWebKit we don&apos;t want to go through the simple path and don&apos;t want to have the runtime overhead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91861</commentid>
    <comment_count>4</comment_count>
      <attachid>23594</attachid>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-09-19 19:38:23 -0700</bug_when>
    <thetext>Created attachment 23594
Bring the QtWebKit font handling more inline with the rest of WebCore

This is mostly done and helps us to pass acid3. The Qt4.3 support needs to be fixed though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91862</commentid>
    <comment_count>5</comment_count>
      <attachid>23592</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-09-19 19:56:32 -0700</bug_when>
    <thetext>Comment on attachment 23592
Move the &quot;fast&quot; WebCore Font path to a separate file

I don&apos;t really like the idea of splitting the fast font path into its own file.  Why is that necessary?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91923</commentid>
    <comment_count>6</comment_count>
      <attachid>23593</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-09-20 13:33:07 -0700</bug_when>
    <thetext>Comment on attachment 23593
Add compiletime option to not use the fast path

Looks sane enough to me.  Normally we don&apos;t use &quot;return foo()&quot; in functions returning void.

The WTF_USE definition should really go in WebCore/config.h (unless you all don&apos;t use that).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91924</commentid>
    <comment_count>7</comment_count>
      <attachid>23592</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-09-20 13:34:30 -0700</bug_when>
    <thetext>Comment on attachment 23592
Move the &quot;fast&quot; WebCore Font path to a separate file

I expect this would need to be performance tested by the Apple folks for them to accept it.  I&apos;m not sure if the font stuff depends on this all getting inlined or not.  Looks good to me though.

Hyatt should really review this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91931</commentid>
    <comment_count>8</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-09-20 14:03:40 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 23592 [edit])
&gt; I don&apos;t really like the idea of splitting the fast font path into its own file.
&gt;  Why is that necessary?

The other option would be to add a #ifdef around the code inside Font.cpp. It needs to be #ifdef&apos;ed or moved out though. QtWebKit does not want to use the WebCore fast font path, in order to compile the WebCore fast font path we would need to have a very complex FontCache, FontFallBackList, GlyphPageTree.. implementation that would be a duplication of Qt&apos;s internals and mostly unused.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91960</commentid>
    <comment_count>9</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-09-20 20:53:27 -0700</bug_when>
    <thetext>Right, I get that.  I think it&apos;s better to just ifdef in Font.cpp though.  We get so much confusion over RenderBlock being split into two files... I think something similar would happen if Font got split up... people would get confused over where functions were... or where to put new functions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91961</commentid>
    <comment_count>10</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-09-20 20:54:02 -0700</bug_when>
    <thetext>Splitting WidthIterator out is good though.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91997</commentid>
    <comment_count>11</comment_count>
      <attachid>23591</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-09-21 11:32:59 -0700</bug_when>
    <thetext>Comment on attachment 23591
Split WidthIterator out of Font.cpp

This code in WidthIterator was all Apple-written in 2003, and didn&apos;t come from KHTML, so you don&apos;t need to include the pre-2003 copyrights on the new file.

+/**
+ * This file is part of the html renderer for KDE.

You shouldn&apos;t copy those lines either.

+        private:
+        UChar32 normalizeVoicingMarks(int currentCharacter);

Indentation here is wrong. the private should be outdented.

+#include &quot;Font.h&quot;

I don&apos;t think we really need to include the entire Font.h header. This file just declares things, it doesn&apos;t actually need class definitions for classes like Font and TextRun. All we need is a forward delcaration of Font, GlyphBuffer, and TextRun, and then an appropriate include to get the UChar32 type.

WidthIterator should inherit from Noncopyable.

+        WidthIterator(const Font* font, const TextRun&amp; run);
+
+        void advance(int to, GlyphBuffer* glyphBuffer = 0);
+        bool advanceOneCharacter(float&amp; width, GlyphBuffer* glyphBuffer = 0);

Style says we shouldn&apos;t have named arguments for font, run, and glyphBuffer.

r=me, but some of those changes should be done, i think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>92313</commentid>
    <comment_count>12</comment_count>
      <attachid>23594</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-09-23 04:16:33 -0700</bug_when>
    <thetext>Comment on attachment 23594
Bring the QtWebKit font handling more inline with the rest of WebCore

This seems sane enough to me.  This is great to see the Qt port&apos;s font code aligning more with the other ports.

There are a few style violations in this patch (mostly * and &amp; spacing inconsistent with the WebKit style guidelines).  There are also a bunch of // qtDebug() comments.  We generally don&apos;t commit commented out code, so I would encourage you to remove those.

This patch of course depends on the other two, which I feel hyatt or mitz are much more capable of reviewing than I.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>92612</commentid>
    <comment_count>13</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2008-09-24 15:39:11 -0700</bug_when>
    <thetext>Has anyone done perf testing to determine wether the fast path makes a performance difference for Qt? It might be good to know if this causes a perf regression (though perhaps the Qt folks are willing to take the speed hit for other reasons).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>94553</commentid>
    <comment_count>14</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2008-10-08 07:31:39 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; Has anyone done perf testing to determine wether the fast path makes a
&gt; performance difference for Qt? It might be good to know if this causes a perf
&gt; regression (though perhaps the Qt folks are willing to take the speed hit for
&gt; other reasons).

I don&apos;t have hard numbers, but the main problem with the &quot;fast&quot; path is that it&apos;s slower with Qt because we can not provide a proper mapping from characters to glyphs. There is currently no public API in Qt for that, and as a result of that the implementation would have to map a character to a &quot;virtual&quot; glyph that is the unicode value again. When drawing the glyphs we treat them as characters and pass them as string to Qt to draw the text. That is much more work and uses more memory than just always going the &quot;complex&quot; path of passing the string down to the toolkit.

I recall very well how the qt port become significantly faster after Lars removed the &quot;fast&quot; path for the Qt port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>95131</commentid>
    <comment_count>15</comment_count>
      <attachid>23591</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-10-12 18:37:21 -0700</bug_when>
    <thetext>Comment on attachment 23591
Split WidthIterator out of Font.cpp

Cleared review flag since I landed this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>100855</commentid>
    <comment_count>16</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-12-01 12:32:29 -0800</bug_when>
    <thetext>I think the only way to get this patch reviewed is to catch hyatt on IRC and talk it out with him.  I don&apos;t feel like enough of an expert in our font system to give these patches a good review.  I&apos;m going to mark the last one as r?hyatt too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>100856</commentid>
    <comment_count>17</comment_count>
      <attachid>23594</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-12-01 12:33:18 -0800</bug_when>
    <thetext>Comment on attachment 23594
Bring the QtWebKit font handling more inline with the rest of WebCore

Marking this is r?hyatt as hyatt is really our font expert (or was at least last time I checked).  I don&apos;t feel enough of an expert in this code to review it, but certainly if someone else does they should feel free to do so!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>101328</commentid>
    <comment_count>18</comment_count>
      <attachid>23592</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-04 09:18:38 -0800</bug_when>
    <thetext>Comment on attachment 23592
Move the &quot;fast&quot; WebCore Font path to a separate file

Moving to a separate file seems fine.

&gt; +/**

We don&apos;t use that double-star format.

&gt; + * This file is part of the html renderer for KDE.

You can leave this out of the new file.

&gt; + * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
&gt; + *           (C) 1999 Antti Koivisto (koivisto@kde.org)
&gt; + *           (C) 2000 Dirk Mueller (mueller@kde.org)
&gt; + * Copyright (C) 2003, 2006 Apple Computer, Inc.
&gt; + * Copyright (C) 2008 Holger Hans Peter Freyther

None of the code you&apos;re moving is covered by the older copyrights (older than 2003); it&apos;s all new stuff. So you can omit those older copyright notices from this new file.
&gt; +    return data;
&gt; +}
&gt; +
&gt; +
&gt; +
&gt; +}

We just use one blank line in places like this, not 3.

r=me on moving this code</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>101329</commentid>
    <comment_count>19</comment_count>
      <attachid>23592</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-04 09:19:50 -0800</bug_when>
    <thetext>Comment on attachment 23592
Move the &quot;fast&quot; WebCore Font path to a separate file

Wait a second, this only includes fixes to GNUmakefile.am, not the makefiles for other platforms. So it will break all builds that don&apos;t use GNUmakefile.am if landed as-is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102290</commentid>
    <comment_count>20</comment_count>
      <attachid>23592</attachid>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-12-11 16:09:57 -0800</bug_when>
    <thetext>Comment on attachment 23592
Move the &quot;fast&quot; WebCore Font path to a separate file

Clear review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102554</commentid>
    <comment_count>21</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2008-12-15 05:56:39 -0800</bug_when>
    <thetext>Landed in r39207 and the three commits before. </thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23591</attachid>
            <date>2008-09-19 19:28:41 -0700</date>
            <delta_ts>2008-10-12 18:37:21 -0700</delta_ts>
            <desc>Split WidthIterator out of Font.cpp</desc>
            <filename>0001-Split-out-the-WidthIterator-of-Font.cpp.patch</filename>
            <type>text/plain</type>
            <size>22807</size>
            <attacher name="Holger Freyther">zecke</attacher>
            
              <data encoding="base64">RnJvbSA3YWQzZTI2MDZkYmExOGRjMjc4Yjc1OTZjMjA3MGJjMjQ5OGMxNGUwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2Vs
ZmlzaC5vcmc+CkRhdGU6IFNhdCwgMjAgU2VwIDIwMDggMDA6Mzg6NDUgKzAyMDAKU3ViamVjdDog
W1BBVENIXSBTcGxpdCBvdXQgdGhlIFdpZHRoSXRlcmF0b3Igb2YgRm9udC5jcHAKCi0tLQogV2Vi
Q29yZS9HTlVtYWtlZmlsZS5hbSAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKwogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcCAgICAgICAgICB8ICAyMjAgKy0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5j
cHAgfCAgMjM3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKwogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9XaWR0aEl0ZXJhdG9yLmggICB8ICAgNTYgKysrKysrKwogNCBmaWxlcyBjaGFuZ2Vk
LCAyOTYgaW5zZXJ0aW9ucygrKSwgMjE5IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5jcHAKIGNyZWF0ZSBtb2Rl
IDEwMDY0NCBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1dpZHRoSXRlcmF0b3IuaAoKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0gYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmlu
ZGV4IDMzZDIzNzIuLjk0NDI1NTUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0K
KysrIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQpAQCAtMTYzMCw2ICsxNjMwLDggQEAgd2ViY29y
ZV9zb3VyY2VzICs9IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1N0cmluZ1RydW5jYXRv
ci5oIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1RleHRSdW4uaCBcCiAJV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Vbml0QmV6aWVyLmggXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvV2lkdGhJdGVyYXRvci5jcHAgXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJ
dGVyYXRvci5oIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVCbGVuZC5o
IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVDb2xvck1hdHJpeC5oIFwK
IAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVDb21wb25lbnRUcmFuc2Zlci5o
IFwKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAgYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCmluZGV4IGM5MzljZDUuLmIwYWM4MDggMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNwcApAQCAtMjYsMjcgKzI2LDE4IEBACiAjaW5jbHVk
ZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9udC5oIgogCi0jaW5jbHVkZSAiQ2hhcmFjdGVyTmFt
ZXMuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRlICJGb250Q2FjaGUuaCIKICNp
bmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCiAjaW5jbHVkZSAiSW50UG9pbnQuaCIKICNpbmNs
dWRlICJHbHlwaEJ1ZmZlci5oIgotI2luY2x1ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUuaD4KKyNp
bmNsdWRlICJXaWR0aEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAot
I2lmIFVTRShJQ1VfVU5JQ09ERSkKLSNpbmNsdWRlIDx1bmljb2RlL3Vub3JtLmg+Ci0jZW5kaWYK
LQogdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmljb2RlOwogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLS8vIEFjY29yZGluZyB0byBodHRwOi8vd3d3LnVuaWNvZGUub3Jn
L1B1YmxpYy9VTklEQVRBL1VDRC5odG1sI0Nhbm9uaWNhbF9Db21iaW5pbmdfQ2xhc3NfVmFsdWVz
Ci1jb25zdCB1aW50OF90IGhpcmFnYW5hS2F0YWthbmFWb2ljaW5nTWFya3NDb21iaW5pbmdDbGFz
cyA9IDg7Ci0KIGNvbnN0IHVpbnQ4X3QgRm9udDo6Z1JvdW5kaW5nSGFja0NoYXJhY3RlclRhYmxl
WzI1Nl0gPSB7CiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSAvKlx0Ki8sIDEgLypc
biovLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLAogICAgIDEgLypzcGFjZSovLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAxIC8qLSovLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAxIC8qPyovLApAQCAtNjAsMjE1ICs1MSw2IEBAIGNvbnN0IHVpbnQ4X3QgRm9u
dDo6Z1JvdW5kaW5nSGFja0NoYXJhY3RlclRhYmxlWzI1Nl0gPSB7CiAKIEZvbnQ6OkNvZGVQYXRo
IEZvbnQ6OmNvZGVQYXRoID0gQXV0bzsKIAotc3RydWN0IFdpZHRoSXRlcmF0b3IgewotICAgIFdp
ZHRoSXRlcmF0b3IoY29uc3QgRm9udCogZm9udCwgY29uc3QgVGV4dFJ1biYgcnVuKTsKLQotICAg
IHZvaWQgYWR2YW5jZShpbnQgdG8sIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlciA9IDApOwotICAg
IGJvb2wgYWR2YW5jZU9uZUNoYXJhY3RlcihmbG9hdCYgd2lkdGgsIEdseXBoQnVmZmVyKiBnbHlw
aEJ1ZmZlciA9IDApOwotICAgIAotICAgIGNvbnN0IEZvbnQqIG1fZm9udDsKLQotICAgIGNvbnN0
IFRleHRSdW4mIG1fcnVuOwotICAgIGludCBtX2VuZDsKLQotICAgIHVuc2lnbmVkIG1fY3VycmVu
dENoYXJhY3RlcjsKLSAgICBmbG9hdCBtX3J1bldpZHRoU29GYXI7Ci0gICAgZmxvYXQgbV9wYWRk
aW5nOwotICAgIGZsb2F0IG1fcGFkUGVyU3BhY2U7Ci0gICAgZmxvYXQgbV9maW5hbFJvdW5kaW5n
V2lkdGg7Ci0gICAgCi1wcml2YXRlOgotICAgIFVDaGFyMzIgbm9ybWFsaXplVm9pY2luZ01hcmtz
KGludCBjdXJyZW50Q2hhcmFjdGVyKTsKLX07Ci0KLVdpZHRoSXRlcmF0b3I6OldpZHRoSXRlcmF0
b3IoY29uc3QgRm9udCogZm9udCwgY29uc3QgVGV4dFJ1biYgcnVuKQotICAgIDogbV9mb250KGZv
bnQpCi0gICAgLCBtX3J1bihydW4pCi0gICAgLCBtX2VuZChydW4ubGVuZ3RoKCkpCi0gICAgLCBt
X2N1cnJlbnRDaGFyYWN0ZXIoMCkKLSAgICAsIG1fcnVuV2lkdGhTb0ZhcigwKQotICAgICwgbV9m
aW5hbFJvdW5kaW5nV2lkdGgoMCkKLXsKLSAgICAvLyBJZiB0aGUgcGFkZGluZyBpcyBub24temVy
bywgY291bnQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gdGhlIHJ1bgotICAgIC8vIGFuZCBkaXZp
ZGUgdGhhdCBieSB0aGUgcGFkZGluZyBmb3IgcGVyIHNwYWNlIGFkZGl0aW9uLgotICAgIG1fcGFk
ZGluZyA9IG1fcnVuLnBhZGRpbmcoKTsKLSAgICBpZiAoIW1fcGFkZGluZykKLSAgICAgICAgbV9w
YWRQZXJTcGFjZSA9IDA7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZsb2F0IG51bVNwYWNlcyA9IDA7
Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVuLmxlbmd0aCgpOyBpKyspCi0gICAgICAg
ICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKG1fcnVuW2ldKSkKLSAgICAgICAgICAgICAgICBu
dW1TcGFjZXMrKzsKLQotICAgICAgICBpZiAobnVtU3BhY2VzID09IDApCi0gICAgICAgICAgICBt
X3BhZFBlclNwYWNlID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9wYWRQZXJTcGFj
ZSA9IGNlaWxmKG1fcnVuLnBhZGRpbmcoKSAvIG51bVNwYWNlcyk7Ci0gICAgfQotfQotCi12b2lk
IFdpZHRoSXRlcmF0b3I6OmFkdmFuY2UoaW50IG9mZnNldCwgR2x5cGhCdWZmZXIqIGdseXBoQnVm
ZmVyKQotewotICAgIGlmIChvZmZzZXQgPiBtX2VuZCkKLSAgICAgICAgb2Zmc2V0ID0gbV9lbmQ7
Ci0KLSAgICBpbnQgY3VycmVudENoYXJhY3RlciA9IG1fY3VycmVudENoYXJhY3RlcjsKLSAgICBj
b25zdCBVQ2hhciogY3AgPSBtX3J1bi5kYXRhKGN1cnJlbnRDaGFyYWN0ZXIpOwotCi0gICAgYm9v
bCBydGwgPSBtX3J1bi5ydGwoKTsKLSAgICBib29sIGhhc0V4dHJhU3BhY2luZyA9IChtX2ZvbnQt
PmxldHRlclNwYWNpbmcoKSB8fCBtX2ZvbnQtPndvcmRTcGFjaW5nKCkgfHwgbV9wYWRkaW5nKSAm
JiAhbV9ydW4uc3BhY2luZ0Rpc2FibGVkKCk7Ci0KLSAgICBmbG9hdCBydW5XaWR0aFNvRmFyID0g
bV9ydW5XaWR0aFNvRmFyOwotICAgIGZsb2F0IGxhc3RSb3VuZGluZ1dpZHRoID0gbV9maW5hbFJv
dW5kaW5nV2lkdGg7Ci0gICAgCi0gICAgd2hpbGUgKGN1cnJlbnRDaGFyYWN0ZXIgPCBvZmZzZXQp
IHsKLSAgICAgICAgVUNoYXIzMiBjID0gKmNwOwotICAgICAgICB1bnNpZ25lZCBjbHVzdGVyTGVu
Z3RoID0gMTsKLSAgICAgICAgaWYgKGMgPj0gMHgzMDQxKSB7Ci0gICAgICAgICAgICBpZiAoYyA8
PSAweDMwRkUpIHsKLSAgICAgICAgICAgICAgICAvLyBEZWFsIHdpdGggSGlyYWdhbmEgYW5kIEth
dGFrYW5hIHZvaWNlZCBhbmQgc2VtaS12b2ljZWQgc3lsbGFibGVzLgotICAgICAgICAgICAgICAg
IC8vIE5vcm1hbGl6ZSBpbnRvIGNvbXBvc2VkIGZvcm0sIGFuZCB0aGVuIGxvb2sgZm9yIGdseXBo
IHdpdGggYmFzZSArIGNvbWJpbmVkIG1hcmsuCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWJv
dmUgZm9yIGNoYXJhY3RlciByYW5nZSB0byBtaW5pbWl6ZSBwZXJmb3JtYW5jZSBpbXBhY3QuCi0g
ICAgICAgICAgICAgICAgVUNoYXIzMiBub3JtYWxpemVkID0gbm9ybWFsaXplVm9pY2luZ01hcmtz
KGN1cnJlbnRDaGFyYWN0ZXIpOwotICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGMgPSBub3JtYWxpemVkOwotICAgICAgICAgICAgICAgICAgICBj
bHVzdGVyTGVuZ3RoID0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2Ug
aWYgKFUxNl9JU19TVVJST0dBVEUoYykpIHsKLSAgICAgICAgICAgICAgICBpZiAoIVUxNl9JU19T
VVJST0dBVEVfTEVBRChjKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAg
ICAgICAgICAvLyBEbyB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXI/ICBJZiBzbywgZGV0ZXJtaW5l
IHRoZSBmdWxsIFVuaWNvZGUgKDMyIGJpdCkKLSAgICAgICAgICAgICAgICAvLyBjb2RlIHBvaW50
IGJlZm9yZSBnbHlwaCBsb29rdXAuCi0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhh
dmUgYW5vdGhlciBjaGFyYWN0ZXIgYW5kIGl0J3MgYSBsb3cgc3Vycm9nYXRlLgotICAgICAgICAg
ICAgICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyICsgMSA+PSBtX3J1bi5sZW5ndGgoKSkKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgVUNoYXIgbG93ID0gY3BbMV07
Ci0gICAgICAgICAgICAgICAgaWYgKCFVMTZfSVNfVFJBSUwobG93KSkKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgYyA9IFUxNl9HRVRfU1VQUExFTUVOVEFSWShj
LCBsb3cpOwotICAgICAgICAgICAgICAgIGNsdXN0ZXJMZW5ndGggPSAyOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgR2x5cGhEYXRhJiBnbHlwaERhdGEgPSBtX2Zv
bnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihjLCBydGwpOwotICAgICAgICBHbHlwaCBnbHlwaCA9
IGdseXBoRGF0YS5nbHlwaDsKLSAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRh
ID0gZ2x5cGhEYXRhLmZvbnREYXRhOwotCi0gICAgICAgIEFTU0VSVChmb250RGF0YSk7Ci0KLSAg
ICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGdseXBoIGFuZCBmb250IGRhdGEsIGdldCBpdHMg
d2lkdGguCi0gICAgICAgIGZsb2F0IHdpZHRoOwotICAgICAgICBpZiAoYyA9PSAnXHQnICYmIG1f
cnVuLmFsbG93VGFicygpKSB7Ci0gICAgICAgICAgICBmbG9hdCB0YWJXaWR0aCA9IG1fZm9udC0+
dGFiV2lkdGgoKTsKLSAgICAgICAgICAgIHdpZHRoID0gdGFiV2lkdGggLSBmbW9kZihtX3J1bi54
UG9zKCkgKyBydW5XaWR0aFNvRmFyLCB0YWJXaWR0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICB3aWR0aCA9IGZvbnREYXRhLT53aWR0aEZvckdseXBoKGdseXBoKTsKLSAgICAgICAg
ICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBzcGFjZXMgaW4gdHdvIHdheXMgd2hlbiBhcHBseWluZyB3
b3JkIHJvdW5kaW5nLgotICAgICAgICAgICAgLy8gRmlyc3QsIHdlIHJvdW5kIHNwYWNlcyB0byBh
biBhZGp1c3RlZCB3aWR0aCBpbiBhbGwgZm9udHMuCi0gICAgICAgICAgICAvLyBTZWNvbmQsIGlu
IGZpeGVkLXBpdGNoIGZvbnRzIHdlIGVuc3VyZSB0aGF0IGFsbCBjaGFyYWN0ZXJzIHRoYXQKLSAg
ICAgICAgICAgIC8vIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgc3BhY2UgY2hhcmFjdGVyIGhhdmUg
dGhlIHNhbWUgd2lkdGggYXMgdGhlIHNwYWNlIGNoYXJhY3Rlci4KLSAgICAgICAgICAgIGlmICh3
aWR0aCA9PSBmb250RGF0YS0+bV9zcGFjZVdpZHRoICYmIChmb250RGF0YS0+bV90cmVhdEFzRml4
ZWRQaXRjaCB8fCBnbHlwaCA9PSBmb250RGF0YS0+bV9zcGFjZUdseXBoKSAmJiBtX3J1bi5hcHBs
eVdvcmRSb3VuZGluZygpKQotICAgICAgICAgICAgICAgIHdpZHRoID0gZm9udERhdGEtPm1fYWRq
dXN0ZWRTcGFjZVdpZHRoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0V4dHJhU3BhY2lu
ZykgewotICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgbGV0dGVyLXNwYWNpbmcuCi0gICAgICAg
ICAgICBpZiAod2lkdGggJiYgbV9mb250LT5sZXR0ZXJTcGFjaW5nKCkpCi0gICAgICAgICAgICAg
ICAgd2lkdGggKz0gbV9mb250LT5sZXR0ZXJTcGFjaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChG
b250Ojp0cmVhdEFzU3BhY2UoYykpIHsKLSAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciBw
YWRkaW5nLiBXZWJDb3JlIHVzZXMgc3BhY2UgcGFkZGluZyB0byBqdXN0aWZ5IHRleHQuCi0gICAg
ICAgICAgICAgICAgLy8gV2UgZGlzdHJpYnV0ZSB0aGUgc3BlY2lmaWVkIHBhZGRpbmcgb3ZlciB0
aGUgYXZhaWxhYmxlIHNwYWNlcyBpbiB0aGUgcnVuLgotICAgICAgICAgICAgICAgIGlmIChtX3Bh
ZGRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGxlZnQgb3ZlciBwYWRkaW5nIGlm
IG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5IG51bWJlciBvZiBzcGFjZXMuCi0gICAgICAgICAgICAg
ICAgICAgIGlmIChtX3BhZGRpbmcgPCBtX3BhZFBlclNwYWNlKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB3aWR0aCArPSBtX3BhZGRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3Bh
ZGRpbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
ICAgICAgICAgd2lkdGggKz0gbV9wYWRQZXJTcGFjZTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IG1fcGFkZGluZyAtPSBtX3BhZFBlclNwYWNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3Igd29yZCBzcGFj
aW5nLgotICAgICAgICAgICAgICAgIC8vIFdlIGFwcGx5IGFkZGl0aW9uYWwgc3BhY2UgYmV0d2Vl
biAid29yZHMiIGJ5IGFkZGluZyB3aWR0aCB0byB0aGUgc3BhY2UgY2hhcmFjdGVyLgotICAgICAg
ICAgICAgICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyICE9IDAgJiYgIUZvbnQ6OnRyZWF0QXNTcGFj
ZShjcFstMV0pICYmIG1fZm9udC0+d29yZFNwYWNpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAg
d2lkdGggKz0gbV9mb250LT53b3JkU3BhY2luZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gQWR2YW5jZSBwYXN0IHRoZSBjaGFyYWN0ZXIgd2UganVzdCBkZWFsdCB3
aXRoLgotICAgICAgICBjcCArPSBjbHVzdGVyTGVuZ3RoOwotICAgICAgICBjdXJyZW50Q2hhcmFj
dGVyICs9IGNsdXN0ZXJMZW5ndGg7Ci0KLSAgICAgICAgLy8gQWNjb3VudCBmb3IgZmxvYXQvaW50
ZWdlciBpbXBlZGFuY2UgbWlzbWF0Y2ggYmV0d2VlbiBDRyBhbmQgS0hUTUwuICJXb3JkcyIgKGNo
YXJhY3RlcnMgCi0gICAgICAgIC8vIGZvbGxvd2VkIGJ5IGEgY2hhcmFjdGVyIGRlZmluZWQgYnkg
aXNSb3VuZGluZ0hhY2tDaGFyYWN0ZXIoKSkgYXJlIGFsd2F5cyBhbiBpbnRlZ2VyIHdpZHRoLgot
ICAgICAgICAvLyBXZSBhZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBh
ICJ3b3JkIiB0byBlbnN1cmUgYW4gaW50ZWdlciB3aWR0aC4KLSAgICAgICAgLy8gSWYgd2UgbW92
ZSBLSFRNTCB0byBmbG9hdHMgd2UgY2FuIHJlbW92ZSB0aGlzIChhbmQgcmVsYXRlZCkgaGFja3Mu
Ci0KLSAgICAgICAgZmxvYXQgb2xkV2lkdGggPSB3aWR0aDsKLQotICAgICAgICAvLyBGb3JjZSBj
aGFyYWN0ZXJzIHRoYXQgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdvcmQgYm91bmRhcmllcyBmb3Ig
dGhlIHJvdW5kaW5nIGhhY2sKLSAgICAgICAgLy8gdG8gYmUgaW50ZWdlciB3aWR0aCwgc28gZm9s
bG93aW5nIHdvcmRzIHdpbGwgc3RhcnQgb24gYW4gaW50ZWdlciBib3VuZGFyeS4KLSAgICAgICAg
aWYgKG1fcnVuLmFwcGx5V29yZFJvdW5kaW5nKCkgJiYgRm9udDo6aXNSb3VuZGluZ0hhY2tDaGFy
YWN0ZXIoYykpCi0gICAgICAgICAgICB3aWR0aCA9IGNlaWxmKHdpZHRoKTsKLQotICAgICAgICAv
LyBDaGVjayB0byBzZWUgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgInJvdW5kaW5nIGhhY2sg
Y2hhcmFjdGVyIiwgaWYgc28sIGFkanVzdAotICAgICAgICAvLyB3aWR0aCBzbyB0aGF0IHRoZSB0
b3RhbCBydW4gd2lkdGggd2lsbCBiZSBvbiBhbiBpbnRlZ2VyIGJvdW5kYXJ5LgotICAgICAgICBp
ZiAoKG1fcnVuLmFwcGx5V29yZFJvdW5kaW5nKCkgJiYgY3VycmVudENoYXJhY3RlciA8IG1fcnVu
Lmxlbmd0aCgpICYmIEZvbnQ6OmlzUm91bmRpbmdIYWNrQ2hhcmFjdGVyKCpjcCkpCi0gICAgICAg
ICAgICAgICAgfHwgKG1fcnVuLmFwcGx5UnVuUm91bmRpbmcoKSAmJiBjdXJyZW50Q2hhcmFjdGVy
ID49IG1fZW5kKSkgewotICAgICAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IHJ1bldpZHRoU29G
YXIgKyB3aWR0aDsKLSAgICAgICAgICAgIHdpZHRoICs9IGNlaWxmKHRvdGFsV2lkdGgpIC0gdG90
YWxXaWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHJ1bldpZHRoU29GYXIgKz0gd2lkdGg7Ci0K
LSAgICAgICAgaWYgKGdseXBoQnVmZmVyKQotICAgICAgICAgICAgZ2x5cGhCdWZmZXItPmFkZChn
bHlwaCwgZm9udERhdGEsIChydGwgPyBvbGRXaWR0aCArIGxhc3RSb3VuZGluZ1dpZHRoIDogd2lk
dGgpKTsKLQotICAgICAgICBsYXN0Um91bmRpbmdXaWR0aCA9IHdpZHRoIC0gb2xkV2lkdGg7Ci0g
ICAgfQotCi0gICAgbV9jdXJyZW50Q2hhcmFjdGVyID0gY3VycmVudENoYXJhY3RlcjsKLSAgICBt
X3J1bldpZHRoU29GYXIgPSBydW5XaWR0aFNvRmFyOwotICAgIG1fZmluYWxSb3VuZGluZ1dpZHRo
ID0gbGFzdFJvdW5kaW5nV2lkdGg7Ci19Ci0KLWJvb2wgV2lkdGhJdGVyYXRvcjo6YWR2YW5jZU9u
ZUNoYXJhY3RlcihmbG9hdCYgd2lkdGgsIEdseXBoQnVmZmVyKiBnbHlwaEJ1ZmZlcikKLXsKLSAg
ICBnbHlwaEJ1ZmZlci0+Y2xlYXIoKTsKLSAgICBhZHZhbmNlKG1fY3VycmVudENoYXJhY3RlciAr
IDEsIGdseXBoQnVmZmVyKTsKLSAgICBmbG9hdCB3ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsg
aSA8IGdseXBoQnVmZmVyLT5zaXplKCk7ICsraSkKLSAgICAgICAgdyArPSBnbHlwaEJ1ZmZlci0+
YWR2YW5jZUF0KGkpOwotICAgIHdpZHRoID0gdzsKLSAgICByZXR1cm4gIWdseXBoQnVmZmVyLT5p
c0VtcHR5KCk7Ci19Ci0KLVVDaGFyMzIgV2lkdGhJdGVyYXRvcjo6bm9ybWFsaXplVm9pY2luZ01h
cmtzKGludCBjdXJyZW50Q2hhcmFjdGVyKQotewotICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyICsg
MSA8IG1fZW5kKSB7Ci0gICAgICAgIGlmIChjb21iaW5pbmdDbGFzcyhtX3J1bltjdXJyZW50Q2hh
cmFjdGVyICsgMV0pID09IGhpcmFnYW5hS2F0YWthbmFWb2ljaW5nTWFya3NDb21iaW5pbmdDbGFz
cykgewotI2lmIFVTRShJQ1VfVU5JQ09ERSkKLSAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBpbnRv
IGNvbXBvc2VkIGZvcm0gdXNpbmcgMy4yIHJ1bGVzLgotICAgICAgICAgICAgVUNoYXIgbm9ybWFs
aXplZENoYXJhY3RlcnNbMl0gPSB7IDAsIDAgfTsKLSAgICAgICAgICAgIFVFcnJvckNvZGUgdVN0
YXR1cyA9IFVfWkVST19FUlJPUjsgIAotICAgICAgICAgICAgaW50MzJfdCByZXN1bHRMZW5ndGgg
PSB1bm9ybV9ub3JtYWxpemUobV9ydW4uZGF0YShjdXJyZW50Q2hhcmFjdGVyKSwgMiwKLSAgICAg
ICAgICAgICAgICBVTk9STV9ORkMsIFVOT1JNX1VOSUNPREVfM18yLCAmbm9ybWFsaXplZENoYXJh
Y3RlcnNbMF0sIDIsICZ1U3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHRMZW5ndGggPT0g
MSAmJiB1U3RhdHVzID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRDaGFy
YWN0ZXJzWzBdOwotI2VsaWYgVVNFKFFUNF9VTklDT0RFKQotICAgICAgICAgICAgUVN0cmluZyB0
bXAocmVpbnRlcnByZXRfY2FzdDxjb25zdCBRQ2hhcio+KG1fcnVuLmRhdGEoY3VycmVudENoYXJh
Y3RlcikpLCAyKTsKLSAgICAgICAgICAgIFFTdHJpbmcgcmVzID0gdG1wLm5vcm1hbGl6ZWQoUVN0
cmluZzo6Tm9ybWFsaXphdGlvbkZvcm1fQywgUUNoYXI6OlVuaWNvZGVfM18yKTsKLSAgICAgICAg
ICAgIGlmIChyZXMubGVuZ3RoKCkgPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmF0
KDApLnVuaWNvZGUoKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwot
fQotCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRm9udCBJbXBs
ZW1lbnRhdGlvbiAoQ3Jvc3MtUGxhdGZvcm0gUG9ydGlvbikKIC8vID09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L1dpZHRoSXRlcmF0b3IuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJh
dG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAxNDVkCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJhdG9yLmNw
cApAQCAtMCwwICsxLDIzNyBAQAorLyoqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgaHRt
bCByZW5kZXJlciBmb3IgS0RFLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xs
IChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChr
b2l2aXN0b0BrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDAwIERpcmsgTXVlbGxlciAobXVl
bGxlckBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2IEFwcGxlIENvbXB1dGVy
LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIK
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXaWR0aEl0ZXJhdG9yLmgiCisKKyNp
bmNsdWRlICJDaGFyYWN0ZXJOYW1lcy5oIgorI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCisjaW5j
bHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKworI2luY2x1ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUu
aD4KKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCisjaWYgVVNFKElDVV9VTklDT0RFKQor
I2luY2x1ZGUgPHVuaWNvZGUvdW5vcm0uaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgV1RG
OwordXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8g
QWNjb3JkaW5nIHRvIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvVUNELmh0
bWwjQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzc19WYWx1ZXMKK2NvbnN0IHVpbnQ4X3QgaGlyYWdh
bmFLYXRha2FuYVZvaWNpbmdNYXJrc0NvbWJpbmluZ0NsYXNzID0gODsKKworV2lkdGhJdGVyYXRv
cjo6V2lkdGhJdGVyYXRvcihjb25zdCBGb250KiBmb250LCBjb25zdCBUZXh0UnVuJiBydW4pCisg
ICAgOiBtX2ZvbnQoZm9udCkKKyAgICAsIG1fcnVuKHJ1bikKKyAgICAsIG1fZW5kKHJ1bi5sZW5n
dGgoKSkKKyAgICAsIG1fY3VycmVudENoYXJhY3RlcigwKQorICAgICwgbV9ydW5XaWR0aFNvRmFy
KDApCisgICAgLCBtX2ZpbmFsUm91bmRpbmdXaWR0aCgwKQoreworICAgIC8vIElmIHRoZSBwYWRk
aW5nIGlzIG5vbi16ZXJvLCBjb3VudCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiB0aGUgcnVuCisg
ICAgLy8gYW5kIGRpdmlkZSB0aGF0IGJ5IHRoZSBwYWRkaW5nIGZvciBwZXIgc3BhY2UgYWRkaXRp
b24uCisgICAgbV9wYWRkaW5nID0gbV9ydW4ucGFkZGluZygpOworICAgIGlmICghbV9wYWRkaW5n
KQorICAgICAgICBtX3BhZFBlclNwYWNlID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgZmxvYXQg
bnVtU3BhY2VzID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW4ubGVuZ3RoKCk7
IGkrKykKKyAgICAgICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2UobV9ydW5baV0pKQorICAg
ICAgICAgICAgICAgIG51bVNwYWNlcysrOworCisgICAgICAgIGlmIChudW1TcGFjZXMgPT0gMCkK
KyAgICAgICAgICAgIG1fcGFkUGVyU3BhY2UgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBtX3BhZFBlclNwYWNlID0gY2VpbGYobV9ydW4ucGFkZGluZygpIC8gbnVtU3BhY2VzKTsKKyAg
ICB9Cit9CisKK3ZvaWQgV2lkdGhJdGVyYXRvcjo6YWR2YW5jZShpbnQgb2Zmc2V0LCBHbHlwaEJ1
ZmZlciogZ2x5cGhCdWZmZXIpCit7CisgICAgaWYgKG9mZnNldCA+IG1fZW5kKQorICAgICAgICBv
ZmZzZXQgPSBtX2VuZDsKKworICAgIGludCBjdXJyZW50Q2hhcmFjdGVyID0gbV9jdXJyZW50Q2hh
cmFjdGVyOworICAgIGNvbnN0IFVDaGFyKiBjcCA9IG1fcnVuLmRhdGEoY3VycmVudENoYXJhY3Rl
cik7CisKKyAgICBib29sIHJ0bCA9IG1fcnVuLnJ0bCgpOworICAgIGJvb2wgaGFzRXh0cmFTcGFj
aW5nID0gKG1fZm9udC0+bGV0dGVyU3BhY2luZygpIHx8IG1fZm9udC0+d29yZFNwYWNpbmcoKSB8
fCBtX3BhZGRpbmcpICYmICFtX3J1bi5zcGFjaW5nRGlzYWJsZWQoKTsKKworICAgIGZsb2F0IHJ1
bldpZHRoU29GYXIgPSBtX3J1bldpZHRoU29GYXI7CisgICAgZmxvYXQgbGFzdFJvdW5kaW5nV2lk
dGggPSBtX2ZpbmFsUm91bmRpbmdXaWR0aDsKKyAgICAKKyAgICB3aGlsZSAoY3VycmVudENoYXJh
Y3RlciA8IG9mZnNldCkgeworICAgICAgICBVQ2hhcjMyIGMgPSAqY3A7CisgICAgICAgIHVuc2ln
bmVkIGNsdXN0ZXJMZW5ndGggPSAxOworICAgICAgICBpZiAoYyA+PSAweDMwNDEpIHsKKyAgICAg
ICAgICAgIGlmIChjIDw9IDB4MzBGRSkgeworICAgICAgICAgICAgICAgIC8vIERlYWwgd2l0aCBI
aXJhZ2FuYSBhbmQgS2F0YWthbmEgdm9pY2VkIGFuZCBzZW1pLXZvaWNlZCBzeWxsYWJsZXMuCisg
ICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIGludG8gY29tcG9zZWQgZm9ybSwgYW5kIHRoZW4g
bG9vayBmb3IgZ2x5cGggd2l0aCBiYXNlICsgY29tYmluZWQgbWFyay4KKyAgICAgICAgICAgICAg
ICAvLyBDaGVjayBhYm92ZSBmb3IgY2hhcmFjdGVyIHJhbmdlIHRvIG1pbmltaXplIHBlcmZvcm1h
bmNlIGltcGFjdC4KKyAgICAgICAgICAgICAgICBVQ2hhcjMyIG5vcm1hbGl6ZWQgPSBub3JtYWxp
emVWb2ljaW5nTWFya3MoY3VycmVudENoYXJhY3Rlcik7CisgICAgICAgICAgICAgICAgaWYgKG5v
cm1hbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG5vcm1hbGl6ZWQ7CisgICAgICAg
ICAgICAgICAgICAgIGNsdXN0ZXJMZW5ndGggPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0gZWxzZSBpZiAoVTE2X0lTX1NVUlJPR0FURShjKSkgeworICAgICAgICAgICAgICAg
IGlmICghVTE2X0lTX1NVUlJPR0FURV9MRUFEKGMpKQorICAgICAgICAgICAgICAgICAgICBicmVh
azsKKworICAgICAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpcj8gIElm
IHNvLCBkZXRlcm1pbmUgdGhlIGZ1bGwgVW5pY29kZSAoMzIgYml0KQorICAgICAgICAgICAgICAg
IC8vIGNvZGUgcG9pbnQgYmVmb3JlIGdseXBoIGxvb2t1cC4KKyAgICAgICAgICAgICAgICAvLyBN
YWtlIHN1cmUgd2UgaGF2ZSBhbm90aGVyIGNoYXJhY3RlciBhbmQgaXQncyBhIGxvdyBzdXJyb2dh
dGUuCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgKyAxID49IG1fcnVuLmxl
bmd0aCgpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBVQ2hh
ciBsb3cgPSBjcFsxXTsKKyAgICAgICAgICAgICAgICBpZiAoIVUxNl9JU19UUkFJTChsb3cpKQor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjID0gVTE2X0dFVF9T
VVBQTEVNRU5UQVJZKGMsIGxvdyk7CisgICAgICAgICAgICAgICAgY2x1c3Rlckxlbmd0aCA9IDI7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBHbHlwaERhdGEmIGds
eXBoRGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMsIHJ0bCk7CisgICAgICAg
IEdseXBoIGdseXBoID0gZ2x5cGhEYXRhLmdseXBoOworICAgICAgICBjb25zdCBTaW1wbGVGb250
RGF0YSogZm9udERhdGEgPSBnbHlwaERhdGEuZm9udERhdGE7CisKKyAgICAgICAgQVNTRVJUKGZv
bnREYXRhKTsKKworICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgZ2x5cGggYW5kIGZvbnQg
ZGF0YSwgZ2V0IGl0cyB3aWR0aC4KKyAgICAgICAgZmxvYXQgd2lkdGg7CisgICAgICAgIGlmIChj
ID09ICdcdCcgJiYgbV9ydW4uYWxsb3dUYWJzKCkpIHsKKyAgICAgICAgICAgIGZsb2F0IHRhYldp
ZHRoID0gbV9mb250LT50YWJXaWR0aCgpOworICAgICAgICAgICAgd2lkdGggPSB0YWJXaWR0aCAt
IGZtb2RmKG1fcnVuLnhQb3MoKSArIHJ1bldpZHRoU29GYXIsIHRhYldpZHRoKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIHdpZHRoID0gZm9udERhdGEtPndpZHRoRm9yR2x5cGgoZ2x5
cGgpOworICAgICAgICAgICAgLy8gV2Ugc3BlY2lhbCBjYXNlIHNwYWNlcyBpbiB0d28gd2F5cyB3
aGVuIGFwcGx5aW5nIHdvcmQgcm91bmRpbmcuCisgICAgICAgICAgICAvLyBGaXJzdCwgd2Ugcm91
bmQgc3BhY2VzIHRvIGFuIGFkanVzdGVkIHdpZHRoIGluIGFsbCBmb250cy4KKyAgICAgICAgICAg
IC8vIFNlY29uZCwgaW4gZml4ZWQtcGl0Y2ggZm9udHMgd2UgZW5zdXJlIHRoYXQgYWxsIGNoYXJh
Y3RlcnMgdGhhdAorICAgICAgICAgICAgLy8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSBzcGFjZSBj
aGFyYWN0ZXIgaGF2ZSB0aGUgc2FtZSB3aWR0aCBhcyB0aGUgc3BhY2UgY2hhcmFjdGVyLgorICAg
ICAgICAgICAgaWYgKHdpZHRoID09IGZvbnREYXRhLT5tX3NwYWNlV2lkdGggJiYgKGZvbnREYXRh
LT5tX3RyZWF0QXNGaXhlZFBpdGNoIHx8IGdseXBoID09IGZvbnREYXRhLT5tX3NwYWNlR2x5cGgp
ICYmIG1fcnVuLmFwcGx5V29yZFJvdW5kaW5nKCkpCisgICAgICAgICAgICAgICAgd2lkdGggPSBm
b250RGF0YS0+bV9hZGp1c3RlZFNwYWNlV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAo
aGFzRXh0cmFTcGFjaW5nKSB7CisgICAgICAgICAgICAvLyBBY2NvdW50IGZvciBsZXR0ZXItc3Bh
Y2luZy4KKyAgICAgICAgICAgIGlmICh3aWR0aCAmJiBtX2ZvbnQtPmxldHRlclNwYWNpbmcoKSkK
KyAgICAgICAgICAgICAgICB3aWR0aCArPSBtX2ZvbnQtPmxldHRlclNwYWNpbmcoKTsKKworICAg
ICAgICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNTcGFjZShjKSkgeworICAgICAgICAgICAgICAgIC8v
IEFjY291bnQgZm9yIHBhZGRpbmcuIFdlYkNvcmUgdXNlcyBzcGFjZSBwYWRkaW5nIHRvIGp1c3Rp
ZnkgdGV4dC4KKyAgICAgICAgICAgICAgICAvLyBXZSBkaXN0cmlidXRlIHRoZSBzcGVjaWZpZWQg
cGFkZGluZyBvdmVyIHRoZSBhdmFpbGFibGUgc3BhY2VzIGluIHRoZSBydW4uCisgICAgICAgICAg
ICAgICAgaWYgKG1fcGFkZGluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgbGVmdCBv
dmVyIHBhZGRpbmcgaWYgbm90IGV2ZW5seSBkaXZpc2libGUgYnkgbnVtYmVyIG9mIHNwYWNlcy4K
KyAgICAgICAgICAgICAgICAgICAgaWYgKG1fcGFkZGluZyA8IG1fcGFkUGVyU3BhY2UpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICs9IG1fcGFkZGluZzsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG1fcGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSBtX3BhZFBlclNwYWNlOworICAgICAgICAg
ICAgICAgICAgICAgICAgbV9wYWRkaW5nIC09IG1fcGFkUGVyU3BhY2U7CisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBY2NvdW50
IGZvciB3b3JkIHNwYWNpbmcuCisgICAgICAgICAgICAgICAgLy8gV2UgYXBwbHkgYWRkaXRpb25h
bCBzcGFjZSBiZXR3ZWVuICJ3b3JkcyIgYnkgYWRkaW5nIHdpZHRoIHRvIHRoZSBzcGFjZSBjaGFy
YWN0ZXIuCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXIgIT0gMCAmJiAhRm9u
dDo6dHJlYXRBc1NwYWNlKGNwWy0xXSkgJiYgbV9mb250LT53b3JkU3BhY2luZygpKQorICAgICAg
ICAgICAgICAgICAgICB3aWR0aCArPSBtX2ZvbnQtPndvcmRTcGFjaW5nKCk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZHZhbmNlIHBhc3QgdGhlIGNoYXJhY3RlciB3
ZSBqdXN0IGRlYWx0IHdpdGguCisgICAgICAgIGNwICs9IGNsdXN0ZXJMZW5ndGg7CisgICAgICAg
IGN1cnJlbnRDaGFyYWN0ZXIgKz0gY2x1c3Rlckxlbmd0aDsKKworICAgICAgICAvLyBBY2NvdW50
IGZvciBmbG9hdC9pbnRlZ2VyIGltcGVkYW5jZSBtaXNtYXRjaCBiZXR3ZWVuIENHIGFuZCBLSFRN
TC4gIldvcmRzIiAoY2hhcmFjdGVycyAKKyAgICAgICAgLy8gZm9sbG93ZWQgYnkgYSBjaGFyYWN0
ZXIgZGVmaW5lZCBieSBpc1JvdW5kaW5nSGFja0NoYXJhY3RlcigpKSBhcmUgYWx3YXlzIGFuIGlu
dGVnZXIgd2lkdGguCisgICAgICAgIC8vIFdlIGFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGxhc3Qg
Y2hhcmFjdGVyIG9mIGEgIndvcmQiIHRvIGVuc3VyZSBhbiBpbnRlZ2VyIHdpZHRoLgorICAgICAg
ICAvLyBJZiB3ZSBtb3ZlIEtIVE1MIHRvIGZsb2F0cyB3ZSBjYW4gcmVtb3ZlIHRoaXMgKGFuZCBy
ZWxhdGVkKSBoYWNrcy4KKworICAgICAgICBmbG9hdCBvbGRXaWR0aCA9IHdpZHRoOworCisgICAg
ICAgIC8vIEZvcmNlIGNoYXJhY3RlcnMgdGhhdCBhcmUgdXNlZCB0byBkZXRlcm1pbmUgd29yZCBi
b3VuZGFyaWVzIGZvciB0aGUgcm91bmRpbmcgaGFjaworICAgICAgICAvLyB0byBiZSBpbnRlZ2Vy
IHdpZHRoLCBzbyBmb2xsb3dpbmcgd29yZHMgd2lsbCBzdGFydCBvbiBhbiBpbnRlZ2VyIGJvdW5k
YXJ5LgorICAgICAgICBpZiAobV9ydW4uYXBwbHlXb3JkUm91bmRpbmcoKSAmJiBGb250Ojppc1Jv
dW5kaW5nSGFja0NoYXJhY3RlcihjKSkKKyAgICAgICAgICAgIHdpZHRoID0gY2VpbGYod2lkdGgp
OworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSAi
cm91bmRpbmcgaGFjayBjaGFyYWN0ZXIiLCBpZiBzbywgYWRqdXN0CisgICAgICAgIC8vIHdpZHRo
IHNvIHRoYXQgdGhlIHRvdGFsIHJ1biB3aWR0aCB3aWxsIGJlIG9uIGFuIGludGVnZXIgYm91bmRh
cnkuCisgICAgICAgIGlmICgobV9ydW4uYXBwbHlXb3JkUm91bmRpbmcoKSAmJiBjdXJyZW50Q2hh
cmFjdGVyIDwgbV9ydW4ubGVuZ3RoKCkgJiYgRm9udDo6aXNSb3VuZGluZ0hhY2tDaGFyYWN0ZXIo
KmNwKSkKKyAgICAgICAgICAgICAgICB8fCAobV9ydW4uYXBwbHlSdW5Sb3VuZGluZygpICYmIGN1
cnJlbnRDaGFyYWN0ZXIgPj0gbV9lbmQpKSB7CisgICAgICAgICAgICBmbG9hdCB0b3RhbFdpZHRo
ID0gcnVuV2lkdGhTb0ZhciArIHdpZHRoOworICAgICAgICAgICAgd2lkdGggKz0gY2VpbGYodG90
YWxXaWR0aCkgLSB0b3RhbFdpZHRoOworICAgICAgICB9CisKKyAgICAgICAgcnVuV2lkdGhTb0Zh
ciArPSB3aWR0aDsKKworICAgICAgICBpZiAoZ2x5cGhCdWZmZXIpCisgICAgICAgICAgICBnbHlw
aEJ1ZmZlci0+YWRkKGdseXBoLCBmb250RGF0YSwgKHJ0bCA/IG9sZFdpZHRoICsgbGFzdFJvdW5k
aW5nV2lkdGggOiB3aWR0aCkpOworCisgICAgICAgIGxhc3RSb3VuZGluZ1dpZHRoID0gd2lkdGgg
LSBvbGRXaWR0aDsKKyAgICB9CisKKyAgICBtX2N1cnJlbnRDaGFyYWN0ZXIgPSBjdXJyZW50Q2hh
cmFjdGVyOworICAgIG1fcnVuV2lkdGhTb0ZhciA9IHJ1bldpZHRoU29GYXI7CisgICAgbV9maW5h
bFJvdW5kaW5nV2lkdGggPSBsYXN0Um91bmRpbmdXaWR0aDsKK30KKworYm9vbCBXaWR0aEl0ZXJh
dG9yOjphZHZhbmNlT25lQ2hhcmFjdGVyKGZsb2F0JiB3aWR0aCwgR2x5cGhCdWZmZXIqIGdseXBo
QnVmZmVyKQoreworICAgIGdseXBoQnVmZmVyLT5jbGVhcigpOworICAgIGFkdmFuY2UobV9jdXJy
ZW50Q2hhcmFjdGVyICsgMSwgZ2x5cGhCdWZmZXIpOworICAgIGZsb2F0IHcgPSAwOworICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgZ2x5cGhCdWZmZXItPnNpemUoKTsgKytpKQorICAgICAgICB3ICs9
IGdseXBoQnVmZmVyLT5hZHZhbmNlQXQoaSk7CisgICAgd2lkdGggPSB3OworICAgIHJldHVybiAh
Z2x5cGhCdWZmZXItPmlzRW1wdHkoKTsKK30KKworVUNoYXIzMiBXaWR0aEl0ZXJhdG9yOjpub3Jt
YWxpemVWb2ljaW5nTWFya3MoaW50IGN1cnJlbnRDaGFyYWN0ZXIpCit7CisgICAgaWYgKGN1cnJl
bnRDaGFyYWN0ZXIgKyAxIDwgbV9lbmQpIHsKKyAgICAgICAgaWYgKGNvbWJpbmluZ0NsYXNzKG1f
cnVuW2N1cnJlbnRDaGFyYWN0ZXIgKyAxXSkgPT0gaGlyYWdhbmFLYXRha2FuYVZvaWNpbmdNYXJr
c0NvbWJpbmluZ0NsYXNzKSB7CisjaWYgVVNFKElDVV9VTklDT0RFKQorICAgICAgICAgICAgLy8g
Tm9ybWFsaXplIGludG8gY29tcG9zZWQgZm9ybSB1c2luZyAzLjIgcnVsZXMuCisgICAgICAgICAg
ICBVQ2hhciBub3JtYWxpemVkQ2hhcmFjdGVyc1syXSA9IHsgMCwgMCB9OworICAgICAgICAgICAg
VUVycm9yQ29kZSB1U3RhdHVzID0gVV9aRVJPX0VSUk9SOyAgCisgICAgICAgICAgICBpbnQzMl90
IHJlc3VsdExlbmd0aCA9IHVub3JtX25vcm1hbGl6ZShtX3J1bi5kYXRhKGN1cnJlbnRDaGFyYWN0
ZXIpLCAyLAorICAgICAgICAgICAgICAgIFVOT1JNX05GQywgVU5PUk1fVU5JQ09ERV8zXzIsICZu
b3JtYWxpemVkQ2hhcmFjdGVyc1swXSwgMiwgJnVTdGF0dXMpOworICAgICAgICAgICAgaWYgKHJl
c3VsdExlbmd0aCA9PSAxICYmIHVTdGF0dXMgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4g
bm9ybWFsaXplZENoYXJhY3RlcnNbMF07CisjZWxpZiBVU0UoUVQ0X1VOSUNPREUpCisgICAgICAg
ICAgICBRU3RyaW5nIHRtcChyZWludGVycHJldF9jYXN0PGNvbnN0IFFDaGFyKj4obV9ydW4uZGF0
YShjdXJyZW50Q2hhcmFjdGVyKSksIDIpOworICAgICAgICAgICAgUVN0cmluZyByZXMgPSB0bXAu
bm9ybWFsaXplZChRU3RyaW5nOjpOb3JtYWxpemF0aW9uRm9ybV9DLCBRQ2hhcjo6VW5pY29kZV8z
XzIpOworICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGgoKSA9PSAxKQorICAgICAgICAgICAgICAg
IHJldHVybiByZXMuYXQoMCkudW5pY29kZSgpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIDA7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvV2lkdGhJdGVyYXRvci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJh
dG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhYjlhMwotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvV2lkdGhJdGVyYXRvci5oCkBA
IC0wLDAgKzEsNTYgQEAKKy8qKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGh0bWwgcmVu
ZGVyZXIgZm9yIEtERS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25v
bGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlz
dG9Aa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11ZWxsZXJA
a2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5j
LgorICogQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisj
aWZuZGVmIFdpZHRoSXRlcmF0b3JfaAorI2RlZmluZSBXaWR0aEl0ZXJhdG9yX2gKKworI2luY2x1
ZGUgIkZvbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIHN0cnVjdCBXaWR0aEl0ZXJh
dG9yIHsKKyAgICAgICAgV2lkdGhJdGVyYXRvcihjb25zdCBGb250KiBmb250LCBjb25zdCBUZXh0
UnVuJiBydW4pOworCisgICAgICAgIHZvaWQgYWR2YW5jZShpbnQgdG8sIEdseXBoQnVmZmVyKiBn
bHlwaEJ1ZmZlciA9IDApOworICAgICAgICBib29sIGFkdmFuY2VPbmVDaGFyYWN0ZXIoZmxvYXQm
IHdpZHRoLCBHbHlwaEJ1ZmZlciogZ2x5cGhCdWZmZXIgPSAwKTsKKworICAgICAgICBjb25zdCBG
b250KiBtX2ZvbnQ7CisKKyAgICAgICAgY29uc3QgVGV4dFJ1biYgbV9ydW47CisgICAgICAgIGlu
dCBtX2VuZDsKKworICAgICAgICB1bnNpZ25lZCBtX2N1cnJlbnRDaGFyYWN0ZXI7CisgICAgICAg
IGZsb2F0IG1fcnVuV2lkdGhTb0ZhcjsKKyAgICAgICAgZmxvYXQgbV9wYWRkaW5nOworICAgICAg
ICBmbG9hdCBtX3BhZFBlclNwYWNlOworICAgICAgICBmbG9hdCBtX2ZpbmFsUm91bmRpbmdXaWR0
aDsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICBVQ2hhcjMyIG5vcm1hbGl6ZVZvaWNpbmdN
YXJrcyhpbnQgY3VycmVudENoYXJhY3Rlcik7CisgICAgfTsKK30KKworI2VuZGlmCisKLS0gCjEu
NS40LjMKCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23592</attachid>
            <date>2008-09-19 19:30:03 -0700</date>
            <delta_ts>2008-12-11 16:09:57 -0800</delta_ts>
            <desc>Move the &quot;fast&quot; WebCore Font path to a separate file</desc>
            <filename>0002-Move-the-fast-font-path-to-a-separate-file.patch</filename>
            <type>text/plain</type>
            <size>28054</size>
            <attacher name="Holger Freyther">zecke</attacher>
            
              <data encoding="base64">RnJvbSAzYzQ2YWI1YTQxNTQ3OTUwN2NiNDVjNjhhMmFlMTRmYWRlNGNlNmE1IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2Vs
ZmlzaC5vcmc+CkRhdGU6IFNhdCwgMjAgU2VwIDIwMDggMDA6NDg6MTQgKzAyMDAKU3ViamVjdDog
W1BBVENIXSBNb3ZlIHRoZSBmYXN0IGZvbnQgcGF0aCB0byBhIHNlcGFyYXRlIGZpbGUKCi0tLQog
V2ViQ29yZS9HTlVtYWtlZmlsZS5hbSAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwICAgICAgICAgfCAgMzIyIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3Bw
IHwgIDM3MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDM3
MSBpbnNlcnRpb25zKCspLCAzMjIgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwCgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9HTlVtYWtlZmlsZS5hbSBiL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KaW5kZXggOTQ0MjU1
NS4uMTEyOTZhNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQorKysgYi9XZWJD
b3JlL0dOVW1ha2VmaWxlLmFtCkBAIC0xNTg2LDYgKzE1ODYsNyBAQCB3ZWJjb3JlX3NvdXJjZXMg
Kz0gXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhbWlseS5oIFwKIAlXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRSZW5kZXJpbmdNb2RlLmggXAogCVdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvRm9udFNlbGVjdG9yLmggXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Rm9udEZhc3RQYXRoLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250VHJhaXRz
TWFzay5oIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dlbmVyYXRlZEltYWdlLmNwcCBc
CiAJV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HZW5lcmF0ZWRJbWFnZS5oIFwKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnQuY3BwCmluZGV4IGIwYWM4MDguLjFkZjEyMmIgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Gb250LmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgIkZvbnQuaCIKIAog
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgotI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUg
IkZvbnRGYWxsYmFja0xpc3QuaCIKICNpbmNsdWRlICJJbnRQb2ludC5oIgogI2luY2x1ZGUgIkds
eXBoQnVmZmVyLmgiCkBAIC0xMzMsMTMyICsxMzIsNiBAQCBib29sIEZvbnQ6Om9wZXJhdG9yPT0o
Y29uc3QgRm9udCYgb3RoZXIpIGNvbnN0CiAgICAgICAgICAgICYmIChtX2ZvbnRMaXN0ID8gbV9m
b250TGlzdC0+Z2VuZXJhdGlvbigpIDogMCkgPT0gKG90aGVyLm1fZm9udExpc3QgPyBvdGhlci5t
X2ZvbnRMaXN0LT5nZW5lcmF0aW9uKCkgOiAwKTsKIH0KIAotY29uc3QgR2x5cGhEYXRhJiBGb250
OjpnbHlwaERhdGFGb3JDaGFyYWN0ZXIoVUNoYXIzMiBjLCBib29sIG1pcnJvciwgYm9vbCBmb3Jj
ZVNtYWxsQ2FwcykgY29uc3QKLXsKLSAgICBib29sIHVzZVNtYWxsQ2Fwc0ZvbnQgPSBmb3JjZVNt
YWxsQ2FwczsKLSAgICBpZiAobV9mb250RGVzY3JpcHRpb24uc21hbGxDYXBzKCkpIHsKLSAgICAg
ICAgVUNoYXIzMiB1cHBlckMgPSBVbmljb2RlOjp0b1VwcGVyKGMpOwotICAgICAgICBpZiAodXBw
ZXJDICE9IGMpIHsKLSAgICAgICAgICAgIGMgPSB1cHBlckM7Ci0gICAgICAgICAgICB1c2VTbWFs
bENhcHNGb250ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtaXJyb3IpCi0g
ICAgICAgIGMgPSBtaXJyb3JlZENoYXIoYyk7Ci0KLSAgICB1bnNpZ25lZCBwYWdlTnVtYmVyID0g
KGMgLyBHbHlwaFBhZ2U6OnNpemUpOwotCi0gICAgR2x5cGhQYWdlVHJlZU5vZGUqIG5vZGUgPSBw
YWdlTnVtYmVyID8gbV9wYWdlcy5nZXQocGFnZU51bWJlcikgOiBtX3BhZ2VaZXJvOwotICAgIGlm
ICghbm9kZSkgewotICAgICAgICBub2RlID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGls
ZChmb250RGF0YUF0KDApLCBwYWdlTnVtYmVyKTsKLSAgICAgICAgaWYgKHBhZ2VOdW1iZXIpCi0g
ICAgICAgICAgICBtX3BhZ2VzLnNldChwYWdlTnVtYmVyLCBub2RlKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgbV9wYWdlWmVybyA9IG5vZGU7Ci0gICAgfQotCi0gICAgR2x5cGhQYWdlKiBw
YWdlOwotICAgIGlmICghdXNlU21hbGxDYXBzRm9udCkgewotICAgICAgICAvLyBGYXN0ZXN0IGxv
b3AsIGZvciB0aGUgY29tbW9uIGNhc2UgKG5vdCBzbWFsbCBjYXBzKS4KLSAgICAgICAgd2hpbGUg
KHRydWUpIHsKLSAgICAgICAgICAgIHBhZ2UgPSBub2RlLT5wYWdlKCk7Ci0gICAgICAgICAgICBp
ZiAocGFnZSkgewotICAgICAgICAgICAgICAgIGNvbnN0IEdseXBoRGF0YSYgZGF0YSA9IHBhZ2Ut
PmdseXBoRGF0YUZvckNoYXJhY3RlcihjKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YS5mb250
RGF0YSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgICAgICAgICAg
aWYgKG5vZGUtPmlzU3lzdGVtRmFsbGJhY2soKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCB0aGUgZmFsbGJh
Y2sgbGlzdC4KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5nZXRDaGlsZChmb250RGF0YUF0KG5v
ZGUtPmxldmVsKCkpLCBwYWdlTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChwYWdlTnVtYmVyKQot
ICAgICAgICAgICAgICAgIG1fcGFnZXMuc2V0KHBhZ2VOdW1iZXIsIG5vZGUpOwotICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIG1fcGFnZVplcm8gPSBub2RlOwotICAgICAgICB9Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHBhZ2UgPSBu
b2RlLT5wYWdlKCk7Ci0gICAgICAgICAgICBpZiAocGFnZSkgewotICAgICAgICAgICAgICAgIGNv
bnN0IEdseXBoRGF0YSYgZGF0YSA9IHBhZ2UtPmdseXBoRGF0YUZvckNoYXJhY3RlcihjKTsKLSAg
ICAgICAgICAgICAgICBpZiAoZGF0YS5mb250RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAv
LyBUaGUgc21hbGxDYXBzRm9udERhdGEgZnVuY3Rpb24gc2hvdWxkIG5vdCBub3JtYWxseSByZXR1
cm4gMC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGlmIGl0IGRvZXMsIHdlIHdpbGwganVz
dCByZW5kZXIgdGhlIGNhcGl0YWwgbGV0dGVyIGJpZy4KLSAgICAgICAgICAgICAgICAgICAgY29u
c3QgU2ltcGxlRm9udERhdGEqIHNtYWxsQ2Fwc0ZvbnREYXRhID0gZGF0YS5mb250RGF0YS0+c21h
bGxDYXBzRm9udERhdGEobV9mb250RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoIXNtYWxsQ2Fwc0ZvbnREYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRh
dGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGUqIHNtYWxsQ2Fwc05v
ZGUgPSBHbHlwaFBhZ2VUcmVlTm9kZTo6Z2V0Um9vdENoaWxkKHNtYWxsQ2Fwc0ZvbnREYXRhLCBw
YWdlTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgR2x5cGhQYWdlKiBzbWFsbENh
cHNQYWdlID0gc21hbGxDYXBzTm9kZS0+cGFnZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAo
c21hbGxDYXBzUGFnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2x5cGhEYXRh
JiBkYXRhID0gc21hbGxDYXBzUGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZm9udERhdGEpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgICAgICAvLyBEbyBub3QgYXR0ZW1wdCBzeXN0ZW0gZmFsbGJhY2sgb2ZmIHRoZSBzbWFs
bENhcHNGb250RGF0YS4gVGhpcyBpcyB0aGUgdmVyeSB1bmxpa2VseSBjYXNlIHRoYXQKLSAgICAg
ICAgICAgICAgICAgICAgLy8gYSBmb250IGhhcyB0aGUgbG93ZXJjYXNlIGNoYXJhY3RlciBidXQg
dGhlIHNtYWxsIGNhcHMgZm9udCBkb2VzIG5vdCBoYXZlIGl0cyB1cHBlcmNhc2UgdmVyc2lvbi4K
LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNtYWxsQ2Fwc0ZvbnREYXRhLT5taXNzaW5nR2x5
cGhEYXRhKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5vZGUt
PmlzU3lzdGVtRmFsbGJhY2soKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCB0aGUgZmFsbGJhY2sgbGlzdC4K
LSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5nZXRDaGlsZChmb250RGF0YUF0KG5vZGUtPmxldmVs
KCkpLCBwYWdlTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChwYWdlTnVtYmVyKQotICAgICAgICAg
ICAgICAgIG1fcGFnZXMuc2V0KHBhZ2VOdW1iZXIsIG5vZGUpOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIG1fcGFnZVplcm8gPSBub2RlOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgQVNTRVJUKHBhZ2UpOwotICAgIEFTU0VSVChub2RlLT5pc1N5c3RlbUZhbGxiYWNrKCkpOwot
Ci0gICAgLy8gU3lzdGVtIGZhbGxiYWNrIGlzIGNoYXJhY3Rlci1kZXBlbmRlbnQuIFdoZW4gd2Ug
Z2V0IGhlcmUsIHdlCi0gICAgLy8ga25vdyB0aGF0IHRoZSBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24g
aXNuJ3QgaW4gdGhlIHN5c3RlbSBmYWxsYmFjawotICAgIC8vIGZvbnQncyBnbHlwaCBwYWdlLiBU
cnkgdG8gbGF6aWx5IGNyZWF0ZSBpdCBoZXJlLgotICAgIFVDaGFyIGNvZGVVbml0c1syXTsKLSAg
ICBpbnQgY29kZVVuaXRzTGVuZ3RoOwotICAgIGlmIChjIDw9IDB4RkZGRikgewotICAgICAgICBV
Q2hhciBjMTYgPSBjOwotICAgICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKGMxNikpCi0gICAg
ICAgICAgICBjb2RlVW5pdHNbMF0gPSAnICc7Ci0gICAgICAgIGVsc2UgaWYgKEZvbnQ6OnRyZWF0
QXNaZXJvV2lkdGhTcGFjZShjMTYpKQotICAgICAgICAgICAgY29kZVVuaXRzWzBdID0gemVyb1dp
ZHRoU3BhY2U7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvZGVVbml0c1swXSA9IGMxNjsK
LSAgICAgICAgY29kZVVuaXRzTGVuZ3RoID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb2Rl
VW5pdHNbMF0gPSBVMTZfTEVBRChjKTsKLSAgICAgICAgY29kZVVuaXRzWzFdID0gVTE2X1RSQUlM
KGMpOwotICAgICAgICBjb2RlVW5pdHNMZW5ndGggPSAyOwotICAgIH0KLSAgICBjb25zdCBTaW1w
bGVGb250RGF0YSogY2hhcmFjdGVyRm9udERhdGEgPSBGb250Q2FjaGU6OmdldEZvbnREYXRhRm9y
Q2hhcmFjdGVycygqdGhpcywgY29kZVVuaXRzLCBjb2RlVW5pdHNMZW5ndGgpOwotICAgIGlmICh1
c2VTbWFsbENhcHNGb250KQotICAgICAgICBjaGFyYWN0ZXJGb250RGF0YSA9IGNoYXJhY3RlckZv
bnREYXRhLT5zbWFsbENhcHNGb250RGF0YShtX2ZvbnREZXNjcmlwdGlvbik7Ci0gICAgaWYgKGNo
YXJhY3RlckZvbnREYXRhKSB7Ci0gICAgICAgIC8vIEdvdCB0aGUgZmFsbGJhY2sgZ2x5cGggYW5k
IGZvbnQuCi0gICAgICAgIEdseXBoUGFnZSogZmFsbGJhY2tQYWdlID0gR2x5cGhQYWdlVHJlZU5v
ZGU6OmdldFJvb3RDaGlsZChjaGFyYWN0ZXJGb250RGF0YSwgcGFnZU51bWJlciktPnBhZ2UoKTsK
LSAgICAgICAgY29uc3QgR2x5cGhEYXRhJiBkYXRhID0gZmFsbGJhY2tQYWdlICYmIGZhbGxiYWNr
UGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGMpLmZvbnREYXRhID8gZmFsbGJhY2tQYWdlLT5n
bHlwaERhdGFGb3JDaGFyYWN0ZXIoYykgOiBjaGFyYWN0ZXJGb250RGF0YS0+bWlzc2luZ0dseXBo
RGF0YSgpOwotICAgICAgICAvLyBDYWNoZSBpdCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHN5c3Rl
bSBmYWxsYmFjayBhZ2FpbiBuZXh0IHRpbWUuCi0gICAgICAgIGlmICghdXNlU21hbGxDYXBzRm9u
dCkKLSAgICAgICAgICAgIHBhZ2UtPnNldEdseXBoRGF0YUZvckNoYXJhY3RlcihjLCBkYXRhLmds
eXBoLCBkYXRhLmZvbnREYXRhKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAg
Ly8gRXZlbiBzeXN0ZW0gZmFsbGJhY2sgY2FuIGZhaWw7IHVzZSB0aGUgbWlzc2luZyBnbHlwaCBp
biB0aGF0IGNhc2UuCi0gICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5pY2VyIHRvIHVzZSB0aGUg
bWlzc2luZyBnbHlwaCBmcm9tIHRoZSBsYXN0IHJlc29ydCBmb250IGluc3RlYWQuCi0gICAgY29u
c3QgR2x5cGhEYXRhJiBkYXRhID0gcHJpbWFyeUZvbnQoKS0+bWlzc2luZ0dseXBoRGF0YSgpOwot
ICAgIGlmICghdXNlU21hbGxDYXBzRm9udCkKLSAgICAgICAgcGFnZS0+c2V0R2x5cGhEYXRhRm9y
Q2hhcmFjdGVyKGMsIGRhdGEuZ2x5cGgsIGRhdGEuZm9udERhdGEpOwotICAgIHJldHVybiBkYXRh
OwotfQotCiB2b2lkIEZvbnQ6OmNhY2hlUHJpbWFyeUZvbnQoKSBjb25zdAogewogICAgIEFTU0VS
VChtX2ZvbnRMaXN0KTsKQEAgLTMzOSwxMzMgKzIxMiw2IEBAIGJvb2wgRm9udDo6aXNGaXhlZFBp
dGNoKCkgY29uc3QKICAgICByZXR1cm4gbV9mb250TGlzdC0+aXNGaXhlZFBpdGNoKHRoaXMpOwog
fQogCi12b2lkIEZvbnQ6OnNldENvZGVQYXRoKENvZGVQYXRoIHApCi17Ci0gICAgY29kZVBhdGgg
PSBwOwotfQotCi1ib29sIEZvbnQ6OmNhblVzZUdseXBoQ2FjaGUoY29uc3QgVGV4dFJ1biYgcnVu
KSBjb25zdAotewotICAgIHN3aXRjaCAoY29kZVBhdGgpIHsKLSAgICAgICAgY2FzZSBBdXRvOgot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2ltcGxlOgotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgQ29tcGxleDoKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gU3RhcnQgZnJvbSAwIHNpbmNlIGRyYXdpbmcgYW5kIGhp
Z2hsaWdodGluZyBhbHNvIG1lYXN1cmUgdGhlIGNoYXJhY3RlcnMgYmVmb3JlIHJ1bi0+ZnJvbQot
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVuLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgY29u
c3QgVUNoYXIgYyA9IHJ1bltpXTsKLSAgICAgICAgaWYgKGMgPCAweDMwMCkgICAgICAvLyBVKzAz
MDAgdGhyb3VnaCBVKzAzNkYgQ29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzCi0gICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgaWYgKGMgPD0gMHgzNkYpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAgICAgaWYgKGMgPCAweDA1OTEgfHwgYyA9PSAweDA1QkUpICAgICAvLyBV
KzA1OTEgdGhyb3VnaCBVKzA1Q0YgZXhjbHVkaW5nIFUrMDVCRSBIZWJyZXcgY29tYmluaW5nIG1h
cmtzLCBIZWJyZXcgcHVuY3R1YXRpb24gUGFzZXEsIFNvZiBQYXN1cSBhbmQgTnVuIEhhZnVraGEK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8PSAweDA1Q0YpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGMgPCAweDA2MDApICAgICAvLyBVKzA2
MDAgdGhyb3VnaCBVKzEwNTkgQXJhYmljLCBTeXJpYWMsIFRoYWFuYSwgRGV2YW5hZ2FyaSwgQmVu
Z2FsaSwgR3VybXVraGksIEd1amFyYXRpLCBPcml5YSwgVGFtaWwsIFRlbHVndSwgS2FubmFkYSwg
TWFsYXlhbGFtLCBTaW5oYWxhLCBUaGFpLCBMYW8sIFRpYmV0YW4sIE15YW5tYXIKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoYyA8PSAweDEwNTkpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGMgPCAweDExMDApICAgICAvLyBVKzExMDAgdGhyb3Vn
aCBVKzExRkYgSGFuZ3VsIEphbW8gKG9ubHkgQW5jaWVudCBLb3JlYW4gc2hvdWxkIGJlIGxlZnQg
aGVyZSBpZiB5b3UgcHJlY29tcG9zZTsgTW9kZXJuIEtvcmVhbiB3aWxsIGJlIHByZWNvbXBvc2Vk
IGFzIGEgcmVzdWx0IG9mIHN0ZXAgQSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBp
ZiAoYyA8PSAweDExRkYpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYg
KGMgPCAweDE3ODApICAgICAvLyBVKzE3ODAgdGhyb3VnaCBVKzE4QUYgS2htZXIsIE1vbmdvbGlh
bgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChjIDw9IDB4MThBRikKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoYyA8IDB4MTkwMCkgICAgIC8vIFUr
MTkwMCB0aHJvdWdoIFUrMTk0RiBMaW1idSAoVW5pY29kZSA0LjApCi0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgaWYgKGMgPD0gMHgxOTRGKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgICAgIGlmIChjIDwgMHgyMEQwKSAgICAgLy8gVSsyMEQwIHRocm91Z2ggVSsyMEZG
IENvbWJpbmluZyBtYXJrcyBmb3Igc3ltYm9scwotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIGlmIChjIDw9IDB4MjBGRikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICBpZiAoYyA8IDB4RkUyMCkgICAgIC8vIFUrRkUyMCB0aHJvdWdoIFUrRkUyRiBDb21iaW5pbmcg
aGFsZiBtYXJrcwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChjIDw9IDB4RkUy
RikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsK
LQotfQotCi12b2lkIEZvbnQ6OmRyYXdTaW1wbGVUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20s
IGludCB0bykgY29uc3QKLXsKLSAgICAvLyBUaGlzIGdseXBoIGJ1ZmZlciBob2xkcyBvdXIgZ2x5
cGhzK2FkdmFuY2VzK2ZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KLSAgICBHbHlwaEJ1ZmZlciBn
bHlwaEJ1ZmZlcjsKLQotICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKLSAgICBXaWR0aEl0
ZXJhdG9yIGl0KHRoaXMsIHJ1bik7Ci0gICAgaXQuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBi
ZWZvcmVXaWR0aCA9IGl0Lm1fcnVuV2lkdGhTb0ZhcjsKLSAgICBpdC5hZHZhbmNlKHRvLCAmZ2x5
cGhCdWZmZXIpOwotICAgIAotICAgIC8vIFdlIGNvdWxkbid0IGdlbmVyYXRlIGFueSBnbHlwaHMg
Zm9yIHRoZSBydW4uICBHaXZlIHVwLgotICAgIGlmIChnbHlwaEJ1ZmZlci5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybjsKLSAgICAKLSAgICBmbG9hdCBhZnRlcldpZHRoID0gaXQubV9ydW5XaWR0
aFNvRmFyOwotCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBmbG9hdCBmaW5hbFJvdW5k
aW5nV2lkdGggPSBpdC5tX2ZpbmFsUm91bmRpbmdXaWR0aDsKLSAgICAgICAgaXQuYWR2YW5jZShy
dW4ubGVuZ3RoKCkpOwotICAgICAgICBzdGFydFggKz0gZmluYWxSb3VuZGluZ1dpZHRoICsgaXQu
bV9ydW5XaWR0aFNvRmFyIC0gYWZ0ZXJXaWR0aDsKLSAgICB9IGVsc2UKLSAgICAgICAgc3RhcnRY
ICs9IGJlZm9yZVdpZHRoOwotCi0gICAgLy8gU3dhcCB0aGUgb3JkZXIgb2YgdGhlIGdseXBocyBp
ZiByaWdodC10by1sZWZ0LgotICAgIGlmIChydW4ucnRsKCkpCi0gICAgICAgIGZvciAoaW50IGkg
PSAwLCBlbmQgPSBnbHlwaEJ1ZmZlci5zaXplKCkgLSAxOyBpIDwgZ2x5cGhCdWZmZXIuc2l6ZSgp
IC8gMjsgKytpLCAtLWVuZCkKLSAgICAgICAgICAgIGdseXBoQnVmZmVyLnN3YXAoaSwgZW5kKTsK
LQotICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGdseXBocyB0byBi
ZSBkaXNwbGF5ZWQgYnkgYWRkaW5nCi0gICAgLy8gYWxsIHRoZSBhZHZhbmNlcyB1cCB0byB0aGUg
Zmlyc3QgZ2x5cGguCi0gICAgRmxvYXRQb2ludCBzdGFydFBvaW50KHN0YXJ0WCwgcG9pbnQueSgp
KTsKLSAgICBkcmF3R2x5cGhCdWZmZXIoY29udGV4dCwgZ2x5cGhCdWZmZXIsIHJ1biwgc3RhcnRQ
b2ludCk7Ci19Ci0KLXZvaWQgRm9udDo6ZHJhd0dseXBoQnVmZmVyKEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQp
IGNvbnN0Ci17ICAgCi0gICAgLy8gRHJhdyBlYWNoIGNvbnRpZ3VvdXMgcnVuIG9mIGdseXBocyB0
aGF0IHVzZSB0aGUgc2FtZSBmb250IGRhdGEuCi0gICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZv
bnREYXRhID0gZ2x5cGhCdWZmZXIuZm9udERhdGFBdCgwKTsKLSAgICBGbG9hdFNpemUgb2Zmc2V0
ID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoMCk7Ci0gICAgRmxvYXRQb2ludCBzdGFydFBvaW50KHBv
aW50KTsKLSAgICBmbG9hdCBuZXh0WCA9IHN0YXJ0UG9pbnQueCgpOwotICAgIGludCBsYXN0RnJv
bSA9IDA7Ci0gICAgaW50IG5leHRHbHlwaCA9IDA7Ci0gICAgd2hpbGUgKG5leHRHbHlwaCA8IGds
eXBoQnVmZmVyLnNpemUoKSkgewotICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbmV4dEZv
bnREYXRhID0gZ2x5cGhCdWZmZXIuZm9udERhdGFBdChuZXh0R2x5cGgpOwotICAgICAgICBGbG9h
dFNpemUgbmV4dE9mZnNldCA9IGdseXBoQnVmZmVyLm9mZnNldEF0KG5leHRHbHlwaCk7Ci0gICAg
ICAgIGlmIChuZXh0Rm9udERhdGEgIT0gZm9udERhdGEgfHwgbmV4dE9mZnNldCAhPSBvZmZzZXQp
IHsKLSAgICAgICAgICAgIGRyYXdHbHlwaHMoY29udGV4dCwgZm9udERhdGEsIGdseXBoQnVmZmVy
LCBsYXN0RnJvbSwgbmV4dEdseXBoIC0gbGFzdEZyb20sIHN0YXJ0UG9pbnQpOwotCi0gICAgICAg
ICAgICBsYXN0RnJvbSA9IG5leHRHbHlwaDsKLSAgICAgICAgICAgIGZvbnREYXRhID0gbmV4dEZv
bnREYXRhOwotICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dE9mZnNldDsKLSAgICAgICAgICAgIHN0
YXJ0UG9pbnQuc2V0WChuZXh0WCk7Ci0gICAgICAgIH0KLSAgICAgICAgbmV4dFggKz0gZ2x5cGhC
dWZmZXIuYWR2YW5jZUF0KG5leHRHbHlwaCk7Ci0gICAgICAgIG5leHRHbHlwaCsrOwotICAgIH0K
LQotICAgIGRyYXdHbHlwaHMoY29udGV4dCwgZm9udERhdGEsIGdseXBoQnVmZmVyLCBsYXN0RnJv
bSwgbmV4dEdseXBoIC0gbGFzdEZyb20sIHN0YXJ0UG9pbnQpOwotfQotCiB2b2lkIEZvbnQ6OmRy
YXdUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25z
dCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICAgICAvLyBE
b24ndCBkcmF3IGFueXRoaW5nIHdoaWxlIHdlIGFyZSB1c2luZyBjdXN0b20gZm9udHMgdGhhdCBh
cmUgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGluZy4KQEAgLTUxMywxMyArMjU5LDYgQEAgZmxvYXQg
Rm9udDo6ZmxvYXRXaWR0aChjb25zdCBUZXh0UnVuJiBydW4sIGludCBleHRyYUNoYXJzQXZhaWxh
YmxlLCBpbnQmIGNoYXJzQ28KICAgICByZXR1cm4gZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KHJ1
bik7CiB9CiAKLWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRS
dW4mIHJ1biwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyKSBjb25zdAotewotICAgIFdpZHRoSXRl
cmF0b3IgaXQodGhpcywgcnVuKTsKLSAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSwgZ2x5cGhC
dWZmZXIpOwotICAgIHJldHVybiBpdC5tX3J1bldpZHRoU29GYXI7Ci19Ci0KIEZsb2F0UmVjdCBG
b250OjpzZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBv
aW50JiBwb2ludCwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CiAjaWYgRU5BQkxF
KFNWR19GT05UUykKQEAgLTUzMywyNCArMjcyLDYgQEAgRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlv
blJlY3RGb3JUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LAog
ICAgIHJldHVybiBzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQocnVuLCBwb2ludCwgaCwgZnJv
bSwgdG8pOwogfQogCi1GbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQo
Y29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLCBpbnQgZnJv
bSwgaW50IHRvKSBjb25zdAotewotICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuKTsKLSAg
ICBpdC5hZHZhbmNlKGZyb20pOwotICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQubV9ydW5XaWR0
aFNvRmFyOwotICAgIGl0LmFkdmFuY2UodG8pOwotICAgIGZsb2F0IGFmdGVyV2lkdGggPSBpdC5t
X3J1bldpZHRoU29GYXI7Ci0KLSAgICAvLyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBjZWls
ZigpIGZvciB0aGUgcmlnaHQgZWRnZSBhcyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJlY3Qg
Y2FyZXQgcG9zaXRpb25pbmcKLSAgICBpZiAocnVuLnJ0bCgpKSB7Ci0gICAgICAgIGl0LmFkdmFu
Y2UocnVuLmxlbmd0aCgpKTsKLSAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0Lm1fcnVuV2lk
dGhTb0ZhcjsKLSAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYodG90
YWxXaWR0aCAtIGFmdGVyV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0gYmVm
b3JlV2lkdGgpIC0gZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgaCk7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYoYmVmb3Jl
V2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihiZWZvcmVXaWR0
aCksIGgpOwotICAgIH0KLX0KLQogaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uKGNvbnN0IFRl
eHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0CiB7CiAj
aWYgRU5BQkxFKFNWR19GT05UUykKQEAgLTU2Myw0OSArMjg0LDYgQEAgaW50IEZvbnQ6Om9mZnNl
dEZvclBvc2l0aW9uKGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRp
YWxHbHlwaHMKICAgICByZXR1cm4gb2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChydW4s
IHgsIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKIH0KIAotaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0
aW9uRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGludCB4LCBib29sIGluY2x1ZGVQ
YXJ0aWFsR2x5cGhzKSBjb25zdAotewotICAgIGZsb2F0IGRlbHRhID0gKGZsb2F0KXg7Ci0KLSAg
ICBXaWR0aEl0ZXJhdG9yIGl0KHRoaXMsIHJ1bik7Ci0gICAgR2x5cGhCdWZmZXIgbG9jYWxHbHlw
aEJ1ZmZlcjsKLSAgICB1bnNpZ25lZCBvZmZzZXQ7Ci0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAg
ICAgICBkZWx0YSAtPSBmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChydW4sIDApOwotICAgICAgICB3
aGlsZSAoMSkgewotICAgICAgICAgICAgb2Zmc2V0ID0gaXQubV9jdXJyZW50Q2hhcmFjdGVyOwot
ICAgICAgICAgICAgZmxvYXQgdzsKLSAgICAgICAgICAgIGlmICghaXQuYWR2YW5jZU9uZUNoYXJh
Y3Rlcih3LCAmbG9jYWxHbHlwaEJ1ZmZlcikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICBkZWx0YSArPSB3OwotICAgICAgICAgICAgaWYgKGluY2x1ZGVQYXJ0aWFsR2x5cGhz
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhIC0gdyAvIDIgPj0gMCkKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlm
IChkZWx0YSA+PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAg
ICBvZmZzZXQgPSBpdC5tX2N1cnJlbnRDaGFyYWN0ZXI7Ci0gICAgICAgICAgICBmbG9hdCB3Owot
ICAgICAgICAgICAgaWYgKCFpdC5hZHZhbmNlT25lQ2hhcmFjdGVyKHcsICZsb2NhbEdseXBoQnVm
ZmVyKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlbHRhIC09IHc7Ci0g
ICAgICAgICAgICBpZiAoaW5jbHVkZVBhcnRpYWxHbHlwaHMpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoZGVsdGEgKyB3IC8gMiA8PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhIDw9IDApCi0gICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgcmV0dXJuIG9mZnNldDsKLX0KLQogI2lmIEVOQUJMRShTVkdfRk9OVFMpCiBib29sIEZvbnQ6
OmlzU1ZHRm9udCgpIGNvbnN0CiB7IApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250RmFzdFBhdGguY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFz
dFBhdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlY2FjMDkKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5j
cHAKQEAgLTAsMCArMSwzNzAgQEAKKy8qKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGh0
bWwgcmVuZGVyZXIgZm9yIEtERS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAo
a29pdmlzdG9Aa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwMCBEaXJrIE11ZWxsZXIgKG11
ZWxsZXJAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiBBcHBsZSBDb21wdXRl
ciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVy
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9udC5oIgorCisjaW5jbHVkZSAi
Q2hhcmFjdGVyTmFtZXMuaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJGbG9h
dFJlY3QuaCIKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdseXBoUGFnZVRy
ZWVOb2RlLmgiCisjaW5jbHVkZSAiSW50UG9pbnQuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0
YS5oIgorI2luY2x1ZGUgIldpZHRoSXRlcmF0b3IuaCIKKworI2luY2x1ZGUgPHd0Zi91bmljb2Rl
L1VuaWNvZGUuaD4KKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCit1c2luZyBuYW1lc3Bh
Y2UgV1RGOwordXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
Kwordm9pZCBGb250OjpzZXRDb2RlUGF0aChDb2RlUGF0aCBwKQoreworICAgIGNvZGVQYXRoID0g
cDsKK30KKworYm9vbCBGb250OjpjYW5Vc2VHbHlwaENhY2hlKGNvbnN0IFRleHRSdW4mIHJ1bikg
Y29uc3QKK3sKKyAgICBzd2l0Y2ggKGNvZGVQYXRoKSB7CisgICAgICAgIGNhc2UgQXV0bzoKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpbXBsZToKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICBjYXNlIENvbXBsZXg6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIAorICAgIC8vIFN0YXJ0IGZyb20gMCBzaW5jZSBkcmF3aW5nIGFuZCBoaWdo
bGlnaHRpbmcgYWxzbyBtZWFzdXJlIHRoZSBjaGFyYWN0ZXJzIGJlZm9yZSBydW4tPmZyb20KKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0
IFVDaGFyIGMgPSBydW5baV07CisgICAgICAgIGlmIChjIDwgMHgzMDApICAgICAgLy8gVSswMzAw
IHRocm91Z2ggVSswMzZGIENvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcworICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGlmIChjIDw9IDB4MzZGKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIGlmIChjIDwgMHgwNTkxIHx8IGMgPT0gMHgwNUJFKSAgICAgLy8gVSsw
NTkxIHRocm91Z2ggVSswNUNGIGV4Y2x1ZGluZyBVKzA1QkUgSGVicmV3IGNvbWJpbmluZyBtYXJr
cywgSGVicmV3IHB1bmN0dWF0aW9uIFBhc2VxLCBTb2YgUGFzdXEgYW5kIE51biBIYWZ1a2hhCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGMgPD0gMHgwNUNGKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChjIDwgMHgwNjAwKSAgICAgLy8gVSswNjAw
IHRocm91Z2ggVSsxMDU5IEFyYWJpYywgU3lyaWFjLCBUaGFhbmEsIERldmFuYWdhcmksIEJlbmdh
bGksIEd1cm11a2hpLCBHdWphcmF0aSwgT3JpeWEsIFRhbWlsLCBUZWx1Z3UsIEthbm5hZGEsIE1h
bGF5YWxhbSwgU2luaGFsYSwgVGhhaSwgTGFvLCBUaWJldGFuLCBNeWFubWFyCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgaWYgKGMgPD0gMHgxMDU5KQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgIGlmIChjIDwgMHgxMTAwKSAgICAgLy8gVSsxMTAwIHRocm91Z2gg
VSsxMUZGIEhhbmd1bCBKYW1vIChvbmx5IEFuY2llbnQgS29yZWFuIHNob3VsZCBiZSBsZWZ0IGhl
cmUgaWYgeW91IHByZWNvbXBvc2U7IE1vZGVybiBLb3JlYW4gd2lsbCBiZSBwcmVjb21wb3NlZCBh
cyBhIHJlc3VsdCBvZiBzdGVwIEEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYg
KGMgPD0gMHgxMUZGKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChj
IDwgMHgxNzgwKSAgICAgLy8gVSsxNzgwIHRocm91Z2ggVSsxOEFGIEtobWVyLCBNb25nb2xpYW4K
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYyA8PSAweDE4QUYpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGMgPCAweDE5MDApICAgICAvLyBVKzE5
MDAgdGhyb3VnaCBVKzE5NEYgTGltYnUgKFVuaWNvZGUgNC4wKQorICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIGlmIChjIDw9IDB4MTk0RikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICBpZiAoYyA8IDB4MjBEMCkgICAgIC8vIFUrMjBEMCB0aHJvdWdoIFUrMjBGRiBD
b21iaW5pbmcgbWFya3MgZm9yIHN5bWJvbHMKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBpZiAoYyA8PSAweDIwRkYpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
aWYgKGMgPCAweEZFMjApICAgICAvLyBVK0ZFMjAgdGhyb3VnaCBVK0ZFMkYgQ29tYmluaW5nIGhh
bGYgbWFya3MKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYyA8PSAweEZFMkYp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisK
K30KKwordm9pZCBGb250OjpkcmF3U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQs
IGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBp
bnQgdG8pIGNvbnN0Cit7CisgICAgLy8gVGhpcyBnbHlwaCBidWZmZXIgaG9sZHMgb3VyIGdseXBo
cythZHZhbmNlcytmb250IGRhdGEgZm9yIGVhY2ggZ2x5cGguCisgICAgR2x5cGhCdWZmZXIgZ2x5
cGhCdWZmZXI7CisKKyAgICBmbG9hdCBzdGFydFggPSBwb2ludC54KCk7CisgICAgV2lkdGhJdGVy
YXRvciBpdCh0aGlzLCBydW4pOworICAgIGl0LmFkdmFuY2UoZnJvbSk7CisgICAgZmxvYXQgYmVm
b3JlV2lkdGggPSBpdC5tX3J1bldpZHRoU29GYXI7CisgICAgaXQuYWR2YW5jZSh0bywgJmdseXBo
QnVmZmVyKTsKKyAgICAKKyAgICAvLyBXZSBjb3VsZG4ndCBnZW5lcmF0ZSBhbnkgZ2x5cGhzIGZv
ciB0aGUgcnVuLiAgR2l2ZSB1cC4KKyAgICBpZiAoZ2x5cGhCdWZmZXIuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm47CisgICAgCisgICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGl0Lm1fcnVuV2lkdGhT
b0ZhcjsKKworICAgIGlmIChydW4ucnRsKCkpIHsKKyAgICAgICAgZmxvYXQgZmluYWxSb3VuZGlu
Z1dpZHRoID0gaXQubV9maW5hbFJvdW5kaW5nV2lkdGg7CisgICAgICAgIGl0LmFkdmFuY2UocnVu
Lmxlbmd0aCgpKTsKKyAgICAgICAgc3RhcnRYICs9IGZpbmFsUm91bmRpbmdXaWR0aCArIGl0Lm1f
cnVuV2lkdGhTb0ZhciAtIGFmdGVyV2lkdGg7CisgICAgfSBlbHNlCisgICAgICAgIHN0YXJ0WCAr
PSBiZWZvcmVXaWR0aDsKKworICAgIC8vIFN3YXAgdGhlIG9yZGVyIG9mIHRoZSBnbHlwaHMgaWYg
cmlnaHQtdG8tbGVmdC4KKyAgICBpZiAocnVuLnJ0bCgpKQorICAgICAgICBmb3IgKGludCBpID0g
MCwgZW5kID0gZ2x5cGhCdWZmZXIuc2l6ZSgpIC0gMTsgaSA8IGdseXBoQnVmZmVyLnNpemUoKSAv
IDI7ICsraSwgLS1lbmQpCisgICAgICAgICAgICBnbHlwaEJ1ZmZlci5zd2FwKGksIGVuZCk7CisK
KyAgICAvLyBDYWxjdWxhdGUgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBnbHlwaHMgdG8gYmUg
ZGlzcGxheWVkIGJ5IGFkZGluZworICAgIC8vIGFsbCB0aGUgYWR2YW5jZXMgdXAgdG8gdGhlIGZp
cnN0IGdseXBoLgorICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7
CisgICAgZHJhd0dseXBoQnVmZmVyKGNvbnRleHQsIGdseXBoQnVmZmVyLCBydW4sIHN0YXJ0UG9p
bnQpOworfQorCit2b2lkIEZvbnQ6OmRyYXdHbHlwaEJ1ZmZlcihHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBj
b25zdAoreyAgIAorICAgIC8vIERyYXcgZWFjaCBjb250aWd1b3VzIHJ1biBvZiBnbHlwaHMgdGhh
dCB1c2UgdGhlIHNhbWUgZm9udCBkYXRhLgorICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250
RGF0YSA9IGdseXBoQnVmZmVyLmZvbnREYXRhQXQoMCk7CisgICAgRmxvYXRTaXplIG9mZnNldCA9
IGdseXBoQnVmZmVyLm9mZnNldEF0KDApOworICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludChwb2lu
dCk7CisgICAgZmxvYXQgbmV4dFggPSBzdGFydFBvaW50LngoKTsKKyAgICBpbnQgbGFzdEZyb20g
PSAwOworICAgIGludCBuZXh0R2x5cGggPSAwOworICAgIHdoaWxlIChuZXh0R2x5cGggPCBnbHlw
aEJ1ZmZlci5zaXplKCkpIHsKKyAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIG5leHRGb250
RGF0YSA9IGdseXBoQnVmZmVyLmZvbnREYXRhQXQobmV4dEdseXBoKTsKKyAgICAgICAgRmxvYXRT
aXplIG5leHRPZmZzZXQgPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChuZXh0R2x5cGgpOworICAgICAg
ICBpZiAobmV4dEZvbnREYXRhICE9IGZvbnREYXRhIHx8IG5leHRPZmZzZXQgIT0gb2Zmc2V0KSB7
CisgICAgICAgICAgICBkcmF3R2x5cGhzKGNvbnRleHQsIGZvbnREYXRhLCBnbHlwaEJ1ZmZlciwg
bGFzdEZyb20sIG5leHRHbHlwaCAtIGxhc3RGcm9tLCBzdGFydFBvaW50KTsKKworICAgICAgICAg
ICAgbGFzdEZyb20gPSBuZXh0R2x5cGg7CisgICAgICAgICAgICBmb250RGF0YSA9IG5leHRGb250
RGF0YTsKKyAgICAgICAgICAgIG9mZnNldCA9IG5leHRPZmZzZXQ7CisgICAgICAgICAgICBzdGFy
dFBvaW50LnNldFgobmV4dFgpOworICAgICAgICB9CisgICAgICAgIG5leHRYICs9IGdseXBoQnVm
ZmVyLmFkdmFuY2VBdChuZXh0R2x5cGgpOworICAgICAgICBuZXh0R2x5cGgrKzsKKyAgICB9CisK
KyAgICBkcmF3R2x5cGhzKGNvbnRleHQsIGZvbnREYXRhLCBnbHlwaEJ1ZmZlciwgbGFzdEZyb20s
IG5leHRHbHlwaCAtIGxhc3RGcm9tLCBzdGFydFBvaW50KTsKK30KKworZmxvYXQgRm9udDo6Zmxv
YXRXaWR0aEZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBHbHlwaEJ1ZmZlciogZ2x5
cGhCdWZmZXIpIGNvbnN0Cit7CisgICAgV2lkdGhJdGVyYXRvciBpdCh0aGlzLCBydW4pOworICAg
IGl0LmFkdmFuY2UocnVuLmxlbmd0aCgpLCBnbHlwaEJ1ZmZlcik7CisgICAgcmV0dXJuIGl0Lm1f
cnVuV2lkdGhTb0ZhcjsKK30KKworRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JTaW1w
bGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgaCwg
aW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBXaWR0aEl0ZXJhdG9yIGl0KHRoaXMsIHJ1
bik7CisgICAgaXQuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGl0Lm1f
cnVuV2lkdGhTb0ZhcjsKKyAgICBpdC5hZHZhbmNlKHRvKTsKKyAgICBmbG9hdCBhZnRlcldpZHRo
ID0gaXQubV9ydW5XaWR0aFNvRmFyOworCisgICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0aGVyIHRo
YW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVuc3VyZSBj
b3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCisgICAgaWYgKHJ1bi5ydGwoKSkgeworICAgICAgICBp
dC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgICAgIGZsb2F0IHRvdGFsV2lkdGggPSBpdC5t
X3J1bldpZHRoU29GYXI7CisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxv
b3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90YWxXaWR0
aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIGgpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxvb3Jm
KGJlZm9yZVdpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYoYWZ0ZXJXaWR0aCkgLSBmbG9vcmYoYmVm
b3JlV2lkdGgpLCBoKTsKKyAgICB9Cit9CisKK2ludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZv
clNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlh
bEdseXBocykgY29uc3QKK3sKKyAgICBmbG9hdCBkZWx0YSA9IChmbG9hdCl4OworCisgICAgV2lk
dGhJdGVyYXRvciBpdCh0aGlzLCBydW4pOworICAgIEdseXBoQnVmZmVyIGxvY2FsR2x5cGhCdWZm
ZXI7CisgICAgdW5zaWduZWQgb2Zmc2V0OworICAgIGlmIChydW4ucnRsKCkpIHsKKyAgICAgICAg
ZGVsdGEgLT0gZmxvYXRXaWR0aEZvclNpbXBsZVRleHQocnVuLCAwKTsKKyAgICAgICAgd2hpbGUg
KDEpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IGl0Lm1fY3VycmVudENoYXJhY3RlcjsKKyAgICAg
ICAgICAgIGZsb2F0IHc7CisgICAgICAgICAgICBpZiAoIWl0LmFkdmFuY2VPbmVDaGFyYWN0ZXIo
dywgJmxvY2FsR2x5cGhCdWZmZXIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgZGVsdGEgKz0gdzsKKyAgICAgICAgICAgIGlmIChpbmNsdWRlUGFydGlhbEdseXBocykgewor
ICAgICAgICAgICAgICAgIGlmIChkZWx0YSAtIHcgLyAyID49IDApCisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVs
dGEgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgb2Zm
c2V0ID0gaXQubV9jdXJyZW50Q2hhcmFjdGVyOworICAgICAgICAgICAgZmxvYXQgdzsKKyAgICAg
ICAgICAgIGlmICghaXQuYWR2YW5jZU9uZUNoYXJhY3Rlcih3LCAmbG9jYWxHbHlwaEJ1ZmZlcikp
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWx0YSAtPSB3OworICAgICAg
ICAgICAgaWYgKGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRl
bHRhICsgdyAvIDIgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8PSAwKQorICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiBvZmZzZXQ7Cit9CisKK2NvbnN0IEdseXBoRGF0YSYgRm9udDo6Z2x5cGhEYXRhRm9yQ2hh
cmFjdGVyKFVDaGFyMzIgYywgYm9vbCBtaXJyb3IsIGJvb2wgZm9yY2VTbWFsbENhcHMpIGNvbnN0
Cit7CisgICAgYm9vbCB1c2VTbWFsbENhcHNGb250ID0gZm9yY2VTbWFsbENhcHM7CisgICAgaWYg
KG1fZm9udERlc2NyaXB0aW9uLnNtYWxsQ2FwcygpKSB7CisgICAgICAgIFVDaGFyMzIgdXBwZXJD
ID0gVW5pY29kZTo6dG9VcHBlcihjKTsKKyAgICAgICAgaWYgKHVwcGVyQyAhPSBjKSB7CisgICAg
ICAgICAgICBjID0gdXBwZXJDOworICAgICAgICAgICAgdXNlU21hbGxDYXBzRm9udCA9IHRydWU7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWlycm9yKQorICAgICAgICBjID0gbWlycm9y
ZWRDaGFyKGMpOworCisgICAgdW5zaWduZWQgcGFnZU51bWJlciA9IChjIC8gR2x5cGhQYWdlOjpz
aXplKTsKKworICAgIEdseXBoUGFnZVRyZWVOb2RlKiBub2RlID0gcGFnZU51bWJlciA/IG1fcGFn
ZXMuZ2V0KHBhZ2VOdW1iZXIpIDogbV9wYWdlWmVybzsKKyAgICBpZiAoIW5vZGUpIHsKKyAgICAg
ICAgbm9kZSA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQoZm9udERhdGFBdCgwKSwg
cGFnZU51bWJlcik7CisgICAgICAgIGlmIChwYWdlTnVtYmVyKQorICAgICAgICAgICAgbV9wYWdl
cy5zZXQocGFnZU51bWJlciwgbm9kZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcGFn
ZVplcm8gPSBub2RlOworICAgIH0KKworICAgIEdseXBoUGFnZSogcGFnZTsKKyAgICBpZiAoIXVz
ZVNtYWxsQ2Fwc0ZvbnQpIHsKKyAgICAgICAgLy8gRmFzdGVzdCBsb29wLCBmb3IgdGhlIGNvbW1v
biBjYXNlIChub3Qgc21hbGwgY2FwcykuCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAg
ICAgICBwYWdlID0gbm9kZS0+cGFnZSgpOworICAgICAgICAgICAgaWYgKHBhZ2UpIHsKKyAgICAg
ICAgICAgICAgICBjb25zdCBHbHlwaERhdGEmIGRhdGEgPSBwYWdlLT5nbHlwaERhdGFGb3JDaGFy
YWN0ZXIoYyk7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEuZm9udERhdGEpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgICAgIGlmIChub2RlLT5pc1N5c3Rl
bUZhbGxiYWNrKCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAvLyBQcm9jZWVkIHdpdGggdGhlIGZhbGxiYWNrIGxpc3QuCisgICAgICAg
ICAgICBub2RlID0gbm9kZS0+Z2V0Q2hpbGQoZm9udERhdGFBdChub2RlLT5sZXZlbCgpKSwgcGFn
ZU51bWJlcik7CisgICAgICAgICAgICBpZiAocGFnZU51bWJlcikKKyAgICAgICAgICAgICAgICBt
X3BhZ2VzLnNldChwYWdlTnVtYmVyLCBub2RlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICBtX3BhZ2VaZXJvID0gbm9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBwYWdlID0gbm9kZS0+cGFnZSgpOworICAg
ICAgICAgICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBHbHlwaERhdGEmIGRh
dGEgPSBwYWdlLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoYyk7CisgICAgICAgICAgICAgICAgaWYg
KGRhdGEuZm9udERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNtYWxsQ2Fwc0Zv
bnREYXRhIGZ1bmN0aW9uIHNob3VsZCBub3Qgbm9ybWFsbHkgcmV0dXJuIDAuCisgICAgICAgICAg
ICAgICAgICAgIC8vIEJ1dCBpZiBpdCBkb2VzLCB3ZSB3aWxsIGp1c3QgcmVuZGVyIHRoZSBjYXBp
dGFsIGxldHRlciBiaWcuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBzbWFsbENhcHNGb250RGF0YSA9IGRhdGEuZm9udERhdGEtPnNtYWxsQ2Fwc0ZvbnREYXRhKG1f
Zm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzbWFsbENhcHNGb250
RGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOworCisgICAgICAgICAg
ICAgICAgICAgIEdseXBoUGFnZVRyZWVOb2RlKiBzbWFsbENhcHNOb2RlID0gR2x5cGhQYWdlVHJl
ZU5vZGU6OmdldFJvb3RDaGlsZChzbWFsbENhcHNGb250RGF0YSwgcGFnZU51bWJlcik7CisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEdseXBoUGFnZSogc21hbGxDYXBzUGFnZSA9IHNtYWxsQ2Fw
c05vZGUtPnBhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNtYWxsQ2Fwc1BhZ2UpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdseXBoRGF0YSYgZGF0YSA9IHNtYWxsQ2Fw
c1BhZ2UtPmdseXBoRGF0YUZvckNoYXJhY3RlcihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChkYXRhLmZvbnREYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBk
YXRhOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8g
bm90IGF0dGVtcHQgc3lzdGVtIGZhbGxiYWNrIG9mZiB0aGUgc21hbGxDYXBzRm9udERhdGEuIFRo
aXMgaXMgdGhlIHZlcnkgdW5saWtlbHkgY2FzZSB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8v
IGEgZm9udCBoYXMgdGhlIGxvd2VyY2FzZSBjaGFyYWN0ZXIgYnV0IHRoZSBzbWFsbCBjYXBzIGZv
bnQgZG9lcyBub3QgaGF2ZSBpdHMgdXBwZXJjYXNlIHZlcnNpb24uCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBzbWFsbENhcHNGb250RGF0YS0+bWlzc2luZ0dseXBoRGF0YSgpOworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChub2RlLT5pc1N5c3RlbUZhbGxiYWNr
KCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLyBQcm9jZWVkIHdpdGggdGhlIGZhbGxiYWNrIGxpc3QuCisgICAgICAgICAgICBub2Rl
ID0gbm9kZS0+Z2V0Q2hpbGQoZm9udERhdGFBdChub2RlLT5sZXZlbCgpKSwgcGFnZU51bWJlcik7
CisgICAgICAgICAgICBpZiAocGFnZU51bWJlcikKKyAgICAgICAgICAgICAgICBtX3BhZ2VzLnNl
dChwYWdlTnVtYmVyLCBub2RlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBt
X3BhZ2VaZXJvID0gbm9kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTU0VSVChwYWdlKTsK
KyAgICBBU1NFUlQobm9kZS0+aXNTeXN0ZW1GYWxsYmFjaygpKTsKKworICAgIC8vIFN5c3RlbSBm
YWxsYmFjayBpcyBjaGFyYWN0ZXItZGVwZW5kZW50LiBXaGVuIHdlIGdldCBoZXJlLCB3ZQorICAg
IC8vIGtub3cgdGhhdCB0aGUgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIGlzbid0IGluIHRoZSBzeXN0
ZW0gZmFsbGJhY2sKKyAgICAvLyBmb250J3MgZ2x5cGggcGFnZS4gVHJ5IHRvIGxhemlseSBjcmVh
dGUgaXQgaGVyZS4KKyAgICBVQ2hhciBjb2RlVW5pdHNbMl07CisgICAgaW50IGNvZGVVbml0c0xl
bmd0aDsKKyAgICBpZiAoYyA8PSAweEZGRkYpIHsKKyAgICAgICAgVUNoYXIgYzE2ID0gYzsKKyAg
ICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNTcGFjZShjMTYpKQorICAgICAgICAgICAgY29kZVVuaXRz
WzBdID0gJyAnOworICAgICAgICBlbHNlIGlmIChGb250Ojp0cmVhdEFzWmVyb1dpZHRoU3BhY2Uo
YzE2KSkKKyAgICAgICAgICAgIGNvZGVVbml0c1swXSA9IHplcm9XaWR0aFNwYWNlOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBjb2RlVW5pdHNbMF0gPSBjMTY7CisgICAgICAgIGNvZGVVbml0
c0xlbmd0aCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZVVuaXRzWzBdID0gVTE2X0xF
QUQoYyk7CisgICAgICAgIGNvZGVVbml0c1sxXSA9IFUxNl9UUkFJTChjKTsKKyAgICAgICAgY29k
ZVVuaXRzTGVuZ3RoID0gMjsKKyAgICB9CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGNoYXJh
Y3RlckZvbnREYXRhID0gRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMoKnRoaXMs
IGNvZGVVbml0cywgY29kZVVuaXRzTGVuZ3RoKTsKKyAgICBpZiAodXNlU21hbGxDYXBzRm9udCkK
KyAgICAgICAgY2hhcmFjdGVyRm9udERhdGEgPSBjaGFyYWN0ZXJGb250RGF0YS0+c21hbGxDYXBz
Rm9udERhdGEobV9mb250RGVzY3JpcHRpb24pOworICAgIGlmIChjaGFyYWN0ZXJGb250RGF0YSkg
eworICAgICAgICAvLyBHb3QgdGhlIGZhbGxiYWNrIGdseXBoIGFuZCBmb250LgorICAgICAgICBH
bHlwaFBhZ2UqIGZhbGxiYWNrUGFnZSA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQo
Y2hhcmFjdGVyRm9udERhdGEsIHBhZ2VOdW1iZXIpLT5wYWdlKCk7CisgICAgICAgIGNvbnN0IEds
eXBoRGF0YSYgZGF0YSA9IGZhbGxiYWNrUGFnZSAmJiBmYWxsYmFja1BhZ2UtPmdseXBoRGF0YUZv
ckNoYXJhY3RlcihjKS5mb250RGF0YSA/IGZhbGxiYWNrUGFnZS0+Z2x5cGhEYXRhRm9yQ2hhcmFj
dGVyKGMpIDogY2hhcmFjdGVyRm9udERhdGEtPm1pc3NpbmdHbHlwaERhdGEoKTsKKyAgICAgICAg
Ly8gQ2FjaGUgaXQgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBzeXN0ZW0gZmFsbGJhY2sgYWdhaW4g
bmV4dCB0aW1lLgorICAgICAgICBpZiAoIXVzZVNtYWxsQ2Fwc0ZvbnQpCisgICAgICAgICAgICBw
YWdlLT5zZXRHbHlwaERhdGFGb3JDaGFyYWN0ZXIoYywgZGF0YS5nbHlwaCwgZGF0YS5mb250RGF0
YSk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIC8vIEV2ZW4gc3lzdGVtIGZh
bGxiYWNrIGNhbiBmYWlsOyB1c2UgdGhlIG1pc3NpbmcgZ2x5cGggaW4gdGhhdCBjYXNlLgorICAg
IC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlciB0byB1c2UgdGhlIG1pc3NpbmcgZ2x5cGggZnJv
bSB0aGUgbGFzdCByZXNvcnQgZm9udCBpbnN0ZWFkLgorICAgIGNvbnN0IEdseXBoRGF0YSYgZGF0
YSA9IHByaW1hcnlGb250KCktPm1pc3NpbmdHbHlwaERhdGEoKTsKKyAgICBpZiAoIXVzZVNtYWxs
Q2Fwc0ZvbnQpCisgICAgICAgIHBhZ2UtPnNldEdseXBoRGF0YUZvckNoYXJhY3RlcihjLCBkYXRh
LmdseXBoLCBkYXRhLmZvbnREYXRhKTsKKyAgICByZXR1cm4gZGF0YTsKK30KKworCisKK30KLS0g
CjEuNS40LjMKCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23593</attachid>
            <date>2008-09-19 19:36:02 -0700</date>
            <delta_ts>2008-12-15 05:54:54 -0800</delta_ts>
            <desc>Add compiletime option to not use the fast path</desc>
            <filename>0003-Make-it-possible-to-compile-Font.cpp-without-using-t.patch</filename>
            <type>text/plain</type>
            <size>3632</size>
            <attacher name="Holger Freyther">zecke</attacher>
            
              <data encoding="base64">RnJvbSA1YjBiYWViYjkxM2QzZDA2NTk2NmE5ZWFjYTBmMjA0Y2U2MzYyOGEyIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2Vs
ZmlzaC5vcmc+CkRhdGU6IFNhdCwgMjAgU2VwIDIwMDggMDA6NTA6NDIgKzAyMDAKU3ViamVjdDog
W1BBVENIXSBNYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgRm9udC5jcHAgd2l0aG91dCB1c2lu
ZyB0aGUgZmFzdCBwYXRoCiAgICAgQXZvaWQgaGF2aW5nIHRvIGhhdmUgYSBjb21wbGV0ZSBGb250
Q2FjaGUgYW5kIEdseXBoUGFnZVRyZWVOb2RlCiAgICAgaW1wbGVtZW50YXRpb24gYW5kIGRpc2Fi
bGUgdGhlIGZhc3QgcGF0aCBpbiBXZWJDb3JlIGF0IGNvbXBpbGUKICAgICB0aW1lLgoKLS0tCiBK
YXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaCAgICAgIHwgICAgNCArKysrCiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwIHwgICAyNCArKysrKysrKysrKysrKysrKysrKystLS0K
IDIgZmlsZXMgY2hhbmdlZCwgMjUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYg
LS1naXQgYS9KYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaCBiL0phdmFTY3JpcHRDb3JlL3d0
Zi9QbGF0Zm9ybS5oCmluZGV4IGE4Njg5NjYuLjkxZjM0NTQgMTAwNjQ0Ci0tLSBhL0phdmFTY3Jp
cHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCisrKyBiL0phdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5o
CkBAIC0zNjQsNCArMzY0LDggQEAKICNlbmRpZgogI2VuZGlmCiAKKyNpZiAhUExBVEZPUk0oUVQp
CisjZGVmaW5lIFdURl9VU0VfRk9OVF9GQVNUX1BBVEggMQorI2VuZGlmCisKICNlbmRpZiAvKiBX
VEZfUGxhdGZvcm1faCAqLwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
b250LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5jcHAKaW5kZXggMWRmMTIy
Yi4uNmQ4YzU2NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmNw
cAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwCkBAIC0zNyw2ICszNyw3
IEBAIHVzaW5nIG5hbWVzcGFjZSBXVEY7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lmIFVT
RShGT05UX0ZBU1RfUEFUSCkKIGNvbnN0IHVpbnQ4X3QgRm9udDo6Z1JvdW5kaW5nSGFja0NoYXJh
Y3RlclRhYmxlWzI1Nl0gPSB7CiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSAvKlx0
Ki8sIDEgLypcbiovLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLAogICAgIDEgLypzcGFjZSovLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAxIC8qLSovLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAxIC8qPyovLApAQCAtNDksNiArNTAsNyBAQCBjb25zdCB1aW50
OF90IEZvbnQ6OmdSb3VuZGluZ0hhY2tDaGFyYWN0ZXJUYWJsZVsyNTZdID0gewogfTsKIAogRm9u
dDo6Q29kZVBhdGggRm9udDo6Y29kZVBhdGggPSBBdXRvOworI2VuZGlmCiAKIC8vID09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGb250IEltcGxlbWVudGF0aW9uIChDcm9z
cy1QbGF0Zm9ybSBQb3J0aW9uKQpAQCAtMjI3LDEwICsyMjksMTIgQEAgdm9pZCBGb250OjpkcmF3
VGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
RmxvYXRQb2kKICAgICB9CiAjZW5kaWYKIAorI2lmIFVTRShGT05UX0ZBU1RfUEFUSCkKICAgICBp
ZiAoY2FuVXNlR2x5cGhDYWNoZShydW4pKQotICAgICAgICBkcmF3U2ltcGxlVGV4dChjb250ZXh0
LCBydW4sIHBvaW50LCBmcm9tLCB0byk7Ci0gICAgZWxzZQotICAgICAgICBkcmF3Q29tcGxleFRl
eHQoY29udGV4dCwgcnVuLCBwb2ludCwgZnJvbSwgdG8pOworICAgICAgICByZXR1cm4gZHJhd1Np
bXBsZVRleHQoY29udGV4dCwgcnVuLCBwb2ludCwgZnJvbSwgdG8pOworI2VuZGlmCisKKyAgICBy
ZXR1cm4gZHJhd0NvbXBsZXhUZXh0KGNvbnRleHQsIHJ1biwgcG9pbnQsIGZyb20sIHRvKTsKIH0K
IAogZmxvYXQgRm9udDo6ZmxvYXRXaWR0aChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0CkBAIC0y
NDAsOCArMjQ0LDExIEBAIGZsb2F0IEZvbnQ6OmZsb2F0V2lkdGgoY29uc3QgVGV4dFJ1biYgcnVu
KSBjb25zdAogICAgICAgICByZXR1cm4gZmxvYXRXaWR0aFVzaW5nU1ZHRm9udChydW4pOwogI2Vu
ZGlmCiAKKyNpZiBVU0UoRk9OVF9GQVNUX1BBVEgpCiAgICAgaWYgKGNhblVzZUdseXBoQ2FjaGUo
cnVuKSkKICAgICAgICAgcmV0dXJuIGZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0KHJ1biwgMCk7Cisj
ZW5kaWYKKwogICAgIHJldHVybiBmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQocnVuKTsKIH0KIApA
QCAtMjU0LDggKzI2MSwxMiBAQCBmbG9hdCBGb250OjpmbG9hdFdpZHRoKGNvbnN0IFRleHRSdW4m
IHJ1biwgaW50IGV4dHJhQ2hhcnNBdmFpbGFibGUsIGludCYgY2hhcnNDbwogCiAgICAgY2hhcnND
b25zdW1lZCA9IHJ1bi5sZW5ndGgoKTsKICAgICBnbHlwaE5hbWUgPSAiIjsKKworI2lmIEVOQUJM
RShGT05UX0ZBU1RfUEFUSCkKICAgICBpZiAoY2FuVXNlR2x5cGhDYWNoZShydW4pKQogICAgICAg
ICByZXR1cm4gZmxvYXRXaWR0aEZvclNpbXBsZVRleHQocnVuLCAwKTsKKyNlbmRpZgorCiAgICAg
cmV0dXJuIGZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChydW4pOwogfQogCkBAIC0yNjcsOCArMjc4
LDEyIEBAIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdCBUZXh0UnVu
JiBydW4sIGNvbnN0IEludFBvaW50JiBwb2ludCwKICNlbmRpZgogCiAgICAgdG8gPSAodG8gPT0g
LTEgPyBydW4ubGVuZ3RoKCkgOiB0byk7CisKKyNpZiBVU0UoRk9OVF9GQVNUX1BBVEgpCiAgICAg
aWYgKGNhblVzZUdseXBoQ2FjaGUocnVuKSkKICAgICAgICAgcmV0dXJuIHNlbGVjdGlvblJlY3RG
b3JTaW1wbGVUZXh0KHJ1biwgcG9pbnQsIGgsIGZyb20sIHRvKTsKKyNlbmRpZgorCiAgICAgcmV0
dXJuIHNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChydW4sIHBvaW50LCBoLCBmcm9tLCB0byk7
CiB9CiAKQEAgLTI3OSw4ICsyOTQsMTEgQEAgaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uKGNv
bnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMKICAgICAg
ICAgcmV0dXJuIG9mZnNldEZvclBvc2l0aW9uRm9yVGV4dFVzaW5nU1ZHRm9udChydW4sIHgsIGlu
Y2x1ZGVQYXJ0aWFsR2x5cGhzKTsKICNlbmRpZgogCisjaWYgVVNFKEZPTlRfRkFTVF9QQVRIKQog
ICAgIGlmIChjYW5Vc2VHbHlwaENhY2hlKHJ1bikpCiAgICAgICAgIHJldHVybiBvZmZzZXRGb3JQ
b3NpdGlvbkZvclNpbXBsZVRleHQocnVuLCB4LCBpbmNsdWRlUGFydGlhbEdseXBocyk7CisjZW5k
aWYKKwogICAgIHJldHVybiBvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KHJ1biwgeCwg
aW5jbHVkZVBhcnRpYWxHbHlwaHMpOwogfQogCi0tIAoxLjUuNC4zCgo=
</data>
<flag name="review"
          id="10571"
          type_id="1"
          status="+"
          setter="hausmann"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23594</attachid>
            <date>2008-09-19 19:38:23 -0700</date>
            <delta_ts>2008-12-15 05:55:10 -0800</delta_ts>
            <desc>Bring the QtWebKit font handling more inline with the rest of WebCore</desc>
            <filename>0004-Bring-the-Qt-Font-implementation-closer-to-the-rest.patch</filename>
            <type>text/plain</type>
            <size>57847</size>
            <attacher name="Holger Freyther">zecke</attacher>
            
              <data encoding="base64">RnJvbSBhMDQyNjc0NTc0ZTYxNTg3NWI0OTRkNjBkNWFkZWI5ZGQxMjM3NjFhIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2Vs
ZmlzaC5vcmc+CkRhdGU6IFNhdCwgMjAgU2VwIDIwMDggMDA6NTM6MTMgKzAyMDAKU3ViamVjdDog
W1BBVENIXSBCcmluZyB0aGUgUXQgRm9udCBpbXBsZW1lbnRhdGlvbiBjbG9zZXIgdG8gdGhlIHJl
c3Qgb2YgV2ViQ29yZQogICAgIC0gVGFrZSBtb3N0IG9mIHRoZSBwYXRocyB0aGUgb3RoZXIgZm9u
dCBpbXBsZW1lbnRhdGlvbnMgdGFrZQogICAgIC0gU3BsaXQgb3V0IHRoZSBRdDQuMyBpbXBsZW1l
bnRhdGlvbgogICAgIC0gSW1wbGVtZW50IHRoZSBRdCBkcmF3aW5nIGFzIHBhcnQgb2YgdGhlICJj
b21wbGV4IiBkcmF3aW5nCiAgICAgLSBGaXggbG9hZGluZyBvZiBjdXN0b20gZm9udHMKICAgICAt
IFJlbW92ZSBwbGVudHkgb2YgI2lmZGVmIGZyb20gRm9udC5oCiAgICAgLSBTdGlsbCBkbyBub3Qg
dXNlIHRoZSBGb250Q2FjaGUgb3IgdGhlIGZhc3QgcGF0aCBvZiBXZWJDb3JlCgotLS0KIFdlYkNv
cmUvV2ViQ29yZS5wcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMSArLQog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250LmggICAgICAgICAgICAgICAgICAgfCAgIDU1
ICstLQogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFsbGJhY2tMaXN0LmggICAgICAg
fCAgICA1ICstCiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcCAg
ICAgICB8ICAgMTIgKy0KIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEu
aCAgICAgICAgIHwgICAgOSArCiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNo
ZVF0LmNwcCAgICAgICB8ICAgMTEgKy0KIC4uLi9ncmFwaGljcy9xdC9Gb250Q3VzdG9tUGxhdGZv
cm1EYXRhLmNwcCAgICAgICAgIHwgICAxOSArLQogLi4uL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0Zv
bnRDdXN0b21QbGF0Zm9ybURhdGEuaCAgfCAgICAzICstCiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGEuaCAgICB8ICAgMjIgKy0KIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcXQvRm9udFF0LmNwcCAgICAgICAgICAgIHwgIDU1MCArLS0tLS0tLS0tLS0tLS0t
LS0tLQogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQ0My5jcHAgICAgICAgICAg
fCAgMzU2ICsrKysrKysrKysrKysKIC4uLi9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HbHlwaFBhZ2VU
cmVlTm9kZVF0LmNwcCAgIHwgICAgNyArLQogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9T
aW1wbGVGb250RGF0YVF0LmNwcCAgfCAgIDM1ICstCiBXZWJDb3JlL3BsYXRmb3JtL3F0L1JlbmRl
clRoZW1lUXQuY3BwICAgICAgICAgICAgICB8ICAgIDQgKwogMTQgZmlsZXMgY2hhbmdlZCwgNDk5
IGluc2VydGlvbnMoKyksIDYwMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdDQzLmNwcAoKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dlYkNvcmUucHJvCmluZGV4IDEwNmRjZDQuLmNlMTE2
MmMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5wcm8KKysrIGIvV2ViQ29yZS9XZWJDb3Jl
LnBybwpAQCAtNjUsNyArNjUsNyBAQCB3aW4zMi1nKysgewogIWNvbnRhaW5zKERFRklORVMsIEVO
QUJMRV9YUEFUSD0uKTogREVGSU5FUyArPSBFTkFCTEVfWFBBVEg9MQogIyFjb250YWlucyhERUZJ
TkVTLCBFTkFCTEVfWEJMPS4pOiBERUZJTkVTICs9IEVOQUJMRV9YQkw9MQogIWNvbnRhaW5zKERF
RklORVMsIEVOQUJMRV9TVkc9Lik6IERFRklORVMgKz0gRU5BQkxFX1NWRz0xCi0jIWNvbnRhaW5z
KERFRklORVMsIEVOQUJMRV9TVkdfRk9OVFM9Lik6IERFRklORVMgKz0gRU5BQkxFX1NWR19GT05U
Uz0xCishY29udGFpbnMoREVGSU5FUywgRU5BQkxFX1NWR19GT05UUz0uKTogREVGSU5FUyArPSBF
TkFCTEVfU1ZHX0ZPTlRTPTEKICFjb250YWlucyhERUZJTkVTLCBFTkFCTEVfU1ZHX0ZJTFRFUlM9
Lik6IERFRklORVMgKz0gRU5BQkxFX1NWR19GSUxURVJTPTEKICFjb250YWlucyhERUZJTkVTLCBF
TkFCTEVfU1ZHX0ZPUkVJR05fT0JKRUNUPS4pOiBERUZJTkVTICs9IEVOQUJMRV9TVkdfRk9SRUlH
Tl9PQkpFQ1Q9MQogIWNvbnRhaW5zKERFRklORVMsIEVOQUJMRV9TVkdfQU5JTUFUSU9OPS4pOiBE
RUZJTkVTICs9IEVOQUJMRV9TVkdfQU5JTUFUSU9OPTEKQEAgLTgwMiw2ICs4MDIsNyBAQCBTT1VS
Q0VTICs9IFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9GbG9hdFJlY3QuY3BwIFwKICAgICBwbGF0
Zm9ybS9ncmFwaGljcy9GbG9hdFNpemUuY3BwIFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9Gb250
RGF0YS5jcHAgXAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnQuY3BwIFwKICAgICBwbGF0Zm9y
bS9ncmFwaGljcy9HZW5lcmF0ZWRJbWFnZS5jcHAgXAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0dy
YWRpZW50LmNwcCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcCBc
CkBAIC04MTMsNiArODE0LDcgQEAgU09VUkNFUyArPSBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mv
UGF0dGVybi5jcHAgXAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL1Blbi5jcHAgXAogICAgIHBsYXRm
b3JtL2dyYXBoaWNzL1NlZ21lbnRlZEZvbnREYXRhLmNwcCBcCisgICAgcGxhdGZvcm0vZ3JhcGhp
Y3MvU2ltcGxlRm9udERhdGEuY3BwIFwKICAgICBwbGF0Zm9ybS9LVVJMLmNwcCBcCiAgICAgcGxh
dGZvcm0vTG9nZ2luZy5jcHAgXAogICAgIHBsYXRmb3JtL01JTUVUeXBlUmVnaXN0cnkuY3BwIFwK
QEAgLTk5NSw2ICs5OTcsOSBAQCBTT1VSQ0VTICs9IFwKICAgICBwYWdlL3F0L0ZyYW1lUXQuY3Bw
IFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9xdC9BZmZpbmVUcmFuc2Zvcm1RdC5jcHAgXAogICAg
IHBsYXRmb3JtL2dyYXBoaWNzL3F0L0NvbG9yUXQuY3BwIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGlj
cy9xdC9Gb250UXQuY3BwIFwKKyAgICBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQ0My5jcHAg
XAorICAgIHBsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRQbGF0Zm9ybURhdGFRdC5jcHAgXAogICAg
IHBsYXRmb3JtL2dyYXBoaWNzL3F0L0Zsb2F0UG9pbnRRdC5jcHAgXAogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3F0L0Zsb2F0UmVjdFF0LmNwcCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR3Jh
ZGllbnRRdC5jcHAgXApAQCAtMTAyNiw3ICsxMDMxLDcgQEAgU09VUkNFUyArPSBcCiAgICAgcGxh
dGZvcm0vcXQvRmlsZVN5c3RlbVF0LmNwcCBcCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9u
dENhY2hlUXQuY3BwIFwKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q3VzdG9tUGxhdGZv
cm1EYXRhLmNwcCBcCi0gICAgcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcCBcCisgICAg
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udEZhbGxiYWNrTGlzdFF0LmNwcCBcCiAgICAgcGxhdGZv
cm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAgXAogICAgIHBsYXRmb3JtL2dy
YXBoaWNzL3F0L1NpbXBsZUZvbnREYXRhUXQuY3BwIFwKICAgICBwbGF0Zm9ybS9xdC9LVVJMUXQu
Y3BwIFwKQEAgLTEzODIsNiArMTM4Nyw3IEBAIGNvbnRhaW5zKERFRklORVMsIEVOQUJMRV9TVkc9
MSkgewogICAgICAgICBzdmcvU1ZHR0VsZW1lbnQuaWRsIFwKICAgICAgICAgc3ZnL1NWR0dseXBo
RWxlbWVudC5pZGwgXAogICAgICAgICBzdmcvU1ZHR3JhZGllbnRFbGVtZW50LmlkbCBcCisgICAg
ICAgIHN2Zy9TVkdIS2VybkVsZW1lbnQuaWRsIFwKICAgICAgICAgc3ZnL1NWR0ltYWdlRWxlbWVu
dC5pZGwgXAogICAgICAgICBzdmcvU1ZHTGVuZ3RoLmlkbCBcCiAgICAgICAgIHN2Zy9TVkdMZW5n
dGhMaXN0LmlkbCBcCkBAIC0xNTI5LDYgKzE1MzUsNyBAQCBjb250YWlucyhERUZJTkVTLCBFTkFC
TEVfU1ZHPTEpIHsKICAgICAgICAgc3ZnL1NWR0dFbGVtZW50LmNwcCBcCiAgICAgICAgIHN2Zy9T
VkdHbHlwaEVsZW1lbnQuY3BwIFwKICAgICAgICAgc3ZnL1NWR0dyYWRpZW50RWxlbWVudC5jcHAg
XAorICAgICAgICBzdmcvU1ZHSEtlcm5FbGVtZW50LmNwcCBcCiAgICAgICAgIHN2Zy9TVkdJbWFn
ZUVsZW1lbnQuY3BwIFwKICAgICAgICAgc3ZnL1NWR0xhbmdTcGFjZS5jcHAgXAogICAgICAgICBz
dmcvU1ZHTGVuZ3RoLmNwcCBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0ZvbnQuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCmluZGV4IDk1NzRjMTUu
LjQ1ZWZhYWIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udC5oCkBAIC0zLDYgKzMsNyBAQAogICog
ICAgICAgICAgIChDKSAyMDAwIEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQogICog
ICAgICAgICAgIChDKSAyMDAwIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQogICogQ29w
eXJpZ2h0IChDKSAyMDAzLCAyMDA2LCAyMDA3IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKICAqCiAgKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAg
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYwpAQCAtMjksOCArMzAsNyBAQAogI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CiAKICNpZiBQ
TEFURk9STShRVCkKLSNpbmNsdWRlIDxRdEd1aS9xZm9udC5oPgotI2luY2x1ZGUgPFF0R3VpL3Fm
b250bWV0cmljcy5oPgorI2luY2x1ZGUgPFFGb250PgogI2VuZGlmCiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKQEAgLTU0LDkgKzU0LDggQEAgY2xhc3MgRm9udCB7CiBwdWJsaWM6CiAgICAgRm9udCgp
OwogICAgIEZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiwgc2hvcnQgbGV0dGVyU3BhY2luZywg
c2hvcnQgd29yZFNwYWNpbmcpOwotI2lmICFQTEFURk9STShRVCkKLSAgICBGb250KGNvbnN0IEZv
bnRQbGF0Zm9ybURhdGEmLCBib29sIGlzUHJpbnRpbmcpOyAvLyBUaGlzIGNvbnN0cnVjdG9yIGlz
IG9ubHkgdXNlZCBpZiB0aGUgcGxhdGZvcm0gd2FudHMgdG8gc3RhcnQgd2l0aCBhIG5hdGl2ZSBm
b250LgotI2VuZGlmCisgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBvbmx5IHVzZWQgaWYgdGhl
IHBsYXRmb3JtIHdhbnRzIHRvIHN0YXJ0IHdpdGggYSBuYXRpdmUgZm9udC4KKyAgICBGb250KGNv
bnN0IEZvbnRQbGF0Zm9ybURhdGEmLCBib29sIGlzUHJpbnRpbmcpOwogICAgIH5Gb250KCk7CiAK
ICAgICBGb250KGNvbnN0IEZvbnQmKTsKQEAgLTg3LDEzICs4Niw4IEBAIHB1YmxpYzoKIAogICAg
IHNob3J0IHdvcmRTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gbV93b3JkU3BhY2luZzsgfQogICAg
IHNob3J0IGxldHRlclNwYWNpbmcoKSBjb25zdCB7IHJldHVybiBtX2xldHRlclNwYWNpbmc7IH0K
LSNpZiAhUExBVEZPUk0oUVQpCiAgICAgdm9pZCBzZXRXb3JkU3BhY2luZyhzaG9ydCBzKSB7IG1f
d29yZFNwYWNpbmcgPSBzOyB9CiAgICAgdm9pZCBzZXRMZXR0ZXJTcGFjaW5nKHNob3J0IHMpIHsg
bV9sZXR0ZXJTcGFjaW5nID0gczsgfQotI2Vsc2UKLSAgICB2b2lkIHNldFdvcmRTcGFjaW5nKHNo
b3J0IHMpOwotICAgIHZvaWQgc2V0TGV0dGVyU3BhY2luZyhzaG9ydCBzKTsKLSNlbmRpZgogICAg
IGJvb2wgaXNGaXhlZFBpdGNoKCkgY29uc3Q7CiAgICAgYm9vbCBpc1ByaW50ZXJGb250KCkgY29u
c3QgeyByZXR1cm4gbV9mb250RGVzY3JpcHRpb24udXNlUHJpbnRlckZvbnQoKTsgfQogICAgIApA
QCAtMTA1LDE0ICs5OSw3IEBAIHB1YmxpYzoKICAgICBib29sIGl0YWxpYygpIGNvbnN0IHsgcmV0
dXJuIG1fZm9udERlc2NyaXB0aW9uLml0YWxpYygpOyB9CiAgICAgRm9udFdlaWdodCB3ZWlnaHQo
KSBjb25zdCB7IHJldHVybiBtX2ZvbnREZXNjcmlwdGlvbi53ZWlnaHQoKTsgfQogCi0jaWYgIVBM
QVRGT1JNKFFUKQogICAgIGJvb2wgaXNQbGF0Zm9ybUZvbnQoKSBjb25zdCB7IHJldHVybiBtX2lz
UGxhdGZvcm1Gb250OyB9Ci0jZW5kaWYKLQotI2lmIFBMQVRGT1JNKFFUKQotICAgIGlubGluZSBj
b25zdCBRRm9udCAmZm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9udDsgfQotICAgIGlubGluZSBj
b25zdCBRRm9udCAmc2NGb250KCkgY29uc3QgeyByZXR1cm4gbV9zY0ZvbnQ7IH0KLSNlbmRpZgog
CiAgICAgLy8gTWV0cmljcyB0aGF0IHdlIHF1ZXJ5IHRoZSBGb250RmFsbGJhY2tMaXN0IGZvci4K
ICAgICBpbnQgYXNjZW50KCkgY29uc3Q7CkBAIC0xMjUsNyArMTEyLDYgQEAgcHVibGljOgogICAg
IGludCBzcGFjZVdpZHRoKCkgY29uc3Q7CiAgICAgaW50IHRhYldpZHRoKCkgY29uc3QgeyByZXR1
cm4gOCAqIHNwYWNlV2lkdGgoKTsgfQogCi0jaWYgIVBMQVRGT1JNKFFUKQogICAgIGNvbnN0IFNp
bXBsZUZvbnREYXRhKiBwcmltYXJ5Rm9udCgpIGNvbnN0IHsKICAgICAgICAgaWYgKCFtX2NhY2hl
ZFByaW1hcnlGb250KQogICAgICAgICAgICAgY2FjaGVQcmltYXJ5Rm9udCgpOwpAQCAtMTM3LDkg
KzEyMywxMSBAQCBwdWJsaWM6CiAgICAgLy8gVXNlZCBmb3IgY29tcGxleCB0ZXh0LCBhbmQgZG9l
cyBub3QgdXRpbGl6ZSB0aGUgZ2x5cGggbWFwIGNhY2hlLgogICAgIGNvbnN0IEZvbnREYXRhKiBm
b250RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCBpbnQgbGVuZ3RoKSBjb25zdDsKIAor
I2lmIFBMQVRGT1JNKFFUKQorICAgIFFGb250IGZvbnQoKSBjb25zdDsKKyNlbmRpZgorCiBwcml2
YXRlOgotICAgIGJvb2wgY2FuVXNlR2x5cGhDYWNoZShjb25zdCBUZXh0UnVuJikgY29uc3Q7Ci0g
ICAgdm9pZCBkcmF3U2ltcGxlVGV4dChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBUZXh0UnVuJiwg
Y29uc3QgRmxvYXRQb2ludCYsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0OwogI2lmIEVOQUJMRShT
VkdfRk9OVFMpCiAgICAgdm9pZCBkcmF3VGV4dFVzaW5nU1ZHRm9udChHcmFwaGljc0NvbnRleHQq
LCBjb25zdCBUZXh0UnVuJiwgY29uc3QgRmxvYXRQb2ludCYsIGludCBmcm9tLCBpbnQgdG8pIGNv
bnN0OwogICAgIGZsb2F0IGZsb2F0V2lkdGhVc2luZ1NWR0ZvbnQoY29uc3QgVGV4dFJ1biYpIGNv
bnN0OwpAQCAtMTQ3LDI0ICsxMzUsMjcgQEAgcHJpdmF0ZToKICAgICBGbG9hdFJlY3Qgc2VsZWN0
aW9uUmVjdEZvclRleHRVc2luZ1NWR0ZvbnQoY29uc3QgVGV4dFJ1biYsIGNvbnN0IEludFBvaW50
JiwgaW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0OwogICAgIGludCBvZmZzZXRGb3JQb3Np
dGlvbkZvclRleHRVc2luZ1NWR0ZvbnQoY29uc3QgVGV4dFJ1biYsIGludCBwb3NpdGlvbiwgYm9v
bCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3Q7CiAjZW5kaWYKKworI2lmIEVOQUJMRShGT05U
X0ZBU1RfUEFUSCkKKyAgICBib29sIGNhblVzZUdseXBoQ2FjaGUoY29uc3QgVGV4dFJ1biYpIGNv
bnN0OworICAgIHZvaWQgZHJhd1NpbXBsZVRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4
dFJ1biYsIGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKICAgICB2
b2lkIGRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgU2ltcGxlRm9udERhdGEqLCBj
b25zdCBHbHlwaEJ1ZmZlciYsIGludCBmcm9tLCBpbnQgdG8sIGNvbnN0IEZsb2F0UG9pbnQmKSBj
b25zdDsKICAgICB2b2lkIGRyYXdHbHlwaEJ1ZmZlcihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBH
bHlwaEJ1ZmZlciYsIGNvbnN0IFRleHRSdW4mLCBjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7Ci0g
ICAgdm9pZCBkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4dFJ1biYs
IGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKICAgICBmbG9hdCBm
bG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiwgR2x5cGhCdWZmZXIqKSBjb25z
dDsKLSAgICBmbG9hdCBmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYpIGNv
bnN0OwogICAgIGludCBvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1
biYsIGludCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3Q7Ci0gICAg
aW50IG9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYsIGludCBw
b3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3Q7CiAgICAgRmxvYXRSZWN0
IHNlbGVjdGlvblJlY3RGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mLCBjb25zdCBJbnRQb2lu
dCYsIGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKKyNlbmRpZgorCisgICAgdm9pZCBk
cmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgVGV4dFJ1biYsIGNvbnN0IEZs
b2F0UG9pbnQmLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdDsKKyAgICBmbG9hdCBmbG9hdFdpZHRo
Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYpIGNvbnN0OworICAgIGludCBvZmZzZXRGb3JQ
b3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mLCBpbnQgcG9zaXRpb24sIGJvb2wg
aW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0OwogICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0
Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYsIGNvbnN0IEludFBvaW50JiwgaW50IGgsIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0OwogICAgIHZvaWQgY2FjaGVQcmltYXJ5Rm9udCgpIGNvbnN0
OwotI2VuZGlmCiAgICAgZnJpZW5kIHN0cnVjdCBXaWR0aEl0ZXJhdG9yOwogCiAgICAgLy8gVXNl
ZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIGRpZmZlcmVudCBmb250IHJlbmRlcmluZyBjb2RlIHBhdGhz
LgogcHVibGljOgotI2lmIFBMQVRGT1JNKFFUKQotICAgIEZvbnRTZWxlY3RvciogZm9udFNlbGVj
dG9yKCkgY29uc3QgeyByZXR1cm4gMDsgfQotI2Vsc2UKKyNpZiBFTkFCTEUoRk9OVF9GQVNUX1BB
VEgpCiAgICAgZW51bSBDb2RlUGF0aCB7IEF1dG8sIFNpbXBsZSwgQ29tcGxleCB9OwogICAgIHN0
YXRpYyB2b2lkIHNldENvZGVQYXRoKENvZGVQYXRoKTsKICAgICBzdGF0aWMgQ29kZVBhdGggY29k
ZVBhdGg7CkBAIC0xNzQsOSArMTY1LDkgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJu
ICgoKGMgJiB+MHhGRikgPT0gMCAmJiBnUm91bmRpbmdIYWNrQ2hhcmFjdGVyVGFibGVbY10pKTsK
ICAgICB9CisjZW5kaWYKIAogICAgIEZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7
Ci0jZW5kaWYKICAgICBzdGF0aWMgYm9vbCB0cmVhdEFzU3BhY2UoVUNoYXIgYykgeyByZXR1cm4g
YyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09IDB4MDBBMDsgfQogICAg
IHN0YXRpYyBib29sIHRyZWF0QXNaZXJvV2lkdGhTcGFjZShVQ2hhciBjKSB7IHJldHVybiBjIDwg
MHgyMCB8fCAoYyA+PSAweDdGICYmIGMgPCAweEEwKSB8fCBjID09IDB4MjAwZSB8fCBjID09IDB4
MjAwZiB8fCBjID49IDB4MjAyYSAmJiBjIDw9IDB4MjAyZSB8fCBjID09IDB4RkZGQzsgfQogCkBA
IC0xODcsMjEgKzE3OCwxMyBAQCBwdWJsaWM6CiAKIHByaXZhdGU6CiAgICAgRm9udERlc2NyaXB0
aW9uIG1fZm9udERlc2NyaXB0aW9uOwotI2lmICFQTEFURk9STShRVCkKICAgICBtdXRhYmxlIFJl
ZlB0cjxGb250RmFsbGJhY2tMaXN0PiBtX2ZvbnRMaXN0OwogICAgIG11dGFibGUgSGFzaE1hcDxp
bnQsIEdseXBoUGFnZVRyZWVOb2RlKj4gbV9wYWdlczsKICAgICBtdXRhYmxlIEdseXBoUGFnZVRy
ZWVOb2RlKiBtX3BhZ2VaZXJvOwogICAgIG11dGFibGUgY29uc3QgU2ltcGxlRm9udERhdGEqIG1f
Y2FjaGVkUHJpbWFyeUZvbnQ7Ci0jZW5kaWYKICAgICBzaG9ydCBtX2xldHRlclNwYWNpbmc7CiAg
ICAgc2hvcnQgbV93b3JkU3BhY2luZzsKLSNpZiAhUExBVEZPUk0oUVQpCiAgICAgYm9vbCBtX2lz
UGxhdGZvcm1Gb250OwotI2Vsc2UKLSAgICBRRm9udCBtX2ZvbnQ7Ci0gICAgUUZvbnQgbV9zY0Zv
bnQ7Ci0gICAgaW50IG1fc3BhY2VXaWR0aDsKLSNlbmRpZgogfTsKIAogfQpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFsbGJhY2tMaXN0LmggYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnRGYWxsYmFja0xpc3QuaAppbmRleCBhMjNiMzJjLi5hZjViOGQ1
IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYWxsYmFja0xpc3Qu
aAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYWxsYmFja0xpc3QuaApAQCAt
MjYsNyArMjYsOCBAQAogCiAjaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCiAjaW5jbHVkZSAiU2lt
cGxlRm9udERhdGEuaCIKLSNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAg
LTY1LDcgKzY2LDcgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgcmVsZWFzZUZvbnREYXRhKCk7CiAK
LSAgICBtdXRhYmxlIFZlY3RvcjxwYWlyPGNvbnN0IEZvbnREYXRhKiwgYm9vbD4sIDE+IG1fZm9u
dExpc3Q7CisgICAgbXV0YWJsZSBWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IEZvbnREYXRhKiwgYm9v
bD4sIDE+IG1fZm9udExpc3Q7CiAgICAgbXV0YWJsZSBpbnQgbV9mYW1pbHlJbmRleDsKICAgICBt
dXRhYmxlIFBpdGNoIG1fcGl0Y2g7CiAgICAgbXV0YWJsZSBib29sIG1fbG9hZGluZ0N1c3RvbUZv
bnRzOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0
YS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmNwcAppbmRl
eCAzNzJmY2M4Li43MzY1NjdlIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L1NpbXBsZUZvbnREYXRhLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBs
ZUZvbnREYXRhLmNwcApAQCAtNTAsNyArNTAsNyBAQCBTaW1wbGVGb250RGF0YTo6U2ltcGxlRm9u
dERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgZiwgYm9vbCBjdXN0b21Gb250LCBib29sCiAg
ICAgLCBtX2lzTG9hZGluZyhsb2FkaW5nKQogICAgICwgbV9zbWFsbENhcHNGb250RGF0YSgwKQog
ewotI2lmIEVOQUJMRShTVkdfRk9OVFMpICYmICFQTEFURk9STShRVCkKKyNpZiBFTkFCTEUoU1ZH
X0ZPTlRTKQogICAgIGlmIChTVkdGb250RmFjZUVsZW1lbnQqIHN2Z0ZvbnRGYWNlRWxlbWVudCA9
IHN2Z0ZvbnREYXRhID8gc3ZnRm9udERhdGEtPnN2Z0ZvbnRGYWNlRWxlbWVudCgpIDogMCkgewog
ICAgICAgIG1fdW5pdHNQZXJFbSA9IHN2Z0ZvbnRGYWNlRWxlbWVudC0+dW5pdHNQZXJFbSgpOwog
CkBAIC03NSw3ICs3NSwxMiBAQCBTaW1wbGVGb250RGF0YTo6U2ltcGxlRm9udERhdGEoY29uc3Qg
Rm9udFBsYXRmb3JtRGF0YSYgZiwgYm9vbCBjdXN0b21Gb250LCBib29sCiAjZW5kaWYKIAogICAg
IHBsYXRmb3JtSW5pdCgpOworICAgIHBsYXRmb3JtR2x5cGhJbml0KCk7Cit9CiAKKyNpZiAhUExB
VEZPUk0oUVQpCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUdseXBoSW5pdCgpCit7CiAg
ICAgR2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RD
aGlsZCh0aGlzLCAwKS0+cGFnZSgpOwogICAgIGlmICghZ2x5cGhQYWdlWmVybykgewogICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBnZXQgZ2x5cGggcGFnZSB6ZXJvLiIpOwpAQCAtMTEzLDYg
KzExOCw3IEBAIFNpbXBsZUZvbnREYXRhOjpTaW1wbGVGb250RGF0YShjb25zdCBGb250UGxhdGZv
cm1EYXRhJiBmLCBib29sIGN1c3RvbUZvbnQsIGJvb2wKICAgICBtX21pc3NpbmdHbHlwaERhdGEu
Zm9udERhdGEgPSB0aGlzOwogICAgIG1fbWlzc2luZ0dseXBoRGF0YS5nbHlwaCA9IDA7CiB9Cisj
ZW5kaWYKIAogU2ltcGxlRm9udERhdGE6On5TaW1wbGVGb250RGF0YSgpCiB7CkBAIC0xMjIsMTIg
KzEyOCwxMyBAQCBTaW1wbGVGb250RGF0YTo6flNpbXBsZUZvbnREYXRhKCkKICAgICAgICAgR2x5
cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUZvbnREYXRhKHRoaXMpOwogICAgIH0KIAotI2lmIEVO
QUJMRShTVkdfRk9OVFMpICYmICFQTEFURk9STShRVCkKKyNpZiBFTkFCTEUoU1ZHX0ZPTlRTKQog
ICAgIGlmICghbV9zdmdGb250RGF0YSB8fCAhbV9zdmdGb250RGF0YS0+c3ZnRm9udEZhY2VFbGVt
ZW50KCkpCiAjZW5kaWYKICAgICAgICAgcGxhdGZvcm1EZXN0cm95KCk7CiB9CiAKKyNpZiAhUExB
VEZPUk0oUVQpCiBmbG9hdCBTaW1wbGVGb250RGF0YTo6d2lkdGhGb3JHbHlwaChHbHlwaCBnbHlw
aCkgY29uc3QKIHsKICAgICBmbG9hdCB3aWR0aCA9IG1fZ2x5cGhUb1dpZHRoTWFwLndpZHRoRm9y
R2x5cGgoZ2x5cGgpOwpAQCAtMTM5LDYgKzE0Niw3IEBAIGZsb2F0IFNpbXBsZUZvbnREYXRhOjp3
aWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAogICAgIAogICAgIHJldHVybiB3aWR0aDsK
IH0KKyNlbmRpZgogCiBjb25zdCBTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OmZvbnRE
YXRhRm9yQ2hhcmFjdGVyKFVDaGFyMzIpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL1NpbXBsZUZvbnREYXRhLmgKaW5kZXggOWI3NjA4MS4uMjA0OTkxNCAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaApAQCAtNDMsNiArNDMsMTAgQEAgdHlw
ZWRlZiBzdHJ1Y3QgT3BhcXVlQVRTVVN0eWxlKiBBVFNVU3R5bGU7CiAjaW5jbHVkZSA8Y2Fpcm8u
aD4KICNlbmRpZgogCisjaWYgUExBVEZPUk0oUVQpCisjaW5jbHVkZSA8UUZvbnQ+CisjZW5kaWYK
KwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBGb250RGVzY3JpcHRpb247CkBAIC0xMDks
NiArMTEzLDEwIEBAIHB1YmxpYzoKICNlbmRpZgogI2VuZGlmCiAKKyNpZiBQTEFURk9STShRVCkK
KyAgICBRRm9udCBnZXRRdEZvbnQoKSBjb25zdCB7IHJldHVybiBtX2ZvbnQuZm9udCgpOyB9Cisj
ZW5kaWYKKwogI2lmIFBMQVRGT1JNKFdJTikKICAgICBib29sIGlzU3lzdGVtRm9udCgpIGNvbnN0
IHsgcmV0dXJuIG1faXNTeXN0ZW1Gb250OyB9CiAgICAgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiBz
Y3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0OwpAQCAtMTI4LDYgKzEzNiw3IEBAIHB1YmxpYzoK
IAogcHJpdmF0ZToKICAgICB2b2lkIHBsYXRmb3JtSW5pdCgpOworICAgIHZvaWQgcGxhdGZvcm1H
bHlwaEluaXQoKTsKICAgICB2b2lkIHBsYXRmb3JtRGVzdHJveSgpOwogICAgIAogICAgIHZvaWQg
Y29tbW9uSW5pdCgpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9G
b250Q2FjaGVRdC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0
LmNwcAppbmRleCAzNzcxZjIyLi5lMWFhOTdkIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3F0L0ZvbnRDYWNoZVF0LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3F0L0ZvbnRDYWNoZVF0LmNwcApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgICAgQ29weXJpZ2h0
IChDKSAyMDA3IFRyb2xsdGVjaCBBU0EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhh
bnMgUGV0ZXIgRnJleXRoZXIKIAogICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjEsNyArMjIsOSBAQAog
Ki8KICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJGb250Q2FjaGUuaCIKKwogI2luY2x1
ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIkZvbnRQbGF0Zm9ybURhdGEuaCIKICNp
bmNsdWRlICJGb250LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTMwLDkgKzMzLDkgQEAg
dm9pZCBGb250Q2FjaGU6OmdldFRyYWl0c0luRmFtaWx5KGNvbnN0IEF0b21pY1N0cmluZyYgZmFt
aWx5TmFtZSwgVmVjdG9yPHVuc2lnbmUKIHsKIH0KIAotRm9udFBsYXRmb3JtRGF0YSogRm9udENh
Y2hlOjpnZXRDYWNoZWRGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYsIGNv
bnN0IEF0b21pY1N0cmluZyYgZmFtaWx5LCBib29sIGNoZWNraW5nQWx0ZXJuYXRlTmFtZSkKK0Zv
bnRQbGF0Zm9ybURhdGEqIEZvbnRDYWNoZTo6Z2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShjb25z
dCBGb250RGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBBdG9taWNTdHJpbmcmIGZhbWls
eSwgYm9vbCBjaGVja2luZ0FsdGVybmF0ZU5hbWUpCiB7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0
dXJuIG5ldyBGb250UGxhdGZvcm1EYXRhKGRlc2NyaXB0aW9uKTsKIH0KIAogU2ltcGxlRm9udERh
dGEqIEZvbnRDYWNoZTo6Z2V0Q2FjaGVkRm9udERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSop
CkBAIC00NSw2ICs0OCwxMCBAQCBGb250UGxhdGZvcm1EYXRhKiBGb250Q2FjaGU6OmdldExhc3RS
ZXNvcnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJikKICAgICByZXR1cm4gMDsK
IH0KIAordm9pZCBGb250Q2FjaGU6OnJlbGVhc2VGb250RGF0YShjb25zdCBXZWJDb3JlOjpTaW1w
bGVGb250RGF0YSopCit7Cit9CisKIHZvaWQgRm9udENhY2hlOjphZGRDbGllbnQoRm9udFNlbGVj
dG9yKikKIHsKIH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9u
dEN1c3RvbVBsYXRmb3JtRGF0YS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0Zv
bnRDdXN0b21QbGF0Zm9ybURhdGEuY3BwCmluZGV4IGZmODA0NjcuLjczOGE3NTAgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5j
cHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q3VzdG9tUGxhdGZvcm1E
YXRhLmNwcApAQCAtMjUsMTkgKzI1LDI1IEBACiAjaW5jbHVkZSAiRm9udFBsYXRmb3JtRGF0YS5o
IgogI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgogI2luY2x1ZGUgPFFGb250RGF0YWJhc2U+Cisj
aW5jbHVkZSA8UVN0cmluZ0xpc3Q+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogRm9udEN1c3Rv
bVBsYXRmb3JtRGF0YTo6fkZvbnRDdXN0b21QbGF0Zm9ybURhdGEoKQogewotICAgIFFGb250RGF0
YWJhc2U6OnJlbW92ZUFwcGxpY2F0aW9uRm9udChoYW5kbGUpOworICAgIFFGb250RGF0YWJhc2U6
OnJlbW92ZUFwcGxpY2F0aW9uRm9udChtX2hhbmRsZSk7CiB9CiAKIEZvbnRQbGF0Zm9ybURhdGEg
Rm9udEN1c3RvbVBsYXRmb3JtRGF0YTo6Zm9udFBsYXRmb3JtRGF0YShpbnQgc2l6ZSwgYm9vbCBi
b2xkLCBib29sIGl0YWxpYywgRm9udFJlbmRlcmluZ01vZGUpCiB7Ci0gICAgRm9udFBsYXRmb3Jt
RGF0YSByZXN1bHQ7Ci0gICAgcmVzdWx0LmhhbmRsZSA9IGhhbmRsZTsKLSAgICByZXR1cm4gcmVz
dWx0OworICAgIFFGb250IGZvbnQ7CisgICAgZm9udC5zZXRGYW1pbHkoUUZvbnREYXRhYmFzZTo6
YXBwbGljYXRpb25Gb250RmFtaWxpZXMobV9oYW5kbGUpWzBdKTsKKyAgICBmb250LnNldFBpeGVs
U2l6ZShzaXplKTsKKyAgICBpZiAoYm9sZCkKKyAgICAgICAgZm9udC5zZXRXZWlnaHQoUUZvbnQ6
OkJvbGQpOworICAgIGZvbnQuc2V0SXRhbGljKGl0YWxpYyk7CisKKyAgICByZXR1cm4gRm9udFBs
YXRmb3JtRGF0YShmb250LCBib2xkKTsKIH0KIAogRm9udEN1c3RvbVBsYXRmb3JtRGF0YSogY3Jl
YXRlRm9udEN1c3RvbVBsYXRmb3JtRGF0YShTaGFyZWRCdWZmZXIqIGJ1ZmZlcikKQEAgLTQ3LDgg
KzUzLDExIEBAIEZvbnRDdXN0b21QbGF0Zm9ybURhdGEqIGNyZWF0ZUZvbnRDdXN0b21QbGF0Zm9y
bURhdGEoU2hhcmVkQnVmZmVyKiBidWZmZXIpCiAgICAgaW50IGlkID0gUUZvbnREYXRhYmFzZTo6
YWRkQXBwbGljYXRpb25Gb250RnJvbURhdGEoUUJ5dGVBcnJheShidWZmZXItPmRhdGEoKSwgYnVm
ZmVyLT5zaXplKCkpKTsKICAgICBpZiAoaWQgPT0gLTEpCiAgICAgICAgIHJldHVybiAwOworCisg
ICAgUV9BU1NFUlQoUUZvbnREYXRhYmFzZTo6YXBwbGljYXRpb25Gb250RmFtaWxpZXMoaWQpLnNp
emUoKSA+IDApOworCiAgICAgRm9udEN1c3RvbVBsYXRmb3JtRGF0YSAqZGF0YSA9IG5ldyBGb250
Q3VzdG9tUGxhdGZvcm1EYXRhOwotICAgIGRhdGEtPmhhbmRsZSA9IGlkOworICAgIGRhdGEtPm1f
aGFuZGxlID0gaWQ7CiAgICAgcmV0dXJuIGRhdGE7CiB9CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5oIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250Q3VzdG9tUGxhdGZvcm1EYXRhLmgKaW5kZXggZjdhNzk5
NS4uM2FmYmJmZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250
Q3VzdG9tUGxhdGZvcm1EYXRhLmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9G
b250Q3VzdG9tUGxhdGZvcm1EYXRhLmgKQEAgLTMzLDcgKzMzLDggQEAgY2xhc3MgRm9udFBsYXRm
b3JtRGF0YTsKIHN0cnVjdCBGb250Q3VzdG9tUGxhdGZvcm1EYXRhIDogTm9uY29weWFibGUgewog
ICAgIH5Gb250Q3VzdG9tUGxhdGZvcm1EYXRhKCk7CiAKLSAgICBpbnQgaGFuZGxlOyAvLyBmb3Ig
dXNlIHdpdGggUUZvbnREYXRhYmFzZTo6YWRkQXBwbGljYXRpb25Gb250L3JlbW92ZUFwcGxpY2F0
aW9uRm9udAorICAgIC8vIGZvciB1c2Ugd2l0aCBRRm9udERhdGFiYXNlOjphZGRBcHBsaWNhdGlv
bkZvbnQvcmVtb3ZlQXBwbGljYXRpb25Gb250CisgICAgaW50IG1faGFuZGxlOwogCiAgICAgRm9u
dFBsYXRmb3JtRGF0YSBmb250UGxhdGZvcm1EYXRhKGludCBzaXplLCBib29sIGJvbGQsIGJvb2wg
aXRhbGljLCBGb250UmVuZGVyaW5nTW9kZSA9IE5vcm1hbFJlbmRlcmluZ01vZGUpOwogfTsKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFBsYXRmb3JtRGF0YS5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UGxhdGZvcm1EYXRhLmgKaW5kZXgg
N2RhZjZlZC4uZjEyZjAxYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9x
dC9Gb250UGxhdGZvcm1EYXRhLmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9G
b250UGxhdGZvcm1EYXRhLmgKQEAgLTEsNSArMSw2IEBACiAvKgogICAgIENvcHlyaWdodCAoQykg
MjAwNyBUcm9sbHRlY2ggQVNBCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBl
dGVyIEZyZXl0aGVyCiAKICAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDE0ICsyMywyOSBAQAogI2lm
bmRlZiBGb250UGxhdGZvcm1EYXRhX2gKICNkZWZpbmUgRm9udFBsYXRmb3JtRGF0YV9oCiAKKyNp
bmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgPFFGb250PgorCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIGNsYXNzIEZvbnRQbGF0Zm9ybURhdGEKIHsKIHB1YmxpYzoKLSAgICAv
LyB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgY3VzdG9tIGxvYWRlZCBmb250cyBhbmQgcmVwcmVzZW50
cyB0aGUgaWQgaGFuZGxlIHBhc3NlZCB0bwotICAgIC8vIFFGb250RGF0YWJhc2U6OmFkZEFwcGxp
Y2F0aW9uRm9udC9yZW1vdmVBcHBsaWNhdGlvbkZvbnQKLSAgICBpbnQgaGFuZGxlOworI2lmIEVO
QUJMRShTVkdfRk9OVFMpCisgICAgRm9udFBsYXRmb3JtRGF0YShmbG9hdCBzaXplLCBib29sIGJv
bGQsIGJvb2wgb2JsaXF1ZSk7CisjZW5kaWYKKyAgICBGb250UGxhdGZvcm1EYXRhKCk7CisgICAg
Rm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mLCBpbnQgd29yZFNwYWNpbmcg
PSAwLCBpbnQgbGV0dGVyU3BhY2luZyA9IDApOworICAgIEZvbnRQbGF0Zm9ybURhdGEoY29uc3Qg
UUZvbnQmLCBib29sIGJvbGQpOworCisgICAgUUZvbnQgZm9udCgpIGNvbnN0IHsgcmV0dXJuIG1f
Zm9udDsgfQorICAgIGZsb2F0IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKworICAg
IGZsb2F0IG1fc2l6ZTsKKyAgICBib29sIG1fYm9sZDsKKyAgICBib29sIG1fb2JsaXF1ZTsKKyAg
ICBRRm9udCBtX2ZvbnQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3F0L0ZvbnRRdC5jcHAKaW5kZXggYzRkNjJmOS4uMjQ1NmIzMSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Gb250UXQuY3BwCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0LmNwcApAQCAtMSw1ICsxLDYgQEAKIC8qCiAg
ICAgQ29weXJpZ2h0IChDKSAyMDA3IFRyb2xsdGVjaCBBU0EKKyAgICBDb3B5cmlnaHQgKEMpIDIw
MDggSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKIAogICAgIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgICBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjAs
NiArMjEsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkZvbnQuaCIKICNpbmNs
dWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCiAj
aW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCiAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
QEAgLTMxLDY2ICszMyw5IEBACiAjaW5jbHVkZSA8cWRlYnVnLmg+CiAKICNpbmNsdWRlIDxsaW1p
dHMuaD4KLW5hbWVzcGFjZSBXZWJDb3JlIHsKIAogI2lmIFFUX1ZFUlNJT04gPj0gMHgwNDA0MDAK
LQotRm9udDo6Rm9udCgpCi0gICAgOiBtX2xldHRlclNwYWNpbmcoMCkKLSAgICAsIG1fd29yZFNw
YWNpbmcoMCkKLSAgICAsIG1fZm9udCgpCi0gICAgLCBtX3NjRm9udCgpCi17Ci0gICAgUUZvbnRN
ZXRyaWNzIG1ldHJpY3MobV9mb250KTsKLSAgICBtX3NwYWNlV2lkdGggPSBtZXRyaWNzLndpZHRo
KFFMYXRpbjFDaGFyKCcgJykpOwotfQotCi1Gb250OjpGb250KGNvbnN0IEZvbnREZXNjcmlwdGlv
biYgZGVzY3JpcHRpb24sIHNob3J0IGxldHRlclNwYWNpbmcsIHNob3J0IHdvcmRTcGFjaW5nKQot
ICAgIDogbV9mb250RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pCi0gICAgLCBtX2xldHRlclNwYWNp
bmcobGV0dGVyU3BhY2luZykKLSAgICAsIG1fd29yZFNwYWNpbmcod29yZFNwYWNpbmcpCi17Ci0g
ICAgY29uc3QgRm9udEZhbWlseSogZmFtaWx5ID0gJmRlc2NyaXB0aW9uLmZhbWlseSgpOwotICAg
IFFTdHJpbmcgZmFtaWx5TmFtZTsKLSAgICB3aGlsZSAoZmFtaWx5KSB7Ci0gICAgICAgIGZhbWls
eU5hbWUgKz0gZmFtaWx5LT5mYW1pbHkoKTsKLSAgICAgICAgZmFtaWx5ID0gZmFtaWx5LT5uZXh0
KCk7Ci0gICAgICAgIGlmIChmYW1pbHkpCi0gICAgICAgICAgICBmYW1pbHlOYW1lICs9IFFMYXRp
bjFDaGFyKCcsJyk7Ci0gICAgfQotCi0gICAgbV9mb250LnNldEZhbWlseShmYW1pbHlOYW1lKTsK
LSAgICBtX2ZvbnQuc2V0UGl4ZWxTaXplKHFSb3VuZChkZXNjcmlwdGlvbi5jb21wdXRlZFNpemUo
KSkpOwotICAgIG1fZm9udC5zZXRJdGFsaWMoZGVzY3JpcHRpb24uaXRhbGljKCkpOwotICAgIC8v
IEZJWE1FOiBNYXAgYWxsIEZvbnRXZWlnaHQgdmFsdWVzIHRvIFFGb250IHdlaWdodHMuCi0gICAg
aWYgKGRlc2NyaXB0aW9uLndlaWdodCgpID49IEZvbnRXZWlnaHQ2MDApCi0gICAgICAgIG1fZm9u
dC5zZXRXZWlnaHQoUUZvbnQ6OkJvbGQpOwotICAgIGVsc2UKLSAgICAgICAgbV9mb250LnNldFdl
aWdodChRRm9udDo6Tm9ybWFsKTsKLQotICAgIGJvb2wgc21hbGxDYXBzID0gZGVzY3JpcHRpb24u
c21hbGxDYXBzKCk7Ci0gICAgbV9mb250LnNldENhcGl0YWxpemF0aW9uKHNtYWxsQ2FwcyA/IFFG
b250OjpTbWFsbENhcHMgOiBRRm9udDo6TWl4ZWRDYXNlKTsKLQotICAgIFFGb250TWV0cmljcyBt
ZXRyaWNzID0gUUZvbnRNZXRyaWNzKG1fZm9udCk7Ci0gICAgbV9zcGFjZVdpZHRoID0gbWV0cmlj
cy53aWR0aChRTGF0aW4xQ2hhcignICcpKTsKLQotICAgIGlmICh3b3JkU3BhY2luZykKLSAgICAg
ICAgbV9mb250LnNldFdvcmRTcGFjaW5nKHdvcmRTcGFjaW5nKTsKLSAgICBpZiAobGV0dGVyU3Bh
Y2luZykKLSAgICAgICAgbV9mb250LnNldExldHRlclNwYWNpbmcoUUZvbnQ6OkFic29sdXRlU3Bh
Y2luZywgbGV0dGVyU3BhY2luZyk7Ci19Ci0KLXZvaWQgRm9udDo6c2V0V29yZFNwYWNpbmcoc2hv
cnQgcykKLXsKLSAgICBtX2ZvbnQuc2V0V29yZFNwYWNpbmcocyk7Ci0gICAgbV93b3JkU3BhY2lu
ZyA9IHM7Ci19Ci12b2lkIEZvbnQ6OnNldExldHRlclNwYWNpbmcoc2hvcnQgcykKLXsKLSAgICBt
X2ZvbnQuc2V0TGV0dGVyU3BhY2luZyhRRm9udDo6QWJzb2x1dGVTcGFjaW5nLCBzKTsKLSAgICBt
X2xldHRlclNwYWNpbmcgPSBzOwotfQotCituYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRpYyBR
U3RyaW5nIHFzdHJpbmcoY29uc3QgVGV4dFJ1biYgcnVuKQogewpAQCAtMTIxLDEwICs2NiwxMSBA
QCBzdGF0aWMgUVRleHRMaW5lIHNldHVwTGF5b3V0KFFUZXh0TGF5b3V0KiBsYXlvdXQsIGNvbnN0
IFRleHRSdW4mIHN0eWxlKQogICAgIHJldHVybiBsaW5lOwogfQogCi12b2lkIEZvbnQ6OmRyYXdU
ZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0
UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAordm9pZCBGb250OjpkcmF3Q29t
cGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CiAgICAgaWYgKHRv
IDwgMCkKICAgICAgICAgdG8gPSBydW4ubGVuZ3RoKCk7CisKICAgICBRUGFpbnRlciAqcCA9IGN0
eC0+cGxhdGZvcm1Db250ZXh0KCk7CiAgICAgQ29sb3IgY29sb3IgPSBjdHgtPmZpbGxDb2xvcigp
OwogICAgIHAtPnNldFBlbihRQ29sb3IoY29sb3IpKTsKQEAgLTEzOCwxNCArODQsMTQgQEAgdm9p
ZCBGb250OjpkcmF3VGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVu
LCBjb25zdCBGbG9hdFBvaW50JgogICAgIGJvb2wgaGFzU2hhZG93ID0gY3R4LT50ZXh0RHJhd2lu
Z01vZGUoKSA9PSBjVGV4dEZpbGwgJiYgY3R4LT5nZXRTaGFkb3coc2hhZG93U2l6ZSwgc2hhZG93
Qmx1ciwgc2hhZG93Q29sb3IpOwogCiAgICAgaWYgKGZyb20gPiAwIHx8IHRvIDwgcnVuLmxlbmd0
aCgpKSB7Ci0gICAgICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIG1fZm9udCk7CisgICAg
ICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7CiAgICAgICAgIFFUZXh0TGlu
ZSBsaW5lID0gc2V0dXBMYXlvdXQoJmxheW91dCwgcnVuKTsKICAgICAgICAgZmxvYXQgeDEgPSBs
aW5lLmN1cnNvclRvWChmcm9tKTsKICAgICAgICAgZmxvYXQgeDIgPSBsaW5lLmN1cnNvclRvWCh0
byk7CiAgICAgICAgIGlmICh4MiA8IHgxKQogICAgICAgICAgICAgcVN3YXAoeDEsIHgyKTsKIAot
ICAgICAgICBRRm9udE1ldHJpY3MgZm0obV9mb250KTsKKyAgICAgICAgUUZvbnRNZXRyaWNzIGZt
KGZvbnQoKSk7CiAgICAgICAgIGludCBhc2NlbnQgPSBmbS5hc2NlbnQoKTsKICAgICAgICAgUVJl
Y3RGIGNsaXAocG9pbnQueCgpICsgeDEsIHBvaW50LnkoKSAtIGFzY2VudCwgeDIgLSB4MSwgZm0u
aGVpZ2h0KCkpOwogCkBAIC0xNzksNyArMTI1LDcgQEAgdm9pZCBGb250OjpkcmF3VGV4dChHcmFw
aGljc0NvbnRleHQqIGN0eCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50Jgog
ICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcC0+c2V0Rm9udChtX2ZvbnQpOworICAgIHAt
PnNldEZvbnQoZm9udCgpKTsKIAogICAgIFFQb2ludEYgcHQocG9pbnQueCgpLCBwb2ludC55KCkp
OwogICAgIGludCBmbGFncyA9IHJ1bi5ydGwoKSA/IFF0OjpUZXh0Rm9yY2VSaWdodFRvTGVmdCA6
IFF0OjpUZXh0Rm9yY2VMZWZ0VG9SaWdodDsKQEAgLTE5NCwxMiArMTQwLDEyIEBAIHZvaWQgRm9u
dDo6ZHJhd1RleHQoR3JhcGhpY3NDb250ZXh0KiBjdHgsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29u
c3QgRmxvYXRQb2ludCYKICAgICBwLT5kcmF3VGV4dChwdCwgc3RyaW5nLCBmbGFncywgcnVuLnBh
ZGRpbmcoKSk7CiB9CiAKLWludCBGb250Ojp3aWR0aChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0
CitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVu
KSBjb25zdAogewogICAgIGlmICghcnVuLmxlbmd0aCgpKQogICAgICAgICByZXR1cm4gMDsKICAg
ICBRU3RyaW5nIHN0cmluZyA9IHFzdHJpbmcocnVuKTsKLSAgICBRVGV4dExheW91dCBsYXlvdXQo
c3RyaW5nLCBtX2ZvbnQpOworICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7
CiAgICAgUVRleHRMaW5lIGxpbmUgPSBzZXR1cExheW91dCgmbGF5b3V0LCBydW4pOwogICAgIGlu
dCB3ID0gaW50KGxpbmUubmF0dXJhbFRleHRXaWR0aCgpKTsKICAgICAvLyBXZWJLaXQgZXhwZWN0
cyB1cyB0byBpZ25vcmUgd29yZCBzcGFjaW5nIG9uIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKGFzIG9w
cG9zZWQgdG8gd2hhdCBRdCBkb2VzKQpAQCAtMjA5LDMwICsxNTUsMTggQEAgaW50IEZvbnQ6Ondp
ZHRoKGNvbnN0IFRleHRSdW4mIHJ1bikgY29uc3QKICAgICByZXR1cm4gdyArIHJ1bi5wYWRkaW5n
KCk7CiB9CiAKLWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGgoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25z
dAotewotICAgIHJldHVybiB3aWR0aChydW4pOwotfQotCi1mbG9hdCBGb250OjpmbG9hdFdpZHRo
KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IC8qZXh0cmFDaGFyc0F2YWlsYWJsZSovLCBpbnQmIGNo
YXJzQ29uc3VtZWQsIFN0cmluZyYgZ2x5cGhOYW1lKSBjb25zdAotewotICAgIGNoYXJzQ29uc3Vt
ZWQgPSBydW4ubGVuZ3RoKCk7Ci0gICAgZ2x5cGhOYW1lID0gIiI7Ci0gICAgcmV0dXJuIHdpZHRo
KHJ1bik7Ci19Ci0KLWludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbihjb25zdCBUZXh0UnVuJiBy
dW4sIGludCBwb3NpdGlvbiwgYm9vbCAvKmluY2x1ZGVQYXJ0aWFsR2x5cGhzKi8pIGNvbnN0Citp
bnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBy
dW4sIGludCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKIHsKICAg
ICBRU3RyaW5nIHN0cmluZyA9IHFzdHJpbmcocnVuKTsKLSAgICBRVGV4dExheW91dCBsYXlvdXQo
c3RyaW5nLCBtX2ZvbnQpOworICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7
CiAgICAgUVRleHRMaW5lIGxpbmUgPSBzZXR1cExheW91dCgmbGF5b3V0LCBydW4pOwogICAgIHJl
dHVybiBsaW5lLnhUb0N1cnNvcihwb3NpdGlvbik7CiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxl
Y3Rpb25SZWN0Rm9yVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwdCwg
aW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CitGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9u
UmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHB0
LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICAgICBRU3RyaW5nIHN0cmluZyA9
IHFzdHJpbmcocnVuKTsKLSAgICBRVGV4dExheW91dCBsYXlvdXQoc3RyaW5nLCBtX2ZvbnQpOwor
ICAgIFFUZXh0TGF5b3V0IGxheW91dChzdHJpbmcsIGZvbnQoKSk7CiAgICAgUVRleHRMaW5lIGxp
bmUgPSBzZXR1cExheW91dCgmbGF5b3V0LCBydW4pOwogCiAgICAgZmxvYXQgeDEgPSBsaW5lLmN1
cnNvclRvWChmcm9tKTsKQEAgLTI0Myw0NjQgKzE3NywxMiBAQCBGbG9hdFJlY3QgRm9udDo6c2Vs
ZWN0aW9uUmVjdEZvclRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcHQs
IGludAogICAgIHJldHVybiBGbG9hdFJlY3QocHQueCgpICsgeDEsIHB0LnkoKSwgeDIgLSB4MSwg
aCk7CiB9CiAKLSNlbHNlCi0KLQotc3RydWN0IFRleHRSdW5Db21wb25lbnQgewotICAgIFRleHRS
dW5Db21wb25lbnQoKSA6IGZvbnQoMCkge30KLSAgICBUZXh0UnVuQ29tcG9uZW50KGNvbnN0IFVD
aGFyICpzdGFydCwgaW50IGxlbmd0aCwgYm9vbCBydGwsIGNvbnN0IFFGb250ICpmb250LCBpbnQg
b2Zmc2V0LCBib29sIHNjID0gZmFsc2UpOwotICAgIFRleHRSdW5Db21wb25lbnQoaW50IHNwYWNl
cywgYm9vbCBydGwsIGNvbnN0IFFGb250ICpmb250LCBpbnQgb2Zmc2V0KTsKLQotICAgIGlubGlu
ZSBib29sIGlzU3BhY2UoKSBjb25zdCB7IHJldHVybiBzcGFjZXMgIT0gMDsgfQotCi0gICAgUVN0
cmluZyBzdHJpbmc7Ci0gICAgY29uc3QgUUZvbnQgKmZvbnQ7Ci0gICAgaW50IHdpZHRoOwotICAg
IGludCBvZmZzZXQ7Ci0gICAgaW50IHNwYWNlczsKLX07Ci0KLVRleHRSdW5Db21wb25lbnQ6OlRl
eHRSdW5Db21wb25lbnQoY29uc3QgVUNoYXIgKnN0YXJ0LCBpbnQgbGVuZ3RoLCBib29sIHJ0bCwg
Y29uc3QgUUZvbnQgKmYsIGludCBvLCBib29sIHNjKQotICAgIDogc3RyaW5nKHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgUUNoYXIqPihzdGFydCksIGxlbmd0aCkKLSAgICAsIGZvbnQoZikKLSAgICAs
IG9mZnNldChvKQotICAgICwgc3BhY2VzKDApCi17Ci0gICAgaWYgKHNjKQotICAgICAgICBzdHJp
bmcgPSBzdHJpbmcudG9VcHBlcigpOwotICAgIHN0cmluZy5wcmVwZW5kKHJ0bCA/IFFDaGFyKDB4
MjAyZSkgOiBRQ2hhcigweDIwMmQpKTsKLSAgICB3aWR0aCA9IFFGb250TWV0cmljcygqZm9udCku
d2lkdGgoc3RyaW5nKTsKLX0KLQotVGV4dFJ1bkNvbXBvbmVudDo6VGV4dFJ1bkNvbXBvbmVudChp
bnQgcywgYm9vbCBydGwsIGNvbnN0IFFGb250ICpmLCBpbnQgbykKLSAgICA6IHN0cmluZyhzLCBR
TGF0aW4xQ2hhcignICcpKQotICAgICwgZm9udChmKQotICAgICwgb2Zmc2V0KG8pCi0gICAgLCBz
cGFjZXMocykKLXsKLSAgICBzdHJpbmcucHJlcGVuZChydGwgPyBRQ2hhcigweDIwMmUpIDogUUNo
YXIoMHgyMDJkKSk7Ci0gICAgd2lkdGggPSBzcGFjZXMgKiBRRm9udE1ldHJpY3MoKmZvbnQpLndp
ZHRoKFFMYXRpbjFDaGFyKCcgJykpOwotfQotCi0KLUZvbnQ6OkZvbnQoKQotICAgIDogbV9sZXR0
ZXJTcGFjaW5nKDApCi0gICAgLCBtX3dvcmRTcGFjaW5nKDApCi0gICAgLCBtX2ZvbnQoKQotICAg
ICwgbV9zY0ZvbnQoKQotewotICAgIFFGb250TWV0cmljcyBtZXRyaWNzKG1fZm9udCk7Ci0gICAg
bV9zcGFjZVdpZHRoID0gbWV0cmljcy53aWR0aChRTGF0aW4xQ2hhcignICcpKTsKLSAgICBxcmVh
bCBwb2ludHNpemUgPSBtX2ZvbnQucG9pbnRTaXplRigpOwotICAgIGlmIChwb2ludHNpemUgPiAw
KQotICAgICAgICBtX3NjRm9udC5zZXRQb2ludFNpemVGKHBvaW50c2l6ZSowLjcpOwotICAgIGVs
c2UKLSAgICAgICAgbV9zY0ZvbnQuc2V0UGl4ZWxTaXplKHFSb3VuZChtX2ZvbnQucGl4ZWxTaXpl
KCkqLjcpKTsKLX0KLQotRm9udDo6Rm9udChjb25zdCBGb250RGVzY3JpcHRpb24mIGRlc2NyaXB0
aW9uLCBzaG9ydCBsZXR0ZXJTcGFjaW5nLCBzaG9ydCB3b3JkU3BhY2luZykKLSAgICA6IG1fZm9u
dERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKQotICAgICwgbV9sZXR0ZXJTcGFjaW5nKGxldHRlclNw
YWNpbmcpCi0gICAgLCBtX3dvcmRTcGFjaW5nKHdvcmRTcGFjaW5nKQotewotICAgIGNvbnN0IEZv
bnRGYW1pbHkqIGZhbWlseSA9ICZkZXNjcmlwdGlvbi5mYW1pbHkoKTsKLSAgICBRU3RyaW5nIGZh
bWlseU5hbWU7Ci0gICAgd2hpbGUgKGZhbWlseSkgewotICAgICAgICBmYW1pbHlOYW1lICs9IGZh
bWlseS0+ZmFtaWx5KCk7Ci0gICAgICAgIGZhbWlseSA9IGZhbWlseS0+bmV4dCgpOwotICAgICAg
ICBpZiAoZmFtaWx5KQotICAgICAgICAgICAgZmFtaWx5TmFtZSArPSBRTGF0aW4xQ2hhcignLCcp
OwotICAgIH0KLQotICAgIG1fZm9udC5zZXRGYW1pbHkoZmFtaWx5TmFtZSk7Ci0gICAgbV9mb250
LnNldFBpeGVsU2l6ZShxUm91bmQoZGVzY3JpcHRpb24uY29tcHV0ZWRTaXplKCkpKTsKLSAgICBt
X2ZvbnQuc2V0SXRhbGljKGRlc2NyaXB0aW9uLml0YWxpYygpKTsKLSAgICAvLyBGSVhNRTogTWFw
IGFsbCBGb250V2VpZ2h0IHZhbHVlcyB0byBRRm9udCB3ZWlnaHRzLgotICAgIGlmIChkZXNjcmlw
dGlvbi53ZWlnaHQoKSA+PSBGb250V2VpZ2h0NjAwKQotICAgICAgICBtX2ZvbnQuc2V0V2VpZ2h0
KFFGb250OjpCb2xkKTsKLSAgICBlbHNlCi0gICAgICAgIG1fZm9udC5zZXRXZWlnaHQoUUZvbnQ6
Ok5vcm1hbCk7Ci0KLSAgICBRRm9udE1ldHJpY3MgbWV0cmljcyA9IFFGb250TWV0cmljcyhtX2Zv
bnQpOwotICAgIG1fc3BhY2VXaWR0aCA9IG1ldHJpY3Mud2lkdGgoUUxhdGluMUNoYXIoJyAnKSk7
Ci0gICAgbV9zY0ZvbnQgPSBtX2ZvbnQ7Ci0gICAgbV9zY0ZvbnQuc2V0UGl4ZWxTaXplKHFSb3Vu
ZChkZXNjcmlwdGlvbi5jb21wdXRlZFNpemUoKSouNykpOwotfQotCi12b2lkIEZvbnQ6OnNldFdv
cmRTcGFjaW5nKHNob3J0IHMpCi17Ci0gICAgbV93b3JkU3BhY2luZyA9IHM7Ci19Ci12b2lkIEZv
bnQ6OnNldExldHRlclNwYWNpbmcoc2hvcnQgcykKLXsKLSAgICBtX2xldHRlclNwYWNpbmcgPSBz
OwotfQotCi1zdGF0aWMgaW50IGdlbmVyYXRlQ29tcG9uZW50cyhWZWN0b3I8VGV4dFJ1bkNvbXBv
bmVudCwgMTAyND4qIGNvbXBvbmVudHMsIGNvbnN0IEZvbnQgJmZvbnQsIGNvbnN0IFRleHRSdW4g
JnJ1bikKLXsKLS8vICAgICBxRGVidWcoKSA8PCAiZ2VuZXJhdGVDb21wb25lbnRzIiA8PCBRU3Ry
aW5nKChjb25zdCBRQ2hhciAqKXJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7Ci0gICAg
aW50IGxldHRlclNwYWNpbmcgPSBmb250LmxldHRlclNwYWNpbmcoKTsKLSAgICBpbnQgd29yZFNw
YWNpbmcgPSBmb250LndvcmRTcGFjaW5nKCk7Ci0gICAgYm9vbCBzbWFsbENhcHMgPSBmb250LmZv
bnREZXNjcmlwdGlvbigpLnNtYWxsQ2FwcygpOwotICAgIGludCBwYWRkaW5nID0gcnVuLnBhZGRp
bmcoKTsKLSAgICBpbnQgbnVtU3BhY2VzID0gMDsKLSAgICBpZiAocGFkZGluZykgewotICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgaWYg
KEZvbnQ6OnRyZWF0QXNTcGFjZShydW5baV0pKQotICAgICAgICAgICAgICAgICsrbnVtU3BhY2Vz
OwotICAgIH0KLQotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGNvbnN0IFFGb250ICpmID0gJmZv
bnQuZm9udCgpOwotICAgIGlmIChsZXR0ZXJTcGFjaW5nIHx8IHNtYWxsQ2FwcykgewotICAgICAg
ICAvLyBuZWVkIHRvIGRyYXcgZXZlcnkgbGV0dGVyIG9uIGl0J3Mgb3duCi0gICAgICAgIGludCBz
dGFydCA9IDA7Ci0gICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2UocnVuWzBdKSkgewotICAg
ICAgICAgICAgaW50IGFkZCA9IDA7Ci0gICAgICAgICAgICBpZiAobnVtU3BhY2VzKSB7Ci0gICAg
ICAgICAgICAgICAgYWRkID0gcGFkZGluZy9udW1TcGFjZXM7Ci0gICAgICAgICAgICAgICAgcGFk
ZGluZyAtPSBhZGQ7Ci0gICAgICAgICAgICAgICAgLS1udW1TcGFjZXM7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudCgxLCBydW4u
cnRsKCksICZmb250LmZvbnQoKSwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gYWRk
ICsgbGV0dGVyU3BhY2luZyArIGNvbXBvbmVudHMtPmxhc3QoKS53aWR0aDsKLSAgICAgICAgICAg
IHN0YXJ0ID0gMTsKLS8vICAgICAgICAgcURlYnVnKCkgPDwgInNwYWNlIGF0IDAiIDw8IG9mZnNl
dDsKLSAgICAgICAgfSBlbHNlIGlmIChzbWFsbENhcHMpIHsKLSAgICAgICAgICAgIGYgPSAoUUNo
YXI6OmNhdGVnb3J5KHJ1blswXSkgPT0gUUNoYXI6OkxldHRlcl9Mb3dlcmNhc2UgPyAmZm9udC5z
Y0ZvbnQoKSA6ICZmb250LmZvbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9
IDE7IGkgPCBydW4ubGVuZ3RoKCk7ICsraSkgewotICAgICAgICAgICAgdWludCBjaCA9IHJ1bltp
XTsKLSAgICAgICAgICAgIGlmIChRQ2hhcihjaCkuaXNIaWdoU3Vycm9nYXRlKCkgJiYgUUNoYXIo
cnVuW2ktMV0pLmlzTG93U3Vycm9nYXRlKCkpCi0gICAgICAgICAgICAgICAgY2ggPSBRQ2hhcjo6
c3Vycm9nYXRlVG9VY3M0KGNoLCBydW5baS0xXSk7Ci0gICAgICAgICAgICBpZiAoUUNoYXIoY2gp
LmlzTG93U3Vycm9nYXRlKCkgfHwgUUNoYXI6OmNhdGVnb3J5KGNoKSA9PSBRQ2hhcjo6TWFya19O
b25TcGFjaW5nKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKEZv
bnQ6OnRyZWF0QXNTcGFjZShydW5baV0pKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFkZCA9IDA7
Ci0vLyAgICAgICAgICAgICAgICAgcURlYnVnKCkgPDwgIiAgICB0cmVhdEFzU3BhY2U6IiA8PCBp
IDw8IHN0YXJ0OwotICAgICAgICAgICAgICAgIGlmIChpIC0gc3RhcnQgPiAwKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KHJ1bi5jaGFy
YWN0ZXJzKCkgKyBzdGFydCwgaSAtIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4ucnRsKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsIG9mZnNldCwgZiA9PSAm
Zm9udC5zY0ZvbnQoKSkpOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50
cy0+bGFzdCgpLndpZHRoICsgbGV0dGVyU3BhY2luZzsKLS8vICAgICAgICAgICAgICAgICAgICAg
cURlYnVnKCkgPDwgIiAgIGFwcGVuZGluZygxKSAiIDw8IGNvbXBvbmVudHMtPmxhc3QoKS5zdHJp
bmcgPDwgY29tcG9uZW50cy0+bGFzdCgpLndpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICBpZiAobnVtU3BhY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZCA9IHBh
ZGRpbmcvbnVtU3BhY2VzOwotICAgICAgICAgICAgICAgICAgICBwYWRkaW5nIC09IGFkZDsKLSAg
ICAgICAgICAgICAgICAgICAgLS1udW1TcGFjZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KDEsIHJ1bi5ydGwo
KSwgJmZvbnQuZm9udCgpLCBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd29y
ZFNwYWNpbmcgKyBhZGQgKyBjb21wb25lbnRzLT5sYXN0KCkud2lkdGggKyBsZXR0ZXJTcGFjaW5n
OwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFsZXR0ZXJTcGFjaW5nKSB7Ci0vLyAgICAgICAg
ICAgICAgICAgcURlYnVnKCkgPDwgaSA8PCBjaGFyKHJ1bltpXSkgPDwgKFFDaGFyOjpjYXRlZ29y
eShjaCkgPT0gUUNoYXI6OkxldHRlcl9Mb3dlcmNhc2UpIDw8Ci0vLyAgICAgICAgICAgICAgICAg
ICAgIFFGb250SW5mbygqZikucG9pbnRTaXplRigpOwotICAgICAgICAgICAgICAgIGlmIChRQ2hh
cjo6Y2F0ZWdvcnkoY2gpID09IFFDaGFyOjpMZXR0ZXJfTG93ZXJjYXNlKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmIChmID09ICZmb250LnNjRm9udCgpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKGYgPT0gJmZvbnQuZm9udCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkg
LSBzdGFydCA+IDApIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1
bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQsIGkgLSBzdGFydCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4ucnRsKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgb2Zm
c2V0LCBmID09ICZmb250LnNjRm9udCgpKSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNv
bXBvbmVudHMtPmxhc3QoKS53aWR0aCArIGxldHRlclNwYWNpbmc7Ci0vLyAgICAgICAgICAgICAg
ICAgcURlYnVnKCkgPDwgIiAgIGFwcGVuZGluZygyKSAiIDw8IGNvbXBvbmVudHMtPmxhc3QoKS5z
dHJpbmcgPDwgY29tcG9uZW50cy0+bGFzdCgpLndpZHRoOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgaWYgKHNtYWxsQ2FwcykKLSAgICAgICAgICAgICAgICBmID0gKFFDaGFyOjpjYXRlZ29y
eShjaCkgPT0gUUNoYXI6OkxldHRlcl9Mb3dlcmNhc2UgPyAmZm9udC5zY0ZvbnQoKSA6ICZmb250
LmZvbnQoKSk7Ci0gICAgICAgICAgICBzdGFydCA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYg
KHJ1bi5sZW5ndGgoKSAtIHN0YXJ0ID4gMCkgewotICAgICAgICAgICAgY29tcG9uZW50cy0+YXBw
ZW5kKFRleHRSdW5Db21wb25lbnQocnVuLmNoYXJhY3RlcnMoKSArIHN0YXJ0LCBydW4ubGVuZ3Ro
KCkgLSBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJ1bi5ydGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGYsIG9mZnNldCwgZiA9PSAmZm9udC5zY0ZvbnQoKSkpOwotICAgICAgICAgICAgb2Zm
c2V0ICs9IGNvbXBvbmVudHMtPmxhc3QoKS53aWR0aDsKLS8vICAgICAgICAgICAgIHFEZWJ1Zygp
IDw8ICIgICBhcHBlbmRpbmcoMykgIiA8PCBjb21wb25lbnRzLT5sYXN0KCkuc3RyaW5nIDw8IGNv
bXBvbmVudHMtPmxhc3QoKS53aWR0aDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGV0
dGVyU3BhY2luZzsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICBp
ZiAoRm9udDo6dHJlYXRBc1NwYWNlKHJ1bltpXSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSAt
IHN0YXJ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4
dFJ1bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQsIGkgLSBzdGFydCwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLnJ0
bCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmLCBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBvbmVu
dHMtPmxhc3QoKS53aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50
IGFkZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG51bVNwYWNlcykgewotICAgICAgICAgICAg
ICAgICAgICBhZGQgPSBwYWRkaW5nL251bVNwYWNlczsKLSAgICAgICAgICAgICAgICAgICAgcGFk
ZGluZyAtPSBhZGQ7Ci0gICAgICAgICAgICAgICAgICAgIC0tbnVtU3BhY2VzOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBv
bmVudCgxLCBydW4ucnRsKCksICZmb250LmZvbnQoKSwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICAg
ICAgb2Zmc2V0ICs9IGFkZCArIGNvbXBvbmVudHMtPmxhc3QoKS53aWR0aDsKLSAgICAgICAgICAg
ICAgICBpZiAoaSkKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHdvcmRTcGFjaW5nOwot
ICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICAgICAgaWYgKHJ1bi5sZW5ndGgoKSAtIHN0YXJ0ID4gMCkgewotICAgICAgICAgICAgY29t
cG9uZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25lbnQocnVuLmNoYXJhY3RlcnMoKSArIHN0YXJ0
LCBydW4ubGVuZ3RoKCkgLSBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJ1bi5ydGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGYsIG9mZnNldCkpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IGNv
bXBvbmVudHMtPmxhc3QoKS53aWR0aDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb2Zm
c2V0OwotfQotCi12b2lkIEZvbnQ6OmRyYXdUZXh0KEdyYXBoaWNzQ29udGV4dCogY3R4LCBjb25z
dCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRv
KSBjb25zdAotewotICAgIGlmICh0byA8IDApCi0gICAgICAgIHRvID0gcnVuLmxlbmd0aCgpOwot
ICAgIFFQYWludGVyICpwID0gY3R4LT5wbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBDb2xvciBjb2xv
ciA9IGN0eC0+ZmlsbENvbG9yKCk7Ci0gICAgcC0+c2V0UGVuKFFDb2xvcihjb2xvcikpOwotCi0g
ICAgVmVjdG9yPFRleHRSdW5Db21wb25lbnQsIDEwMjQ+IGNvbXBvbmVudHM7Ci0gICAgaW50IHcg
PSBnZW5lcmF0ZUNvbXBvbmVudHMoJmNvbXBvbmVudHMsICp0aGlzLCBydW4pOwotCi0gICAgaWYg
KGZyb20gPiAwIHx8IHRvIDwgcnVuLmxlbmd0aCgpKSB7Ci0gICAgICAgIEZsb2F0UmVjdCBjbGlw
ID0gc2VsZWN0aW9uUmVjdEZvclRleHQocnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEludFBvaW50KHFSb3VuZChwb2ludC54KCkpLCBxUm91bmQocG9p
bnQueSgpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UUZvbnRNZXRyaWNzKG1fZm9udCkuaGVpZ2h0KCksIGZyb20sIHRvKTsKLSAgICAgICAgUVJlY3RG
IHJlY3QoY2xpcC54KCksIGNsaXAueSgpIC0gYXNjZW50KCksIGNsaXAud2lkdGgoKSwgY2xpcC5o
ZWlnaHQoKSk7Ci0gICAgICAgIHAtPnNhdmUoKTsKLSAgICAgICAgcC0+c2V0Q2xpcFJlY3QocmVj
dC50b1JlY3QoKSk7Ci0gICAgfQotCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBmb3Ig
KGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlm
ICghY29tcG9uZW50cy5hdChpKS5pc1NwYWNlKCkpIHsKLSAgICAgICAgICAgICAgICBwLT5zZXRG
b250KCpjb21wb25lbnRzLmF0KGkpLmZvbnQpOwotICAgICAgICAgICAgICAgIFFQb2ludEYgcHQo
cG9pbnQueCgpICsgdyAtIGNvbXBvbmVudHMuYXQoaSkub2Zmc2V0IC0gY29tcG9uZW50cy5hdChp
KS53aWR0aCwgcG9pbnQueSgpKTsKLSAgICAgICAgICAgICAgICBwLT5kcmF3VGV4dChwdCwgY29t
cG9uZW50cy5hdChpKS5zdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgKytp
KSB7Ci0gICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuYXQoaSkuaXNTcGFjZSgpKSB7Ci0gICAg
ICAgICAgICAgICAgcC0+c2V0Rm9udCgqY29tcG9uZW50cy5hdChpKS5mb250KTsKLSAgICAgICAg
ICAgICAgICBRUG9pbnRGIHB0KHBvaW50LngoKSArIGNvbXBvbmVudHMuYXQoaSkub2Zmc2V0LCBw
b2ludC55KCkpOwotICAgICAgICAgICAgICAgIHAtPmRyYXdUZXh0KHB0LCBjb21wb25lbnRzLmF0
KGkpLnN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZy
b20gPiAwIHx8IHRvIDwgcnVuLmxlbmd0aCgpKQotICAgICAgICBwLT5yZXN0b3JlKCk7Ci19Ci0K
LWludCBGb250Ojp3aWR0aChjb25zdCBUZXh0UnVuJiBydW4pIGNvbnN0Ci17Ci0gICAgVmVjdG9y
PFRleHRSdW5Db21wb25lbnQsIDEwMjQ+IGNvbXBvbmVudHM7Ci0gICAgaW50IHcgPSBnZW5lcmF0
ZUNvbXBvbmVudHMoJmNvbXBvbmVudHMsICp0aGlzLCBydW4pOwotCi0vLyAgICAgcURlYnVnKCkg
PDwgIiAgICAgd2lkdGg9IiA8PCB3OwotICAgIHJldHVybiB3OwotfQotCi1mbG9hdCBGb250Ojpm
bG9hdFdpZHRoKGNvbnN0IFRleHRSdW4mIHJ1bikgY29uc3QKLXsKLSAgICByZXR1cm4gd2lkdGgo
cnVuKTsKLX0KLQotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aChjb25zdCBUZXh0UnVuJiBydW4sIGlu
dCAvKmV4dHJhQ2hhcnNBdmFpbGFibGUqLywgaW50JiBjaGFyc0NvbnN1bWVkLCBTdHJpbmcmIGds
eXBoTmFtZSkgY29uc3QKK1FGb250IEZvbnQ6OmZvbnQoKSBjb25zdAogewotICAgIGNoYXJzQ29u
c3VtZWQgPSBydW4ubGVuZ3RoKCk7Ci0gICAgZ2x5cGhOYW1lID0gIiI7Ci0gICAgcmV0dXJuIHdp
ZHRoKHJ1bik7CisgICAgcmV0dXJuIHByaW1hcnlGb250KCktPmdldFF0Rm9udCgpOwogfQogCi1p
bnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb24oY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgcG9zaXRp
b24sIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Ci17Ci0gICAgVmVjdG9yPFRleHRS
dW5Db21wb25lbnQsIDEwMjQ+IGNvbXBvbmVudHM7Ci0gICAgaW50IHcgPSBnZW5lcmF0ZUNvbXBv
bmVudHMoJmNvbXBvbmVudHMsICp0aGlzLCBydW4pOwotCi0gICAgaW50IG9mZnNldCA9IDA7Ci0g
ICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVu
dHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCB4ZSA9IHcgLSBjb21wb25lbnRzLmF0
KGkpLm9mZnNldDsKLSAgICAgICAgICAgIGludCB4cyA9IHhlIC0gY29tcG9uZW50cy5hdChpKS53
aWR0aDsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSB4cykgewotICAgICAgICAgICAgICAg
IFFUZXh0TGF5b3V0IGxheW91dChjb21wb25lbnRzLmF0KGkpLnN0cmluZywgKmNvbXBvbmVudHMu
YXQoaSkuZm9udCk7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LmJlZ2luTGF5b3V0KCk7Ci0gICAg
ICAgICAgICAgICAgUVRleHRMaW5lIGwgPSBsYXlvdXQuY3JlYXRlTGluZSgpOwotICAgICAgICAg
ICAgICAgIGlmICghbC5pc1ZhbGlkKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZz
ZXQ7Ci0KLSAgICAgICAgICAgICAgICBsLnNldExpbmVXaWR0aChJTlRfTUFYLzI1Nik7Ci0gICAg
ICAgICAgICAgICAgbGF5b3V0LmVuZExheW91dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBv
c2l0aW9uIC0geHMgPj0gbC53aWR0aCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zm
c2V0OwotICAgICAgICAgICAgICAgIGludCBjdXJzb3IgPSBsLnhUb0N1cnNvcihwb3NpdGlvbiAt
IHhzKTsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID4gMSkKLSAgICAgICAgICAgICAgICAg
ICAgLS1jdXJzb3I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIGN1cnNvcjsKLSAg
ICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBvbmVudHMu
YXQoaSkuc3RyaW5nLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
IH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7
ICsraSkgewotICAgICAgICAgICAgaW50IHhzID0gY29tcG9uZW50cy5hdChpKS5vZmZzZXQ7Ci0g
ICAgICAgICAgICBpbnQgeGUgPSB4cyArIGNvbXBvbmVudHMuYXQoaSkud2lkdGg7Ci0gICAgICAg
ICAgICBpZiAocG9zaXRpb24gPD0geGUpIHsKLSAgICAgICAgICAgICAgICBRVGV4dExheW91dCBs
YXlvdXQoY29tcG9uZW50cy5hdChpKS5zdHJpbmcsICpjb21wb25lbnRzLmF0KGkpLmZvbnQpOwot
ICAgICAgICAgICAgICAgIGxheW91dC5iZWdpbkxheW91dCgpOwotICAgICAgICAgICAgICAgIFFU
ZXh0TGluZSBsID0gbGF5b3V0LmNyZWF0ZUxpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWwu
aXNWYWxpZCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwotCi0gICAgICAg
ICAgICAgICAgbC5zZXRMaW5lV2lkdGgoSU5UX01BWC8yNTYpOwotICAgICAgICAgICAgICAgIGxh
eW91dC5lbmRMYXlvdXQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAtIHhzID49
IGwud2lkdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIGNvbXBvbmVu
dHMuYXQoaSkuc3RyaW5nLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICBpbnQgY3Vyc29y
ID0gbC54VG9DdXJzb3IocG9zaXRpb24gLSB4cyk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNv
ciA+IDEpCi0gICAgICAgICAgICAgICAgICAgIC0tY3Vyc29yOwotICAgICAgICAgICAgICAgIHJl
dHVybiBvZmZzZXQgKyBjdXJzb3I7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIG9mZnNldCArPSBjb21wb25lbnRzLmF0KGkpLnN0cmluZy5sZW5ndGgoKSAtIDE7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJ1bi5sZW5ndGgoKTsKIH0K
IAotc3RhdGljIGZsb2F0IGN1cnNvclRvWChjb25zdCBWZWN0b3I8VGV4dFJ1bkNvbXBvbmVudCwg
MTAyND4mIGNvbXBvbmVudHMsIGludCB3aWR0aCwgYm9vbCBydGwsIGludCBjdXJzb3IpCi17Ci0g
ICAgaW50IHN0YXJ0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMuc2l6
ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKHN0YXJ0ICsgY29tcG9uZW50cy5hdChpKS5zdHJpbmcu
bGVuZ3RoKCkgLSAxIDwgY3Vyc29yKSB7Ci0gICAgICAgICAgICBzdGFydCArPSBjb21wb25lbnRz
LmF0KGkpLnN0cmluZy5sZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgfQotICAgICAgICBpbnQgeHMgPSBjb21wb25lbnRzLmF0KGkpLm9mZnNldDsKLSAgICAgICAg
aWYgKHJ0bCkKLSAgICAgICAgICAgIHhzID0gd2lkdGggLSB4cyAtIGNvbXBvbmVudHMuYXQoaSku
d2lkdGg7Ci0gICAgICAgIFFUZXh0TGF5b3V0IGxheW91dChjb21wb25lbnRzLmF0KGkpLnN0cmlu
ZywgKmNvbXBvbmVudHMuYXQoaSkuZm9udCk7Ci0gICAgICAgIGxheW91dC5iZWdpbkxheW91dCgp
OwotICAgICAgICBRVGV4dExpbmUgbCA9IGxheW91dC5jcmVhdGVMaW5lKCk7Ci0gICAgICAgIGlm
ICghbC5pc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBsLnNldExp
bmVXaWR0aChJTlRfTUFYLzI1Nik7Ci0gICAgICAgIGxheW91dC5lbmRMYXlvdXQoKTsKLQotICAg
ICAgICByZXR1cm4geHMgKyBsLmN1cnNvclRvWChjdXJzb3IgLSBzdGFydCArIDEpOwotICAgIH0K
LSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9y
VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwdCwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QK
LXsKLSAgICBWZWN0b3I8VGV4dFJ1bkNvbXBvbmVudCwgMTAyND4gY29tcG9uZW50czsKLSAgICBp
bnQgdyA9IGdlbmVyYXRlQ29tcG9uZW50cygmY29tcG9uZW50cywgKnRoaXMsIHJ1bik7Ci0KLSAg
ICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHJ1bi5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIEZs
b2F0UmVjdChwdC54KCksIHB0LnkoKSwgdywgaCk7Ci0KLSAgICBmbG9hdCB4MSA9IGN1cnNvclRv
WChjb21wb25lbnRzLCB3LCBydW4ucnRsKCksIGZyb20pOwotICAgIGZsb2F0IHgyID0gY3Vyc29y
VG9YKGNvbXBvbmVudHMsIHcsIHJ1bi5ydGwoKSwgdG8pOwotICAgIGlmICh4MiA8IHgxKQotICAg
ICAgICBxU3dhcCh4MSwgeDIpOwotCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4MSwg
cHQueSgpLCB4MiAtIHgxLCBoKTsKLX0KICNlbmRpZgogCi0KLUZvbnQ6On5Gb250KCkKLXsKLX0K
LQotRm9udDo6Rm9udChjb25zdCBGb250JiBvdGhlcikKLSAgICA6IG1fZm9udERlc2NyaXB0aW9u
KG90aGVyLm1fZm9udERlc2NyaXB0aW9uKQotICAgICwgbV9sZXR0ZXJTcGFjaW5nKG90aGVyLm1f
bGV0dGVyU3BhY2luZykKLSAgICAsIG1fd29yZFNwYWNpbmcob3RoZXIubV93b3JkU3BhY2luZykK
LSAgICAsIG1fZm9udChvdGhlci5tX2ZvbnQpCi0gICAgLCBtX3NjRm9udChvdGhlci5tX3NjRm9u
dCkKLSAgICAsIG1fc3BhY2VXaWR0aChvdGhlci5tX3NwYWNlV2lkdGgpCi17Ci19Ci0KLUZvbnQm
IEZvbnQ6Om9wZXJhdG9yPShjb25zdCBGb250JiBvdGhlcikKLXsKLSAgICBtX2ZvbnREZXNjcmlw
dGlvbiA9IG90aGVyLm1fZm9udERlc2NyaXB0aW9uOwotICAgIG1fbGV0dGVyU3BhY2luZyA9IG90
aGVyLm1fbGV0dGVyU3BhY2luZzsKLSAgICBtX3dvcmRTcGFjaW5nID0gb3RoZXIubV93b3JkU3Bh
Y2luZzsKLSAgICBtX2ZvbnQgPSBvdGhlci5tX2ZvbnQ7Ci0gICAgbV9zY0ZvbnQgPSBvdGhlci5t
X3NjRm9udDsKLSAgICBtX3NwYWNlV2lkdGggPSBvdGhlci5tX3NwYWNlV2lkdGg7Ci0gICAgcmV0
dXJuICp0aGlzOwotfQotCi1ib29sIEZvbnQ6Om9wZXJhdG9yPT0oY29uc3QgRm9udCYgb3RoZXIp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZm9udERlc2NyaXB0aW9uID09IG90aGVyLm1fZm9udERl
c2NyaXB0aW9uCi0gICAgICAgICYmIG1fbGV0dGVyU3BhY2luZyA9PSBvdGhlci5tX2xldHRlclNw
YWNpbmcKLSAgICAgICAgJiYgbV93b3JkU3BhY2luZyA9PSBvdGhlci5tX3dvcmRTcGFjaW5nCi0g
ICAgICAgICYmIG1fZm9udCA9PSBvdGhlci5tX2ZvbnQKLSAgICAgICAgJiYgbV9zY0ZvbnQgPT0g
b3RoZXIubV9zY0ZvbnQKLSAgICAgICAgJiYgbV9zcGFjZVdpZHRoID09IG90aGVyLm1fc3BhY2VX
aWR0aDsKLX0KLQotdm9pZCBGb250Ojp1cGRhdGUoUGFzc1JlZlB0cjxGb250U2VsZWN0b3I+KSBj
b25zdAotewotICAgIC8vIGRvbid0IHRoaW5rIHdlIG5lZWQgdGhpcwotfQotCi0KLWJvb2wgRm9u
dDo6aXNGaXhlZFBpdGNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gUUZvbnRJbmZvKG1fZm9udCku
Zml4ZWRQaXRjaCgpOwotfQotCi0vLyBNZXRyaWNzIHRoYXQgd2UgcXVlcnkgdGhlIEZvbnRGYWxs
YmFja0xpc3QgZm9yLgotaW50IEZvbnQ6OmFzY2VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFG
b250TWV0cmljcyhtX2ZvbnQpLmFzY2VudCgpOwotfQotCi1pbnQgRm9udDo6ZGVzY2VudCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIFFGb250TWV0cmljcyhtX2ZvbnQpLmRlc2NlbnQoKTsKLX0KLQot
aW50IEZvbnQ6OmxpbmVTcGFjaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gUUZvbnRNZXRyaWNz
KG1fZm9udCkubGluZVNwYWNpbmcoKTsKLX0KLQotaW50IEZvbnQ6OmxpbmVHYXAoKSBjb25zdAot
ewotICAgIHJldHVybiBRRm9udE1ldHJpY3MobV9mb250KS5sZWFkaW5nKCk7Ci19Ci0KLWZsb2F0
IEZvbnQ6OnhIZWlnaHQoKSBjb25zdAotewotICAgIHJldHVybiBRRm9udE1ldHJpY3MobV9mb250
KS54SGVpZ2h0KCk7Ci19Ci0KLXVuc2lnbmVkIEZvbnQ6OnVuaXRzUGVyRW0oKSBjb25zdAotewot
ICAgIHJldHVybiAxOyAvLyBGSVhNRSEKLX0KLQotaW50IEZvbnQ6OnNwYWNlV2lkdGgoKSBjb25z
dAotewotICAgIHJldHVybiBtX3NwYWNlV2lkdGg7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvRm9udFF0NDMuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9xdC9Gb250UXQ0My5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uMjRkMTQzOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
cXQvRm9udFF0NDMuY3BwCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICAgIENvcHlyaWdodCAoQykg
MjAwNyBUcm9sbHRlY2ggQVNBCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBl
dGVyIEZyZXl0aGVyCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisK
KyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnQuaCIK
KyNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0
LmgiCisjaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlIDxRVGV4dExheW91dD4KKyNpbmNsdWRlIDxRUGFpbnRlcj4KKyNpbmNs
dWRlIDxRRm9udE1ldHJpY3M+CisjaW5jbHVkZSA8UUZvbnRJbmZvPgorI2luY2x1ZGUgPHFhbGdv
cml0aG1zLmg+CisjaW5jbHVkZSA8cWRlYnVnLmg+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKwor
I2lmIFFUX1ZFUlNJT04gPCAweDA0MDQwMAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVj
dCBUZXh0UnVuQ29tcG9uZW50IHsKKyAgICBUZXh0UnVuQ29tcG9uZW50KCkgOiBmb250KDApIHt9
CisgICAgVGV4dFJ1bkNvbXBvbmVudChjb25zdCBVQ2hhciAqc3RhcnQsIGludCBsZW5ndGgsIGJv
b2wgcnRsLCBjb25zdCBRRm9udCAqZm9udCwgaW50IG9mZnNldCwgYm9vbCBzYyA9IGZhbHNlKTsK
KyAgICBUZXh0UnVuQ29tcG9uZW50KGludCBzcGFjZXMsIGJvb2wgcnRsLCBjb25zdCBRRm9udCAq
Zm9udCwgaW50IG9mZnNldCk7CisKKyAgICBpbmxpbmUgYm9vbCBpc1NwYWNlKCkgY29uc3QgeyBy
ZXR1cm4gc3BhY2VzICE9IDA7IH0KKworICAgIFFTdHJpbmcgc3RyaW5nOworICAgIGNvbnN0IFFG
b250ICpmb250OworICAgIGludCB3aWR0aDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBzcGFj
ZXM7Cit9OworCitUZXh0UnVuQ29tcG9uZW50OjpUZXh0UnVuQ29tcG9uZW50KGNvbnN0IFVDaGFy
ICpzdGFydCwgaW50IGxlbmd0aCwgYm9vbCBydGwsIGNvbnN0IFFGb250ICpmLCBpbnQgbywgYm9v
bCBzYykKKyAgICA6IHN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IFFDaGFyKj4oc3RhcnQp
LCBsZW5ndGgpCisgICAgLCBmb250KGYpCisgICAgLCBvZmZzZXQobykKKyAgICAsIHNwYWNlcygw
KQoreworICAgIGlmIChzYykKKyAgICAgICAgc3RyaW5nID0gc3RyaW5nLnRvVXBwZXIoKTsKKyAg
ICBzdHJpbmcucHJlcGVuZChydGwgPyBRQ2hhcigweDIwMmUpIDogUUNoYXIoMHgyMDJkKSk7Cisg
ICAgd2lkdGggPSBRRm9udE1ldHJpY3MoKmZvbnQpLndpZHRoKHN0cmluZyk7Cit9CisKK1RleHRS
dW5Db21wb25lbnQ6OlRleHRSdW5Db21wb25lbnQoaW50IHMsIGJvb2wgcnRsLCBjb25zdCBRRm9u
dCAqZiwgaW50IG8pCisgICAgOiBzdHJpbmcocywgUUxhdGluMUNoYXIoJyAnKSkKKyAgICAsIGZv
bnQoZikKKyAgICAsIG9mZnNldChvKQorICAgICwgc3BhY2VzKHMpCit7CisgICAgc3RyaW5nLnBy
ZXBlbmQocnRsID8gUUNoYXIoMHgyMDJlKSA6IFFDaGFyKDB4MjAyZCkpOworICAgIHdpZHRoID0g
c3BhY2VzICogUUZvbnRNZXRyaWNzKCpmb250KS53aWR0aChRTGF0aW4xQ2hhcignICcpKTsKK30K
KworCitzdGF0aWMgaW50IGdlbmVyYXRlQ29tcG9uZW50cyhWZWN0b3I8VGV4dFJ1bkNvbXBvbmVu
dCwgMTAyND4qIGNvbXBvbmVudHMsIGNvbnN0IEZvbnQgJmZvbnQsIGNvbnN0IFRleHRSdW4gJnJ1
bikKK3sKKy8vICAgICBxRGVidWcoKSA8PCAiZ2VuZXJhdGVDb21wb25lbnRzIiA8PCBRU3RyaW5n
KChjb25zdCBRQ2hhciAqKXJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSk7CisgICAgaW50
IGxldHRlclNwYWNpbmcgPSBmb250LmxldHRlclNwYWNpbmcoKTsKKyAgICBpbnQgd29yZFNwYWNp
bmcgPSBmb250LndvcmRTcGFjaW5nKCk7CisgICAgYm9vbCBzbWFsbENhcHMgPSBmb250LmZvbnRE
ZXNjcmlwdGlvbigpLnNtYWxsQ2FwcygpOworICAgIGludCBwYWRkaW5nID0gcnVuLnBhZGRpbmco
KTsKKyAgICBpbnQgbnVtU3BhY2VzID0gMDsKKyAgICBpZiAocGFkZGluZykgeworICAgICAgICBm
b3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5ndGgoKTsgaSsrKQorICAgICAgICAgICAgaWYgKEZv
bnQ6OnRyZWF0QXNTcGFjZShydW5baV0pKQorICAgICAgICAgICAgICAgICsrbnVtU3BhY2VzOwor
ICAgIH0KKworICAgIGludCBvZmZzZXQgPSAwOworICAgIGNvbnN0IFFGb250ICpmID0gJmZvbnQu
Zm9udCgpOworICAgIGlmIChsZXR0ZXJTcGFjaW5nIHx8IHNtYWxsQ2FwcykgeworICAgICAgICAv
LyBuZWVkIHRvIGRyYXcgZXZlcnkgbGV0dGVyIG9uIGl0J3Mgb3duCisgICAgICAgIGludCBzdGFy
dCA9IDA7CisgICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2UocnVuWzBdKSkgeworICAgICAg
ICAgICAgaW50IGFkZCA9IDA7CisgICAgICAgICAgICBpZiAobnVtU3BhY2VzKSB7CisgICAgICAg
ICAgICAgICAgYWRkID0gcGFkZGluZy9udW1TcGFjZXM7CisgICAgICAgICAgICAgICAgcGFkZGlu
ZyAtPSBhZGQ7CisgICAgICAgICAgICAgICAgLS1udW1TcGFjZXM7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudCgxLCBydW4ucnRs
KCksICZmb250LmZvbnQoKSwgb2Zmc2V0KSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gYWRkICsg
bGV0dGVyU3BhY2luZyArIGNvbXBvbmVudHMtPmxhc3QoKS53aWR0aDsKKyAgICAgICAgICAgIHN0
YXJ0ID0gMTsKKy8vICAgICAgICAgcURlYnVnKCkgPDwgInNwYWNlIGF0IDAiIDw8IG9mZnNldDsK
KyAgICAgICAgfSBlbHNlIGlmIChzbWFsbENhcHMpIHsKKyAgICAgICAgICAgIGYgPSAoUUNoYXI6
OmNhdGVnb3J5KHJ1blswXSkgPT0gUUNoYXI6OkxldHRlcl9Mb3dlcmNhc2UgPyAmZm9udC5zY0Zv
bnQoKSA6ICZmb250LmZvbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7
IGkgPCBydW4ubGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgICAgdWludCBjaCA9IHJ1bltpXTsK
KyAgICAgICAgICAgIGlmIChRQ2hhcihjaCkuaXNIaWdoU3Vycm9nYXRlKCkgJiYgUUNoYXIocnVu
W2ktMV0pLmlzTG93U3Vycm9nYXRlKCkpCisgICAgICAgICAgICAgICAgY2ggPSBRQ2hhcjo6c3Vy
cm9nYXRlVG9VY3M0KGNoLCBydW5baS0xXSk7CisgICAgICAgICAgICBpZiAoUUNoYXIoY2gpLmlz
TG93U3Vycm9nYXRlKCkgfHwgUUNoYXI6OmNhdGVnb3J5KGNoKSA9PSBRQ2hhcjo6TWFya19Ob25T
cGFjaW5nKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKEZvbnQ6
OnRyZWF0QXNTcGFjZShydW5baV0pKSB7CisgICAgICAgICAgICAgICAgaW50IGFkZCA9IDA7Cisv
LyAgICAgICAgICAgICAgICAgcURlYnVnKCkgPDwgIiAgICB0cmVhdEFzU3BhY2U6IiA8PCBpIDw8
IHN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChpIC0gc3RhcnQgPiAwKSB7CisgICAgICAgICAg
ICAgICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KHJ1bi5jaGFyYWN0
ZXJzKCkgKyBzdGFydCwgaSAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBydW4ucnRsKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsIG9mZnNldCwgZiA9PSAmZm9u
dC5zY0ZvbnQoKSkpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50cy0+
bGFzdCgpLndpZHRoICsgbGV0dGVyU3BhY2luZzsKKy8vICAgICAgICAgICAgICAgICAgICAgcURl
YnVnKCkgPDwgIiAgIGFwcGVuZGluZygxKSAiIDw8IGNvbXBvbmVudHMtPmxhc3QoKS5zdHJpbmcg
PDwgY29tcG9uZW50cy0+bGFzdCgpLndpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBpZiAobnVtU3BhY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IHBhZGRp
bmcvbnVtU3BhY2VzOworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nIC09IGFkZDsKKyAgICAg
ICAgICAgICAgICAgICAgLS1udW1TcGFjZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KDEsIHJ1bi5ydGwoKSwg
JmZvbnQuZm9udCgpLCBvZmZzZXQpKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd29yZFNw
YWNpbmcgKyBhZGQgKyBjb21wb25lbnRzLT5sYXN0KCkud2lkdGggKyBsZXR0ZXJTcGFjaW5nOwor
ICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7CisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFsZXR0ZXJTcGFjaW5nKSB7CisvLyAgICAgICAgICAg
ICAgICAgcURlYnVnKCkgPDwgaSA8PCBjaGFyKHJ1bltpXSkgPDwgKFFDaGFyOjpjYXRlZ29yeShj
aCkgPT0gUUNoYXI6OkxldHRlcl9Mb3dlcmNhc2UpIDw8CisvLyAgICAgICAgICAgICAgICAgICAg
IFFGb250SW5mbygqZikucG9pbnRTaXplRigpOworICAgICAgICAgICAgICAgIGlmIChRQ2hhcjo6
Y2F0ZWdvcnkoY2gpID09IFFDaGFyOjpMZXR0ZXJfTG93ZXJjYXNlKSB7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChmID09ICZmb250LnNjRm9udCgpKQorICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKGYgPT0gJmZvbnQuZm9udCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgLSBz
dGFydCA+IDApIHsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNv
bXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQsIGkgLSBzdGFydCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4ucnRsKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgb2Zmc2V0
LCBmID09ICZmb250LnNjRm9udCgpKSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBv
bmVudHMtPmxhc3QoKS53aWR0aCArIGxldHRlclNwYWNpbmc7CisvLyAgICAgICAgICAgICAgICAg
cURlYnVnKCkgPDwgIiAgIGFwcGVuZGluZygyKSAiIDw8IGNvbXBvbmVudHMtPmxhc3QoKS5zdHJp
bmcgPDwgY29tcG9uZW50cy0+bGFzdCgpLndpZHRoOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKHNtYWxsQ2FwcykKKyAgICAgICAgICAgICAgICBmID0gKFFDaGFyOjpjYXRlZ29yeShj
aCkgPT0gUUNoYXI6OkxldHRlcl9Mb3dlcmNhc2UgPyAmZm9udC5zY0ZvbnQoKSA6ICZmb250LmZv
bnQoKSk7CisgICAgICAgICAgICBzdGFydCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1
bi5sZW5ndGgoKSAtIHN0YXJ0ID4gMCkgeworICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5k
KFRleHRSdW5Db21wb25lbnQocnVuLmNoYXJhY3RlcnMoKSArIHN0YXJ0LCBydW4ubGVuZ3RoKCkg
LSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJ1bi5ydGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGYsIG9mZnNldCwgZiA9PSAmZm9udC5zY0ZvbnQoKSkpOworICAgICAgICAgICAgb2Zmc2V0
ICs9IGNvbXBvbmVudHMtPmxhc3QoKS53aWR0aDsKKy8vICAgICAgICAgICAgIHFEZWJ1ZygpIDw8
ICIgICBhcHBlbmRpbmcoMykgIiA8PCBjb21wb25lbnRzLT5sYXN0KCkuc3RyaW5nIDw8IGNvbXBv
bmVudHMtPmxhc3QoKS53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gbGV0dGVy
U3BhY2luZzsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBm
b3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAo
Rm9udDo6dHJlYXRBc1NwYWNlKHJ1bltpXSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAtIHN0
YXJ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1
bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQsIGkgLSBzdGFydCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLnJ0bCgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmLCBvZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBvbmVudHMt
Pmxhc3QoKS53aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGFk
ZCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG51bVNwYWNlcykgeworICAgICAgICAgICAgICAg
ICAgICBhZGQgPSBwYWRkaW5nL251bVNwYWNlczsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGlu
ZyAtPSBhZGQ7CisgICAgICAgICAgICAgICAgICAgIC0tbnVtU3BhY2VzOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVu
dCgxLCBydW4ucnRsKCksICZmb250LmZvbnQoKSwgb2Zmc2V0KSk7CisgICAgICAgICAgICAgICAg
b2Zmc2V0ICs9IGFkZCArIGNvbXBvbmVudHMtPmxhc3QoKS53aWR0aDsKKyAgICAgICAgICAgICAg
ICBpZiAoaSkKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHdvcmRTcGFjaW5nOworICAg
ICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKHJ1bi5sZW5ndGgoKSAtIHN0YXJ0ID4gMCkgeworICAgICAgICAgICAgY29tcG9u
ZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25lbnQocnVuLmNoYXJhY3RlcnMoKSArIHN0YXJ0LCBy
dW4ubGVuZ3RoKCkgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJ1bi5ydGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGYsIG9mZnNldCkpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBv
bmVudHMtPmxhc3QoKS53aWR0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0
OworfQorCit2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGN0eCwg
Y29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGlu
dCB0bykgY29uc3QKK3sKKyAgICBpZiAodG8gPCAwKQorICAgICAgICB0byA9IHJ1bi5sZW5ndGgo
KTsKKworICAgIFFQYWludGVyICpwID0gY3R4LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBDb2xv
ciBjb2xvciA9IGN0eC0+ZmlsbENvbG9yKCk7CisgICAgcC0+c2V0UGVuKFFDb2xvcihjb2xvcikp
OworCisgICAgVmVjdG9yPFRleHRSdW5Db21wb25lbnQsIDEwMjQ+IGNvbXBvbmVudHM7CisgICAg
aW50IHcgPSBnZW5lcmF0ZUNvbXBvbmVudHMoJmNvbXBvbmVudHMsICp0aGlzLCBydW4pOworCisg
ICAgaWYgKGZyb20gPiAwIHx8IHRvIDwgcnVuLmxlbmd0aCgpKSB7CisgICAgICAgIEZsb2F0UmVj
dCBjbGlwID0gc2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KHJ1biwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRQb2ludChxUm91bmQocG9pbnQueCgp
KSwgcVJvdW5kKHBvaW50LnkoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFFGb250TWV0cmljcyhmb250KCkpLmhlaWdodCgpLCBmcm9tLCB0byk7Cisg
ICAgICAgIFFSZWN0RiByZWN0KGNsaXAueCgpLCBjbGlwLnkoKSAtIGFzY2VudCgpLCBjbGlwLndp
ZHRoKCksIGNsaXAuaGVpZ2h0KCkpOworICAgICAgICBwLT5zYXZlKCk7CisgICAgICAgIHAtPnNl
dENsaXBSZWN0KHJlY3QudG9SZWN0KCkpOworICAgIH0KKworICAgIGlmIChydW4ucnRsKCkpIHsK
KyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuYXQoaSkuaXNTcGFjZSgpKSB7CisgICAgICAgICAg
ICAgICAgcC0+c2V0Rm9udCgqY29tcG9uZW50cy5hdChpKS5mb250KTsKKyAgICAgICAgICAgICAg
ICBRUG9pbnRGIHB0KHBvaW50LngoKSArIHcgLSBjb21wb25lbnRzLmF0KGkpLm9mZnNldCAtIGNv
bXBvbmVudHMuYXQoaSkud2lkdGgsIHBvaW50LnkoKSk7CisgICAgICAgICAgICAgICAgcC0+ZHJh
d1RleHQocHQsIGNvbXBvbmVudHMuYXQoaSkuc3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50
cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCFjb21wb25lbnRzLmF0KGkpLmlzU3Bh
Y2UoKSkgeworICAgICAgICAgICAgICAgIHAtPnNldEZvbnQoKmNvbXBvbmVudHMuYXQoaSkuZm9u
dCk7CisgICAgICAgICAgICAgICAgUVBvaW50RiBwdChwb2ludC54KCkgKyBjb21wb25lbnRzLmF0
KGkpLm9mZnNldCwgcG9pbnQueSgpKTsKKyAgICAgICAgICAgICAgICBwLT5kcmF3VGV4dChwdCwg
Y29tcG9uZW50cy5hdChpKS5zdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorICAgIGlmIChmcm9tID4gMCB8fCB0byA8IHJ1bi5sZW5ndGgoKSkKKyAgICAgICAgcC0+cmVz
dG9yZSgpOworfQorCitmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3Qg
VGV4dFJ1biYgcnVuKSBjb25zdAoreworICAgIFZlY3RvcjxUZXh0UnVuQ29tcG9uZW50LCAxMDI0
PiBjb21wb25lbnRzOworICAgIGludCB3ID0gZ2VuZXJhdGVDb21wb25lbnRzKCZjb21wb25lbnRz
LCAqdGhpcywgcnVuKTsKKworICAgIHJldHVybiB3OworfQorCitpbnQgRm9udDo6b2Zmc2V0Rm9y
UG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGludCBwb3NpdGlvbiwg
Ym9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKK3sKKyAgICBWZWN0b3I8VGV4dFJ1bkNv
bXBvbmVudCwgMTAyND4gY29tcG9uZW50czsKKyAgICBpbnQgdyA9IGdlbmVyYXRlQ29tcG9uZW50
cygmY29tcG9uZW50cywgKnRoaXMsIHJ1bik7CisKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBp
ZiAocnVuLnJ0bCgpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5z
aXplKCk7ICsraSkgeworICAgICAgICAgICAgaW50IHhlID0gdyAtIGNvbXBvbmVudHMuYXQoaSku
b2Zmc2V0OworICAgICAgICAgICAgaW50IHhzID0geGUgLSBjb21wb25lbnRzLmF0KGkpLndpZHRo
OworICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IHhzKSB7CisgICAgICAgICAgICAgICAgUVRl
eHRMYXlvdXQgbGF5b3V0KGNvbXBvbmVudHMuYXQoaSkuc3RyaW5nLCAqY29tcG9uZW50cy5hdChp
KS5mb250KTsKKyAgICAgICAgICAgICAgICBsYXlvdXQuYmVnaW5MYXlvdXQoKTsKKyAgICAgICAg
ICAgICAgICBRVGV4dExpbmUgbCA9IGxheW91dC5jcmVhdGVMaW5lKCk7CisgICAgICAgICAgICAg
ICAgaWYgKCFsLmlzVmFsaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsK
KworICAgICAgICAgICAgICAgIGwuc2V0TGluZVdpZHRoKElOVF9NQVgvMjU2KTsKKyAgICAgICAg
ICAgICAgICBsYXlvdXQuZW5kTGF5b3V0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRp
b24gLSB4cyA+PSBsLndpZHRoKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7
CisgICAgICAgICAgICAgICAgaW50IGN1cnNvciA9IGwueFRvQ3Vyc29yKHBvc2l0aW9uIC0geHMp
OworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPiAxKQorICAgICAgICAgICAgICAgICAgICAt
LWN1cnNvcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgY3Vyc29yOworICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50cy5hdChp
KS5zdHJpbmcubGVuZ3RoKCkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBl
bHNlIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgKytp
KSB7CisgICAgICAgICAgICBpbnQgeHMgPSBjb21wb25lbnRzLmF0KGkpLm9mZnNldDsKKyAgICAg
ICAgICAgIGludCB4ZSA9IHhzICsgY29tcG9uZW50cy5hdChpKS53aWR0aDsKKyAgICAgICAgICAg
IGlmIChwb3NpdGlvbiA8PSB4ZSkgeworICAgICAgICAgICAgICAgIFFUZXh0TGF5b3V0IGxheW91
dChjb21wb25lbnRzLmF0KGkpLnN0cmluZywgKmNvbXBvbmVudHMuYXQoaSkuZm9udCk7CisgICAg
ICAgICAgICAgICAgbGF5b3V0LmJlZ2luTGF5b3V0KCk7CisgICAgICAgICAgICAgICAgUVRleHRM
aW5lIGwgPSBsYXlvdXQuY3JlYXRlTGluZSgpOworICAgICAgICAgICAgICAgIGlmICghbC5pc1Zh
bGlkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisKKyAgICAgICAgICAg
ICAgICBsLnNldExpbmVXaWR0aChJTlRfTUFYLzI1Nik7CisgICAgICAgICAgICAgICAgbGF5b3V0
LmVuZExheW91dCgpOworCisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIC0geHMgPj0gbC53
aWR0aCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgY29tcG9uZW50cy5h
dChpKS5zdHJpbmcubGVuZ3RoKCkgLSAxOworICAgICAgICAgICAgICAgIGludCBjdXJzb3IgPSBs
LnhUb0N1cnNvcihwb3NpdGlvbiAtIHhzKTsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID4g
MSkKKyAgICAgICAgICAgICAgICAgICAgLS1jdXJzb3I7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG9mZnNldCArIGN1cnNvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
b2Zmc2V0ICs9IGNvbXBvbmVudHMuYXQoaSkuc3RyaW5nLmxlbmd0aCgpIC0gMTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnVuLmxlbmd0aCgpOworfQorCitz
dGF0aWMgZmxvYXQgY3Vyc29yVG9YKGNvbnN0IFZlY3RvcjxUZXh0UnVuQ29tcG9uZW50LCAxMDI0
PiYgY29tcG9uZW50cywgaW50IHdpZHRoLCBib29sIHJ0bCwgaW50IGN1cnNvcikKK3sKKyAgICBp
bnQgc3RhcnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7
ICsraSkgeworICAgICAgICBpZiAoc3RhcnQgKyBjb21wb25lbnRzLmF0KGkpLnN0cmluZy5sZW5n
dGgoKSAtIDEgPCBjdXJzb3IpIHsKKyAgICAgICAgICAgIHN0YXJ0ICs9IGNvbXBvbmVudHMuYXQo
aSkuc3RyaW5nLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9
CisgICAgICAgIGludCB4cyA9IGNvbXBvbmVudHMuYXQoaSkub2Zmc2V0OworICAgICAgICBpZiAo
cnRsKQorICAgICAgICAgICAgeHMgPSB3aWR0aCAtIHhzIC0gY29tcG9uZW50cy5hdChpKS53aWR0
aDsKKyAgICAgICAgUVRleHRMYXlvdXQgbGF5b3V0KGNvbXBvbmVudHMuYXQoaSkuc3RyaW5nLCAq
Y29tcG9uZW50cy5hdChpKS5mb250KTsKKyAgICAgICAgbGF5b3V0LmJlZ2luTGF5b3V0KCk7Cisg
ICAgICAgIFFUZXh0TGluZSBsID0gbGF5b3V0LmNyZWF0ZUxpbmUoKTsKKyAgICAgICAgaWYgKCFs
LmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGwuc2V0TGluZVdp
ZHRoKElOVF9NQVgvMjU2KTsKKyAgICAgICAgbGF5b3V0LmVuZExheW91dCgpOworCisgICAgICAg
IHJldHVybiB4cyArIGwuY3Vyc29yVG9YKGN1cnNvciAtIHN0YXJ0ICsgMSk7CisgICAgfQorICAg
IHJldHVybiB3aWR0aDsKK30KKworRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21w
bGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29u
c3QKK3sKKyAgICBWZWN0b3I8VGV4dFJ1bkNvbXBvbmVudCwgMTAyND4gY29tcG9uZW50czsKKyAg
ICBpbnQgdyA9IGdlbmVyYXRlQ29tcG9uZW50cygmY29tcG9uZW50cywgKnRoaXMsIHJ1bik7CisK
KyAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHJ1bi5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJu
IEZsb2F0UmVjdChwdC54KCksIHB0LnkoKSwgdywgaCk7CisKKyAgICBmbG9hdCB4MSA9IGN1cnNv
clRvWChjb21wb25lbnRzLCB3LCBydW4ucnRsKCksIGZyb20pOworICAgIGZsb2F0IHgyID0gY3Vy
c29yVG9YKGNvbXBvbmVudHMsIHcsIHJ1bi5ydGwoKSwgdG8pOworICAgIGlmICh4MiA8IHgxKQor
ICAgICAgICBxU3dhcCh4MSwgeDIpOworCisgICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4
MSwgcHQueSgpLCB4MiAtIHgxLCBoKTsKK30KKworaW50IEZvbnQ6OmxpbmVHYXAoKSBjb25zdAor
eworICAgIHJldHVybiBRRm9udE1ldHJpY3MobV9mb250KS5sZWFkaW5nKCk7Cit9CisKK30KKwor
I2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFn
ZVRyZWVOb2RlUXQuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HbHlwaFBhZ2VU
cmVlTm9kZVF0LmNwcAppbmRleCAyMjA4MDdlLi43MWYzNTRjIDEwMDY0NAotLS0gYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dseXBoUGFnZVRyZWVOb2RlUXQuY3BwCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvR2x5cGhQYWdlVHJlZU5vZGVRdC5jcHAKQEAgLTEsNSAr
MSw2IEBACiAvKgogICAgIENvcHlyaWdodCAoQykgMjAwNyBUcm9sbHRlY2ggQVNBCisgICAgQ29w
eXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCiAKICAgICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAg
ICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKQEAgLTI0LDcgKzI1LDExIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdm9pZCBH
bHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEoY29uc3QgRm9udERhdGEq
IGZvbnREYXRhKQordm9pZCBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERh
dGEoY29uc3QgRm9udERhdGEqKQoreworfQorCit2b2lkIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVu
ZVRyZWVGb250RGF0YShjb25zdCBXZWJDb3JlOjpTaW1wbGVGb250RGF0YSopCiB7CiB9CiAKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvU2ltcGxlRm9udERhdGFRdC5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L1NpbXBsZUZvbnREYXRhUXQuY3BwCmlu
ZGV4IDI1ZTAyYzYuLmYwOGJhY2YgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvU2ltcGxlRm9udERhdGFRdC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9TaW1wbGVGb250RGF0YVF0LmNwcApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgICAgQ29weXJp
Z2h0IChDKSAyMDA3IFRyb2xsdGVjaCBBU0EKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDggSG9sZ2Vy
IEhhbnMgUGV0ZXIgRnJleXRoZXIKIAogICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgICBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMTksMzcgKzIwLDQ3
IEBACiAgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBhbGwgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9y
IGxvYWRpbmcgaW1hZ2VzLCBzdHlsZSBzaGVldHMgYW5kIGh0bWwKICAgICBwYWdlcyBmcm9tIHRo
ZSB3ZWIuIEl0IGhhcyBhIG1lbW9yeSBjYWNoZSBmb3IgdGhlc2Ugb2JqZWN0cy4KICovCisKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogCi0jaW5jbHVk
ZSAiU1ZHRm9udERhdGEuaCIKKyNpbmNsdWRlIDxRRm9udE1ldHJpY3M+CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotU2ltcGxlRm9udERhdGE6OlNpbXBsZUZvbnREYXRhKGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEmIGZvbnQsIGJvb2wgY3VzdG9tRm9udCwgYm9vbCBsb2FkaW5nLCBTVkdGb250RGF0
YSopCi0gICAgOiBtX2ZvbnQoZm9udCkKLSAgICAsIG1faXNDdXN0b21Gb250KGN1c3RvbUZvbnQp
Ci0gICAgLCBtX2lzTG9hZGluZyhsb2FkaW5nKQordm9pZCBTaW1wbGVGb250RGF0YTo6ZGV0ZXJt
aW5lUGl0Y2goKQogeworICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSBtX2ZvbnQuZm9udCgpLmZp
eGVkUGl0Y2goKTsKIH0KIAotU2ltcGxlRm9udERhdGE6On5TaW1wbGVGb250RGF0YSgpCitib29s
IFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnModW5zaWduZWQgc2hvcnQgY29uc3Qq
LCBpbnQpIGNvbnN0CiB7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgU2ltcGxlRm9udERh
dGE6OmNvbnRhaW5zQ2hhcmFjdGVycyhjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0
aCkgY29uc3QKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCiB7Ci0gICAgcmV0
dXJuIHRydWU7CisgICAgUUZvbnRNZXRyaWNzIGZtKG1fZm9udC5mb250KCkpOworCisgICAgbV9h
c2NlbnQgPSBmbS5hc2NlbnQoKTsKKyAgICBtX2Rlc2NlbnQgPSBmbS5kZXNjZW50KCk7CisgICAg
bV9saW5lU3BhY2luZyA9IGZtLmxpbmVTcGFjaW5nKCk7CisgICAgbV94SGVpZ2h0ID0gZm0ueEhl
aWdodCgpOworICAgIG1fc3BhY2VXaWR0aCA9IGZtLndpZHRoKCcgJyk7CisgICAgbV9saW5lR2Fw
ID0gZm0ubGVhZGluZygpOwogfQogCi1jb25zdCBTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERh
dGE6OmZvbnREYXRhRm9yQ2hhcmFjdGVyKFVDaGFyMzIpIGNvbnN0Cit2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUdseXBoSW5pdCgpCiB7Ci0gICAgcmV0dXJuIHRoaXM7CisgICAgbV9zcGFj
ZUdseXBoID0gMDsKKyAgICBtX2FkanVzdGVkU3BhY2VXaWR0aCA9IG1fc3BhY2VXaWR0aDsKKyAg
ICBkZXRlcm1pbmVQaXRjaCgpOworICAgIG1fbWlzc2luZ0dseXBoRGF0YS5mb250RGF0YSA9IHRo
aXM7CisgICAgbV9taXNzaW5nR2x5cGhEYXRhLmdseXBoID0gMDsKIH0KIAotYm9vbCBTaW1wbGVG
b250RGF0YTo6aXNTZWdtZW50ZWQoKSBjb25zdAordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZv
cm1EZXN0cm95KCkKIHsKLSAgICByZXR1cm4gZmFsc2U7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vcXQvUmVuZGVyVGhlbWVRdC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3F0
L1JlbmRlclRoZW1lUXQuY3BwCmluZGV4IDJhNDIzNGUuLjc4ZDQ5MDYgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvcGxhdGZvcm0vcXQvUmVuZGVyVGhlbWVRdC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9xdC9SZW5kZXJUaGVtZVF0LmNwcApAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoQykg
MjAwNiBaYWNrIFJ1c2luIDx6YWNrQGtkZS5vcmc+CiAgKiAgICAgICAgICAgICAgIDIwMDYgRGly
ayBNdWVsbGVyIDxtdWVsbGVyQGtkZS5vcmc+CiAgKiAgICAgICAgICAgICAgIDIwMDYgTmlrb2xh
cyBaaW1tZXJtYW5uIDx6aW1tZXJtYW5uQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgg
SG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgog
ICoKQEAgLTQ1LDcgKzQ2LDkgQEAKICNpbmNsdWRlIDxRU3R5bGVPcHRpb25GcmFtZVYyPgogCiAj
aW5jbHVkZSAiQ29sb3IuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCiAjaW5jbHVk
ZSAiQ1NTU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIkZvbnRTZWxlY3Rvci5oIgogI2luY2x1ZGUg
IkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIkZvbnQuaCIKQEAgLTM4
Nyw2ICszOTAsNyBAQCB2b2lkIFJlbmRlclRoZW1lUXQ6OmFkanVzdEJ1dHRvblN0eWxlKENTU1N0
eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogcwogICAgIGZvbnRGYW1pbHkuc2V0
RmFtaWx5KG1fYnV0dG9uRm9udEZhbWlseSk7CiAgICAgZm9udERlc2NyaXB0aW9uLnNldEZhbWls
eShmb250RmFtaWx5KTsKICAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgc3R5bGUtPmZvbnQoKS51cGRhdGUoc2VsZWN0b3ItPmZvbnRTZWxlY3Rvcigp
KTsKICAgICBzdHlsZS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWln
aHQoKSk7CiAKICAgICBzZXRCdXR0b25TaXplKHN0eWxlKTsKLS0gCjEuNS40LjMKCg==
</data>
<flag name="review"
          id="10572"
          type_id="1"
          status="+"
          setter="hausmann"
    />
          </attachment>
      

    </bug>

</bugzilla>