<?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>220858</bug_id>
          
          <creation_ts>2021-01-22 03:40:41 -0800</creation_ts>
          <short_desc>Move FontCascadeCache onto FontCache</short_desc>
          <delta_ts>2021-12-07 22:05:50 -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>WebCore Misc.</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>219283</blocked>
    
    <blocked>202793</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Lord">clord</reporter>
          <assigned_to name="Chris Lord">clord</assigned_to>
          <cc>achristensen</cc>
    
    <cc>darin</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>heycam</cc>
    
    <cc>mmaxfield</cc>
    
    <cc>rbuis</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>thorton</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1721553</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Lord">clord</who>
    <bug_when>2021-01-22 03:40:41 -0800</bug_when>
    <thetext>Currently, FontCascadeCache is a singleton and is managed by some static global functions. This isn&apos;t particularly clear as it doesn&apos;t follow the convention of being a class with a singleton() method (it&apos;s just a typedef of a HashMap). I think it makes sense to integrate it with FontCache - this works well for making FontCache thread-safe, as the FontCascadeCache is also a requirement of using fonts and both can be managed easily using the same lock.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1721563</commentid>
    <comment_count>1</comment_count>
      <attachid>418136</attachid>
    <who name="Chris Lord">clord</who>
    <bug_when>2021-01-22 04:29:06 -0800</bug_when>
    <thetext>Created attachment 418136
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1723683</commentid>
    <comment_count>2</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-01-29 03:41:14 -0800</bug_when>
    <thetext>&lt;rdar://problem/73748595&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1725757</commentid>
    <comment_count>3</comment_count>
      <attachid>418136</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2021-02-04 12:55:56 -0800</bug_when>
    <thetext>Comment on attachment 418136
Patch

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

&gt; Source/WebCore/ChangeLog:9
&gt; +        Make FontCascadeCache and associated functions a child of FontCache,
&gt; +        accessible via FontCache::singleton.

Why?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1725967</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Lord">clord</who>
    <bug_when>2021-02-05 01:01:05 -0800</bug_when>
    <thetext>(In reply to Myles C. Maxfield from comment #3)
&gt; Comment on attachment 418136 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=418136&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:9
&gt; &gt; +        Make FontCascadeCache and associated functions a child of FontCache,
&gt; &gt; +        accessible via FontCache::singleton.
&gt; 
&gt; Why?

In the world of a thread-safe FontCache, having FontCascadeCache live on it makes it much easier to handle locking with a shared lock. I guess it could just as well be its own class if we promoted it to a full singleton class instead of a HashMap typedef.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1732056</commentid>
    <comment_count>5</comment_count>
      <attachid>421170</attachid>
    <who name="Chris Lord">clord</who>
    <bug_when>2021-02-22 01:22:49 -0800</bug_when>
    <thetext>Created attachment 421170
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1732082</commentid>
    <comment_count>6</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-02-22 03:39:15 -0800</bug_when>
    <thetext>Committed r273237: &lt;https://commits.webkit.org/r273237&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 421170.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1732206</commentid>
    <comment_count>7</comment_count>
      <attachid>421170</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-02-22 10:57:58 -0800</bug_when>
    <thetext>Comment on attachment 421170
Patch

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

&gt; Source/WebCore/platform/graphics/FontCache.h:188
&gt; +struct FontCascadeCacheEntry {
&gt; +    WTF_MAKE_FAST_ALLOCATED;
&gt; +public:

Just moved code, but: Better style is WTF_MAKE_STRUCT_FAST_ALLOCATED instead.

&gt; Source/WebCore/platform/graphics/FontCache.h:192
&gt; +    FontCascadeCacheEntry(FontCascadeCacheKey&amp;&amp; key, Ref&lt;FontCascadeFonts&gt;&amp;&amp; fonts)
&gt; +        : key(WTFMove(key))
&gt; +        , fonts(WTFMove(fonts))
&gt; +    { }

Just moved code, but: We should be able to remove this and make minimal changes to get everything compiling.

&gt; Source/WebCore/platform/graphics/FontCache.h:198
&gt; +typedef HashMap&lt;unsigned, std::unique_ptr&lt;FontCascadeCacheEntry&gt;, AlreadyHashed&gt; FontCascadeCache;

Just moved code, but: In new code we want &quot;using&quot; here, not &quot;typedef&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1821377</commentid>
    <comment_count>8</comment_count>
      <attachid>421170</attachid>
    <who name="Cameron McCormack (:heycam)">heycam</who>
    <bug_when>2021-12-07 22:05:50 -0800</bug_when>
    <thetext>Comment on attachment 421170
Patch

(webkit-patch went awry.)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>418136</attachid>
            <date>2021-01-22 04:29:06 -0800</date>
            <delta_ts>2021-02-22 01:22:44 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-220858-20210122122905.patch</filename>
            <type>text/plain</type>
            <size>17081</size>
            <attacher name="Chris Lord">clord</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjcxMjg5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNjRlZjljYTNmNTk3MjA0
ZTllN2JlNGU5MmQ3YThmYmEyNjhiOGVhZi4uNGFmMzczMjBiMWVmNWY5MjU2ZjE0ZWFiMGFkYTk1
ZmJlMzQ0Y2FkZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM2IEBACisyMDIxLTAxLTIyICBDaHJp
cyBMb3JkICA8Y2xvcmRAaWdhbGlhLmNvbT4KKworICAgICAgICBNb3ZlIEZvbnRDYXNjYWRlQ2Fj
aGUgb250byBGb250Q2FjaGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyMDg1OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIE1ha2UgRm9udENhc2NhZGVDYWNoZSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbnMg
YSBjaGlsZCBvZiBGb250Q2FjaGUsCisgICAgICAgIGFjY2Vzc2libGUgdmlhIEZvbnRDYWNoZTo6
c2luZ2xldG9uLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gYmVoYXZpb3IgY2hhbmdlLgor
CisgICAgICAgICogcGFnZS9NZW1vcnlSZWxlYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnJl
bGVhc2VOb25jcml0aWNhbE1lbW9yeSk6CisgICAgICAgICogcGFnZS9TZXR0aW5nc0Jhc2UuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6aW52YWxpZGF0ZUFmdGVyR2VuZXJpY0ZhbWlseUNoYW5nZSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmtleXNNYXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmludmFsaWRh
dGVGb250Q2FzY2FkZUNhY2hlKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Y2xlYXJX
aWR0aENhY2hlcyk6CisgICAgICAgIChXZWJDb3JlOjptYWtlRm9udENhc2NhZGVDYWNoZUtleSk6
CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlRm9udENhc2NhZGVDYWNoZUhhc2gpOgorICAgICAg
ICAoV2ViQ29yZTo6Rm9udENhY2hlOjpwcnVuZVVucmVmZXJlbmNlZEVudHJpZXNGcm9tRm9udENh
c2NhZGVDYWNoZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnBydW5lU3lzdGVtRmFs
bGJhY2tGb250cyk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnJldHJpZXZlT3JBZGRD
YWNoZWRGb250cyk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnVwZGF0ZUZvbnRDYXNj
YWRlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaDoKKyAgICAgICAg
KFdlYkNvcmU6OkZvbnRDYXNjYWRlQ2FjaGVFbnRyeTo6Rm9udENhc2NhZGVDYWNoZUVudHJ5KToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpGb250Q2FzY2FkZTo6dXBkYXRlRm9udHMgY29uc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6Rm9udENhc2NhZGU6OnVwZGF0ZSBjb25zdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvRm9udENhc2NhZGUuaDoKKwogMjAyMS0wMS0yMiAgQ2hyaXMgTG9yZCAgPGNsb3JkQGlnYWxp
YS5jb20+CiAKICAgICAgICAgUmVtb3ZlIGluZGl2aWR1YWwgc2V0dGluZ3MgYWNjZXNzb3JzIGZy
b20gV29ya2VyR2xvYmFsU2NvcGUgYW5kIGFkZCBTZXR0aW5nczo6VmFsdWVzIGFjY2Vzc29yCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL01lbW9yeVJlbGVhc2UuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGFnZS9NZW1vcnlSZWxlYXNlLmNwcAppbmRleCA3Y2NiMzRmMjBmZmI1ZDQ1MDdh
NTczNGRjZTY5ZDJiYzljOGNkZjY0Li5jNTk2Njk4ODc0ODMwNzY3M2ViOWE2NTA2NWY1N2I5OTNi
MmQyODY2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL01lbW9yeVJlbGVhc2UuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BhZ2UvTWVtb3J5UmVsZWFzZS5jcHAKQEAgLTY3LDggKzY3
LDggQEAgc3RhdGljIHZvaWQgcmVsZWFzZU5vbmNyaXRpY2FsTWVtb3J5KE1haW50YWluTWVtb3J5
Q2FjaGUgbWFpbnRhaW5NZW1vcnlDYWNoZSkKICAgICBSZW5kZXJUaGVtZTo6c2luZ2xldG9uKCku
cHVyZ2VDYWNoZXMoKTsKIAogICAgIEZvbnRDYWNoZTo6c2luZ2xldG9uKCkucHVyZ2VJbmFjdGl2
ZUZvbnREYXRhKCk7CisgICAgRm9udENhY2hlOjpzaW5nbGV0b24oKS5jbGVhcldpZHRoQ2FjaGVz
KCk7CiAKLSAgICBjbGVhcldpZHRoQ2FjaGVzKCk7CiAgICAgVGV4dFBhaW50ZXI6OmNsZWFyR2x5
cGhEaXNwbGF5TGlzdHMoKTsKIAogICAgIGZvciAoYXV0byogZG9jdW1lbnQgOiBEb2N1bWVudDo6
YWxsRG9jdW1lbnRzKCkpIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvU2V0dGlu
Z3NCYXNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BhZ2UvU2V0dGluZ3NCYXNlLmNwcAppbmRleCA2
YWY3ODQzNWJlODc5MzZmMjkwNjgyODdjNGExYjVlZDEwZGU2ZTQ2Li5kMjMyNzJlYjFmMTFiMDMw
ZTk2MGM2NWY3Njk1ZWVkOGU5ZDg5MzgzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wYWdl
L1NldHRpbmdzQmFzZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGFnZS9TZXR0aW5nc0Jhc2Uu
Y3BwCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAiRE9NVGltZXIuaCIKICNpbmNsdWRlICJE
YXRhYmFzZS5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRm9udENhc2NhZGUu
aCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUg
IkZyYW1lVHJlZS5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgpAQCAtNTUsNyArNTUsNyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKIHN0YXRpYyB2b2lkIGludmFsaWRhdGVBZnRlckdlbmVyaWNG
YW1pbHlDaGFuZ2UoUGFnZSogcGFnZSkKIHsKLSAgICBpbnZhbGlkYXRlRm9udENhc2NhZGVDYWNo
ZSgpOworICAgIEZvbnRDYWNoZTo6c2luZ2xldG9uKCkuaW52YWxpZGF0ZUZvbnRDYXNjYWRlQ2Fj
aGUoKTsKICAgICBpZiAocGFnZSkKICAgICAgICAgcGFnZS0+c2V0TmVlZHNSZWNhbGNTdHlsZUlu
QWxsRnJhbWVzKCk7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250Q2FjaGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9u
dENhY2hlLmNwcAppbmRleCBhYmExYTg0MjY4MDI1YzEyZjc1ZDY3MzczYjkzMzI2Y2VjNmIzZjE2
Li5mYjBmODhkYTc5MWEzYTYxYzU3YmFjYzFhZjcyYjQ2ZjBjYzkwOTZkIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5jcHAKQEAgLTQwMyw2ICs0MDMs
MTAzIEBAIHZvaWQgRm9udENhY2hlOjpwdXJnZUluYWN0aXZlRm9udERhdGEodW5zaWduZWQgcHVy
Z2VDb3VudCkKICAgICBwbGF0Zm9ybVB1cmdlSW5hY3RpdmVGb250RGF0YSgpOwogfQogCitzdGF0
aWMgYm9vbCBrZXlzTWF0Y2goY29uc3QgRm9udENhc2NhZGVDYWNoZUtleSYgYSwgY29uc3QgRm9u
dENhc2NhZGVDYWNoZUtleSYgYikKK3sKKyAgICBpZiAoYS5mb250RGVzY3JpcHRpb25LZXkgIT0g
Yi5mb250RGVzY3JpcHRpb25LZXkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoYS5m
b250U2VsZWN0b3JJZCAhPSBiLmZvbnRTZWxlY3RvcklkIHx8IGEuZm9udFNlbGVjdG9yVmVyc2lv
biAhPSBiLmZvbnRTZWxlY3RvclZlcnNpb24pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB1
bnNpZ25lZCBzaXplID0gYS5mYW1pbGllcy5zaXplKCk7CisgICAgaWYgKHNpemUgIT0gYi5mYW1p
bGllcy5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGlmICghRm9udENhc2NhZGVEZXNjcmlwdGlv
bjo6ZmFtaWx5TmFtZXNBcmVFcXVhbChhLmZhbWlsaWVzW2ldLCBiLmZhbWlsaWVzW2ldKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgRm9udENhY2hlOjppbnZhbGlkYXRlRm9udENhc2NhZGVDYWNoZSgpCit7CisgICAgbV9mb250
Q2FzY2FkZUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgRm9udENhY2hlOjpjbGVhcldpZHRoQ2Fj
aGVzKCkKK3sKKyAgICBmb3IgKGF1dG8mIHZhbHVlIDogbV9mb250Q2FzY2FkZUNhY2hlLnZhbHVl
cygpKQorICAgICAgICB2YWx1ZS0+Zm9udHMuZ2V0KCkud2lkdGhDYWNoZSgpLmNsZWFyKCk7Cit9
CisKK3N0YXRpYyBGb250Q2FzY2FkZUNhY2hlS2V5IG1ha2VGb250Q2FzY2FkZUNhY2hlS2V5KGNv
bnN0IEZvbnRDYXNjYWRlRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBGb250U2VsZWN0b3IqIGZv
bnRTZWxlY3RvcikKK3sKKyAgICBGb250Q2FzY2FkZUNhY2hlS2V5IGtleTsKKyAgICBrZXkuZm9u
dERlc2NyaXB0aW9uS2V5ID0gRm9udERlc2NyaXB0aW9uS2V5KGRlc2NyaXB0aW9uKTsKKyAgICB1
bnNpZ25lZCBmYW1pbHlDb3VudCA9IGRlc2NyaXB0aW9uLmZhbWlseUNvdW50KCk7CisgICAga2V5
LmZhbWlsaWVzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoZmFtaWx5Q291bnQpOworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBmYW1pbHlDb3VudDsgKytpKQorICAgICAgICBrZXkuZmFtaWxp
ZXMudW5jaGVja2VkQXBwZW5kKGRlc2NyaXB0aW9uLmZhbWlseUF0KGkpKTsKKyAgICBrZXkuZm9u
dFNlbGVjdG9ySWQgPSBmb250U2VsZWN0b3IgPyBmb250U2VsZWN0b3ItPnVuaXF1ZUlkKCkgOiAw
OworICAgIGtleS5mb250U2VsZWN0b3JWZXJzaW9uID0gZm9udFNlbGVjdG9yID8gZm9udFNlbGVj
dG9yLT52ZXJzaW9uKCkgOiAwOworICAgIHJldHVybiBrZXk7Cit9CisKK3N0YXRpYyB1bnNpZ25l
ZCBjb21wdXRlRm9udENhc2NhZGVDYWNoZUhhc2goY29uc3QgRm9udENhc2NhZGVDYWNoZUtleSYg
a2V5KQoreworICAgIC8vIEZJWE1FOiBTaG91bGQgaGFzaCB0aGUga2V5IGFuZCB0aGUgZmFtaWx5
IG5hbWUgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBtYWtpbmcgYSBoYXNoIG91dCBvZiBvdGhlciBo
YXNoZXMuCisgICAgSW50ZWdlckhhc2hlciBoYXNoZXI7CisgICAgaGFzaGVyLmFkZChrZXkuZm9u
dERlc2NyaXB0aW9uS2V5LmNvbXB1dGVIYXNoKCkpOworICAgIGhhc2hlci5hZGQoa2V5LmZvbnRT
ZWxlY3RvcklkKTsKKyAgICBoYXNoZXIuYWRkKGtleS5mb250U2VsZWN0b3JWZXJzaW9uKTsKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5LmZhbWlsaWVzLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIGF1dG8mIGZhbWlseSA9IGtleS5mYW1pbGllc1tpXTsKKyAgICAgICAgaGFzaGVyLmFk
ZChmYW1pbHkuaXNOdWxsKCkgPyAwIDogRm9udENhc2NhZGVEZXNjcmlwdGlvbjo6ZmFtaWx5TmFt
ZUhhc2goZmFtaWx5KSk7CisgICAgfQorICAgIHJldHVybiBoYXNoZXIuaGFzaCgpOworfQorCit2
b2lkIEZvbnRDYWNoZTo6cHJ1bmVVbnJlZmVyZW5jZWRFbnRyaWVzRnJvbUZvbnRDYXNjYWRlQ2Fj
aGUoKQoreworICAgIG1fZm9udENhc2NhZGVDYWNoZS5yZW1vdmVJZihbXShhdXRvJiBlbnRyeSkg
eworICAgICAgICByZXR1cm4gZW50cnkudmFsdWUtPmZvbnRzLmdldCgpLmhhc09uZVJlZigpOwor
ICAgIH0pOworfQorCit2b2lkIEZvbnRDYWNoZTo6cHJ1bmVTeXN0ZW1GYWxsYmFja0ZvbnRzKCkK
K3sKKyAgICBmb3IgKGF1dG8mIGVudHJ5IDogbV9mb250Q2FzY2FkZUNhY2hlLnZhbHVlcygpKQor
ICAgICAgICBlbnRyeS0+Zm9udHMtPnBydW5lU3lzdGVtRmFsbGJhY2tzKCk7Cit9CisKK1JlZjxG
b250Q2FzY2FkZUZvbnRzPiBGb250Q2FjaGU6OnJldHJpZXZlT3JBZGRDYWNoZWRGb250cyhjb25z
dCBGb250Q2FzY2FkZURlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIFJlZlB0cjxGb250U2Vs
ZWN0b3I+JiYgZm9udFNlbGVjdG9yKQoreworICAgIGF1dG8ga2V5ID0gbWFrZUZvbnRDYXNjYWRl
Q2FjaGVLZXkoZm9udERlc2NyaXB0aW9uLCBmb250U2VsZWN0b3IuZ2V0KCkpOworCisgICAgdW5z
aWduZWQgaGFzaCA9IGNvbXB1dGVGb250Q2FzY2FkZUNhY2hlSGFzaChrZXkpOworICAgIGF1dG8g
YWRkUmVzdWx0ID0gbV9mb250Q2FzY2FkZUNhY2hlLmFkZChoYXNoLCBudWxscHRyKTsKKyAgICBp
ZiAoIWFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGtleXNNYXRjaChhZGRSZXN1bHQuaXRlcmF0b3It
PnZhbHVlLT5rZXksIGtleSkpCisgICAgICAgIHJldHVybiBhZGRSZXN1bHQuaXRlcmF0b3ItPnZh
bHVlLT5mb250cy5nZXQoKTsKKworICAgIGF1dG8mIG5ld0VudHJ5ID0gYWRkUmVzdWx0Lml0ZXJh
dG9yLT52YWx1ZTsKKyAgICBuZXdFbnRyeSA9IG1ha2VVbmlxdWU8Rm9udENhc2NhZGVDYWNoZUVu
dHJ5PihXVEZNb3ZlKGtleSksIEZvbnRDYXNjYWRlRm9udHM6OmNyZWF0ZShXVEZNb3ZlKGZvbnRT
ZWxlY3RvcikpKTsKKyAgICBSZWY8Rm9udENhc2NhZGVGb250cz4gZ2x5cGhzID0gbmV3RW50cnkt
PmZvbnRzLmdldCgpOworCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVucmVmZXJlbmNlZFBy
dW5lSW50ZXJ2YWwgPSA1MDsKKyAgICBzdGF0aWMgY29uc3QgaW50IG1heGltdW1FbnRyaWVzID0g
NDAwOworICAgIHN0YXRpYyB1bnNpZ25lZCBwcnVuZUNvdW50ZXI7CisgICAgLy8gUmVmZXJlbmNl
ZCBGb250Q2FzY2FkZUZvbnRzIHdvdWxkIGV4aXN0IGFueXdheSBzbyBwcnVuaW5nIHRoZW0gc2F2
ZXMgbGl0dGxlIG1lbW9yeS4KKyAgICBpZiAoISgrK3BydW5lQ291bnRlciAlIHVucmVmZXJlbmNl
ZFBydW5lSW50ZXJ2YWwpKQorICAgICAgICBwcnVuZVVucmVmZXJlbmNlZEVudHJpZXNGcm9tRm9u
dENhc2NhZGVDYWNoZSgpOworICAgIC8vIFByZXZlbnQgcGF0aG9sb2dpY2FsIGdyb3d0aC4KKyAg
ICBpZiAobV9mb250Q2FzY2FkZUNhY2hlLnNpemUoKSA+IG1heGltdW1FbnRyaWVzKQorICAgICAg
ICBtX2ZvbnRDYXNjYWRlQ2FjaGUucmVtb3ZlKG1fZm9udENhc2NhZGVDYWNoZS5yYW5kb20oKSk7
CisgICAgcmV0dXJuIGdseXBoczsKK30KKwordm9pZCBGb250Q2FjaGU6OnVwZGF0ZUZvbnRDYXNj
YWRlKGNvbnN0IEZvbnRDYXNjYWRlJiBmb250Q2FzY2FkZSwgUmVmUHRyPEZvbnRTZWxlY3Rvcj4m
JiBmb250U2VsZWN0b3IpCit7CisgICAgZm9udENhc2NhZGUudXBkYXRlRm9udHMocmV0cmlldmVP
ckFkZENhY2hlZEZvbnRzKGZvbnRDYXNjYWRlLmZvbnREZXNjcmlwdGlvbigpLCBXVEZNb3ZlKGZv
bnRTZWxlY3RvcikpKTsKK30KKwogc2l6ZV90IEZvbnRDYWNoZTo6Zm9udENvdW50KCkKIHsKICAg
ICByZXR1cm4gY2FjaGVkRm9udHMoKS5zaXplKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnRDYWNoZS5oCmluZGV4IGY4ZTA1YWViODZkNGQ3MDg3NWYwMTE5MDYxYzE2
NDM3NjBiZDcwN2QuLmRlY2Q2N2VkYWQ2OGM3NzFmMDgyZDhmY2I1NzhjMzEyM2Q1N2ZmMmUgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5oCkBAIC0yOSw2
ICsyOSw3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSAiRm9udENhc2NhZGVGb250cy5o
IgogI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgIkZvbnRQbGF0Zm9ybURh
dGEuaCIKICNpbmNsdWRlICJGb250VGFnZ2VkU2V0dGluZ3MuaCIKQEAgLTE3NSw2ICsxNzYsMjcg
QEAgc3RydWN0IEZvbnREZXNjcmlwdGlvbktleUhhc2ggewogICAgIHN0YXRpYyBjb25zdCBib29s
IHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKIH07CiAKK3N0cnVjdCBGb250
Q2FzY2FkZUNhY2hlS2V5IHsKKyAgICBGb250RGVzY3JpcHRpb25LZXkgZm9udERlc2NyaXB0aW9u
S2V5OyAvLyBTaGFyZWQgd2l0aCB0aGUgbG93ZXIgbGV2ZWwgRm9udENhY2hlIChjYWNoaW5nIEZv
bnQgb2JqZWN0cykKKyAgICBWZWN0b3I8QXRvbVN0cmluZywgMz4gZmFtaWxpZXM7CisgICAgdW5z
aWduZWQgZm9udFNlbGVjdG9ySWQ7CisgICAgdW5zaWduZWQgZm9udFNlbGVjdG9yVmVyc2lvbjsK
K307CisKK3N0cnVjdCBGb250Q2FzY2FkZUNhY2hlRW50cnkgeworICAgIFdURl9NQUtFX0ZBU1Rf
QUxMT0NBVEVEOworcHVibGljOgorICAgIEZvbnRDYXNjYWRlQ2FjaGVFbnRyeShGb250Q2FzY2Fk
ZUNhY2hlS2V5JiYga2V5LCBSZWY8Rm9udENhc2NhZGVGb250cz4mJiBmb250cykKKyAgICAgICAg
OiBrZXkoV1RGTW92ZShrZXkpKQorICAgICAgICAsIGZvbnRzKFdURk1vdmUoZm9udHMpKQorICAg
IHsgfQorICAgIEZvbnRDYXNjYWRlQ2FjaGVLZXkga2V5OworICAgIFJlZjxGb250Q2FzY2FkZUZv
bnRzPiBmb250czsKK307CisKKy8vIEZJWE1FOiBTaG91bGQgbWFrZSBoYXNoIHRyYWl0cyBmb3Ig
Rm9udENhc2NhZGVDYWNoZUtleSBpbnN0ZWFkIG9mIHVzaW5nIGEgaGFzaCBhcyB0aGUga2V5IChz
byB3ZSBoYXNoIGEgaGFzaCkuCit0eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIHN0ZDo6dW5pcXVl
X3B0cjxGb250Q2FzY2FkZUNhY2hlRW50cnk+LCBBbHJlYWR5SGFzaGVkPiBGb250Q2FzY2FkZUNh
Y2hlOworCiBjbGFzcyBGb250Q2FjaGUgewogICAgIGZyaWVuZCBjbGFzcyBXVEY6Ok5ldmVyRGVz
dHJveWVkPEZvbnRDYWNoZT47CiAKQEAgLTIyMCw2ICsyNDIsMTAgQEAgcHVibGljOgogICAgIFdF
QkNPUkVfRVhQT1JUIHZvaWQgcHVyZ2VJbmFjdGl2ZUZvbnREYXRhKHVuc2lnbmVkIGNvdW50ID0g
VUlOVF9NQVgpOwogICAgIHZvaWQgcGxhdGZvcm1QdXJnZUluYWN0aXZlRm9udERhdGEoKTsKIAor
ICAgIHZvaWQgdXBkYXRlRm9udENhc2NhZGUoY29uc3QgRm9udENhc2NhZGUmLCBSZWZQdHI8Rm9u
dFNlbGVjdG9yPiYmKTsKKyAgICB2b2lkIGludmFsaWRhdGVGb250Q2FzY2FkZUNhY2hlKCk7Cisg
ICAgdm9pZCBjbGVhcldpZHRoQ2FjaGVzKCk7CisKICNpZiBQTEFURk9STShXSU4pCiAgICAgUmVm
UHRyPEZvbnQ+IGZvbnRGcm9tRGVzY3JpcHRpb25BbmRMb2dGb250KGNvbnN0IEZvbnREZXNjcmlw
dGlvbiYsIGNvbnN0IExPR0ZPTlQmLCBBdG9tU3RyaW5nJiBvdXRGb250RmFtaWx5TmFtZSk7CiAj
ZW5kaWYKQEAgLTI1Miw2ICsyNzgsOSBAQCBwcml2YXRlOgogICAgIH5Gb250Q2FjaGUoKSA9IGRl
bGV0ZTsKIAogICAgIFdFQkNPUkVfRVhQT1JUIHZvaWQgcHVyZ2VJbmFjdGl2ZUZvbnREYXRhSWZO
ZWVkZWQoKTsKKyAgICB2b2lkIHBydW5lVW5yZWZlcmVuY2VkRW50cmllc0Zyb21Gb250Q2FzY2Fk
ZUNhY2hlKCk7CisgICAgdm9pZCBwcnVuZVN5c3RlbUZhbGxiYWNrRm9udHMoKTsKKyAgICBSZWY8
Rm9udENhc2NhZGVGb250cz4gcmV0cmlldmVPckFkZENhY2hlZEZvbnRzKGNvbnN0IEZvbnRDYXNj
YWRlRGVzY3JpcHRpb24mLCBSZWZQdHI8Rm9udFNlbGVjdG9yPiYmKTsKIAogICAgIC8vIEZJWE1F
OiBUaGlzIG1ldGhvZCBzaG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLgogICAgIEZvbnRQbGF0
Zm9ybURhdGEqIGdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9u
JiwgY29uc3QgQXRvbVN0cmluZyYgZmFtaWx5LCBjb25zdCBGb250RmVhdHVyZVNldHRpbmdzKiBm
b250RmFjZUZlYXR1cmVzID0gbnVsbHB0ciwgRm9udFNlbGVjdGlvblNwZWNpZmllZENhcGFiaWxp
dGllcyBmb250RmFjZUNhcGFiaWxpdGllcyA9IHsgfSwgYm9vbCBjaGVja2luZ0FsdGVybmF0ZU5h
bWUgPSBmYWxzZSk7CkBAIC0yNjYsNiArMjk1LDggQEAgcHJpdmF0ZToKICAgICAKICAgICBib29s
IG1fc2hvdWxkTW9ja0JvbGRTeXN0ZW1Gb250Rm9yQWNjZXNzaWJpbGl0eSB7IGZhbHNlIH07CiAK
KyAgICBGb250Q2FzY2FkZUNhY2hlIG1fZm9udENhc2NhZGVDYWNoZTsKKwogI2lmIFBMQVRGT1JN
KENPQ09BKQogICAgIExpc3RIYXNoU2V0PFN0cmluZz4gbV9zZWVuRmFtaWxpZXNGb3JQcmV3YXJt
aW5nOwogICAgIExpc3RIYXNoU2V0PFN0cmluZz4gbV9mb250TmFtZXNSZXF1aXJpbmdTeXN0ZW1G
YWxsYmFja0ZvclByZXdhcm1pbmc7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9Gb250Q2FzY2FkZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250Q2FzY2FkZS5jcHAKaW5kZXggZDMyMjRhMzBhOTNjZmE0Y2ViMmFkN2U4YWYyNzMw
ZTg1YjdkNWQzNC4uODE2ZjFkY2VkZGUzMDZiMzdjMjJkMWI0MjU5ODBkOWM0NGI4MWJmMiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmNwcApA
QCAtMTQ2LDEyNSArMTQ2LDYgQEAgYm9vbCBGb250Q2FzY2FkZTo6b3BlcmF0b3I9PShjb25zdCBG
b250Q2FzY2FkZSYgb3RoZXIpIGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0cnVjdCBG
b250Q2FzY2FkZUNhY2hlS2V5IHsKLSAgICBGb250RGVzY3JpcHRpb25LZXkgZm9udERlc2NyaXB0
aW9uS2V5OyAvLyBTaGFyZWQgd2l0aCB0aGUgbG93ZXIgbGV2ZWwgRm9udENhY2hlIChjYWNoaW5n
IEZvbnQgb2JqZWN0cykKLSAgICBWZWN0b3I8QXRvbVN0cmluZywgMz4gZmFtaWxpZXM7Ci0gICAg
dW5zaWduZWQgZm9udFNlbGVjdG9ySWQ7Ci0gICAgdW5zaWduZWQgZm9udFNlbGVjdG9yVmVyc2lv
bjsKLX07Ci0KLXN0cnVjdCBGb250Q2FzY2FkZUNhY2hlRW50cnkgewotICAgIFdURl9NQUtFX0ZB
U1RfQUxMT0NBVEVEOwotcHVibGljOgotICAgIEZvbnRDYXNjYWRlQ2FjaGVFbnRyeShGb250Q2Fz
Y2FkZUNhY2hlS2V5JiYga2V5LCBSZWY8Rm9udENhc2NhZGVGb250cz4mJiBmb250cykKLSAgICAg
ICAgOiBrZXkoV1RGTW92ZShrZXkpKQotICAgICAgICAsIGZvbnRzKFdURk1vdmUoZm9udHMpKQot
ICAgIHsgfQotICAgIEZvbnRDYXNjYWRlQ2FjaGVLZXkga2V5OwotICAgIFJlZjxGb250Q2FzY2Fk
ZUZvbnRzPiBmb250czsKLX07Ci0KLS8vIEZJWE1FOiBTaG91bGQgbWFrZSBoYXNoIHRyYWl0cyBm
b3IgRm9udENhc2NhZGVDYWNoZUtleSBpbnN0ZWFkIG9mIHVzaW5nIGEgaGFzaCBhcyB0aGUga2V5
IChzbyB3ZSBoYXNoIGEgaGFzaCkuCi10eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIHN0ZDo6dW5p
cXVlX3B0cjxGb250Q2FzY2FkZUNhY2hlRW50cnk+LCBBbHJlYWR5SGFzaGVkPiBGb250Q2FzY2Fk
ZUNhY2hlOwotCi1zdGF0aWMgYm9vbCBrZXlzTWF0Y2goY29uc3QgRm9udENhc2NhZGVDYWNoZUtl
eSYgYSwgY29uc3QgRm9udENhc2NhZGVDYWNoZUtleSYgYikKLXsKLSAgICBpZiAoYS5mb250RGVz
Y3JpcHRpb25LZXkgIT0gYi5mb250RGVzY3JpcHRpb25LZXkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBpZiAoYS5mb250U2VsZWN0b3JJZCAhPSBiLmZvbnRTZWxlY3RvcklkIHx8IGEuZm9u
dFNlbGVjdG9yVmVyc2lvbiAhPSBiLmZvbnRTZWxlY3RvclZlcnNpb24pCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB1bnNpZ25lZCBzaXplID0gYS5mYW1pbGllcy5zaXplKCk7Ci0gICAgaWYg
KHNpemUgIT0gYi5mYW1pbGllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGlmICghRm9udENh
c2NhZGVEZXNjcmlwdGlvbjo6ZmFtaWx5TmFtZXNBcmVFcXVhbChhLmZhbWlsaWVzW2ldLCBiLmZh
bWlsaWVzW2ldKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLXN0YXRpYyBGb250Q2FzY2FkZUNhY2hlJiBmb250Q2FzY2FkZUNhY2hlKCkK
LXsKLSAgICBzdGF0aWMgTmV2ZXJEZXN0cm95ZWQ8Rm9udENhc2NhZGVDYWNoZT4gY2FjaGU7Ci0g
ICAgcmV0dXJuIGNhY2hlLmdldCgpOwotfQotCi12b2lkIGludmFsaWRhdGVGb250Q2FzY2FkZUNh
Y2hlKCkKLXsKLSAgICBmb250Q2FzY2FkZUNhY2hlKCkuY2xlYXIoKTsKLX0KLQotdm9pZCBjbGVh
cldpZHRoQ2FjaGVzKCkKLXsKLSAgICBmb3IgKGF1dG8mIHZhbHVlIDogZm9udENhc2NhZGVDYWNo
ZSgpLnZhbHVlcygpKQotICAgICAgICB2YWx1ZS0+Zm9udHMuZ2V0KCkud2lkdGhDYWNoZSgpLmNs
ZWFyKCk7Ci19Ci0KLXN0YXRpYyBGb250Q2FzY2FkZUNhY2hlS2V5IG1ha2VGb250Q2FzY2FkZUNh
Y2hlS2V5KGNvbnN0IEZvbnRDYXNjYWRlRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBGb250U2Vs
ZWN0b3IqIGZvbnRTZWxlY3RvcikKLXsKLSAgICBGb250Q2FzY2FkZUNhY2hlS2V5IGtleTsKLSAg
ICBrZXkuZm9udERlc2NyaXB0aW9uS2V5ID0gRm9udERlc2NyaXB0aW9uS2V5KGRlc2NyaXB0aW9u
KTsKLSAgICB1bnNpZ25lZCBmYW1pbHlDb3VudCA9IGRlc2NyaXB0aW9uLmZhbWlseUNvdW50KCk7
Ci0gICAga2V5LmZhbWlsaWVzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoZmFtaWx5Q291bnQpOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmYW1pbHlDb3VudDsgKytpKQotICAgICAgICBr
ZXkuZmFtaWxpZXMudW5jaGVja2VkQXBwZW5kKGRlc2NyaXB0aW9uLmZhbWlseUF0KGkpKTsKLSAg
ICBrZXkuZm9udFNlbGVjdG9ySWQgPSBmb250U2VsZWN0b3IgPyBmb250U2VsZWN0b3ItPnVuaXF1
ZUlkKCkgOiAwOwotICAgIGtleS5mb250U2VsZWN0b3JWZXJzaW9uID0gZm9udFNlbGVjdG9yID8g
Zm9udFNlbGVjdG9yLT52ZXJzaW9uKCkgOiAwOwotICAgIHJldHVybiBrZXk7Ci19Ci0KLXN0YXRp
YyB1bnNpZ25lZCBjb21wdXRlRm9udENhc2NhZGVDYWNoZUhhc2goY29uc3QgRm9udENhc2NhZGVD
YWNoZUtleSYga2V5KQotewotICAgIC8vIEZJWE1FOiBTaG91bGQgaGFzaCB0aGUga2V5IGFuZCB0
aGUgZmFtaWx5IG5hbWUgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBtYWtpbmcgYSBoYXNoIG91dCBv
ZiBvdGhlciBoYXNoZXMuCi0gICAgSW50ZWdlckhhc2hlciBoYXNoZXI7Ci0gICAgaGFzaGVyLmFk
ZChrZXkuZm9udERlc2NyaXB0aW9uS2V5LmNvbXB1dGVIYXNoKCkpOwotICAgIGhhc2hlci5hZGQo
a2V5LmZvbnRTZWxlY3RvcklkKTsKLSAgICBoYXNoZXIuYWRkKGtleS5mb250U2VsZWN0b3JWZXJz
aW9uKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5LmZhbWlsaWVzLnNpemUoKTsg
KytpKSB7Ci0gICAgICAgIGF1dG8mIGZhbWlseSA9IGtleS5mYW1pbGllc1tpXTsKLSAgICAgICAg
aGFzaGVyLmFkZChmYW1pbHkuaXNOdWxsKCkgPyAwIDogRm9udENhc2NhZGVEZXNjcmlwdGlvbjo6
ZmFtaWx5TmFtZUhhc2goZmFtaWx5KSk7Ci0gICAgfQotICAgIHJldHVybiBoYXNoZXIuaGFzaCgp
OwotfQotCi12b2lkIHBydW5lVW5yZWZlcmVuY2VkRW50cmllc0Zyb21Gb250Q2FzY2FkZUNhY2hl
KCkKLXsKLSAgICBmb250Q2FzY2FkZUNhY2hlKCkucmVtb3ZlSWYoW10oYXV0byYgZW50cnkpIHsK
LSAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlLT5mb250cy5nZXQoKS5oYXNPbmVSZWYoKTsKLSAg
ICB9KTsKLX0KLQotdm9pZCBwcnVuZVN5c3RlbUZhbGxiYWNrRm9udHMoKQotewotICAgIGZvciAo
YXV0byYgZW50cnkgOiBmb250Q2FzY2FkZUNhY2hlKCkudmFsdWVzKCkpCi0gICAgICAgIGVudHJ5
LT5mb250cy0+cHJ1bmVTeXN0ZW1GYWxsYmFja3MoKTsKLX0KLQotc3RhdGljIFJlZjxGb250Q2Fz
Y2FkZUZvbnRzPiByZXRyaWV2ZU9yQWRkQ2FjaGVkRm9udHMoY29uc3QgRm9udENhc2NhZGVEZXNj
cmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBSZWZQdHI8Rm9udFNlbGVjdG9yPiYmIGZvbnRTZWxl
Y3RvcikKLXsKLSAgICBhdXRvIGtleSA9IG1ha2VGb250Q2FzY2FkZUNhY2hlS2V5KGZvbnREZXNj
cmlwdGlvbiwgZm9udFNlbGVjdG9yLmdldCgpKTsKLQotICAgIHVuc2lnbmVkIGhhc2ggPSBjb21w
dXRlRm9udENhc2NhZGVDYWNoZUhhc2goa2V5KTsKLSAgICBhdXRvIGFkZFJlc3VsdCA9IGZvbnRD
YXNjYWRlQ2FjaGUoKS5hZGQoaGFzaCwgbnVsbHB0cik7Ci0gICAgaWYgKCFhZGRSZXN1bHQuaXNO
ZXdFbnRyeSAmJiBrZXlzTWF0Y2goYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS0+a2V5LCBrZXkp
KQotICAgICAgICByZXR1cm4gYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS0+Zm9udHMuZ2V0KCk7
Ci0KLSAgICBhdXRvJiBuZXdFbnRyeSA9IGFkZFJlc3VsdC5pdGVyYXRvci0+dmFsdWU7Ci0gICAg
bmV3RW50cnkgPSBtYWtlVW5pcXVlPEZvbnRDYXNjYWRlQ2FjaGVFbnRyeT4oV1RGTW92ZShrZXkp
LCBGb250Q2FzY2FkZUZvbnRzOjpjcmVhdGUoV1RGTW92ZShmb250U2VsZWN0b3IpKSk7Ci0gICAg
UmVmPEZvbnRDYXNjYWRlRm9udHM+IGdseXBocyA9IG5ld0VudHJ5LT5mb250cy5nZXQoKTsKLQot
ICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB1bnJlZmVyZW5jZWRQcnVuZUludGVydmFsID0gNTA7
Ci0gICAgc3RhdGljIGNvbnN0IGludCBtYXhpbXVtRW50cmllcyA9IDQwMDsKLSAgICBzdGF0aWMg
dW5zaWduZWQgcHJ1bmVDb3VudGVyOwotICAgIC8vIFJlZmVyZW5jZWQgRm9udENhc2NhZGVGb250
cyB3b3VsZCBleGlzdCBhbnl3YXkgc28gcHJ1bmluZyB0aGVtIHNhdmVzIGxpdHRsZSBtZW1vcnku
Ci0gICAgaWYgKCEoKytwcnVuZUNvdW50ZXIgJSB1bnJlZmVyZW5jZWRQcnVuZUludGVydmFsKSkK
LSAgICAgICAgcHJ1bmVVbnJlZmVyZW5jZWRFbnRyaWVzRnJvbUZvbnRDYXNjYWRlQ2FjaGUoKTsK
LSAgICAvLyBQcmV2ZW50IHBhdGhvbG9naWNhbCBncm93dGguCi0gICAgaWYgKGZvbnRDYXNjYWRl
Q2FjaGUoKS5zaXplKCkgPiBtYXhpbXVtRW50cmllcykKLSAgICAgICAgZm9udENhc2NhZGVDYWNo
ZSgpLnJlbW92ZShmb250Q2FzY2FkZUNhY2hlKCkucmFuZG9tKCkpOwotICAgIHJldHVybiBnbHlw
aHM7Ci19Ci0KIGJvb2wgRm9udENhc2NhZGU6OmlzQ3VycmVudChjb25zdCBGb250U2VsZWN0b3Im
IGZvbnRTZWxlY3RvcikgY29uc3QKIHsKICAgICBpZiAoIW1fZm9udHMpCkBAIC0yNzcsMTQgKzE1
OCwxOSBAQCBib29sIEZvbnRDYXNjYWRlOjppc0N1cnJlbnQoY29uc3QgRm9udFNlbGVjdG9yJiBm
b250U2VsZWN0b3IpIGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgRm9udENhc2Nh
ZGU6OnVwZGF0ZShSZWZQdHI8Rm9udFNlbGVjdG9yPiYmIGZvbnRTZWxlY3RvcikgY29uc3QKK3Zv
aWQgRm9udENhc2NhZGU6OnVwZGF0ZUZvbnRzKFJlZjxGb250Q2FzY2FkZUZvbnRzPiYmIGZvbnRz
KSBjb25zdAogewotICAgIG1fZm9udHMgPSByZXRyaWV2ZU9yQWRkQ2FjaGVkRm9udHMobV9mb250
RGVzY3JpcHRpb24sIFdURk1vdmUoZm9udFNlbGVjdG9yKSk7CisgICAgbV9mb250cyA9IFdURk1v
dmUoZm9udHMpOwogICAgIG1fdXNlQmFja3NsYXNoQXNZZW5TeW1ib2wgPSB1c2VCYWNrc2xhc2hB
c1llblNpZ25Gb3JGYW1pbHkoZmlyc3RGYW1pbHkoKSk7CiAgICAgbV9lbmFibGVLZXJuaW5nID0g
Y29tcHV0ZUVuYWJsZUtlcm5pbmcoKTsKICAgICBtX3JlcXVpcmVzU2hhcGluZyA9IGNvbXB1dGVS
ZXF1aXJlc1NoYXBpbmcoKTsKIH0KIAordm9pZCBGb250Q2FzY2FkZTo6dXBkYXRlKFJlZlB0cjxG
b250U2VsZWN0b3I+JiYgZm9udFNlbGVjdG9yKSBjb25zdAoreworICAgIEZvbnRDYWNoZTo6c2lu
Z2xldG9uKCkudXBkYXRlRm9udENhc2NhZGUoKnRoaXMsIFdURk1vdmUoZm9udFNlbGVjdG9yKSk7
Cit9CisKIEdseXBoQnVmZmVyIEZvbnRDYXNjYWRlOjpsYXlvdXRUZXh0KENvZGVQYXRoIGNvZGVQ
YXRoVG9Vc2UsIGNvbnN0IFRleHRSdW4mIHJ1biwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8s
IEZvclRleHRFbXBoYXNpc09yTm90IGZvclRleHRFbXBoYXNpcykgY29uc3QKIHsKICAgICBpZiAo
Y29kZVBhdGhUb1VzZSAhPSBDb2RlUGF0aDo6Q29tcGxleCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmggYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5oCmluZGV4IDEyNzc2NDhhN2NlNzNiYWE3MDE2
ZjE1YzdmZmE5NzlkYzU3ZDI1NmMuLjVhZWQ3ZTcxYzMyNTU4MzMzZmI1NGZmNmRkNjMzZWQwMGZh
NmRiMWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRD
YXNjYWRlLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2Nh
ZGUuaApAQCAtMTA2LDYgKzEwNiw3IEBAIHB1YmxpYzoKICAgICBmbG9hdCBzaXplKCkgY29uc3Qg
eyByZXR1cm4gZm9udERlc2NyaXB0aW9uKCkuY29tcHV0ZWRTaXplKCk7IH0KIAogICAgIGJvb2wg
aXNDdXJyZW50KGNvbnN0IEZvbnRTZWxlY3RvciYpIGNvbnN0OworICAgIHZvaWQgdXBkYXRlRm9u
dHMoUmVmPEZvbnRDYXNjYWRlRm9udHM+JiYpIGNvbnN0OwogICAgIFdFQkNPUkVfRVhQT1JUIHZv
aWQgdXBkYXRlKFJlZlB0cjxGb250U2VsZWN0b3I+JiYgPSBudWxscHRyKSBjb25zdDsKIAogICAg
IGVudW0gQ3VzdG9tRm9udE5vdFJlYWR5QWN0aW9uIHsgRG9Ob3RQYWludElmRm9udE5vdFJlYWR5
LCBVc2VGYWxsYmFja0lmRm9udE5vdFJlYWR5IH07CkBAIC0zMjMsMTEgKzMyNCw2IEBAIHByaXZh
dGU6CiAgICAgbXV0YWJsZSBib29sIG1fcmVxdWlyZXNTaGFwaW5nIHsgZmFsc2UgfTsgLy8gQ29t
cHV0ZWQgZnJvbSBtX2ZvbnREZXNjcmlwdGlvbi4KIH07CiAKLXZvaWQgaW52YWxpZGF0ZUZvbnRD
YXNjYWRlQ2FjaGUoKTsKLXZvaWQgcHJ1bmVVbnJlZmVyZW5jZWRFbnRyaWVzRnJvbUZvbnRDYXNj
YWRlQ2FjaGUoKTsKLXZvaWQgcHJ1bmVTeXN0ZW1GYWxsYmFja0ZvbnRzKCk7Ci12b2lkIGNsZWFy
V2lkdGhDYWNoZXMoKTsKLQogaW5saW5lIGNvbnN0IEZvbnQmIEZvbnRDYXNjYWRlOjpwcmltYXJ5
Rm9udCgpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fZm9udHMpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>421170</attachid>
            <date>2021-02-22 01:22:49 -0800</date>
            <delta_ts>2021-12-07 22:05:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-220858-20210222092247.patch</filename>
            <type>text/plain</type>
            <size>17049</size>
            <attacher name="Chris Lord">clord</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjcyNjUzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTM2ZDk2NDFjOTc4MzU5
ZTk4YmNmMDE2N2JiZGM5NTNkMWY0MjNkNi4uNjk0MWUwNzYzMTRiYzQyZmI5MDk3NjNiMDg0MzA5
ZTI3MTc3ZjVmOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM2IEBACisyMDIxLTAxLTIyICBDaHJp
cyBMb3JkICA8Y2xvcmRAaWdhbGlhLmNvbT4KKworICAgICAgICBNb3ZlIEZvbnRDYXNjYWRlQ2Fj
aGUgb250byBGb250Q2FjaGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyMDg1OAorCisgICAgICAgIFJldmlld2VkIGJ5IE15bGVzIEMuIE1heGZpZWxk
LgorCisgICAgICAgIE1ha2UgRm9udENhc2NhZGVDYWNoZSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlv
bnMgYSBjaGlsZCBvZiBGb250Q2FjaGUsCisgICAgICAgIGFjY2Vzc2libGUgdmlhIEZvbnRDYWNo
ZTo6c2luZ2xldG9uLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gYmVoYXZpb3IgY2hhbmdl
LgorCisgICAgICAgICogcGFnZS9NZW1vcnlSZWxlYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OnJlbGVhc2VOb25jcml0aWNhbE1lbW9yeSk6CisgICAgICAgICogcGFnZS9TZXR0aW5nc0Jhc2Uu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6aW52YWxpZGF0ZUFmdGVyR2VuZXJpY0ZhbWlseUNoYW5n
ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OmtleXNNYXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmludmFs
aWRhdGVGb250Q2FzY2FkZUNhY2hlKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Y2xl
YXJXaWR0aENhY2hlcyk6CisgICAgICAgIChXZWJDb3JlOjptYWtlRm9udENhc2NhZGVDYWNoZUtl
eSk6CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlRm9udENhc2NhZGVDYWNoZUhhc2gpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpwcnVuZVVucmVmZXJlbmNlZEVudHJpZXNGcm9tRm9u
dENhc2NhZGVDYWNoZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnBydW5lU3lzdGVt
RmFsbGJhY2tGb250cyk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnJldHJpZXZlT3JB
ZGRDYWNoZWRGb250cyk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OnVwZGF0ZUZvbnRD
YXNjYWRlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlQ2FjaGVFbnRyeTo6Rm9udENhc2NhZGVDYWNoZUVudHJ5
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpGb250Q2FzY2FkZTo6dXBkYXRlRm9udHMgY29uc3QpOgorICAgICAgICAoV2Vi
Q29yZTo6Rm9udENhc2NhZGU6OnVwZGF0ZSBjb25zdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvRm9udENhc2NhZGUuaDoKKwogMjAyMS0wMi0xMSAgQ2hyaXMgTG9yZCAgPGNsb3JkQGln
YWxpYS5jb20+CiAKICAgICAgICAgQ1NTRm9udEZhY2Ugc2hvdWxkIG5vdCBuZWVkIGl0cyBtX2Zv
bnRTZWxlY3RvciBkYXRhIG1lbWJlcgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGFnZS9N
ZW1vcnlSZWxlYXNlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BhZ2UvTWVtb3J5UmVsZWFzZS5jcHAK
aW5kZXggYTVmN2MwMTM3ZGY1M2YxNDMyNGVjMDVhMGU0MzFhNDUyYjBjYmM0NC4uNGFkNTM1ZGQ3
OWU1NDkyMjE0YzAwMDczYTUzZGU0NTg3Y2I0OGFjZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGFnZS9NZW1vcnlSZWxlYXNlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wYWdlL01lbW9y
eVJlbGVhc2UuY3BwCkBAIC02Nyw4ICs2Nyw4IEBAIHN0YXRpYyB2b2lkIHJlbGVhc2VOb25jcml0
aWNhbE1lbW9yeShNYWludGFpbk1lbW9yeUNhY2hlIG1haW50YWluTWVtb3J5Q2FjaGUpCiAgICAg
UmVuZGVyVGhlbWU6OnNpbmdsZXRvbigpLnB1cmdlQ2FjaGVzKCk7CiAKICAgICBGb250Q2FjaGU6
OnNpbmdsZXRvbigpLnB1cmdlSW5hY3RpdmVGb250RGF0YSgpOworICAgIEZvbnRDYWNoZTo6c2lu
Z2xldG9uKCkuY2xlYXJXaWR0aENhY2hlcygpOwogCi0gICAgY2xlYXJXaWR0aENhY2hlcygpOwog
ICAgIFRleHRQYWludGVyOjpjbGVhckdseXBoRGlzcGxheUxpc3RzKCk7CiAKICAgICBmb3IgKGF1
dG8qIGRvY3VtZW50IDogRG9jdW1lbnQ6OmFsbERvY3VtZW50cygpKSB7CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wYWdlL1NldHRpbmdzQmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wYWdl
L1NldHRpbmdzQmFzZS5jcHAKaW5kZXggNmFmNzg0MzViZTg3OTM2ZjI5MDY4Mjg3YzRhMWI1ZWQx
MGRlNmU0Ni4uZDIzMjcyZWIxZjExYjAzMGU5NjBjNjVmNzY5NWVlZDhlOWQ4OTM4MyAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGFnZS9TZXR0aW5nc0Jhc2UuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BhZ2UvU2V0dGluZ3NCYXNlLmNwcApAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUg
IkRPTVRpbWVyLmgiCiAjaW5jbHVkZSAiRGF0YWJhc2UuaCIKICNpbmNsdWRlICJEb2N1bWVudC5o
IgotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5j
bHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZVRyZWUuaCIKICNpbmNsdWRlICJGcmFtZVZp
ZXcuaCIKQEAgLTU1LDcgKzU1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBzdGF0aWMgdm9p
ZCBpbnZhbGlkYXRlQWZ0ZXJHZW5lcmljRmFtaWx5Q2hhbmdlKFBhZ2UqIHBhZ2UpCiB7Ci0gICAg
aW52YWxpZGF0ZUZvbnRDYXNjYWRlQ2FjaGUoKTsKKyAgICBGb250Q2FjaGU6OnNpbmdsZXRvbigp
LmludmFsaWRhdGVGb250Q2FzY2FkZUNhY2hlKCk7CiAgICAgaWYgKHBhZ2UpCiAgICAgICAgIHBh
Z2UtPnNldE5lZWRzUmVjYWxjU3R5bGVJbkFsbEZyYW1lcygpOwogfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYWNoZS5jcHAKaW5kZXggYWJhMWE4NDI2ODAyNWMx
MmY3NWQ2NzM3M2I5MzMyNmNlYzZiM2YxNi4uZmIwZjg4ZGE3OTFhM2E2MWM1N2JhY2MxYWY3MmI0
NmYwY2M5MDk2ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Rm9udENhY2hlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250
Q2FjaGUuY3BwCkBAIC00MDMsNiArNDAzLDEwMyBAQCB2b2lkIEZvbnRDYWNoZTo6cHVyZ2VJbmFj
dGl2ZUZvbnREYXRhKHVuc2lnbmVkIHB1cmdlQ291bnQpCiAgICAgcGxhdGZvcm1QdXJnZUluYWN0
aXZlRm9udERhdGEoKTsKIH0KIAorc3RhdGljIGJvb2wga2V5c01hdGNoKGNvbnN0IEZvbnRDYXNj
YWRlQ2FjaGVLZXkmIGEsIGNvbnN0IEZvbnRDYXNjYWRlQ2FjaGVLZXkmIGIpCit7CisgICAgaWYg
KGEuZm9udERlc2NyaXB0aW9uS2V5ICE9IGIuZm9udERlc2NyaXB0aW9uS2V5KQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgaWYgKGEuZm9udFNlbGVjdG9ySWQgIT0gYi5mb250U2VsZWN0b3JJ
ZCB8fCBhLmZvbnRTZWxlY3RvclZlcnNpb24gIT0gYi5mb250U2VsZWN0b3JWZXJzaW9uKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgdW5zaWduZWQgc2l6ZSA9IGEuZmFtaWxpZXMuc2l6ZSgp
OworICAgIGlmIChzaXplICE9IGIuZmFtaWxpZXMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBp
ZiAoIUZvbnRDYXNjYWRlRGVzY3JpcHRpb246OmZhbWlseU5hbWVzQXJlRXF1YWwoYS5mYW1pbGll
c1tpXSwgYi5mYW1pbGllc1tpXSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnRDYWNoZTo6aW52YWxpZGF0ZUZvbnRDYXNj
YWRlQ2FjaGUoKQoreworICAgIG1fZm9udENhc2NhZGVDYWNoZS5jbGVhcigpOworfQorCit2b2lk
IEZvbnRDYWNoZTo6Y2xlYXJXaWR0aENhY2hlcygpCit7CisgICAgZm9yIChhdXRvJiB2YWx1ZSA6
IG1fZm9udENhc2NhZGVDYWNoZS52YWx1ZXMoKSkKKyAgICAgICAgdmFsdWUtPmZvbnRzLmdldCgp
LndpZHRoQ2FjaGUoKS5jbGVhcigpOworfQorCitzdGF0aWMgRm9udENhc2NhZGVDYWNoZUtleSBt
YWtlRm9udENhc2NhZGVDYWNoZUtleShjb25zdCBGb250Q2FzY2FkZURlc2NyaXB0aW9uJiBkZXNj
cmlwdGlvbiwgRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCit7CisgICAgRm9udENhc2NhZGVD
YWNoZUtleSBrZXk7CisgICAga2V5LmZvbnREZXNjcmlwdGlvbktleSA9IEZvbnREZXNjcmlwdGlv
bktleShkZXNjcmlwdGlvbik7CisgICAgdW5zaWduZWQgZmFtaWx5Q291bnQgPSBkZXNjcmlwdGlv
bi5mYW1pbHlDb3VudCgpOworICAgIGtleS5mYW1pbGllcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5
KGZhbWlseUNvdW50KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmFtaWx5Q291bnQ7
ICsraSkKKyAgICAgICAga2V5LmZhbWlsaWVzLnVuY2hlY2tlZEFwcGVuZChkZXNjcmlwdGlvbi5m
YW1pbHlBdChpKSk7CisgICAga2V5LmZvbnRTZWxlY3RvcklkID0gZm9udFNlbGVjdG9yID8gZm9u
dFNlbGVjdG9yLT51bmlxdWVJZCgpIDogMDsKKyAgICBrZXkuZm9udFNlbGVjdG9yVmVyc2lvbiA9
IGZvbnRTZWxlY3RvciA/IGZvbnRTZWxlY3Rvci0+dmVyc2lvbigpIDogMDsKKyAgICByZXR1cm4g
a2V5OworfQorCitzdGF0aWMgdW5zaWduZWQgY29tcHV0ZUZvbnRDYXNjYWRlQ2FjaGVIYXNoKGNv
bnN0IEZvbnRDYXNjYWRlQ2FjaGVLZXkmIGtleSkKK3sKKyAgICAvLyBGSVhNRTogU2hvdWxkIGhh
c2ggdGhlIGtleSBhbmQgdGhlIGZhbWlseSBuYW1lIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gbWFr
aW5nIGEgaGFzaCBvdXQgb2Ygb3RoZXIgaGFzaGVzLgorICAgIEludGVnZXJIYXNoZXIgaGFzaGVy
OworICAgIGhhc2hlci5hZGQoa2V5LmZvbnREZXNjcmlwdGlvbktleS5jb21wdXRlSGFzaCgpKTsK
KyAgICBoYXNoZXIuYWRkKGtleS5mb250U2VsZWN0b3JJZCk7CisgICAgaGFzaGVyLmFkZChrZXku
Zm9udFNlbGVjdG9yVmVyc2lvbik7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGtleS5m
YW1pbGllcy5zaXplKCk7ICsraSkgeworICAgICAgICBhdXRvJiBmYW1pbHkgPSBrZXkuZmFtaWxp
ZXNbaV07CisgICAgICAgIGhhc2hlci5hZGQoZmFtaWx5LmlzTnVsbCgpID8gMCA6IEZvbnRDYXNj
YWRlRGVzY3JpcHRpb246OmZhbWlseU5hbWVIYXNoKGZhbWlseSkpOworICAgIH0KKyAgICByZXR1
cm4gaGFzaGVyLmhhc2goKTsKK30KKwordm9pZCBGb250Q2FjaGU6OnBydW5lVW5yZWZlcmVuY2Vk
RW50cmllc0Zyb21Gb250Q2FzY2FkZUNhY2hlKCkKK3sKKyAgICBtX2ZvbnRDYXNjYWRlQ2FjaGUu
cmVtb3ZlSWYoW10oYXV0byYgZW50cnkpIHsKKyAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlLT5m
b250cy5nZXQoKS5oYXNPbmVSZWYoKTsKKyAgICB9KTsKK30KKwordm9pZCBGb250Q2FjaGU6OnBy
dW5lU3lzdGVtRmFsbGJhY2tGb250cygpCit7CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IG1fZm9u
dENhc2NhZGVDYWNoZS52YWx1ZXMoKSkKKyAgICAgICAgZW50cnktPmZvbnRzLT5wcnVuZVN5c3Rl
bUZhbGxiYWNrcygpOworfQorCitSZWY8Rm9udENhc2NhZGVGb250cz4gRm9udENhY2hlOjpyZXRy
aWV2ZU9yQWRkQ2FjaGVkRm9udHMoY29uc3QgRm9udENhc2NhZGVEZXNjcmlwdGlvbiYgZm9udERl
c2NyaXB0aW9uLCBSZWZQdHI8Rm9udFNlbGVjdG9yPiYmIGZvbnRTZWxlY3RvcikKK3sKKyAgICBh
dXRvIGtleSA9IG1ha2VGb250Q2FzY2FkZUNhY2hlS2V5KGZvbnREZXNjcmlwdGlvbiwgZm9udFNl
bGVjdG9yLmdldCgpKTsKKworICAgIHVuc2lnbmVkIGhhc2ggPSBjb21wdXRlRm9udENhc2NhZGVD
YWNoZUhhc2goa2V5KTsKKyAgICBhdXRvIGFkZFJlc3VsdCA9IG1fZm9udENhc2NhZGVDYWNoZS5h
ZGQoaGFzaCwgbnVsbHB0cik7CisgICAgaWYgKCFhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBrZXlz
TWF0Y2goYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS0+a2V5LCBrZXkpKQorICAgICAgICByZXR1
cm4gYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS0+Zm9udHMuZ2V0KCk7CisKKyAgICBhdXRvJiBu
ZXdFbnRyeSA9IGFkZFJlc3VsdC5pdGVyYXRvci0+dmFsdWU7CisgICAgbmV3RW50cnkgPSBtYWtl
VW5pcXVlPEZvbnRDYXNjYWRlQ2FjaGVFbnRyeT4oV1RGTW92ZShrZXkpLCBGb250Q2FzY2FkZUZv
bnRzOjpjcmVhdGUoV1RGTW92ZShmb250U2VsZWN0b3IpKSk7CisgICAgUmVmPEZvbnRDYXNjYWRl
Rm9udHM+IGdseXBocyA9IG5ld0VudHJ5LT5mb250cy5nZXQoKTsKKworICAgIHN0YXRpYyBjb25z
dCB1bnNpZ25lZCB1bnJlZmVyZW5jZWRQcnVuZUludGVydmFsID0gNTA7CisgICAgc3RhdGljIGNv
bnN0IGludCBtYXhpbXVtRW50cmllcyA9IDQwMDsKKyAgICBzdGF0aWMgdW5zaWduZWQgcHJ1bmVD
b3VudGVyOworICAgIC8vIFJlZmVyZW5jZWQgRm9udENhc2NhZGVGb250cyB3b3VsZCBleGlzdCBh
bnl3YXkgc28gcHJ1bmluZyB0aGVtIHNhdmVzIGxpdHRsZSBtZW1vcnkuCisgICAgaWYgKCEoKytw
cnVuZUNvdW50ZXIgJSB1bnJlZmVyZW5jZWRQcnVuZUludGVydmFsKSkKKyAgICAgICAgcHJ1bmVV
bnJlZmVyZW5jZWRFbnRyaWVzRnJvbUZvbnRDYXNjYWRlQ2FjaGUoKTsKKyAgICAvLyBQcmV2ZW50
IHBhdGhvbG9naWNhbCBncm93dGguCisgICAgaWYgKG1fZm9udENhc2NhZGVDYWNoZS5zaXplKCkg
PiBtYXhpbXVtRW50cmllcykKKyAgICAgICAgbV9mb250Q2FzY2FkZUNhY2hlLnJlbW92ZShtX2Zv
bnRDYXNjYWRlQ2FjaGUucmFuZG9tKCkpOworICAgIHJldHVybiBnbHlwaHM7Cit9CisKK3ZvaWQg
Rm9udENhY2hlOjp1cGRhdGVGb250Q2FzY2FkZShjb25zdCBGb250Q2FzY2FkZSYgZm9udENhc2Nh
ZGUsIFJlZlB0cjxGb250U2VsZWN0b3I+JiYgZm9udFNlbGVjdG9yKQoreworICAgIGZvbnRDYXNj
YWRlLnVwZGF0ZUZvbnRzKHJldHJpZXZlT3JBZGRDYWNoZWRGb250cyhmb250Q2FzY2FkZS5mb250
RGVzY3JpcHRpb24oKSwgV1RGTW92ZShmb250U2VsZWN0b3IpKSk7Cit9CisKIHNpemVfdCBGb250
Q2FjaGU6OmZvbnRDb3VudCgpCiB7CiAgICAgcmV0dXJuIGNhY2hlZEZvbnRzKCkuc2l6ZSgpOwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhY2hlLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FjaGUuaAppbmRleCBmOGUw
NWFlYjg2ZDRkNzA4NzVmMDExOTA2MWMxNjQzNzYwYmQ3MDdkLi5kZWNkNjdlZGFkNjhjNzcxZjA4
MmQ4ZmNiNTc4YzMxMjNkNTdmZjJlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9Gb250Q2FjaGUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9Gb250Q2FjaGUuaApAQCAtMjksNiArMjksNyBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2lu
Y2x1ZGUgIkZvbnRDYXNjYWRlRm9udHMuaCIKICNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIK
ICNpbmNsdWRlICJGb250UGxhdGZvcm1EYXRhLmgiCiAjaW5jbHVkZSAiRm9udFRhZ2dlZFNldHRp
bmdzLmgiCkBAIC0xNzUsNiArMTc2LDI3IEBAIHN0cnVjdCBGb250RGVzY3JpcHRpb25LZXlIYXNo
IHsKICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9
IHRydWU7CiB9OwogCitzdHJ1Y3QgRm9udENhc2NhZGVDYWNoZUtleSB7CisgICAgRm9udERlc2Ny
aXB0aW9uS2V5IGZvbnREZXNjcmlwdGlvbktleTsgLy8gU2hhcmVkIHdpdGggdGhlIGxvd2VyIGxl
dmVsIEZvbnRDYWNoZSAoY2FjaGluZyBGb250IG9iamVjdHMpCisgICAgVmVjdG9yPEF0b21TdHJp
bmcsIDM+IGZhbWlsaWVzOworICAgIHVuc2lnbmVkIGZvbnRTZWxlY3RvcklkOworICAgIHVuc2ln
bmVkIGZvbnRTZWxlY3RvclZlcnNpb247Cit9OworCitzdHJ1Y3QgRm9udENhc2NhZGVDYWNoZUVu
dHJ5IHsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBGb250Q2Fz
Y2FkZUNhY2hlRW50cnkoRm9udENhc2NhZGVDYWNoZUtleSYmIGtleSwgUmVmPEZvbnRDYXNjYWRl
Rm9udHM+JiYgZm9udHMpCisgICAgICAgIDoga2V5KFdURk1vdmUoa2V5KSkKKyAgICAgICAgLCBm
b250cyhXVEZNb3ZlKGZvbnRzKSkKKyAgICB7IH0KKyAgICBGb250Q2FzY2FkZUNhY2hlS2V5IGtl
eTsKKyAgICBSZWY8Rm9udENhc2NhZGVGb250cz4gZm9udHM7Cit9OworCisvLyBGSVhNRTogU2hv
dWxkIG1ha2UgaGFzaCB0cmFpdHMgZm9yIEZvbnRDYXNjYWRlQ2FjaGVLZXkgaW5zdGVhZCBvZiB1
c2luZyBhIGhhc2ggYXMgdGhlIGtleSAoc28gd2UgaGFzaCBhIGhhc2gpLgordHlwZWRlZiBIYXNo
TWFwPHVuc2lnbmVkLCBzdGQ6OnVuaXF1ZV9wdHI8Rm9udENhc2NhZGVDYWNoZUVudHJ5PiwgQWxy
ZWFkeUhhc2hlZD4gRm9udENhc2NhZGVDYWNoZTsKKwogY2xhc3MgRm9udENhY2hlIHsKICAgICBm
cmllbmQgY2xhc3MgV1RGOjpOZXZlckRlc3Ryb3llZDxGb250Q2FjaGU+OwogCkBAIC0yMjAsNiAr
MjQyLDEwIEBAIHB1YmxpYzoKICAgICBXRUJDT1JFX0VYUE9SVCB2b2lkIHB1cmdlSW5hY3RpdmVG
b250RGF0YSh1bnNpZ25lZCBjb3VudCA9IFVJTlRfTUFYKTsKICAgICB2b2lkIHBsYXRmb3JtUHVy
Z2VJbmFjdGl2ZUZvbnREYXRhKCk7CiAKKyAgICB2b2lkIHVwZGF0ZUZvbnRDYXNjYWRlKGNvbnN0
IEZvbnRDYXNjYWRlJiwgUmVmUHRyPEZvbnRTZWxlY3Rvcj4mJik7CisgICAgdm9pZCBpbnZhbGlk
YXRlRm9udENhc2NhZGVDYWNoZSgpOworICAgIHZvaWQgY2xlYXJXaWR0aENhY2hlcygpOworCiAj
aWYgUExBVEZPUk0oV0lOKQogICAgIFJlZlB0cjxGb250PiBmb250RnJvbURlc2NyaXB0aW9uQW5k
TG9nRm9udChjb25zdCBGb250RGVzY3JpcHRpb24mLCBjb25zdCBMT0dGT05UJiwgQXRvbVN0cmlu
ZyYgb3V0Rm9udEZhbWlseU5hbWUpOwogI2VuZGlmCkBAIC0yNTIsNiArMjc4LDkgQEAgcHJpdmF0
ZToKICAgICB+Rm9udENhY2hlKCkgPSBkZWxldGU7CiAKICAgICBXRUJDT1JFX0VYUE9SVCB2b2lk
IHB1cmdlSW5hY3RpdmVGb250RGF0YUlmTmVlZGVkKCk7CisgICAgdm9pZCBwcnVuZVVucmVmZXJl
bmNlZEVudHJpZXNGcm9tRm9udENhc2NhZGVDYWNoZSgpOworICAgIHZvaWQgcHJ1bmVTeXN0ZW1G
YWxsYmFja0ZvbnRzKCk7CisgICAgUmVmPEZvbnRDYXNjYWRlRm9udHM+IHJldHJpZXZlT3JBZGRD
YWNoZWRGb250cyhjb25zdCBGb250Q2FzY2FkZURlc2NyaXB0aW9uJiwgUmVmUHRyPEZvbnRTZWxl
Y3Rvcj4mJik7CiAKICAgICAvLyBGSVhNRTogVGhpcyBtZXRob2Qgc2hvdWxkIGV2ZW50dWFsbHkg
YmUgcmVtb3ZlZC4KICAgICBGb250UGxhdGZvcm1EYXRhKiBnZXRDYWNoZWRGb250UGxhdGZvcm1E
YXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYsIGNvbnN0IEF0b21TdHJpbmcmIGZhbWlseSwgY29u
c3QgRm9udEZlYXR1cmVTZXR0aW5ncyogZm9udEZhY2VGZWF0dXJlcyA9IG51bGxwdHIsIEZvbnRT
ZWxlY3Rpb25TcGVjaWZpZWRDYXBhYmlsaXRpZXMgZm9udEZhY2VDYXBhYmlsaXRpZXMgPSB7IH0s
IGJvb2wgY2hlY2tpbmdBbHRlcm5hdGVOYW1lID0gZmFsc2UpOwpAQCAtMjY2LDYgKzI5NSw4IEBA
IHByaXZhdGU6CiAgICAgCiAgICAgYm9vbCBtX3Nob3VsZE1vY2tCb2xkU3lzdGVtRm9udEZvckFj
Y2Vzc2liaWxpdHkgeyBmYWxzZSB9OwogCisgICAgRm9udENhc2NhZGVDYWNoZSBtX2ZvbnRDYXNj
YWRlQ2FjaGU7CisKICNpZiBQTEFURk9STShDT0NPQSkKICAgICBMaXN0SGFzaFNldDxTdHJpbmc+
IG1fc2VlbkZhbWlsaWVzRm9yUHJld2FybWluZzsKICAgICBMaXN0SGFzaFNldDxTdHJpbmc+IG1f
Zm9udE5hbWVzUmVxdWlyaW5nU3lzdGVtRmFsbGJhY2tGb3JQcmV3YXJtaW5nOwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwCmluZGV4IGQzMjI0
YTMwYTkzY2ZhNGNlYjJhZDdlOGFmMjczMGU4NWI3ZDVkMzQuLjgxNmYxZGNlZGRlMzA2YjM3YzIy
ZDFiNDI1OTgwZDljNDRiODFiZjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Gb250Q2FzY2FkZS5jcHAKQEAgLTE0NiwxMjUgKzE0Niw2IEBAIGJvb2wgRm9udENh
c2NhZGU6Om9wZXJhdG9yPT0oY29uc3QgRm9udENhc2NhZGUmIG90aGVyKSBjb25zdAogICAgIHJl
dHVybiB0cnVlOwogfQogCi1zdHJ1Y3QgRm9udENhc2NhZGVDYWNoZUtleSB7Ci0gICAgRm9udERl
c2NyaXB0aW9uS2V5IGZvbnREZXNjcmlwdGlvbktleTsgLy8gU2hhcmVkIHdpdGggdGhlIGxvd2Vy
IGxldmVsIEZvbnRDYWNoZSAoY2FjaGluZyBGb250IG9iamVjdHMpCi0gICAgVmVjdG9yPEF0b21T
dHJpbmcsIDM+IGZhbWlsaWVzOwotICAgIHVuc2lnbmVkIGZvbnRTZWxlY3RvcklkOwotICAgIHVu
c2lnbmVkIGZvbnRTZWxlY3RvclZlcnNpb247Ci19OwotCi1zdHJ1Y3QgRm9udENhc2NhZGVDYWNo
ZUVudHJ5IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBGb250
Q2FzY2FkZUNhY2hlRW50cnkoRm9udENhc2NhZGVDYWNoZUtleSYmIGtleSwgUmVmPEZvbnRDYXNj
YWRlRm9udHM+JiYgZm9udHMpCi0gICAgICAgIDoga2V5KFdURk1vdmUoa2V5KSkKLSAgICAgICAg
LCBmb250cyhXVEZNb3ZlKGZvbnRzKSkKLSAgICB7IH0KLSAgICBGb250Q2FzY2FkZUNhY2hlS2V5
IGtleTsKLSAgICBSZWY8Rm9udENhc2NhZGVGb250cz4gZm9udHM7Ci19OwotCi0vLyBGSVhNRTog
U2hvdWxkIG1ha2UgaGFzaCB0cmFpdHMgZm9yIEZvbnRDYXNjYWRlQ2FjaGVLZXkgaW5zdGVhZCBv
ZiB1c2luZyBhIGhhc2ggYXMgdGhlIGtleSAoc28gd2UgaGFzaCBhIGhhc2gpLgotdHlwZWRlZiBI
YXNoTWFwPHVuc2lnbmVkLCBzdGQ6OnVuaXF1ZV9wdHI8Rm9udENhc2NhZGVDYWNoZUVudHJ5Piwg
QWxyZWFkeUhhc2hlZD4gRm9udENhc2NhZGVDYWNoZTsKLQotc3RhdGljIGJvb2wga2V5c01hdGNo
KGNvbnN0IEZvbnRDYXNjYWRlQ2FjaGVLZXkmIGEsIGNvbnN0IEZvbnRDYXNjYWRlQ2FjaGVLZXkm
IGIpCi17Ci0gICAgaWYgKGEuZm9udERlc2NyaXB0aW9uS2V5ICE9IGIuZm9udERlc2NyaXB0aW9u
S2V5KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGEuZm9udFNlbGVjdG9ySWQgIT0g
Yi5mb250U2VsZWN0b3JJZCB8fCBhLmZvbnRTZWxlY3RvclZlcnNpb24gIT0gYi5mb250U2VsZWN0
b3JWZXJzaW9uKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgdW5zaWduZWQgc2l6ZSA9IGEu
ZmFtaWxpZXMuc2l6ZSgpOwotICAgIGlmIChzaXplICE9IGIuZmFtaWxpZXMuc2l6ZSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsr
aSkgewotICAgICAgICBpZiAoIUZvbnRDYXNjYWRlRGVzY3JpcHRpb246OmZhbWlseU5hbWVzQXJl
RXF1YWwoYS5mYW1pbGllc1tpXSwgYi5mYW1pbGllc1tpXSkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgRm9udENhc2NhZGVD
YWNoZSYgZm9udENhc2NhZGVDYWNoZSgpCi17Ci0gICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEZv
bnRDYXNjYWRlQ2FjaGU+IGNhY2hlOwotICAgIHJldHVybiBjYWNoZS5nZXQoKTsKLX0KLQotdm9p
ZCBpbnZhbGlkYXRlRm9udENhc2NhZGVDYWNoZSgpCi17Ci0gICAgZm9udENhc2NhZGVDYWNoZSgp
LmNsZWFyKCk7Ci19Ci0KLXZvaWQgY2xlYXJXaWR0aENhY2hlcygpCi17Ci0gICAgZm9yIChhdXRv
JiB2YWx1ZSA6IGZvbnRDYXNjYWRlQ2FjaGUoKS52YWx1ZXMoKSkKLSAgICAgICAgdmFsdWUtPmZv
bnRzLmdldCgpLndpZHRoQ2FjaGUoKS5jbGVhcigpOwotfQotCi1zdGF0aWMgRm9udENhc2NhZGVD
YWNoZUtleSBtYWtlRm9udENhc2NhZGVDYWNoZUtleShjb25zdCBGb250Q2FzY2FkZURlc2NyaXB0
aW9uJiBkZXNjcmlwdGlvbiwgRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCi17Ci0gICAgRm9u
dENhc2NhZGVDYWNoZUtleSBrZXk7Ci0gICAga2V5LmZvbnREZXNjcmlwdGlvbktleSA9IEZvbnRE
ZXNjcmlwdGlvbktleShkZXNjcmlwdGlvbik7Ci0gICAgdW5zaWduZWQgZmFtaWx5Q291bnQgPSBk
ZXNjcmlwdGlvbi5mYW1pbHlDb3VudCgpOwotICAgIGtleS5mYW1pbGllcy5yZXNlcnZlSW5pdGlh
bENhcGFjaXR5KGZhbWlseUNvdW50KTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmFt
aWx5Q291bnQ7ICsraSkKLSAgICAgICAga2V5LmZhbWlsaWVzLnVuY2hlY2tlZEFwcGVuZChkZXNj
cmlwdGlvbi5mYW1pbHlBdChpKSk7Ci0gICAga2V5LmZvbnRTZWxlY3RvcklkID0gZm9udFNlbGVj
dG9yID8gZm9udFNlbGVjdG9yLT51bmlxdWVJZCgpIDogMDsKLSAgICBrZXkuZm9udFNlbGVjdG9y
VmVyc2lvbiA9IGZvbnRTZWxlY3RvciA/IGZvbnRTZWxlY3Rvci0+dmVyc2lvbigpIDogMDsKLSAg
ICByZXR1cm4ga2V5OwotfQotCi1zdGF0aWMgdW5zaWduZWQgY29tcHV0ZUZvbnRDYXNjYWRlQ2Fj
aGVIYXNoKGNvbnN0IEZvbnRDYXNjYWRlQ2FjaGVLZXkmIGtleSkKLXsKLSAgICAvLyBGSVhNRTog
U2hvdWxkIGhhc2ggdGhlIGtleSBhbmQgdGhlIGZhbWlseSBuYW1lIGNoYXJhY3RlcnMgcmF0aGVy
IHRoYW4gbWFraW5nIGEgaGFzaCBvdXQgb2Ygb3RoZXIgaGFzaGVzLgotICAgIEludGVnZXJIYXNo
ZXIgaGFzaGVyOwotICAgIGhhc2hlci5hZGQoa2V5LmZvbnREZXNjcmlwdGlvbktleS5jb21wdXRl
SGFzaCgpKTsKLSAgICBoYXNoZXIuYWRkKGtleS5mb250U2VsZWN0b3JJZCk7Ci0gICAgaGFzaGVy
LmFkZChrZXkuZm9udFNlbGVjdG9yVmVyc2lvbik7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGtleS5mYW1pbGllcy5zaXplKCk7ICsraSkgewotICAgICAgICBhdXRvJiBmYW1pbHkgPSBr
ZXkuZmFtaWxpZXNbaV07Ci0gICAgICAgIGhhc2hlci5hZGQoZmFtaWx5LmlzTnVsbCgpID8gMCA6
IEZvbnRDYXNjYWRlRGVzY3JpcHRpb246OmZhbWlseU5hbWVIYXNoKGZhbWlseSkpOwotICAgIH0K
LSAgICByZXR1cm4gaGFzaGVyLmhhc2goKTsKLX0KLQotdm9pZCBwcnVuZVVucmVmZXJlbmNlZEVu
dHJpZXNGcm9tRm9udENhc2NhZGVDYWNoZSgpCi17Ci0gICAgZm9udENhc2NhZGVDYWNoZSgpLnJl
bW92ZUlmKFtdKGF1dG8mIGVudHJ5KSB7Ci0gICAgICAgIHJldHVybiBlbnRyeS52YWx1ZS0+Zm9u
dHMuZ2V0KCkuaGFzT25lUmVmKCk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgcHJ1bmVTeXN0ZW1GYWxs
YmFja0ZvbnRzKCkKLXsKLSAgICBmb3IgKGF1dG8mIGVudHJ5IDogZm9udENhc2NhZGVDYWNoZSgp
LnZhbHVlcygpKQotICAgICAgICBlbnRyeS0+Zm9udHMtPnBydW5lU3lzdGVtRmFsbGJhY2tzKCk7
Ci19Ci0KLXN0YXRpYyBSZWY8Rm9udENhc2NhZGVGb250cz4gcmV0cmlldmVPckFkZENhY2hlZEZv
bnRzKGNvbnN0IEZvbnRDYXNjYWRlRGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgUmVmUHRy
PEZvbnRTZWxlY3Rvcj4mJiBmb250U2VsZWN0b3IpCi17Ci0gICAgYXV0byBrZXkgPSBtYWtlRm9u
dENhc2NhZGVDYWNoZUtleShmb250RGVzY3JpcHRpb24sIGZvbnRTZWxlY3Rvci5nZXQoKSk7Ci0K
LSAgICB1bnNpZ25lZCBoYXNoID0gY29tcHV0ZUZvbnRDYXNjYWRlQ2FjaGVIYXNoKGtleSk7Ci0g
ICAgYXV0byBhZGRSZXN1bHQgPSBmb250Q2FzY2FkZUNhY2hlKCkuYWRkKGhhc2gsIG51bGxwdHIp
OwotICAgIGlmICghYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYga2V5c01hdGNoKGFkZFJlc3VsdC5p
dGVyYXRvci0+dmFsdWUtPmtleSwga2V5KSkKLSAgICAgICAgcmV0dXJuIGFkZFJlc3VsdC5pdGVy
YXRvci0+dmFsdWUtPmZvbnRzLmdldCgpOwotCi0gICAgYXV0byYgbmV3RW50cnkgPSBhZGRSZXN1
bHQuaXRlcmF0b3ItPnZhbHVlOwotICAgIG5ld0VudHJ5ID0gbWFrZVVuaXF1ZTxGb250Q2FzY2Fk
ZUNhY2hlRW50cnk+KFdURk1vdmUoa2V5KSwgRm9udENhc2NhZGVGb250czo6Y3JlYXRlKFdURk1v
dmUoZm9udFNlbGVjdG9yKSkpOwotICAgIFJlZjxGb250Q2FzY2FkZUZvbnRzPiBnbHlwaHMgPSBu
ZXdFbnRyeS0+Zm9udHMuZ2V0KCk7Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgdW5yZWZl
cmVuY2VkUHJ1bmVJbnRlcnZhbCA9IDUwOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4aW11bUVu
dHJpZXMgPSA0MDA7Ci0gICAgc3RhdGljIHVuc2lnbmVkIHBydW5lQ291bnRlcjsKLSAgICAvLyBS
ZWZlcmVuY2VkIEZvbnRDYXNjYWRlRm9udHMgd291bGQgZXhpc3QgYW55d2F5IHNvIHBydW5pbmcg
dGhlbSBzYXZlcyBsaXR0bGUgbWVtb3J5LgotICAgIGlmICghKCsrcHJ1bmVDb3VudGVyICUgdW5y
ZWZlcmVuY2VkUHJ1bmVJbnRlcnZhbCkpCi0gICAgICAgIHBydW5lVW5yZWZlcmVuY2VkRW50cmll
c0Zyb21Gb250Q2FzY2FkZUNhY2hlKCk7Ci0gICAgLy8gUHJldmVudCBwYXRob2xvZ2ljYWwgZ3Jv
d3RoLgotICAgIGlmIChmb250Q2FzY2FkZUNhY2hlKCkuc2l6ZSgpID4gbWF4aW11bUVudHJpZXMp
Ci0gICAgICAgIGZvbnRDYXNjYWRlQ2FjaGUoKS5yZW1vdmUoZm9udENhc2NhZGVDYWNoZSgpLnJh
bmRvbSgpKTsKLSAgICByZXR1cm4gZ2x5cGhzOwotfQotCiBib29sIEZvbnRDYXNjYWRlOjppc0N1
cnJlbnQoY29uc3QgRm9udFNlbGVjdG9yJiBmb250U2VsZWN0b3IpIGNvbnN0CiB7CiAgICAgaWYg
KCFtX2ZvbnRzKQpAQCAtMjc3LDE0ICsxNTgsMTkgQEAgYm9vbCBGb250Q2FzY2FkZTo6aXNDdXJy
ZW50KGNvbnN0IEZvbnRTZWxlY3RvciYgZm9udFNlbGVjdG9yKSBjb25zdAogICAgIHJldHVybiB0
cnVlOwogfQogCi12b2lkIEZvbnRDYXNjYWRlOjp1cGRhdGUoUmVmUHRyPEZvbnRTZWxlY3Rvcj4m
JiBmb250U2VsZWN0b3IpIGNvbnN0Cit2b2lkIEZvbnRDYXNjYWRlOjp1cGRhdGVGb250cyhSZWY8
Rm9udENhc2NhZGVGb250cz4mJiBmb250cykgY29uc3QKIHsKLSAgICBtX2ZvbnRzID0gcmV0cmll
dmVPckFkZENhY2hlZEZvbnRzKG1fZm9udERlc2NyaXB0aW9uLCBXVEZNb3ZlKGZvbnRTZWxlY3Rv
cikpOworICAgIG1fZm9udHMgPSBXVEZNb3ZlKGZvbnRzKTsKICAgICBtX3VzZUJhY2tzbGFzaEFz
WWVuU3ltYm9sID0gdXNlQmFja3NsYXNoQXNZZW5TaWduRm9yRmFtaWx5KGZpcnN0RmFtaWx5KCkp
OwogICAgIG1fZW5hYmxlS2VybmluZyA9IGNvbXB1dGVFbmFibGVLZXJuaW5nKCk7CiAgICAgbV9y
ZXF1aXJlc1NoYXBpbmcgPSBjb21wdXRlUmVxdWlyZXNTaGFwaW5nKCk7CiB9CiAKK3ZvaWQgRm9u
dENhc2NhZGU6OnVwZGF0ZShSZWZQdHI8Rm9udFNlbGVjdG9yPiYmIGZvbnRTZWxlY3RvcikgY29u
c3QKK3sKKyAgICBGb250Q2FjaGU6OnNpbmdsZXRvbigpLnVwZGF0ZUZvbnRDYXNjYWRlKCp0aGlz
LCBXVEZNb3ZlKGZvbnRTZWxlY3RvcikpOworfQorCiBHbHlwaEJ1ZmZlciBGb250Q2FzY2FkZTo6
bGF5b3V0VGV4dChDb2RlUGF0aCBjb2RlUGF0aFRvVXNlLCBjb25zdCBUZXh0UnVuJiBydW4sIHVu
c2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLCBGb3JUZXh0RW1waGFzaXNPck5vdCBmb3JUZXh0RW1w
aGFzaXMpIGNvbnN0CiB7CiAgICAgaWYgKGNvZGVQYXRoVG9Vc2UgIT0gQ29kZVBhdGg6OkNvbXBs
ZXgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2Fz
Y2FkZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuaApp
bmRleCA2MGFmNmYzNWFlNGViNzFhNDAwY2YxMzZhYzgwNjM2ZDdmNjA5YzAwLi4zMTk1OTNlOGU2
ZTczYjk4YjliMDQ2MThhZTdlNTQyNWYzODk5ODk3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmgKQEAgLTExMiw2ICsxMTIsNyBAQCBwdWJsaWM6
CiAgICAgZmxvYXQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZvbnREZXNjcmlwdGlvbigpLmNvbXB1
dGVkU2l6ZSgpOyB9CiAKICAgICBib29sIGlzQ3VycmVudChjb25zdCBGb250U2VsZWN0b3ImKSBj
b25zdDsKKyAgICB2b2lkIHVwZGF0ZUZvbnRzKFJlZjxGb250Q2FzY2FkZUZvbnRzPiYmKSBjb25z
dDsKICAgICBXRUJDT1JFX0VYUE9SVCB2b2lkIHVwZGF0ZShSZWZQdHI8Rm9udFNlbGVjdG9yPiYm
ID0gbnVsbHB0cikgY29uc3Q7CiAKICAgICBlbnVtIEN1c3RvbUZvbnROb3RSZWFkeUFjdGlvbiB7
IERvTm90UGFpbnRJZkZvbnROb3RSZWFkeSwgVXNlRmFsbGJhY2tJZkZvbnROb3RSZWFkeSB9OwpA
QCAtMzI5LDExICszMzAsNiBAQCBwcml2YXRlOgogICAgIG11dGFibGUgYm9vbCBtX3JlcXVpcmVz
U2hhcGluZyB7IGZhbHNlIH07IC8vIENvbXB1dGVkIGZyb20gbV9mb250RGVzY3JpcHRpb24uCiB9
OwogCi12b2lkIGludmFsaWRhdGVGb250Q2FzY2FkZUNhY2hlKCk7Ci12b2lkIHBydW5lVW5yZWZl
cmVuY2VkRW50cmllc0Zyb21Gb250Q2FzY2FkZUNhY2hlKCk7Ci12b2lkIHBydW5lU3lzdGVtRmFs
bGJhY2tGb250cygpOwotdm9pZCBjbGVhcldpZHRoQ2FjaGVzKCk7Ci0KIGlubGluZSBjb25zdCBG
b250JiBGb250Q2FzY2FkZTo6cHJpbWFyeUZvbnQoKSBjb25zdAogewogICAgIEFTU0VSVChtX2Zv
bnRzKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>