<?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>167954</bug_id>
          
          <creation_ts>2017-02-07 13:41:38 -0800</creation_ts>
          <short_desc>[Win] Implement ComplexTextController on top of DirectWrite</short_desc>
          <delta_ts>2019-02-18 17:37:43 -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>Text</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>167566</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Myles C. Maxfield">mmaxfield</assigned_to>
          <cc>mitz</cc>
    
    <cc>mmaxfield</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1274141</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2017-02-07 13:41:38 -0800</bug_when>
    <thetext>Now that the shared pieces of ComplexTextController are shared among all the ports, we should implement the required platform-specific part on top of DirectWrite. Once this is done, we can remove UniscribeController.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1274281</commentid>
    <comment_count>1</comment_count>
      <attachid>300883</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2017-02-08 00:41:40 -0800</bug_when>
    <thetext>Created attachment 300883
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1507550</commentid>
    <comment_count>2</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-02-18 17:37:43 -0800</bug_when>
    <thetext>This would have fixed https://bugs.webkit.org/show_bug.cgi?id=191368</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>300883</attachid>
            <date>2017-02-08 00:41:40 -0800</date>
            <delta_ts>2017-02-08 00:41:40 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>bug-167954-20170208003916.patch</filename>
            <type>text/plain</type>
            <size>60787</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjExODU0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZmZkOWE5YmE3NjQzMzcx
ZGI5MzU2YmQ5ZDVjNGE0MThmMzg3ZmZlOS4uMTE5MjcyYmJmMmRiMjkxZGY3NDNhYmQ1NzI1OWU3
MmIxYTUxNWYzMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDUzIEBACisyMDE3LTAyLTA4ICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgW1dpbl0gSW1w
bGVtZW50IENvbXBsZXhUZXh0Q29udHJvbGxlciBvbiB0b3Agb2YgRGlyZWN0V3JpdGUKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2Nzk1NAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyAo
T09QUyEpLgorCisgICAgICAgICogUGxhdGZvcm1XaW4uY21ha2U6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhc2Nh
ZGU6OmRyYXdHbHlwaEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6YWRq
dXN0U2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRD
YXNjYWRlOjpnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvckNvbXBsZXhUZXh0KToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnRDYXNjYWRlOjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQpOgorICAgICAgICAo
V2ViQ29yZTo6Rm9udENhc2NhZGU6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVyLmg6CisgICAgICAgIChXZWJD
b3JlOjpHbHlwaEJ1ZmZlcjo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6
OmFkdmFuY2VBdCk6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6YWRkKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdseXBoQnVmZmVyOjpzaHJpbmspOgorICAgICAgICAoV2ViQ29yZTo6R2x5
cGhCdWZmZXI6OnN3YXApOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6Om9mZnNldEF0
KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jb2NvYS9Gb250Q2FzY2Fk
ZUNvY29hLm1tOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhc2NhZGU6OmFkanVzdFNlbGVjdGlv
blJlY3RGb3JDb21wbGV4VGV4dCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250Q2Fz
Y2FkZTo6Z2V0R2x5cGhzQW5kQWR2YW5jZXNGb3JDb21wbGV4VGV4dCk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjpvZmZzZXRGb3JQb3NpdGlvbkZv
ckNvbXBsZXhUZXh0KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMv
Q29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQubW06CisgICAgICAgIChXZWJDb3JlOjpDb21w
bGV4VGV4dENvbnRyb2xsZXI6OmNvbGxlY3RDb21wbGV4VGV4dFJ1bnNGb3JDaGFyYWN0ZXJzKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vQ29tcGxleFRleHRDb250cm9sbGVyRGly
ZWN0V3JpdGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEFuYWx5c2lzU291cmNlOjpUZXh0
QW5hbHlzaXNTb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEFuYWx5c2lzU2luazo6aXRl
cmF0ZVJ1bnMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEFuYWx5c2lzU2luazo6aXRlcmF0ZVJ1
blJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBbmFseXNpc1Npbms6OnNwbGl0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlRleHRBbmFseXNpc1Npbms6OmlzU29ydGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OnJldmVyc2VDb2RlVW5pdFRvR2x5cGhNYXApOgorICAgICAgICAoV2ViQ29yZTo6Q29t
cGxleFRleHRDb250cm9sbGVyOjpjb2xsZWN0Q29tcGxleFRleHRSdW5zRm9yQ2hhcmFjdGVycyk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpGb250Q2FzY2FkZTo6ZHJhd0dseXBocyk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRDYXNjYWRlRGlyZWN0MkQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Rm9udENhc2NhZGU6OmRyYXdHbHlwaHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9Gb250V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjphZGp1c3RTZWxl
Y3Rpb25SZWN0Rm9yQ29tcGxleFRleHQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Rm9u
dENhc2NhZGU6OmdldEdseXBoc0FuZEFkdmFuY2VzRm9yQ29tcGxleFRleHQpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6Rm9udENhc2NhZGU6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6b2Zmc2V0Rm9yUG9zaXRp
b25Gb3JDb21wbGV4VGV4dCk6IERlbGV0ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL1VuaXNjcmliZUNvbnRyb2xsZXIuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9VbmlzY3JpYmVDb250cm9sbGVyLmg6IFJlbW92ZWQuCisKIDIwMTctMDIt
MDcgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgogCiAgICAgICAg
IFJFR1JFU1NJT04ocjIxMDc0MCk6IFtHVEtdIDIuMTUgYnJva2UgZW1iZWRkZWQgdmlkZW9zIGlu
IEdOT01FJ3MgeWVscCBhcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1BsYXRmb3JtV2lu
LmNtYWtlIGIvU291cmNlL1dlYkNvcmUvUGxhdGZvcm1XaW4uY21ha2UKaW5kZXggM2I1YjQwYjM5
ZDAxMWVmM2EwNTJkYTg3NTc0NDBiYzU4NDhjMDEwNC4uYTU3Y2JjNTc1MTEzOTliZGYwYTIzNDhl
NDcwNWVkZTdiZWVjZGI1YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvUGxhdGZvcm1XaW4u
Y21ha2UKKysrIGIvU291cmNlL1dlYkNvcmUvUGxhdGZvcm1XaW4uY21ha2UKQEAgLTEwNSw3ICsx
MDUsNiBAQCBsaXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9ncmFwaGlj
cy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1Ry
YW5zZm9ybWF0aW9uTWF0cml4RGlyZWN0MkQuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L1RyYW5zZm9ybWF0aW9uTWF0cml4V2luLmNwcAotICAgIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9V
bmlzY3JpYmVDb250cm9sbGVyLmNwcAogCiAgICAgcGxhdGZvcm0vbmV0d29yay93aW4vRG93bmxv
YWRCdW5kbGVXaW4uY3BwCiAgICAgcGxhdGZvcm0vbmV0d29yay93aW4vTmV0d29ya1N0YXRlTm90
aWZpZXJXaW4uY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9Gb250Q2FzY2FkZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250
Q2FzY2FkZS5jcHAKaW5kZXggZjdiZmRmYTUxMGQwZGQ1NTI3NGMyYWRlNGYyYjEwM2Q4NDFkZGRj
My4uNTE4ZDI5NGVkNTI3ZDQ3NjcyY2Q0YWJjY2RmMjJlMTZjNTE1ZTJiNCAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmNwcApAQCAtMjUsNiAr
MjUsNyBAQAogI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCiAKICNpbmNsdWRlICJDaGFyYWN0ZXJQ
cm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiQ29tcGxleFRleHRDb250cm9sbGVyLmgiCiAjaW5jbHVk
ZSAiRmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRm9udENhY2hlLmgiCiAjaW5jbHVkZSAiR2x5cGhC
dWZmZXIuaCIKQEAgLTEyOTksNyArMTMwMCw2IEBAIHZvaWQgRm9udENhc2NhZGU6OmRyYXdHbHlw
aEJ1ZmZlcihHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnN0IEdseXBoQnVmZmVyJiBnCiB7
CiAgICAgLy8gRHJhdyBlYWNoIGNvbnRpZ3VvdXMgcnVuIG9mIGdseXBocyB0aGF0IHVzZSB0aGUg
c2FtZSBmb250IGRhdGEuCiAgICAgY29uc3QgRm9udCogZm9udERhdGEgPSBnbHlwaEJ1ZmZlci5m
b250QXQoMCk7Ci0gICAgRmxvYXRTaXplIG9mZnNldCA9IGdseXBoQnVmZmVyLm9mZnNldEF0KDAp
OwogICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludChwb2ludC54KCksIHBvaW50LnkoKSAtIGdseXBo
QnVmZmVyLmluaXRpYWxBZHZhbmNlKCkuaGVpZ2h0KCkpOwogICAgIGZsb2F0IG5leHRYID0gc3Rh
cnRQb2ludC54KCkgKyBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoMCkud2lkdGgoKTsKICAgICBmbG9h
dCBuZXh0WSA9IHN0YXJ0UG9pbnQueSgpICsgZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KDApLmhlaWdo
dCgpOwpAQCAtMTMwNywxNCArMTMwNywxMSBAQCB2b2lkIEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhC
dWZmZXIoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBjb25zdCBHbHlwaEJ1ZmZlciYgZwogICAg
IHVuc2lnbmVkIG5leHRHbHlwaCA9IDE7CiAgICAgd2hpbGUgKG5leHRHbHlwaCA8IGdseXBoQnVm
ZmVyLnNpemUoKSkgewogICAgICAgICBjb25zdCBGb250KiBuZXh0Rm9udERhdGEgPSBnbHlwaEJ1
ZmZlci5mb250QXQobmV4dEdseXBoKTsKLSAgICAgICAgRmxvYXRTaXplIG5leHRPZmZzZXQgPSBn
bHlwaEJ1ZmZlci5vZmZzZXRBdChuZXh0R2x5cGgpOwotCi0gICAgICAgIGlmIChuZXh0Rm9udERh
dGEgIT0gZm9udERhdGEgfHwgbmV4dE9mZnNldCAhPSBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG5l
eHRGb250RGF0YSAhPSBmb250RGF0YSkgewogICAgICAgICAgICAgY29udGV4dC5kcmF3R2x5cGhz
KCp0aGlzLCAqZm9udERhdGEsIGdseXBoQnVmZmVyLCBsYXN0RnJvbSwgbmV4dEdseXBoIC0gbGFz
dEZyb20sIHN0YXJ0UG9pbnQpOwogCiAgICAgICAgICAgICBsYXN0RnJvbSA9IG5leHRHbHlwaDsK
ICAgICAgICAgICAgIGZvbnREYXRhID0gbmV4dEZvbnREYXRhOwotICAgICAgICAgICAgb2Zmc2V0
ID0gbmV4dE9mZnNldDsKICAgICAgICAgICAgIHN0YXJ0UG9pbnQuc2V0WChuZXh0WCk7CiAgICAg
ICAgICAgICBzdGFydFBvaW50LnNldFkobmV4dFkpOwogICAgICAgICB9CkBAIC0xNDc1LDQgKzE0
NzIsNjcgQEAgdm9pZCBGb250Q2FzY2FkZTo6ZHJhd0VtcGhhc2lzTWFya3NGb3JDb21wbGV4VGV4
dChHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnMKICAgICBkcmF3RW1waGFzaXNNYXJrcyhj
b250ZXh0LCBnbHlwaEJ1ZmZlciwgbWFyaywgRmxvYXRQb2ludChwb2ludC54KCkgKyBpbml0aWFs
QWR2YW5jZSwgcG9pbnQueSgpKSk7CiB9CiAKKyNpZiBQTEFURk9STShDT0NPQSkgfHwgUExBVEZP
Uk0oV0lOKQordm9pZCBGb250Q2FzY2FkZTo6YWRqdXN0U2VsZWN0aW9uUmVjdEZvckNvbXBsZXhU
ZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgTGF5b3V0UmVjdCYgc2VsZWN0aW9uUmVjdCwgdW5zaWdu
ZWQgZnJvbSwgdW5zaWduZWQgdG8pIGNvbnN0Cit7CisgICAgQ29tcGxleFRleHRDb250cm9sbGVy
IGNvbnRyb2xsZXIoKnRoaXMsIHJ1bik7CisgICAgY29udHJvbGxlci5hZHZhbmNlKGZyb20pOwor
ICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7CisgICAg
Y29udHJvbGxlci5hZHZhbmNlKHRvKTsKKyAgICBmbG9hdCBhZnRlcldpZHRoID0gY29udHJvbGxl
ci5ydW5XaWR0aFNvRmFyKCk7CisKKyAgICBpZiAocnVuLnJ0bCgpKQorICAgICAgICBzZWxlY3Rp
b25SZWN0Lm1vdmUoY29udHJvbGxlci50b3RhbFdpZHRoKCkgLSBhZnRlcldpZHRoLCAwKTsKKyAg
ICBlbHNlCisgICAgICAgIHNlbGVjdGlvblJlY3QubW92ZShiZWZvcmVXaWR0aCwgMCk7CisgICAg
c2VsZWN0aW9uUmVjdC5zZXRXaWR0aChMYXlvdXRVbml0Ojpmcm9tRmxvYXRDZWlsKGFmdGVyV2lk
dGggLSBiZWZvcmVXaWR0aCkpOworfQorCitmbG9hdCBGb250Q2FzY2FkZTo6Z2V0R2x5cGhzQW5k
QWR2YW5jZXNGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIHVuc2lnbmVkIGZyb20s
IHVuc2lnbmVkIHRvLCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIEZvclRleHRFbXBoYXNpc09y
Tm90IGZvclRleHRFbXBoYXNpcykgY29uc3QKK3sKKyAgICBmbG9hdCBpbml0aWFsQWR2YW5jZTsK
KworICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciBjb250cm9sbGVyKCp0aGlzLCBydW4sIGZhbHNl
LCAwLCBmb3JUZXh0RW1waGFzaXMpOworICAgIEdseXBoQnVmZmVyIGR1bW15R2x5cGhCdWZmZXI7
CisgICAgY29udHJvbGxlci5hZHZhbmNlKGZyb20sICZkdW1teUdseXBoQnVmZmVyKTsKKyAgICBj
b250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7CisKKyAgICBpZiAoZ2x5cGhCdWZm
ZXIuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChydW4ucnRsKCkpIHsK
KyAgICAgICAgLy8gRXhwbG9pdCB0aGUgZmFjdCB0aGF0IHRoZSBzdW0gb2YgdGhlIHBhaW50IGFk
dmFuY2VzIGlzIGVxdWFsIHRvCisgICAgICAgIC8vIHRoZSBzdW0gb2YgdGhlIGxheW91dCBhZHZh
bmNlcy4KKyAgICAgICAgaW5pdGlhbEFkdmFuY2UgPSBjb250cm9sbGVyLnRvdGFsV2lkdGgoKTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGdseXBoQnVmZmVyLnNpemUoKTsgKytp
KQorICAgICAgICAgICAgaW5pdGlhbEFkdmFuY2UgLT0gZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KGkp
LndpZHRoKCk7CisgICAgICAgIGdseXBoQnVmZmVyLnJldmVyc2UoMCwgZ2x5cGhCdWZmZXIuc2l6
ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbml0aWFsQWR2YW5jZSA9IGR1bW15R2x5cGhC
dWZmZXIuaW5pdGlhbEFkdmFuY2UoKS53aWR0aCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgZHVtbXlHbHlwaEJ1ZmZlci5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGluaXRp
YWxBZHZhbmNlICs9IGR1bW15R2x5cGhCdWZmZXIuYWR2YW5jZUF0KGkpLndpZHRoKCk7CisgICAg
fQorCisgICAgcmV0dXJuIGluaXRpYWxBZHZhbmNlOworfQorCitmbG9hdCBGb250Q2FzY2FkZTo6
ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25z
dCBGb250Kj4qIGZhbGxiYWNrRm9udHMsIEdseXBoT3ZlcmZsb3cqIGdseXBoT3ZlcmZsb3cpIGNv
bnN0Cit7CisgICAgQ29tcGxleFRleHRDb250cm9sbGVyIGNvbnRyb2xsZXIoKnRoaXMsIHJ1biwg
dHJ1ZSwgZmFsbGJhY2tGb250cyk7CisgICAgaWYgKGdseXBoT3ZlcmZsb3cpIHsKKyAgICAgICAg
Z2x5cGhPdmVyZmxvdy0+dG9wID0gc3RkOjptYXg8aW50PihnbHlwaE92ZXJmbG93LT50b3AsIGNl
aWxmKC1jb250cm9sbGVyLm1pbkdseXBoQm91bmRpbmdCb3hZKCkpIC0gKGdseXBoT3ZlcmZsb3ct
PmNvbXB1dGVCb3VuZHMgPyAwIDogZm9udE1ldHJpY3MoKS5hc2NlbnQoKSkpOworICAgICAgICBn
bHlwaE92ZXJmbG93LT5ib3R0b20gPSBzdGQ6Om1heDxpbnQ+KGdseXBoT3ZlcmZsb3ctPmJvdHRv
bSwgY2VpbGYoY29udHJvbGxlci5tYXhHbHlwaEJvdW5kaW5nQm94WSgpKSAtIChnbHlwaE92ZXJm
bG93LT5jb21wdXRlQm91bmRzID8gMCA6IGZvbnRNZXRyaWNzKCkuZGVzY2VudCgpKSk7CisgICAg
ICAgIGdseXBoT3ZlcmZsb3ctPmxlZnQgPSBzdGQ6Om1heDxpbnQ+KDAsIGNlaWxmKC1jb250cm9s
bGVyLm1pbkdseXBoQm91bmRpbmdCb3hYKCkpKTsKKyAgICAgICAgZ2x5cGhPdmVyZmxvdy0+cmln
aHQgPSBzdGQ6Om1heDxpbnQ+KDAsIGNlaWxmKGNvbnRyb2xsZXIubWF4R2x5cGhCb3VuZGluZ0Jv
eFgoKSAtIGNvbnRyb2xsZXIudG90YWxXaWR0aCgpKSk7CisgICAgfQorICAgIHJldHVybiBjb250
cm9sbGVyLnRvdGFsV2lkdGgoKTsKK30KKworaW50IEZvbnRDYXNjYWRlOjpvZmZzZXRGb3JQb3Np
dGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgeCwgYm9vbCBpbmNs
dWRlUGFydGlhbEdseXBocykgY29uc3QKK3sKKyAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIgY29u
dHJvbGxlcigqdGhpcywgcnVuKTsKKyAgICByZXR1cm4gY29udHJvbGxlci5vZmZzZXRGb3JQb3Np
dGlvbih4LCBpbmNsdWRlUGFydGlhbEdseXBocyk7Cit9CisjZW5kaWYKKwogfQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhCdWZmZXIuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVyLmgKaW5kZXggNjFmM2YwNTBi
NDM1YzIwNDA1ODk4MzlkNTc1NzA3Y2FiNGNjMTE3YS4uMzk0MjI0YzBmMzBiMDg3NmUyZjIxNzQ4
OWYwN2U3Y2M3M2Y1MTJiMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR2x5cGhCdWZmZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HbHlwaEJ1ZmZlci5oCkBAIC05Miw5ICs5Miw2IEBAIHB1YmxpYzoKICAgICAgICAgbV9hZHZh
bmNlcy5jbGVhcigpOwogICAgICAgICBpZiAobV9vZmZzZXRzSW5TdHJpbmcpCiAgICAgICAgICAg
ICBtX29mZnNldHNJblN0cmluZy0+Y2xlYXIoKTsKLSNpZiBQTEFURk9STShXSU4pCi0gICAgICAg
IG1fb2Zmc2V0cy5jbGVhcigpOwotI2VuZGlmCiAgICAgfQogCiAgICAgR2x5cGhCdWZmZXJHbHlw
aCogZ2x5cGhzKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJuIG1fZ2x5cGhzLmRhdGEoKSArIGZyb207
IH0KQEAgLTEyMSwxOSArMTE4LDkgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIG1f
YWR2YW5jZXNbaW5kZXhdOwogICAgIH0KLQotICAgIEZsb2F0U2l6ZSBvZmZzZXRBdCh1bnNpZ25l
ZCBpbmRleCkgY29uc3QKLSAgICB7Ci0jaWYgUExBVEZPUk0oV0lOKQotICAgICAgICByZXR1cm4g
bV9vZmZzZXRzW2luZGV4XTsKLSNlbHNlCi0gICAgICAgIFVOVVNFRF9QQVJBTShpbmRleCk7Ci0g
ICAgICAgIHJldHVybiBGbG9hdFNpemUoKTsKLSNlbmRpZgotICAgIH0KICAgICAKICAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgbm9PZmZzZXQgPSBVSU5UX01BWDsKLSAgICB2b2lkIGFkZChHbHlw
aCBnbHlwaCwgY29uc3QgRm9udCogZm9udCwgZmxvYXQgd2lkdGgsIHVuc2lnbmVkIG9mZnNldElu
U3RyaW5nID0gbm9PZmZzZXQsIGNvbnN0IEZsb2F0U2l6ZSogb2Zmc2V0ID0gMCkKKyAgICB2b2lk
IGFkZChHbHlwaCBnbHlwaCwgY29uc3QgRm9udCogZm9udCwgZmxvYXQgd2lkdGgsIHVuc2lnbmVk
IG9mZnNldEluU3RyaW5nID0gbm9PZmZzZXQpCiAgICAgewogICAgICAgICBtX2ZvbnQuYXBwZW5k
KGZvbnQpOwogCkBAIC0xNTEsMTUgKzEzOCw2IEBAIHB1YmxpYzoKICNlbHNlCiAgICAgICAgIG1f
YWR2YW5jZXMuYXBwZW5kKEZsb2F0U2l6ZSh3aWR0aCwgMCkpOwogI2VuZGlmCi0KLSNpZiBQTEFU
Rk9STShXSU4pCi0gICAgICAgIGlmIChvZmZzZXQpCi0gICAgICAgICAgICBtX29mZnNldHMuYXBw
ZW5kKCpvZmZzZXQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX29mZnNldHMuYXBwZW5k
KEZsb2F0U2l6ZSgpKTsKLSNlbHNlCi0gICAgICAgIFVOVVNFRF9QQVJBTShvZmZzZXQpOwotI2Vu
ZGlmCiAgICAgICAgIAogICAgICAgICBpZiAob2Zmc2V0SW5TdHJpbmcgIT0gbm9PZmZzZXQgJiYg
bV9vZmZzZXRzSW5TdHJpbmcpCiAgICAgICAgICAgICBtX29mZnNldHNJblN0cmluZy0+YXBwZW5k
KG9mZnNldEluU3RyaW5nKTsKQEAgLTIxNSw5ICsxOTMsNiBAQCBwdWJsaWM6CiAgICAgICAgIG1f
YWR2YW5jZXMuc2hyaW5rKHRydW5jYXRpb25Qb2ludCk7CiAgICAgICAgIGlmIChtX29mZnNldHNJ
blN0cmluZykKICAgICAgICAgICAgIG1fb2Zmc2V0c0luU3RyaW5nLT5zaHJpbmsodHJ1bmNhdGlv
blBvaW50KTsKLSNpZiBQTEFURk9STShXSU4pCi0gICAgICAgIG1fb2Zmc2V0cy5zaHJpbmsodHJ1
bmNhdGlvblBvaW50KTsKLSNlbmRpZgogICAgIH0KIAogcHJpdmF0ZToKQEAgLTIzNCwxMiArMjA5
LDYgQEAgcHJpdmF0ZToKICAgICAgICAgR2x5cGhCdWZmZXJBZHZhbmNlIHMgPSBtX2FkdmFuY2Vz
W2luZGV4MV07CiAgICAgICAgIG1fYWR2YW5jZXNbaW5kZXgxXSA9IG1fYWR2YW5jZXNbaW5kZXgy
XTsKICAgICAgICAgbV9hZHZhbmNlc1tpbmRleDJdID0gczsKLQotI2lmIFBMQVRGT1JNKFdJTikK
LSAgICAgICAgRmxvYXRTaXplIG9mZnNldCA9IG1fb2Zmc2V0c1tpbmRleDFdOwotICAgICAgICBt
X29mZnNldHNbaW5kZXgxXSA9IG1fb2Zmc2V0c1tpbmRleDJdOwotICAgICAgICBtX29mZnNldHNb
aW5kZXgyXSA9IG9mZnNldDsKLSNlbmRpZgogICAgIH0KIAogICAgIFZlY3Rvcjxjb25zdCBGb250
KiwgMjA0OD4gbV9mb250OwpAQCAtMjQ3LDkgKzIxNiw2IEBAIHByaXZhdGU6CiAgICAgVmVjdG9y
PEdseXBoQnVmZmVyQWR2YW5jZSwgMjA0OD4gbV9hZHZhbmNlczsKICAgICBHbHlwaEJ1ZmZlckFk
dmFuY2UgbV9pbml0aWFsQWR2YW5jZTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmVjdG9yPHVuc2ln
bmVkLCAyMDQ4Pj4gbV9vZmZzZXRzSW5TdHJpbmc7Ci0jaWYgUExBVEZPUk0oV0lOKQotICAgIFZl
Y3RvcjxGbG9hdFNpemUsIDIwNDg+IG1fb2Zmc2V0czsKLSNlbmRpZgogfTsKIAogfQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY29jb2EvRm9udENhc2NhZGVD
b2NvYS5tbSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NvY29hL0ZvbnRDYXNj
YWRlQ29jb2EubW0KaW5kZXggODM0ZjcxNDQ0MmRhMjQ5ZTcxY2EyYTBkNjQyYjkxOGZlOWZjMTM2
NC4uMTAyYzZlZWE0MGVjNDcyM2IyZmZmNTU5OWEzMGVhYzJkOTlmZjE4MyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY29jb2EvRm9udENhc2NhZGVDb2NvYS5t
bQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb2NvYS9Gb250Q2FzY2Fk
ZUNvY29hLm1tCkBAIC00ODgsNjcgKzQ4OCw2IEBAIGJvb2wgRm9udENhc2NhZGU6OnByaW1hcnlG
b250SXNTeXN0ZW1Gb250KCkgY29uc3QKICAgICByZXR1cm4gQ1RGb250RGVzY3JpcHRvcklzU3lz
dGVtVUlGb250KGFkb3B0Q0YoQ1RGb250Q29weUZvbnREZXNjcmlwdG9yKGZvbnREYXRhLnBsYXRm
b3JtRGF0YSgpLmN0Rm9udCgpKSkuZ2V0KCkpOwogfQogCi12b2lkIEZvbnRDYXNjYWRlOjphZGp1
c3RTZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBMYXlvdXRS
ZWN0JiBzZWxlY3Rpb25SZWN0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykgY29uc3QKLXsK
LSAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIgY29udHJvbGxlcigqdGhpcywgcnVuKTsKLSAgICBj
b250cm9sbGVyLmFkdmFuY2UoZnJvbSk7Ci0gICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9s
bGVyLnJ1bldpZHRoU29GYXIoKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UodG8pOwotICAgIGZs
b2F0IGFmdGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlmIChy
dW4ucnRsKCkpCi0gICAgICAgIHNlbGVjdGlvblJlY3QubW92ZShjb250cm9sbGVyLnRvdGFsV2lk
dGgoKSAtIGFmdGVyV2lkdGgsIDApOwotICAgIGVsc2UKLSAgICAgICAgc2VsZWN0aW9uUmVjdC5t
b3ZlKGJlZm9yZVdpZHRoLCAwKTsKLSAgICBzZWxlY3Rpb25SZWN0LnNldFdpZHRoKExheW91dFVu
aXQ6OmZyb21GbG9hdENlaWwoYWZ0ZXJXaWR0aCAtIGJlZm9yZVdpZHRoKSk7Ci19Ci0KLWZsb2F0
IEZvbnRDYXNjYWRlOjpnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvckNvbXBsZXhUZXh0KGNvbnN0IFRl
eHRSdW4mIHJ1biwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sIEdseXBoQnVmZmVyJiBnbHlw
aEJ1ZmZlciwgRm9yVGV4dEVtcGhhc2lzT3JOb3QgZm9yVGV4dEVtcGhhc2lzKSBjb25zdAotewot
ICAgIGZsb2F0IGluaXRpYWxBZHZhbmNlOwotCi0gICAgQ29tcGxleFRleHRDb250cm9sbGVyIGNv
bnRyb2xsZXIoKnRoaXMsIHJ1biwgZmFsc2UsIDAsIGZvclRleHRFbXBoYXNpcyk7Ci0gICAgR2x5
cGhCdWZmZXIgZHVtbXlHbHlwaEJ1ZmZlcjsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSwg
JmR1bW15R2x5cGhCdWZmZXIpOwotICAgIGNvbnRyb2xsZXIuYWR2YW5jZSh0bywgJmdseXBoQnVm
ZmVyKTsKLQotICAgIGlmIChnbHlwaEJ1ZmZlci5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICAvLyBFeHBsb2l0IHRoZSBmYWN0IHRo
YXQgdGhlIHN1bSBvZiB0aGUgcGFpbnQgYWR2YW5jZXMgaXMgZXF1YWwgdG8KLSAgICAgICAgLy8g
dGhlIHN1bSBvZiB0aGUgbGF5b3V0IGFkdmFuY2VzLgotICAgICAgICBpbml0aWFsQWR2YW5jZSA9
IGNvbnRyb2xsZXIudG90YWxXaWR0aCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgZ2x5cGhCdWZmZXIuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBpbml0aWFsQWR2YW5jZSAt
PSBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoaSkud2lkdGgoKTsKLSAgICAgICAgZ2x5cGhCdWZmZXIu
cmV2ZXJzZSgwLCBnbHlwaEJ1ZmZlci5zaXplKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlu
aXRpYWxBZHZhbmNlID0gZHVtbXlHbHlwaEJ1ZmZlci5pbml0aWFsQWR2YW5jZSgpLndpZHRoKCk7
Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkdW1teUdseXBoQnVmZmVyLnNpemUo
KTsgKytpKQotICAgICAgICAgICAgaW5pdGlhbEFkdmFuY2UgKz0gZHVtbXlHbHlwaEJ1ZmZlci5h
ZHZhbmNlQXQoaSkud2lkdGgoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW5pdGlhbEFkdmFuY2U7
Ci19Ci0KLWZsb2F0IEZvbnRDYXNjYWRlOjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3Qg
VGV4dFJ1biYgcnVuLCBIYXNoU2V0PGNvbnN0IEZvbnQqPiogZmFsbGJhY2tGb250cywgR2x5cGhP
dmVyZmxvdyogZ2x5cGhPdmVyZmxvdykgY29uc3QKLXsKLSAgICBDb21wbGV4VGV4dENvbnRyb2xs
ZXIgY29udHJvbGxlcigqdGhpcywgcnVuLCB0cnVlLCBmYWxsYmFja0ZvbnRzKTsKLSAgICBpZiAo
Z2x5cGhPdmVyZmxvdykgewotICAgICAgICBnbHlwaE92ZXJmbG93LT50b3AgPSBzdGQ6Om1heDxp
bnQ+KGdseXBoT3ZlcmZsb3ctPnRvcCwgY2VpbGYoLWNvbnRyb2xsZXIubWluR2x5cGhCb3VuZGlu
Z0JveFkoKSkgLSAoZ2x5cGhPdmVyZmxvdy0+Y29tcHV0ZUJvdW5kcyA/IDAgOiBmb250TWV0cmlj
cygpLmFzY2VudCgpKSk7Ci0gICAgICAgIGdseXBoT3ZlcmZsb3ctPmJvdHRvbSA9IHN0ZDo6bWF4
PGludD4oZ2x5cGhPdmVyZmxvdy0+Ym90dG9tLCBjZWlsZihjb250cm9sbGVyLm1heEdseXBoQm91
bmRpbmdCb3hZKCkpIC0gKGdseXBoT3ZlcmZsb3ctPmNvbXB1dGVCb3VuZHMgPyAwIDogZm9udE1l
dHJpY3MoKS5kZXNjZW50KCkpKTsKLSAgICAgICAgZ2x5cGhPdmVyZmxvdy0+bGVmdCA9IHN0ZDo6
bWF4PGludD4oMCwgY2VpbGYoLWNvbnRyb2xsZXIubWluR2x5cGhCb3VuZGluZ0JveFgoKSkpOwot
ICAgICAgICBnbHlwaE92ZXJmbG93LT5yaWdodCA9IHN0ZDo6bWF4PGludD4oMCwgY2VpbGYoY29u
dHJvbGxlci5tYXhHbHlwaEJvdW5kaW5nQm94WCgpIC0gY29udHJvbGxlci50b3RhbFdpZHRoKCkp
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXIudG90YWxXaWR0aCgpOwotfQotCi1pbnQg
Rm9udENhc2NhZGU6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1
biYgcnVuLCBmbG9hdCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAotewotICAg
IENvbXBsZXhUZXh0Q29udHJvbGxlciBjb250cm9sbGVyKCp0aGlzLCBydW4pOwotICAgIHJldHVy
biBjb250cm9sbGVyLm9mZnNldEZvclBvc2l0aW9uKHgsIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsK
LX0KLQogLy8gRklYTUU6IFVzZSB0aGlzIG9uIGFsbCBwb3J0cy4KIGNvbnN0IEZvbnQqIEZvbnRD
YXNjYWRlOjpmb250Rm9yQ29tYmluaW5nQ2hhcmFjdGVyU2VxdWVuY2UoY29uc3QgVUNoYXIqIGNo
YXJhY3RlcnMsIHNpemVfdCBsZW5ndGgpIGNvbnN0CiB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQu
bW0gYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ29tcGxleFRleHRDb250
cm9sbGVyQ29yZVRleHQubW0KaW5kZXggZTk1OWQyODgwMmFlZjk4YWY4OWI1MjViMGI4Y2U1MDk0
ZmU1MmQ4ZC4uOThhNDc0YWQxMzMzMDNkZjYxZmFmN2RlM2ZiNGFjYzM3OTM4MzkzYiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NvbXBsZXhUZXh0Q29u
dHJvbGxlckNvcmVUZXh0Lm1tCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L21hYy9Db21wbGV4VGV4dENvbnRyb2xsZXJDb3JlVGV4dC5tbQpAQCAtMTg4LDYgKzE4OCw3IEBA
IHN0YXRpYyBpbmxpbmUgYm9vbCBzYWZlQ0ZFcXVhbChDRlR5cGVSZWYgYSwgQ0ZUeXBlUmVmIGIp
CiAKIHZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpjb2xsZWN0Q29tcGxleFRleHRSdW5zRm9y
Q2hhcmFjdGVycyhjb25zdCBVQ2hhciogY3AsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgc3Ry
aW5nTG9jYXRpb24sIGNvbnN0IEZvbnQqIGZvbnQpCiB7CisgICAgLy8gRklYTUU6IE1vdmUgdGhp
cyBpZiBzdGF0ZW1lbnQgaW50byBhIHNoYXJlZCBsb2NhdGlvbi4KICAgICBpZiAoIWZvbnQpIHsK
ICAgICAgICAgLy8gQ3JlYXRlIGEgcnVuIG9mIG1pc3NpbmcgZ2x5cGhzIGZyb20gdGhlIHByaW1h
cnkgZm9udC4KICAgICAgICAgbV9jb21wbGV4VGV4dFJ1bnMuYXBwZW5kKENvbXBsZXhUZXh0UnVu
OjpjcmVhdGUobV9mb250LnByaW1hcnlGb250KCksIGNwLCBzdHJpbmdMb2NhdGlvbiwgbGVuZ3Ro
LCAwLCBsZW5ndGgsIG1fcnVuLmx0cigpKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vQ29tcGxleFRleHRDb250cm9sbGVyRGlyZWN0V3JpdGUuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0NvbXBsZXhUZXh0Q29udHJv
bGxlckRpcmVjdFdyaXRlLmNwcAppbmRleCBlOTdmOWMyMDRkMWM2NTA3OGFkNzYyZWZmM2JmMDZj
NjFiOGRiMWI5Li43YzA3NWU1YzJjODQzNTUxOGVjYzFkNjI0MjRjMTIzZjc0NDNhNTlkIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vQ29tcGxleFRleHRD
b250cm9sbGVyRGlyZWN0V3JpdGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9Db21wbGV4VGV4dENvbnRyb2xsZXJEaXJlY3RXcml0ZS5jcHAKQEAgLTI1LDEy
ICsyNSwzMTAgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJDb21wbGV4VGV4dENv
bnRyb2xsZXIuaCIKIAorI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250Q2FzY2FkZS5o
IgorI2luY2x1ZGUgPER3cml0ZS5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx3
cmwuaD4KKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCi12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxl
cjo6Y29sbGVjdENvbXBsZXhUZXh0UnVuc0ZvckNoYXJhY3RlcnMoY29uc3QgVUNoYXIqLCB1bnNp
Z25lZCwgdW5zaWduZWQsIGNvbnN0IEZvbnQqKQorY2xhc3MgVGV4dEFuYWx5c2lzU291cmNlIDog
cHVibGljIE1pY3Jvc29mdDo6V1JMOjpSdW50aW1lQ2xhc3M8TWljcm9zb2Z0OjpXUkw6OlJ1bnRp
bWVDbGFzc0ZsYWdzPE1pY3Jvc29mdDo6V1JMOjpDbGFzc2ljQ29tPiwgSURXcml0ZVRleHRBbmFs
eXNpc1NvdXJjZT4geworcHVibGljOgorICAgIFRleHRBbmFseXNpc1NvdXJjZShjb25zdCBXQ0hB
UiogdGV4dFN0cmluZywgVUlOVDMyIHRleHRMZW5ndGgsIGJvb2wgbHRyLCBjb25zdCBXQ0hBUiog
bG9jYWxlTmFtZSwgSURXcml0ZU51bWJlclN1YnN0aXR1dGlvbiogbnVtYmVyU3Vic3RpdHV0aW9u
KQorICAgICAgICA6IG1fdGV4dFN0cmluZyh0ZXh0U3RyaW5nKQorICAgICAgICAsIG1fbG9jYWxl
TmFtZShsb2NhbGVOYW1lKQorICAgICAgICAsIG1fbnVtYmVyU3Vic3RpdHV0aW9uKG51bWJlclN1
YnN0aXR1dGlvbikKKyAgICAgICAgLCBtX3RleHRMZW5ndGgodGV4dExlbmd0aCkKKyAgICAgICAg
LCBtX2x0cihsdHIpCisgICAgeworICAgIH0KKworcHJpdmF0ZToKKyAgICBJRkFDRU1FVEhPRElN
UCBHZXRUZXh0QXRQb3NpdGlvbihVSU5UMzIgdGV4dFBvc2l0aW9uLCBjb25zdCBXQ0hBUiAqKnRl
eHRTdHJpbmcsIFVJTlQzMiAqdGV4dExlbmd0aCkgZmluYWwKKyAgICB7CisgICAgICAgIGlmICh0
ZXh0UG9zaXRpb24gPj0gbV90ZXh0TGVuZ3RoKSB7CisgICAgICAgICAgICAqdGV4dFN0cmluZyA9
IG51bGxwdHI7CisgICAgICAgICAgICAqdGV4dExlbmd0aCA9IDA7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAqdGV4dFN0cmluZyA9IG1fdGV4dFN0cmluZyArIHRleHRQb3NpdGlvbjsK
KyAgICAgICAgICAgICp0ZXh0TGVuZ3RoID0gbV90ZXh0TGVuZ3RoIC0gdGV4dFBvc2l0aW9uOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBTX09LOworICAgIH0KKworICAgIElGQUNFTUVUSE9E
SU1QIEdldFRleHRCZWZvcmVQb3NpdGlvbihVSU5UMzIgdGV4dFBvc2l0aW9uLCBjb25zdCBXQ0hB
UiAqKnRleHRTdHJpbmcsIFVJTlQzMiAqdGV4dExlbmd0aCkgZmluYWwKKyAgICB7CisgICAgICAg
IGlmICghdGV4dFBvc2l0aW9uIHx8IHRleHRQb3NpdGlvbiA+IG1fdGV4dExlbmd0aCkgeworICAg
ICAgICAgICAgKnRleHRTdHJpbmcgPSBudWxscHRyOworICAgICAgICAgICAgKnRleHRMZW5ndGgg
PSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnRleHRTdHJpbmcgPSBtX3RleHRT
dHJpbmc7CisgICAgICAgICAgICAqdGV4dExlbmd0aCA9IHRleHRQb3NpdGlvbjsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisKKyAgICBJRkFDRU1FVEhPRElNUF8oRFdS
SVRFX1JFQURJTkdfRElSRUNUSU9OKSBHZXRQYXJhZ3JhcGhSZWFkaW5nRGlyZWN0aW9uKCkgZmlu
YWwKKyAgICB7CisgICAgICAgIHJldHVybiBtX2x0ciA/IERXUklURV9SRUFESU5HX0RJUkVDVElP
Tl9MRUZUX1RPX1JJR0hUIDogRFdSSVRFX1JFQURJTkdfRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQ7
CisgICAgfQorCisgICAgSUZBQ0VNRVRIT0RJTVAgR2V0TG9jYWxlTmFtZShVSU5UMzIgdGV4dFBv
c2l0aW9uLCBVSU5UMzIqIHRleHRMZW5ndGgsIGNvbnN0IFdDSEFSKiogbG9jYWxlTmFtZSkgZmlu
YWwKKyAgICB7CisgICAgICAgIGlmICh0ZXh0UG9zaXRpb24gPj0gbV90ZXh0TGVuZ3RoKSB7Cisg
ICAgICAgICAgICAqdGV4dExlbmd0aCA9IDA7CisgICAgICAgICAgICAqbG9jYWxlTmFtZSA9IG51
bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqdGV4dExlbmd0aCA9IG1fdGV4
dExlbmd0aCAtIHRleHRQb3NpdGlvbjsKKyAgICAgICAgICAgICpsb2NhbGVOYW1lID0gbV9sb2Nh
bGVOYW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTX09LOworICAgIH0KKworICAgIElG
QUNFTUVUSE9ESU1QIEdldE51bWJlclN1YnN0aXR1dGlvbihVSU5UMzIgdGV4dFBvc2l0aW9uLCBV
SU5UMzIqIHRleHRMZW5ndGgsIElEV3JpdGVOdW1iZXJTdWJzdGl0dXRpb24qKiBudW1iZXJTdWJz
dGl0dXRpb24pIGZpbmFsCisgICAgeworICAgICAgICBpZiAodGV4dFBvc2l0aW9uID49IG1fdGV4
dExlbmd0aCkgeworICAgICAgICAgICAgKnRleHRMZW5ndGggPSAwOworICAgICAgICAgICAgKm51
bWJlclN1YnN0aXR1dGlvbiA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAqdGV4dExlbmd0aCA9IG1fdGV4dExlbmd0aCAtIHRleHRQb3NpdGlvbjsKKyAgICAgICAgICAg
ICpudW1iZXJTdWJzdGl0dXRpb24gPSBtX251bWJlclN1YnN0aXR1dGlvbjsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisKKyAgICBjb25zdCBXQ0hBUiogbV90ZXh0U3Ry
aW5nOworICAgIGNvbnN0IFdDSEFSKiBtX2xvY2FsZU5hbWU7CisgICAgSURXcml0ZU51bWJlclN1
YnN0aXR1dGlvbiogbV9udW1iZXJTdWJzdGl0dXRpb247CisgICAgVUlOVDMyIG1fdGV4dExlbmd0
aDsKKyAgICBib29sIG1fbHRyOworfTsKKworc3RydWN0IERXcml0ZVJ1biB7CisgICAgVUlOVDMy
IHN0YXJ0aW5nU3RyaW5nSW5kZXg7CisgICAgRFdSSVRFX1NDUklQVF9BTkFMWVNJUyBzY3JpcHRB
bmFseXNpczsKKyAgICBib29sIGx0cjsKK307CisKK2NsYXNzIFRleHRBbmFseXNpc1NpbmsgOiBw
dWJsaWMgTWljcm9zb2Z0OjpXUkw6OlJ1bnRpbWVDbGFzczxNaWNyb3NvZnQ6OldSTDo6UnVudGlt
ZUNsYXNzRmxhZ3M8TWljcm9zb2Z0OjpXUkw6OkNsYXNzaWNDb20+LCBJRFdyaXRlVGV4dEFuYWx5
c2lzU2luaz4geworcHVibGljOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQg
aXRlcmF0ZVJ1bnMoVCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIEFTU0VSVChpc1NvcnRlZCgp
KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3J1bnMuc2l6ZSgpIC0gMTsgKytp
KSB7CisgICAgICAgICAgICBpZiAoIWNhbGxiYWNrKG1fcnVuc1tpXSwgbV9ydW5zW2kgKyAxXS5z
dGFydGluZ1N0cmluZ0luZGV4IC0gbV9ydW5zW2ldLnN0YXJ0aW5nU3RyaW5nSW5kZXgpKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIFNU
RE1FVEhPRElNUCBTZXRTY3JpcHRBbmFseXNpcyhVSU5UMzIgdGV4dFBvc2l0aW9uLCBVSU5UMzIg
dGV4dExlbmd0aCwgY29uc3QgRFdSSVRFX1NDUklQVF9BTkFMWVNJUyogc2NyaXB0QW5hbHlzaXMp
IGZpbmFsCisgICAgeworICAgICAgICBBU1NFUlQoaXNTb3J0ZWQoKSk7CisgICAgICAgIGl0ZXJh
dGVSdW5SYW5nZSh0ZXh0UG9zaXRpb24sIHRleHRQb3NpdGlvbiArIHRleHRMZW5ndGgsIFsmXShE
V3JpdGVSdW4mIHJ1bikgeworICAgICAgICAgICAgcnVuLnNjcmlwdEFuYWx5c2lzID0gKnNjcmlw
dEFuYWx5c2lzOworICAgICAgICB9KTsKKyAgICAgICAgQVNTRVJUKGlzU29ydGVkKCkpOworICAg
ICAgICByZXR1cm4gU19PSzsKKyAgICB9CisKKyAgICBTVERNRVRIT0RJTVAgU2V0TGluZUJyZWFr
cG9pbnRzKFVJTlQzMiB0ZXh0UG9zaXRpb24sIFVJTlQzMiB0ZXh0TGVuZ3RoLCBjb25zdCBEV1JJ
VEVfTElORV9CUkVBS1BPSU5UKiBsaW5lQnJlYWtwb2ludHMpIGZpbmFsCisgICAgeworICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgQVNTRVJUKGlzU29ydGVkKCkpOworICAg
ICAgICByZXR1cm4gRV9OT1RJTVBMOworICAgIH0KKworICAgIFNURE1FVEhPRElNUCBTZXRCaWRp
TGV2ZWwoVUlOVDMyIHRleHRQb3NpdGlvbiwgVUlOVDMyIHRleHRMZW5ndGgsIFVJTlQ4IGV4cGxp
Y2l0TGV2ZWwsIFVJTlQ4IHJlc29sdmVkTGV2ZWwpIGZpbmFsCisgICAgeworICAgICAgICBBU1NF
UlQoaXNTb3J0ZWQoKSk7CisgICAgICAgIGl0ZXJhdGVSdW5SYW5nZSh0ZXh0UG9zaXRpb24sIHRl
eHRQb3NpdGlvbiArIHRleHRMZW5ndGgsIFsmXShEV3JpdGVSdW4mIHJ1bikgeworICAgICAgICAg
ICAgcnVuLmx0ciA9ICEocmVzb2x2ZWRMZXZlbCAlIDIpOworICAgICAgICB9KTsKKyAgICAgICAg
QVNTRVJUKGlzU29ydGVkKCkpOworICAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisKKyAgICBT
VERNRVRIT0RJTVAgU2V0TnVtYmVyU3Vic3RpdHV0aW9uKFVJTlQzMiB0ZXh0UG9zaXRpb24sIFVJ
TlQzMiB0ZXh0TGVuZ3RoLCBJRFdyaXRlTnVtYmVyU3Vic3RpdHV0aW9uKiBudW1iZXJTdWJzdGl0
dXRpb24pIGZpbmFsCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgQVNTRVJUKGlzU29ydGVkKCkpOworICAgICAgICByZXR1cm4gRV9OT1RJTVBMOworICAgIH0K
KworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgaXRlcmF0ZVJ1blJhbmdlKFVJ
TlQzMiBzdGFydFRleHRQb3NpdGlvbiwgVUlOVDMyIGVuZFRleHRQb3NpdGlvbiwgVCBjYWxsYmFj
aykKKyAgICB7CisgICAgICAgIEFTU0VSVChzdGFydFRleHRQb3NpdGlvbiA8IGVuZFRleHRQb3Np
dGlvbik7CisgICAgICAgIHNpemVfdCBzdGFydEluZGV4ID0gc3BsaXQoc3RhcnRUZXh0UG9zaXRp
b24pOworICAgICAgICBzaXplX3QgZW5kSW5kZXggPSBzcGxpdChlbmRUZXh0UG9zaXRpb24pOwor
ICAgICAgICBmb3IgKHNpemVfdCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyArK2kpCisg
ICAgICAgICAgICBjYWxsYmFjayhtX3J1bnNbaV0pOworICAgIH0KKworICAgIHNpemVfdCBzcGxp
dChVSU5UMzIgcG9zaXRpb24pCisgICAgeworICAgICAgICBhdXRvIGJvdW5kYXJ5ID0gc3RkOjps
b3dlcl9ib3VuZChtX3J1bnMuYmVnaW4oKSwgbV9ydW5zLmVuZCgpLCBwb3NpdGlvbiwgW10oY29u
c3QgRFdyaXRlUnVuJiBydW4sIFVJTlQzMiBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJu
IHJ1bi5zdGFydGluZ1N0cmluZ0luZGV4IDwgcG9zaXRpb247CisgICAgICAgIH0pOworICAgICAg
ICBhdXRvIGJvdW5kYXJ5SW5kZXggPSBib3VuZGFyeSAtIG1fcnVucy5iZWdpbigpOworICAgICAg
ICAvLyBib3VuZGFyeSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG5lZWRsZQorICAg
ICAgICBpZiAoIWJvdW5kYXJ5SW5kZXgpIHsKKyAgICAgICAgICAgIERXcml0ZVJ1biBydW4gPSB7
IHBvc2l0aW9uLCB7IDAgfSwgdHJ1ZSB9OworICAgICAgICAgICAgbV9ydW5zLmluc2VydCgwLCBy
dW4pOworICAgICAgICB9IGVsc2UgaWYgKGJvdW5kYXJ5SW5kZXggPT0gbV9ydW5zLnNpemUoKSB8
fCBtX3J1bnNbYm91bmRhcnlJbmRleF0uc3RhcnRpbmdTdHJpbmdJbmRleCAhPSBwb3NpdGlvbikg
eworICAgICAgICAgICAgbV9ydW5zLmluc2VydChib3VuZGFyeUluZGV4LCBtX3J1bnNbYm91bmRh
cnlJbmRleCAtIDFdKTsKKyAgICAgICAgICAgIG1fcnVuc1tib3VuZGFyeUluZGV4XS5zdGFydGlu
Z1N0cmluZ0luZGV4ID0gcG9zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvdW5k
YXJ5SW5kZXg7CisgICAgfQorCisgICAgYm9vbCBpc1NvcnRlZCgpIGNvbnN0CisgICAgeworICAg
ICAgICBpZiAobV9ydW5zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBhdXRvIHN0YXJ0ID0gbV9ydW5zWzBdLnN0YXJ0aW5nU3RyaW5nSW5kZXg7CisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbV9ydW5zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAg
ICBhdXRvIHByb2JlID0gbV9ydW5zW2ldLnN0YXJ0aW5nU3RyaW5nSW5kZXg7CisgICAgICAgICAg
ICBpZiAocHJvYmUgPD0gc3RhcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgc3RhcnQgPSBwcm9iZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICBWZWN0b3I8RFdyaXRlUnVuPiBtX3J1bnM7Cit9OworCitzdGF0aWMgVmVj
dG9yPHVuc2lnbmVkPiByZXZlcnNlQ29kZVVuaXRUb0dseXBoTWFwKFZlY3RvcjxVSU5UMTY+IGNs
dXN0ZXJNYXAsIFVJTlQzMiBhY3R1YWxHbHlwaENvdW50LCBib29sIGlzUlRMKQogewotICAgIC8v
IEZJWE1FOiBJbXBsZW1lbnQgdGhpcy4KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB1
bnNpZ25lZCBzZW50aW5lbCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsK
KyAgICBWZWN0b3I8dW5zaWduZWQ+IHJlc3VsdChhY3R1YWxHbHlwaENvdW50LCBzZW50aW5lbCk7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsdXN0ZXJNYXAuc2l6ZSgpOyArK2kpCisg
ICAgICAgIHJlc3VsdFtjbHVzdGVyTWFwW2ldXSA9IGk7CisgICAgYXV0byBpdGVyID0gc3RkOjpm
aW5kX2lmX25vdChyZXN1bHQuYmVnaW4oKSwgcmVzdWx0LmVuZCgpLCBbJl0odW5zaWduZWQgdGVz
dCkgeworICAgICAgICByZXR1cm4gdGVzdCA9PSBzZW50aW5lbDsKKyAgICB9KTsKKyAgICBBU1NF
UlQoaXRlciAhPSByZXN1bHQuZW5kKCkpOworICAgIHVuc2lnbmVkIGluaXRpYWwgPSAqaXRlcjsK
KyAgICBmb3IgKHVuc2lnbmVkJiBpbmRleCA6IHJlc3VsdCkgeworICAgICAgICBpZiAoaW5kZXgg
PT0gc2VudGluZWwpCisgICAgICAgICAgICBpbmRleCA9IGluaXRpYWw7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHNlbnRpbmVsID0gaW5kZXg7CisgICAgfQorICAgIGlmIChpc1JUTCkgewor
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7ICsraSkKKyAgICAg
ICAgICAgIHN0ZDo6c3dhcChyZXN1bHRbaV0sIHJlc3VsdFthY3R1YWxHbHlwaENvdW50IC0gMSAt
IGldKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBDb21wbGV4VGV4dENv
bnRyb2xsZXI6OmNvbGxlY3RDb21wbGV4VGV4dFJ1bnNGb3JDaGFyYWN0ZXJzKGNvbnN0IFVDaGFy
KiBjcCwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBzdHJpbmdMb2NhdGlvbiwgY29uc3QgRm9u
dCogZm9udCkKK3sKKyAgICBpZiAoIWZvbnQpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgcnVuIG9m
IG1pc3NpbmcgZ2x5cGhzIGZyb20gdGhlIHByaW1hcnkgZm9udC4KKyAgICAgICAgbV9jb21wbGV4
VGV4dFJ1bnMuYXBwZW5kKENvbXBsZXhUZXh0UnVuOjpjcmVhdGUobV9mb250LnByaW1hcnlGb250
KCksIGNwLCBzdHJpbmdMb2NhdGlvbiwgbGVuZ3RoLCAwLCBsZW5ndGgsIG1fcnVuLmx0cigpKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElE
V3JpdGVGYWN0b3J5PiBmYWN0b3J5OworICAgIEhSRVNVTFQgaHIgPSBEV3JpdGVDcmVhdGVGYWN0
b3J5KERXUklURV9GQUNUT1JZX1RZUEVfU0hBUkVELCBfX3V1aWRvZihJRFdyaXRlRmFjdG9yeSks
ICZmYWN0b3J5KTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikgfHwgIWZhY3RvcnkpCisgICAgICAg
IHJldHVybjsKKworICAgIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SURXcml0ZUdkaUludGVyb3A+
IGdkaUludGVyb3A7CisgICAgaHIgPSBmYWN0b3J5LT5HZXRHZGlJbnRlcm9wKCZnZGlJbnRlcm9w
KTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikgfHwgIWdkaUludGVyb3ApCisgICAgICAgIHJldHVy
bjsKKworICAgIEhGT05UIGhmb250ID0gZm9udC0+cGxhdGZvcm1EYXRhKCkuaGZvbnQoKTsKKyAg
ICBMT0dGT05UVyBsb2dmb250OworICAgIGludCBieXRlcyA9IEdldE9iamVjdFcoaGZvbnQsIHNp
emVvZihsb2dmb250KSwgJmxvZ2ZvbnQpOworICAgIGlmIChieXRlcyAhPSBzaXplb2YobG9nZm9u
dCkpCisgICAgICAgIHJldHVybjsKKworICAgIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SURXcml0
ZUZvbnQ+IGRXcml0ZUZvbnQ7CisgICAgaHIgPSBnZGlJbnRlcm9wLT5DcmVhdGVGb250RnJvbUxP
R0ZPTlQoJmxvZ2ZvbnQsICZkV3JpdGVGb250KTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikgfHwg
IWRXcml0ZUZvbnQpCisgICAgICAgIHJldHVybjsKKworICAgIE1pY3Jvc29mdDo6V1JMOjpDb21Q
dHI8SURXcml0ZUZvbnRGYWNlPiBmb250RmFjZTsKKyAgICBociA9IGRXcml0ZUZvbnQtPkNyZWF0
ZUZvbnRGYWNlKCZmb250RmFjZSk7CisgICAgaWYgKCFTVUNDRUVERUQoaHIpIHx8ICFmb250RmFj
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJRFdyaXRl
VGV4dEFuYWx5emVyPiB0ZXh0QW5hbHl6ZXI7CisgICAgaHIgPSBmYWN0b3J5LT5DcmVhdGVUZXh0
QW5hbHl6ZXIoJnRleHRBbmFseXplcik7CisgICAgaWYgKCFTVUNDRUVERUQoaHIpIHx8ICF0ZXh0
QW5hbHl6ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFdDSEFSKiBsb2NhbGVOYW1l
ID0gbnVsbHB0cjsKKyAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElEV3JpdGVOdW1iZXJTdWJz
dGl0dXRpb24+IG51bWJlclN1YnN0aXR1dGlvbiA9IG51bGxwdHI7CisKKyAgICBNaWNyb3NvZnQ6
OldSTDo6Q29tUHRyPFRleHRBbmFseXNpc1NvdXJjZT4gc291cmNlKE1pY3Jvc29mdDo6V1JMOjpN
YWtlPFRleHRBbmFseXNpc1NvdXJjZT4oY3AsIGxlbmd0aCwgbV9ydW4ubHRyKCksIGxvY2FsZU5h
bWUsIG51bWJlclN1YnN0aXR1dGlvbi5HZXQoKSkpOworICAgIGlmICghc291cmNlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPFRleHRBbmFseXNpc1Npbms+
IHNpbmsoTWljcm9zb2Z0OjpXUkw6Ok1ha2U8VGV4dEFuYWx5c2lzU2luaz4oKSk7CisgICAgaWYg
KCFzaW5rKQorICAgICAgICByZXR1cm47CisKKyAgICBociA9IHRleHRBbmFseXplci0+QW5hbHl6
ZUJpZGkoc291cmNlLkdldCgpLCAwLCBsZW5ndGgsIHNpbmsuR2V0KCkpOworICAgIGlmICghU1VD
Q0VFREVEKGhyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaHIgPSB0ZXh0QW5hbHl6ZXItPkFu
YWx5emVTY3JpcHQoc291cmNlLkdldCgpLCAwLCBsZW5ndGgsIHNpbmsuR2V0KCkpOworICAgIGlm
ICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQk9PTCBpc1NpZGV3YXlz
ID0gRkFMU0U7CisgICAgc2luay0+aXRlcmF0ZVJ1bnMoWyZdKGNvbnN0IERXcml0ZVJ1biYgcnVu
LCBVSU5UMzIgcnVuTGVuZ3RoKSAtPiBib29sIHsKKyAgICAgICAgQVNTRVJUKHJ1bkxlbmd0aCk7
CisgICAgICAgIEJPT0wgaXNSVEwgPSBydW4ubHRyID8gRkFMU0UgOiBUUlVFOworICAgICAgICBV
SU5UMzIgbWF4R2x5cGhDb3VudCA9IDI7CisgICAgICAgIFZlY3RvcjxVSU5UMTY+IGNsdXN0ZXJN
YXAocnVuTGVuZ3RoKTsKKyAgICAgICAgVmVjdG9yPERXUklURV9TSEFQSU5HX1RFWFRfUFJPUEVS
VElFUz4gdGV4dFByb3BzKHJ1bkxlbmd0aCk7CisgICAgICAgIFVJTlQzMiBhY3R1YWxHbHlwaENv
dW50ID0gMDsKKyAgICAgICAgVmVjdG9yPFVJTlQxNj4gZ2x5cGhJbmRpY2VzOworICAgICAgICBW
ZWN0b3I8RFdSSVRFX1NIQVBJTkdfR0xZUEhfUFJPUEVSVElFUz4gZ2x5cGhQcm9wczsKKyAgICAg
ICAgaHIgPSBIUkVTVUxUX0ZST01fV0lOMzIoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7Cisg
ICAgICAgIC8vIFRoZSByZWNvbW1lbmRlZCBzaXplIGZvciB0aGUgZ2x5cGggYnVmZmVyIGlzIDEu
NSAqIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoICsgMTYgaW4gdGhlIHVuaXNjcmliZSBkb2NzLgorICAg
ICAgICBmb3IgKFVJTlQzMiBtYXhHbHlwaENvdW50KDEuNSAqIHJ1bkxlbmd0aCArIDE2KTsgaHIg
PT0gSFJFU1VMVF9GUk9NX1dJTjMyKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOyBtYXhHbHlw
aENvdW50ICo9IDIpIHsKKyAgICAgICAgICAgIGdseXBoSW5kaWNlcyA9IFZlY3RvcjxVSU5UMTY+
KG1heEdseXBoQ291bnQpOworICAgICAgICAgICAgZ2x5cGhQcm9wcyA9IFZlY3RvcjxEV1JJVEVf
U0hBUElOR19HTFlQSF9QUk9QRVJUSUVTPihtYXhHbHlwaENvdW50KTsKKyAgICAgICAgICAgIGFj
dHVhbEdseXBoQ291bnQgPSAwOworICAgICAgICAgICAgLy8gRGlyZWN0V3JpdGUgZ2l2ZXMgdXMg
Z2x5cGhzIGluIHN0cmluZyBvcmRlci4KKyAgICAgICAgICAgIGhyID0gdGV4dEFuYWx5emVyLT5H
ZXRHbHlwaHMoY3AgKyBydW4uc3RhcnRpbmdTdHJpbmdJbmRleCwgcnVuTGVuZ3RoLCBmb250RmFj
ZS5HZXQoKSwgaXNTaWRld2F5cywgaXNSVEwsICZydW4uc2NyaXB0QW5hbHlzaXMsIGxvY2FsZU5h
bWUsIG51bWJlclN1YnN0aXR1dGlvbi5HZXQoKSwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgbWF4R2x5
cGhDb3VudCwgY2x1c3Rlck1hcC5kYXRhKCksIHRleHRQcm9wcy5kYXRhKCksIGdseXBoSW5kaWNl
cy5kYXRhKCksIGdseXBoUHJvcHMuZGF0YSgpLCAmYWN0dWFsR2x5cGhDb3VudCk7CisgICAgICAg
ICAgICBtYXhHbHlwaENvdW50ICo9IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFTVUNDRUVE
RUQoaHIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWFjdHVhbEds
eXBoQ291bnQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBWZWN0b3I8RkxP
QVQ+IGdseXBoQWR2YW5jZXMoYWN0dWFsR2x5cGhDb3VudCk7CisgICAgICAgIFZlY3RvcjxEV1JJ
VEVfR0xZUEhfT0ZGU0VUPiBnbHlwaE9mZnNldHMoYWN0dWFsR2x5cGhDb3VudCk7CisgICAgICAg
IGhyID0gdGV4dEFuYWx5emVyLT5HZXRHbHlwaFBsYWNlbWVudHMoY3AgKyBydW4uc3RhcnRpbmdT
dHJpbmdJbmRleCwgY2x1c3Rlck1hcC5kYXRhKCksIHRleHRQcm9wcy5kYXRhKCksIHJ1bkxlbmd0
aCwgZ2x5cGhJbmRpY2VzLmRhdGEoKSwgZ2x5cGhQcm9wcy5kYXRhKCksIGFjdHVhbEdseXBoQ291
bnQsIGZvbnRGYWNlLkdldCgpLCBmb250LT5wbGF0Zm9ybURhdGEoKS5zaXplKCksIGlzU2lkZXdh
eXMsIGlzUlRMLCAmcnVuLnNjcmlwdEFuYWx5c2lzLCBsb2NhbGVOYW1lLCBudWxscHRyLCBudWxs
cHRyLCAwLCBnbHlwaEFkdmFuY2VzLmRhdGEoKSwgZ2x5cGhPZmZzZXRzLmRhdGEoKSk7CisgICAg
ICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
ICAgICBWZWN0b3I8RmxvYXRTaXplPiBhZHZhbmNlczsKKyAgICAgICAgVmVjdG9yPEZsb2F0UG9p
bnQ+IG9yaWdpbnM7CisgICAgICAgIFZlY3RvcjxHbHlwaD4gZ2x5cGhzOworICAgICAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbEdseXBoQ291bnQ7ICsraSkgeworICAgICAgICAgICAg
c2l6ZV90IGluZGV4ID0gaXNSVEwgPyBhY3R1YWxHbHlwaENvdW50IC0gMSAtIGkgOiBpOworICAg
ICAgICAgICAgYWR2YW5jZXMuYXBwZW5kKEZsb2F0U2l6ZShnbHlwaEFkdmFuY2VzW2luZGV4XSwg
MCkpOworICAgICAgICAgICAgb3JpZ2lucy5hcHBlbmQoRmxvYXRQb2ludChnbHlwaE9mZnNldHNb
aW5kZXhdLmFkdmFuY2VPZmZzZXQsIGdseXBoT2Zmc2V0c1tpbmRleF0uYXNjZW5kZXJPZmZzZXQp
KTsKKyAgICAgICAgICAgIGdseXBocy5hcHBlbmQoZ2x5cGhJbmRpY2VzW2luZGV4XSk7CisgICAg
ICAgIH0KKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkPiBzdHJpbmdJbmRpY2VzID0gcmV2ZXJzZUNv
ZGVVbml0VG9HbHlwaE1hcChjbHVzdGVyTWFwLCBhY3R1YWxHbHlwaENvdW50LCBpc1JUTCk7Cisg
ICAgICAgIEZsb2F0U2l6ZSBpbml0aWFsQWR2YW5jZShvcmlnaW5zWzBdLngoKSwgb3JpZ2luc1sw
XS55KCkpOworICAgICAgICBtX2NvbXBsZXhUZXh0UnVucy5hcHBlbmQoQ29tcGxleFRleHRSdW46
OmNyZWF0ZShhZHZhbmNlcywgb3JpZ2lucywgZ2x5cGhzLCBzdHJpbmdJbmRpY2VzLCBpbml0aWFs
QWR2YW5jZSwgKmZvbnQsIGNwLCBzdHJpbmdMb2NhdGlvbiwgbGVuZ3RoLCBydW4uc3RhcnRpbmdT
dHJpbmdJbmRleCwgcnVuLnN0YXJ0aW5nU3RyaW5nSW5kZXggKyBydW5MZW5ndGgsIHJ1bi5sdHIp
KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSk7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAKaW5kZXggNWU4ODcy
MGY2MzllODM5OGI0ZTAyNWFlMWM5NmNjNGI0NTBhZTc3My4uNzllZjMyN2FiMjVlN2YwMGUxMWVj
Yzg0ZDgzN2E5YWRmMmZhNzFmNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlICJH
bHlwaEJ1ZmZlci5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIklu
dFJlY3QuaCIKLSNpbmNsdWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCiAjaW5jbHVkZSAiV2Vi
Q29yZVRleHRSZW5kZXJlci5oIgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGlj
YXRpb25TZXJ2aWNlcy5oPgogI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRT
eXN0ZW1JbnRlcmZhY2UuaD4KQEAgLTE3NSw5ICsxNzQsNiBAQCB2b2lkIEZvbnRDYXNjYWRlOjpk
cmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCYgZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBGb250JiBm
b250LAogICAgIENHQWZmaW5lVHJhbnNmb3JtIHNhdmVkTWF0cml4ID0gQ0dDb250ZXh0R2V0VGV4
dE1hdHJpeChjZ0NvbnRleHQpOwogICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0
LCBtYXRyaXgpOwogCi0gICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCBy
ZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgRmxvYXRTaXpl
IHRyYW5zbGF0aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0KICAgICBDR0NvbnRl
eHRTZXRGb250U2l6ZShjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5zaXplKCkpOwogICAgIHdrU2V0
Q0dDb250ZXh0Rm9udFJlbmRlcmluZ1N0eWxlKGNnQ29udGV4dCwgZm9udC5wbGF0Zm9ybURhdGEo
KS5pc1N5c3RlbUZvbnQoKSwgZmFsc2UsIGZvbnQucGxhdGZvcm1EYXRhKCkudXNlR0RJKCkpOwog
CkBAIC0xOTMsMjIgKzE4OSwyMiBAQCB2b2lkIEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhzKEdyYXBo
aWNzQ29udGV4dCYgZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBGb250JiBmb250LAogICAgICAgICBD
b2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQuZmlsbENvbG9yKCk7CiAgICAgICAgIENv
bG9yIHNoYWRvd0ZpbGxDb2xvcihzaGFkb3dDb2xvci5yZWQoKSwgc2hhZG93Q29sb3IuZ3JlZW4o
KSwgc2hhZG93Q29sb3IuYmx1ZSgpLCBzaGFkb3dDb2xvci5hbHBoYSgpICogZmlsbENvbG9yLmFs
cGhhKCkgLyAyNTUpOwogICAgICAgICBncmFwaGljc0NvbnRleHQuc2V0RmlsbENvbG9yKHNoYWRv
d0ZpbGxDb2xvcik7Ci0gICAgICAgIGZsb2F0IHNoYWRvd1RleHRYID0gcG9pbnQueCgpICsgdHJh
bnNsYXRpb24ud2lkdGgoKSArIHNoYWRvd09mZnNldC53aWR0aCgpOworICAgICAgICBmbG9hdCBz
aGFkb3dUZXh0WCA9IHBvaW50LngoKSArIHNoYWRvd09mZnNldC53aWR0aCgpOwogICAgICAgICAv
LyBJZiBzaGFkb3dzIGFyZSBpZ25vcmluZyB0cmFuc2Zvcm1zLCB0aGVuIHdlIGhhdmVuJ3QgYXBw
bGllZCB0aGUgWSBjb29yZGluYXRlIGZsaXAgeWV0LCBzbyBkb3duIGlzIG5lZ2F0aXZlLgotICAg
ICAgICBmbG9hdCBzaGFkb3dUZXh0WSA9IHBvaW50LnkoKSArIHRyYW5zbGF0aW9uLmhlaWdodCgp
ICsgc2hhZG93T2Zmc2V0LmhlaWdodCgpICogKGdyYXBoaWNzQ29udGV4dC5zaGFkb3dzSWdub3Jl
VHJhbnNmb3JtcygpID8gLTEgOiAxKTsKKyAgICAgICAgZmxvYXQgc2hhZG93VGV4dFkgPSBwb2lu
dC55KCkgKyBzaGFkb3dPZmZzZXQuaGVpZ2h0KCkgKiAoZ3JhcGhpY3NDb250ZXh0LnNoYWRvd3NJ
Z25vcmVUcmFuc2Zvcm1zKCkgPyAtMSA6IDEpOwogICAgICAgICBDR0NvbnRleHRTZXRUZXh0UG9z
aXRpb24oY2dDb250ZXh0LCBzaGFkb3dUZXh0WCwgc2hhZG93VGV4dFkpOwogICAgICAgICBDR0Nv
bnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhz
KGZyb20pLCBzdGF0aWNfY2FzdDxjb25zdCBDR1NpemUqPihnbHlwaEJ1ZmZlci5hZHZhbmNlcyhm
cm9tKSksIG51bUdseXBocyk7CiAgICAgICAgIGlmIChmb250LnN5bnRoZXRpY0JvbGRPZmZzZXQo
KSkgewotICAgICAgICAgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29udGV4dCwgcG9p
bnQueCgpICsgdHJhbnNsYXRpb24ud2lkdGgoKSArIHNoYWRvd09mZnNldC53aWR0aCgpICsgZm9u
dC5zeW50aGV0aWNCb2xkT2Zmc2V0KCksIHBvaW50LnkoKSArIHRyYW5zbGF0aW9uLmhlaWdodCgp
ICsgc2hhZG93T2Zmc2V0LmhlaWdodCgpKTsKKyAgICAgICAgICAgIENHQ29udGV4dFNldFRleHRQ
b3NpdGlvbihjZ0NvbnRleHQsIHBvaW50LngoKSArIHNoYWRvd09mZnNldC53aWR0aCgpICsgZm9u
dC5zeW50aGV0aWNCb2xkT2Zmc2V0KCksIHBvaW50LnkoKSArIHNoYWRvd09mZnNldC5oZWlnaHQo
KSk7CiAgICAgICAgICAgICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4
dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBzdGF0aWNfY2FzdDxjb25zdCBDR1NpemUqPihn
bHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSksIG51bUdseXBocyk7CiAgICAgICAgIH0KICAgICAg
ICAgZ3JhcGhpY3NDb250ZXh0LnNldEZpbGxDb2xvcihmaWxsQ29sb3IpOwogICAgIH0KIAotICAg
IENHQ29udGV4dFNldFRleHRQb3NpdGlvbihjZ0NvbnRleHQsIHBvaW50LngoKSArIHRyYW5zbGF0
aW9uLndpZHRoKCksIHBvaW50LnkoKSArIHRyYW5zbGF0aW9uLmhlaWdodCgpKTsKKyAgICBDR0Nv
bnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCksIHBvaW50LnkoKSk7CiAg
ICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRleHQsIGdseXBoQnVmZmVy
LmdseXBocyhmcm9tKSwgc3RhdGljX2Nhc3Q8Y29uc3QgQ0dTaXplKj4oZ2x5cGhCdWZmZXIuYWR2
YW5jZXMoZnJvbSkpLCBudW1HbHlwaHMpOwogICAgIGlmIChmb250LnN5bnRoZXRpY0JvbGRPZmZz
ZXQoKSkgewotICAgICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2lu
dC54KCkgKyB0cmFuc2xhdGlvbi53aWR0aCgpICsgZm9udC5zeW50aGV0aWNCb2xkT2Zmc2V0KCks
IHBvaW50LnkoKSArIHRyYW5zbGF0aW9uLmhlaWdodCgpKTsKKyAgICAgICAgQ0dDb250ZXh0U2V0
VGV4dFBvc2l0aW9uKGNnQ29udGV4dCwgcG9pbnQueCgpICsgZm9udC5zeW50aGV0aWNCb2xkT2Zm
c2V0KCksIHBvaW50LnkoKSk7CiAgICAgICAgIENHQ29udGV4dFNob3dHbHlwaHNXaXRoQWR2YW5j
ZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIHN0YXRpY19jYXN0PGNvbnN0
IENHU2l6ZSo+KGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pKSwgbnVtR2x5cGhzKTsKICAgICB9
CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250
Q2FzY2FkZURpcmVjdDJELmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9Gb250Q2FzY2FkZURpcmVjdDJELmNwcAppbmRleCBiZDU0Y2JhOTAyYWEzZjhmOGNhMDBiZDQy
MWUwMTMwOWZjZjgwODgyLi41NGQ0NDI0MjJiNzIxYzJkNzZiMmQwMzJhZDM4ZTBhNTkwNTgyOGQ1
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENh
c2NhZGVEaXJlY3QyRC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ZvbnRDYXNjYWRlRGlyZWN0MkQuY3BwCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlRGlyZWN0MkQuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5jbHVkZSAiVW5pc2NyaWJl
Q29udHJvbGxlci5oIgogI2luY2x1ZGUgIldlYkNvcmVUZXh0UmVuZGVyZXIuaCIKICNpbmNsdWRl
IDxkMmQxLmg+CiAjaW5jbHVkZSA8ZHdyaXRlLmg+CkBAIC04Myw5ICs4Miw2IEBAIHZvaWQgRm9u
dENhc2NhZGU6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0JiBncmFwaGljc0NvbnRleHQsIGNv
bnN0IEZvbnQmIGZvbnQsCiAgICAgICAgIGNvbnRleHQtPlNldFRyYW5zZm9ybShtYXRyaXggKiBz
a2V3TWF0cml4KTsKICAgICB9CiAKLSAgICAvLyBVbmlzY3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0cyB0
byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2YgY29tYmluaW5nIGdseXBocy4KLSAgICBG
bG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsKLQogICAg
IFJFTEVBU0VfQVNTRVJUKHBsYXRmb3JtRGF0YS5kd0ZvbnQoKSk7CiAgICAgUkVMRUFTRV9BU1NF
UlQocGxhdGZvcm1EYXRhLmR3Rm9udEZhY2UoKSk7CiAKQEAgLTEyNSw5ICsxMjEsOSBAQCB2b2lk
IEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCYgZ3JhcGhpY3NDb250ZXh0
LCBjb25zdCBGb250JiBmb250LAogICAgICAgICBncmFwaGljc0NvbnRleHQuY2xlYXJTaGFkb3co
KTsKICAgICAgICAgQ29sb3IgZmlsbENvbG9yID0gZ3JhcGhpY3NDb250ZXh0LmZpbGxDb2xvcigp
OwogICAgICAgICBDb2xvciBzaGFkb3dGaWxsQ29sb3Ioc2hhZG93Q29sb3IucmVkKCksIHNoYWRv
d0NvbG9yLmdyZWVuKCksIHNoYWRvd0NvbG9yLmJsdWUoKSwgc2hhZG93Q29sb3IuYWxwaGEoKSAq
IGZpbGxDb2xvci5hbHBoYSgpIC8gMjU1KTsKLSAgICAgICAgZmxvYXQgc2hhZG93VGV4dFggPSBw
b2ludC54KCkgKyB0cmFuc2xhdGlvbi53aWR0aCgpICsgc2hhZG93T2Zmc2V0LndpZHRoKCk7Cisg
ICAgICAgIGZsb2F0IHNoYWRvd1RleHRYID0gcG9pbnQueCgpICsgc2hhZG93T2Zmc2V0LndpZHRo
KCk7CiAgICAgICAgIC8vIElmIHNoYWRvd3MgYXJlIGlnbm9yaW5nIHRyYW5zZm9ybXMsIHRoZW4g
d2UgaGF2ZW4ndCBhcHBsaWVkIHRoZSBZIGNvb3JkaW5hdGUgZmxpcCB5ZXQsIHNvIGRvd24gaXMg
bmVnYXRpdmUuCi0gICAgICAgIGZsb2F0IHNoYWRvd1RleHRZID0gcG9pbnQueSgpICsgdHJhbnNs
YXRpb24uaGVpZ2h0KCkgKyBzaGFkb3dPZmZzZXQuaGVpZ2h0KCkgKiAoZ3JhcGhpY3NDb250ZXh0
LnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKCkgPyAtMSA6IDEpOworICAgICAgICBmbG9hdCBzaGFk
b3dUZXh0WSA9IHBvaW50LnkoKSArIHNoYWRvd09mZnNldC5oZWlnaHQoKSAqIChncmFwaGljc0Nv
bnRleHQuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMoKSA/IC0xIDogMSk7CiAKICAgICAgICAgYXV0
byBzaGFkb3dCcnVzaCA9IGdyYXBoaWNzQ29udGV4dC5icnVzaFdpdGhDb2xvcihzaGFkb3dGaWxs
Q29sb3IpOwogICAgICAgICBjb250ZXh0LT5EcmF3R2x5cGhSdW4oRDJEMTo6UG9pbnQyRihzaGFk
b3dUZXh0WCwgc2hhZG93VGV4dFkpLCAmZ2x5cGhSdW4sIHNoYWRvd0JydXNoKTsKQEAgLTEzNSw5
ICsxMzEsOSBAQCB2b2lkIEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCYg
Z3JhcGhpY3NDb250ZXh0LCBjb25zdCBGb250JiBmb250LAogICAgICAgICAgICAgY29udGV4dC0+
RHJhd0dseXBoUnVuKEQyRDE6OlBvaW50MkYoc2hhZG93VGV4dFggKyBmb250LnN5bnRoZXRpY0Jv
bGRPZmZzZXQoKSwgc2hhZG93VGV4dFkpLCAmZ2x5cGhSdW4sIHNoYWRvd0JydXNoKTsKICAgICB9
CiAKLSAgICBjb250ZXh0LT5EcmF3R2x5cGhSdW4oRDJEMTo6UG9pbnQyRihwb2ludC54KCkgKyB0
cmFuc2xhdGlvbi53aWR0aCgpLCBwb2ludC55KCkgKyB0cmFuc2xhdGlvbi5oZWlnaHQoKSksICZn
bHlwaFJ1biwgZ3JhcGhpY3NDb250ZXh0LnNvbGlkRmlsbEJydXNoKCkpOworICAgIGNvbnRleHQt
PkRyYXdHbHlwaFJ1bihEMkQxOjpQb2ludDJGKHBvaW50LngoKSwgcG9pbnQueSgpKSwgJmdseXBo
UnVuLCBncmFwaGljc0NvbnRleHQuc29saWRGaWxsQnJ1c2goKSk7CiAgICAgaWYgKGZvbnQuc3lu
dGhldGljQm9sZE9mZnNldCgpKQotICAgICAgICBjb250ZXh0LT5EcmF3R2x5cGhSdW4oRDJEMTo6
UG9pbnQyRihwb2ludC54KCkgKyB0cmFuc2xhdGlvbi53aWR0aCgpICsgZm9udC5zeW50aGV0aWNC
b2xkT2Zmc2V0KCksIHBvaW50LnkoKSArIHRyYW5zbGF0aW9uLmhlaWdodCgpKSwgJmdseXBoUnVu
LCBncmFwaGljc0NvbnRleHQuc29saWRGaWxsQnJ1c2goKSk7CisgICAgICAgIGNvbnRleHQtPkRy
YXdHbHlwaFJ1bihEMkQxOjpQb2ludDJGKHBvaW50LngoKSArIGZvbnQuc3ludGhldGljQm9sZE9m
ZnNldCgpLCBwb2ludC55KCkpLCAmZ2x5cGhSdW4sIGdyYXBoaWNzQ29udGV4dC5zb2xpZEZpbGxC
cnVzaCgpKTsKIAogICAgIGlmIChoYXNTaW1wbGVTaGFkb3cpCiAgICAgICAgIGdyYXBoaWNzQ29u
dGV4dC5zZXRTaGFkb3coc2hhZG93T2Zmc2V0LCBzaGFkb3dCbHVyLCBzaGFkb3dDb2xvcik7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAKaW5k
ZXggMTIwZTUwMTEyNDlhNmFmMWNiMzFjM2I5NDg4YTM0NTgyOGQ0ZjE0NS4uNjA4MmYxNjkwZDYw
Nzg4N2MxNWEzYzVlZjlkN2ZlZTEyMGM1M2U5OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcApAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1
ZGUgIkxheW91dFJlY3QuaCIKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAiVGV4dFJ1
bi5oIgotI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKICNpbmNsdWRlIDx3dGYvTWF0
aEV4dHJhcy5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtNTAsNjggKzQ5LDQgQEAgYm9v
bCBGb250Q2FzY2FkZTo6Y2FuRXhwYW5kQXJvdW5kSWRlb2dyYXBoc0luQ29tcGxleFRleHQoKQog
ICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBGb250Q2FzY2FkZTo6YWRqdXN0U2VsZWN0aW9u
UmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgTGF5b3V0UmVjdCYgc2VsZWN0
aW9uUmVjdCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pIGNvbnN0Ci17Ci0gICAgVW5pc2Ny
aWJlQ29udHJvbGxlciBpdCh0aGlzLCBydW4pOwotICAgIGl0LmFkdmFuY2UoZnJvbSk7Ci0gICAg
ZmxvYXQgYmVmb3JlV2lkdGggPSBpdC5ydW5XaWR0aFNvRmFyKCk7Ci0gICAgaXQuYWR2YW5jZSh0
byk7Ci0gICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGl0LnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlm
IChydW4ucnRsKCkpIHsKLSAgICAgICAgaXQuYWR2YW5jZShydW4ubGVuZ3RoKCkpOwotICAgICAg
ICBzZWxlY3Rpb25SZWN0Lm1vdmUoaXQucnVuV2lkdGhTb0ZhcigpIC0gYWZ0ZXJXaWR0aCwgMCk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIHNlbGVjdGlvblJlY3QubW92ZShiZWZvcmVXaWR0aCwgMCk7
Ci0gICAgc2VsZWN0aW9uUmVjdC5zZXRXaWR0aChhZnRlcldpZHRoIC0gYmVmb3JlV2lkdGgpOwot
fQotCi1mbG9hdCBGb250Q2FzY2FkZTo6Z2V0R2x5cGhzQW5kQWR2YW5jZXNGb3JDb21wbGV4VGV4
dChjb25zdCBUZXh0UnVuJiBydW4sIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLCBHbHlwaEJ1
ZmZlciYgZ2x5cGhCdWZmZXIsIEZvclRleHRFbXBoYXNpc09yTm90IGZvclRleHRFbXBoYXNpcykg
Y29uc3QKLXsKLSAgICBpZiAoZm9yVGV4dEVtcGhhc2lzKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBB
ZGQgZm9yVGV4dEVtcGhhc2lzIHBhcmVtZXRlciB0byBVbmlzY3JpYmVDb250cm9sbGVyIGFuZCB1
c2UgaXQuCi0gICAgICAgIExPR19FUlJPUigiTm90IGltcGxlbWVudGVkIGZvciB0ZXh0IGVtcGhh
c2lzLiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBVbmlzY3JpYmVDb250cm9s
bGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7
Ci0gICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLSAg
ICBjb250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7Ci0KLSAgICBpZiAoZ2x5cGhC
dWZmZXIuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZsb2F0IGFmdGVyV2lk
dGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlmIChydW4ucnRsKCkpIHsK
LSAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIHJldHVy
biBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7Ci0gICAgfQotICAgIHJl
dHVybiBiZWZvcmVXaWR0aDsKLX0KLQotZmxvYXQgRm9udENhc2NhZGU6OmZsb2F0V2lkdGhGb3JD
b21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgRm9udCo+KiBmYWxs
YmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAotewotICAgIFVu
aXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4sIGZhbGxiYWNrRm9udHMpOwot
ICAgIGNvbnRyb2xsZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOwotICAgIGlmIChnbHlwaE92ZXJm
bG93KSB7Ci0gICAgICAgIGdseXBoT3ZlcmZsb3ctPnRvcCA9IG1heDxpbnQ+KGdseXBoT3ZlcmZs
b3ctPnRvcCwgY2VpbGYoLWNvbnRyb2xsZXIubWluR2x5cGhCb3VuZGluZ0JveFkoKSkgLSAoZ2x5
cGhPdmVyZmxvdy0+Y29tcHV0ZUJvdW5kcyA/IDAgOiBmb250TWV0cmljcygpLmFzY2VudCgpKSk7
Ci0gICAgICAgIGdseXBoT3ZlcmZsb3ctPmJvdHRvbSA9IG1heDxpbnQ+KGdseXBoT3ZlcmZsb3ct
PmJvdHRvbSwgY2VpbGYoY29udHJvbGxlci5tYXhHbHlwaEJvdW5kaW5nQm94WSgpKSAtIChnbHlw
aE92ZXJmbG93LT5jb21wdXRlQm91bmRzID8gMCAgOiBmb250TWV0cmljcygpLmRlc2NlbnQoKSkp
OwotICAgICAgICBnbHlwaE92ZXJmbG93LT5sZWZ0ID0gbWF4PGludD4oMCwgY2VpbGYoLWNvbnRy
b2xsZXIubWluR2x5cGhCb3VuZGluZ0JveFgoKSkpOwotICAgICAgICBnbHlwaE92ZXJmbG93LT5y
aWdodCA9IG1heDxpbnQ+KDAsIGNlaWxmKGNvbnRyb2xsZXIubWF4R2x5cGhCb3VuZGluZ0JveFgo
KSAtIGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpKSk7Ci0gICAgfQotICAgIHJldHVybiBjb250
cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLX0KLQotaW50IEZvbnRDYXNjYWRlOjpvZmZzZXRGb3JQ
b3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgeEZsb2F0LCBi
b29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBUaGlzIHRy
dW5jYXRpb24gaXMgbm90IGEgcHJvYmxlbSBmb3IgSFRNTCwgYnV0IG9ubHkgYWZmZWN0cyBTVkcs
IHdoaWNoIHBhc3NlcyBmbG9hdGluZy1wb2ludCBudW1iZXJzCi0gICAgLy8gdG8gRm9udENhc2Nh
ZGU6Om9mZnNldEZvclBvc2l0aW9uKCkuIEJ1ZyBodHRwOi8vd2Via2l0Lm9yZy9iLzQwNjczIHRy
YWNrcyBmaXhpbmcgdGhpcyBwcm9ibGVtLgotICAgIGludCB4ID0gc3RhdGljX2Nhc3Q8aW50Pih4
RmxvYXQpOwotCi0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250cm9sbGVyKHRoaXMsIHJ1bik7
Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRpb24oeCwgaW5jbHVkZVBhcnRp
YWxHbHlwaHMpOwotfQotCiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vVW5pc2NyaWJlQ29udHJvbGxlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vVW5pc2NyaWJlQ29udHJvbGxlci5jcHAKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwYjAzODdlZmE3MTQwYjI5ZDNkZWNhZGI4NTAyNDk4YjU5YjkwMzYu
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1VuaXNjcmliZUNvbnRyb2xsZXIuY3BwCisrKyAv
ZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIw
MDgsIDIwMDksIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgot
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwot
Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgot
Ci0jaW5jbHVkZSAiRm9udC5oIgotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0jaW5jbHVkZSAi
SFduZERDLmgiCi0jaW5jbHVkZSAiVGV4dFJ1bi5oIgotI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFz
Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXVEY7Ci11c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKLXVz
aW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotLy8gRklYTUU6IFJl
YXJjaGl0ZWN0IHRoaXMgdG8gYmUgbW9yZSBsaWtlIFdpZHRoSXRlcmF0b3IgaW4gRm9udC5jcHAu
ICBIYXZlIGFuIGFkdmFuY2UoKSBtZXRob2QKLS8vIHRoYXQgZG9lcyBzdHVmZiBpbiB0aGF0IG1l
dGhvZCBpbnN0ZWFkIG9mIGRvaW5nIGV2ZXJ5dGhpbmcgaW4gdGhlIGNvbnN0cnVjdG9yLiAgSGF2
ZSBhZHZhbmNlKCkKLS8vIHRha2UgdGhlIEdseXBoQnVmZmVyIGFzIGFuIGFyZyBzbyB0aGF0IHdl
IGRvbid0IGhhdmUgdG8gcG9wdWxhdGUgdGhlIGdseXBoIGJ1ZmZlciB3aGVuCi0vLyBtZWFzdXJp
bmcuCi1VbmlzY3JpYmVDb250cm9sbGVyOjpVbmlzY3JpYmVDb250cm9sbGVyKGNvbnN0IEZvbnRD
YXNjYWRlKiBmb250LCBjb25zdCBUZXh0UnVuJiBydW4sIEhhc2hTZXQ8Y29uc3QgRm9udCo+KiBm
YWxsYmFja0ZvbnRzKQotICAgIDogbV9mb250KCpmb250KQotICAgICwgbV9ydW4ocnVuKQotICAg
ICwgbV9mYWxsYmFja0ZvbnRzKGZhbGxiYWNrRm9udHMpCi0gICAgLCBtX21pbkdseXBoQm91bmRp
bmdCb3hYKG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCkpCi0gICAgLCBtX21heEdseXBoQm91
bmRpbmdCb3hYKG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluKCkpCi0gICAgLCBtX21pbkdseXBo
Qm91bmRpbmdCb3hZKG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCkpCi0gICAgLCBtX21heEds
eXBoQm91bmRpbmdCb3hZKG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluKCkpCi0gICAgLCBtX2Vu
ZChydW4ubGVuZ3RoKCkpCi0gICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXIoMCkKLSAgICAsIG1fcnVu
V2lkdGhTb0ZhcigwKQotICAgICwgbV9wYWRkaW5nKHJ1bi5leHBhbnNpb24oKSkKLSAgICAsIG1f
Y29tcHV0aW5nT2Zmc2V0UG9zaXRpb24oZmFsc2UpCi0gICAgLCBtX2luY2x1ZGVQYXJ0aWFsR2x5
cGhzKGZhbHNlKQotICAgICwgbV9vZmZzZXRYKDApCi0gICAgLCBtX29mZnNldFBvc2l0aW9uKDAp
Ci17Ci0gICAgaWYgKCFtX3BhZGRpbmcpCi0gICAgICAgIG1fcGFkUGVyU3BhY2UgPSAwOwotICAg
IGVsc2UgewotICAgICAgICBmbG9hdCBudW1TcGFjZXMgPSAwOwotICAgICAgICBmb3IgKGludCBz
ID0gMDsgcyA8IG1fcnVuLmxlbmd0aCgpOyBzKyspIHsKLSAgICAgICAgICAgIGlmIChGb250Q2Fz
Y2FkZTo6dHJlYXRBc1NwYWNlKG1fcnVuW3NdKSkKLSAgICAgICAgICAgICAgICBudW1TcGFjZXMr
KzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudW1TcGFjZXMgPT0gMCkKLSAgICAgICAgICAg
IG1fcGFkUGVyU3BhY2UgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX3BhZFBlclNw
YWNlID0gbV9wYWRkaW5nIC8gbnVtU3BhY2VzOwotICAgIH0KLQotICAgIC8vIE51bGwgb3V0IG91
ciB1bmlzY3JpYmUgc3RydWN0cwotICAgIHJlc2V0Q29udHJvbEFuZFN0YXRlKCk7Ci19Ci0KLWlu
dCBVbmlzY3JpYmVDb250cm9sbGVyOjpvZmZzZXRGb3JQb3NpdGlvbihpbnQgeCwgYm9vbCBpbmNs
dWRlUGFydGlhbEdseXBocykKLXsKLSAgICBtX2NvbXB1dGluZ09mZnNldFBvc2l0aW9uID0gdHJ1
ZTsKLSAgICBtX2luY2x1ZGVQYXJ0aWFsR2x5cGhzID0gaW5jbHVkZVBhcnRpYWxHbHlwaHM7Ci0g
ICAgbV9vZmZzZXRYID0geDsKLSAgICBtX29mZnNldFBvc2l0aW9uID0gMDsKLSAgICBhZHZhbmNl
KG1fcnVuLmxlbmd0aCgpKTsKLSAgICBpZiAobV9jb21wdXRpbmdPZmZzZXRQb3NpdGlvbikgewot
ICAgICAgICAvLyBUaGUgcG9pbnQgaXMgdG8gdGhlIGxlZnQgb3IgdG8gdGhlIHJpZ2h0IG9mIHRo
ZSBlbnRpcmUgcnVuLgotICAgICAgICBpZiAobV9vZmZzZXRYID49IG1fcnVuV2lkdGhTb0ZhciAm
JiBtX3J1bi5sdHIoKSB8fCBtX29mZnNldFggPCAwICYmIG1fcnVuLnJ0bCgpKQotICAgICAgICAg
ICAgbV9vZmZzZXRQb3NpdGlvbiA9IG1fZW5kOwotICAgIH0KLSAgICBtX2NvbXB1dGluZ09mZnNl
dFBvc2l0aW9uID0gZmFsc2U7Ci0gICAgcmV0dXJuIG1fb2Zmc2V0UG9zaXRpb247Ci19Ci0KLXZv
aWQgVW5pc2NyaWJlQ29udHJvbGxlcjo6YWR2YW5jZSh1bnNpZ25lZCBvZmZzZXQsIEdseXBoQnVm
ZmVyKiBnbHlwaEJ1ZmZlcikKLXsKLSAgICAvLyBGSVhNRTogV2UgcmVhbGx5IHdhbnQgdG8gYmUg
dXNpbmcgYSBuZXdlciB2ZXJzaW9uIG9mIFVuaXNjcmliZSB0aGF0IHN1cHBvcnRzIHRoZSBuZXcg
T3BlblR5cGUKLSAgICAvLyBmdW5jdGlvbnMuICBUaG9zZSBmdW5jdGlvbnMgd291bGQgYWxsb3cg
dXMgdG8gdHVybiBvZmYga2VybmluZyBhbmQgbGlnYXR1cmVzLiAgV2l0aG91dCBiZWluZyBhYmxl
Ci0gICAgLy8gdG8gZG8gdGhhdCwgd2Ugd2lsbCBoYXZlIGJ1Z2d5IGxpbmUgYnJlYWtpbmcgYW5k
IG1ldHJpY3Mgd2hlbiBzaW1wbGUgYW5kIGNvbXBsZXggdGV4dCBhcmUgY2xvc2UKLSAgICAvLyB0
b2dldGhlciAodGhlIGNvbXBsZXggY29kZSBwYXRoIHdpbGwgbmFycm93IHRoZSB0ZXh0IGJlY2F1
c2Ugb2Yga2VybmluZyBhbmQgbGlnYXR1cmVzIGFuZCB0aGVuCi0gICAgLy8gd2hlbiBiaWRpIHBy
b2Nlc3Npbmcgc3BsaXRzIGludG8gbXVsdGlwbGUgcnVucywgdGhlIHNpbXBsZSBwb3J0aW9ucyB3
aWxsIGdldCB3aWRlciBhbmQgY2F1c2UgdXMgdG8KLSAgICAvLyBzcGlsbCBvZmYgdGhlIGVkZ2Ug
b2YgYSBsaW5lKS4KLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihvZmZzZXQpID4gbV9lbmQpCi0g
ICAgICAgIG9mZnNldCA9IG1fZW5kOwotCi0gICAgaW50IGxlbmd0aCA9IG9mZnNldCAtIG1fY3Vy
cmVudENoYXJhY3RlcjsKLSAgICBpZiAobGVuZ3RoIDw9IDApCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFN0cmluZyBidWZmZXJGb3IxNkJpdERhdGE7Ci0KLSAgICAvLyBJdGVtaXplIHRoZSBzdHJp
bmcuCi0gICAgY29uc3QgVUNoYXIqIGNwID0gbnVsbHB0cjsKLSAgICBpZiAobV9ydW4uaXM4Qml0
KCkpIHsKLSAgICAgICAgLy8gVW5pc2NyaWJlIG9ubHkgZGVhbHMgd2l0aCAxNi1iaXQgY2hhcmFj
dGVycy4gTXVzdCBnZW5lcmF0ZSB0aGVtIG5vdy4KLSAgICAgICAgYnVmZmVyRm9yMTZCaXREYXRh
ID0gU3RyaW5nOjptYWtlMTZCaXRGcm9tOEJpdFNvdXJjZShtX3J1bi5kYXRhOChtX2N1cnJlbnRD
aGFyYWN0ZXIpLCBsZW5ndGgpOwotICAgICAgICBjcCA9IGJ1ZmZlckZvcjE2Qml0RGF0YS5jaGFy
YWN0ZXJzMTYoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgY3AgPSBtX3J1bi5kYXRhMTYobV9jdXJy
ZW50Q2hhcmFjdGVyKTsKLQotICAgIHVuc2lnbmVkIGJhc2VDaGFyYWN0ZXIgPSBtX2N1cnJlbnRD
aGFyYWN0ZXI7Ci0KLSAgICAvLyBXZSBicmVhayB1cCBpdGVtaXphdGlvbiBvZiB0aGUgc3RyaW5n
IGJ5IGZvbnREYXRhIGFuZCAoaWYgbmVlZGVkKSB0aGUgdXNlIG9mIHNtYWxsIGNhcHMuCi0KLSAg
ICAvLyBGSVhNRTogSXQncyBpbmNvbnNpc3RlbnQgdGhhdCB3ZSB1c2UgbG9naWNhbCBvcmRlciB3
aGVuIGl0ZW1pemluZywgc2luY2UgdGhpcwotICAgIC8vIGRvZXMgbm90IG1hdGNoIG5vcm1hbCBS
VEwuCi0KLSAgICAvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBzaG91bGQgZGVjb2RlIHN1cnJvZ2F0
ZSBwYWlycy4gQ3VycmVudGx5IGl0IG1ha2VzIGxpdHRsZSBkaWZmZXJlbmNlIHRoYXQKLSAgICAv
LyBpdCBkb2VzIG5vdCBiZWNhdXNlIHRoZSBmb250IGNhY2hlIG9uIFdpbmRvd3MgZG9lcyBub3Qg
c3VwcG9ydCBub24tQk1QIGNoYXJhY3RlcnMuCi0gICAgVmVjdG9yPFVDaGFyLCAyNTY+IHNtYWxs
Q2Fwc0J1ZmZlcjsKLSAgICBpZiAobV9mb250LmlzU21hbGxDYXBzKCkpCi0gICAgICAgIHNtYWxs
Q2Fwc0J1ZmZlci5yZXNpemUobGVuZ3RoKTsKLQotICAgIHVuc2lnbmVkIGluZGV4T2ZGb250VHJh
bnNpdGlvbiA9IG1fcnVuLnJ0bCgpID8gbGVuZ3RoIC0gMSA6IDA7Ci0gICAgY29uc3QgVUNoYXIq
IGN1cnIgPSBtX3J1bi5ydGwoKSA/IGNwICsgbGVuZ3RoICAtIDEgOiBjcDsKLSAgICBjb25zdCBV
Q2hhciogZW5kID0gbV9ydW4ucnRsKCkgPyBjcCAtIDEgOiBjcCArIGxlbmd0aDsKLQotICAgIGNv
bnN0IEZvbnQqIGZvbnREYXRhOwotICAgIGNvbnN0IEZvbnQqIG5leHRGb250RGF0YSA9IG1fZm9u
dC5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoKmN1cnIsIGZhbHNlKS5mb250OwotCi0gICAgVUNoYXIg
bmV3QyA9IDA7Ci0KLSAgICBib29sIGlzU21hbGxDYXBzOwotICAgIGJvb2wgbmV4dElzU21hbGxD
YXBzID0gbV9mb250LmlzU21hbGxDYXBzKCkgJiYgIShVX0dFVF9HQ19NQVNLKCpjdXJyKSAmIFVf
R0NfTV9NQVNLKSAmJiAobmV3QyA9IHVfdG91cHBlcigqY3VycikpICE9ICpjdXJyOwotCi0gICAg
aWYgKG5leHRJc1NtYWxsQ2FwcykKLSAgICAgICAgc21hbGxDYXBzQnVmZmVyW2N1cnIgLSBjcF0g
PSBuZXdDOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgY3VyciA9IG1fcnVuLnJ0bCgp
ID8gY3VyciAtIDEgOiBjdXJyICsgMTsKLSAgICAgICAgaWYgKGN1cnIgPT0gZW5kKQotICAgICAg
ICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZm9udERhdGEgPSBuZXh0Rm9udERhdGE7Ci0gICAgICAg
IGlzU21hbGxDYXBzID0gbmV4dElzU21hbGxDYXBzOwotICAgICAgICBpbnQgaW5kZXggPSBjdXJy
IC0gY3A7Ci0gICAgICAgIFVDaGFyIGMgPSAqY3VycjsKLQotICAgICAgICBib29sIGZvcmNlU21h
bGxDYXBzID0gaXNTbWFsbENhcHMgJiYgKFVfR0VUX0dDX01BU0soYykgJiBVX0dDX01fTUFTSyk7
Ci0gICAgICAgIG5leHRGb250RGF0YSA9IG1fZm9udC5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoKmN1
cnIsIGZhbHNlLCBmb3JjZVNtYWxsQ2FwcyA/IFNtYWxsQ2Fwc1ZhcmlhbnQgOiBBdXRvVmFyaWFu
dCkuZm9udDsKLSAgICAgICAgaWYgKG1fZm9udC5pc1NtYWxsQ2FwcygpKSB7Ci0gICAgICAgICAg
ICBuZXh0SXNTbWFsbENhcHMgPSBmb3JjZVNtYWxsQ2FwcyB8fCAobmV3QyA9IHVfdG91cHBlcihj
KSkgIT0gYzsKLSAgICAgICAgICAgIGlmIChuZXh0SXNTbWFsbENhcHMpCi0gICAgICAgICAgICAg
ICAgc21hbGxDYXBzQnVmZmVyW2luZGV4XSA9IGZvcmNlU21hbGxDYXBzID8gYyA6IG5ld0M7Ci0g
ICAgICAgIH0KLQotICAgICAgICBpZiAobV9mYWxsYmFja0ZvbnRzICYmIGZvbnREYXRhICYmIG5l
eHRGb250RGF0YSAhPSBmb250RGF0YSAmJiBmb250RGF0YSAhPSAmbV9mb250LnByaW1hcnlGb250
KCkpCi0gICAgICAgICAgICBtX2ZhbGxiYWNrRm9udHMtPmFkZChmb250RGF0YSk7Ci0KLSAgICAg
ICAgaWYgKG5leHRGb250RGF0YSAhPSBmb250RGF0YSB8fCBuZXh0SXNTbWFsbENhcHMgIT0gaXNT
bWFsbENhcHMpIHsKLSAgICAgICAgICAgIGludCBpdGVtU3RhcnQgPSBtX3J1bi5ydGwoKSA/IGlu
ZGV4ICsgMSA6IGluZGV4T2ZGb250VHJhbnNpdGlvbjsKLSAgICAgICAgICAgIGludCBpdGVtTGVu
Z3RoID0gbV9ydW4ucnRsKCkgPyBpbmRleE9mRm9udFRyYW5zaXRpb24gLSBpbmRleCA6IGluZGV4
IC0gaW5kZXhPZkZvbnRUcmFuc2l0aW9uOwotICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVy
ID0gYmFzZUNoYXJhY3RlciArIGl0ZW1TdGFydDsKLSAgICAgICAgICAgIGl0ZW1pemVTaGFwZUFu
ZFBsYWNlKChpc1NtYWxsQ2FwcyA/IHNtYWxsQ2Fwc0J1ZmZlci5kYXRhKCkgOiBjcCkgKyBpdGVt
U3RhcnQsIGl0ZW1MZW5ndGgsIGZvbnREYXRhLCBnbHlwaEJ1ZmZlcik7Ci0gICAgICAgICAgICBp
bmRleE9mRm9udFRyYW5zaXRpb24gPSBpbmRleDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAg
ICBpbnQgaXRlbUxlbmd0aCA9IG1fcnVuLnJ0bCgpID8gaW5kZXhPZkZvbnRUcmFuc2l0aW9uICsg
MSA6IGxlbmd0aCAtIGluZGV4T2ZGb250VHJhbnNpdGlvbjsKLSAgICBpZiAoaXRlbUxlbmd0aCkg
ewotICAgICAgICBpZiAobV9mYWxsYmFja0ZvbnRzICYmIG5leHRGb250RGF0YSAmJiBuZXh0Rm9u
dERhdGEgIT0gJm1fZm9udC5wcmltYXJ5Rm9udCgpKQotICAgICAgICAgICAgbV9mYWxsYmFja0Zv
bnRzLT5hZGQobmV4dEZvbnREYXRhKTsKLQotICAgICAgICBpbnQgaXRlbVN0YXJ0ID0gbV9ydW4u
cnRsKCkgPyAwIDogaW5kZXhPZkZvbnRUcmFuc2l0aW9uOwotICAgICAgICBtX2N1cnJlbnRDaGFy
YWN0ZXIgPSBiYXNlQ2hhcmFjdGVyICsgaXRlbVN0YXJ0OwotICAgICAgICBpdGVtaXplU2hhcGVB
bmRQbGFjZSgobmV4dElzU21hbGxDYXBzID8gc21hbGxDYXBzQnVmZmVyLmRhdGEoKSA6IGNwKSAr
IGl0ZW1TdGFydCwgaXRlbUxlbmd0aCwgbmV4dEZvbnREYXRhLCBnbHlwaEJ1ZmZlcik7Ci0gICAg
fQotCi0gICAgbV9jdXJyZW50Q2hhcmFjdGVyID0gYmFzZUNoYXJhY3RlciArIGxlbmd0aDsKLX0K
LQotdm9pZCBVbmlzY3JpYmVDb250cm9sbGVyOjppdGVtaXplU2hhcGVBbmRQbGFjZShjb25zdCBV
Q2hhciogY3AsIHVuc2lnbmVkIGxlbmd0aCwgY29uc3QgRm9udCogZm9udERhdGEsIEdseXBoQnVm
ZmVyKiBnbHlwaEJ1ZmZlcikKLXsKLSAgICAvLyBTY3JpcHRJdGVtaXplIChpbiBXaW5kb3dzIFhQ
IHZlcnNpb25zIHByaW9yIHRvIFNQMikgY2FuIG92ZXJmbG93IGJ5IDEuICBUaGlzIGlzIHdoeSB0
aGVyZSBpcyBhbiBleHRyYSBlbXB0eSBpdGVtCi0gICAgLy8gaGFuZ2luZyBvdXQgYXQgdGhlIGVu
ZCBvZiB0aGUgYXJyYXkKLSAgICBtX2l0ZW1zLnJlc2l6ZSg2KTsKLSAgICBpbnQgbnVtSXRlbXMg
PSAwOwotICAgIEhSRVNVTFQgcmMgPSBTX09LOwotICAgIHdoaWxlIChyYyA9IDo6U2NyaXB0SXRl
bWl6ZShjcCwgbGVuZ3RoLCBtX2l0ZW1zLnNpemUoKSAtIDEsICZtX2NvbnRyb2wsICZtX3N0YXRl
LCBtX2l0ZW1zLmRhdGEoKSwgJm51bUl0ZW1zKSA9PSBFX09VVE9GTUVNT1JZKSB7Ci0gICAgICAg
IG1faXRlbXMucmVzaXplKG1faXRlbXMuc2l6ZSgpICogMik7Ci0gICAgICAgIHJlc2V0Q29udHJv
bEFuZFN0YXRlKCk7Ci0gICAgfQotICAgIGlmIChGQUlMRUQocmMpKSB7Ci0gICAgICAgIFdURkxv
Z0Fsd2F5cygiVW5pc2NyaWJlQ29udHJvbGxlcjo6aXRlbWl6ZVNoYXBlQW5kUGxhY2U6IFNjcmlw
dEl0ZW1pemUgZmFpbGVkLCByYz0lbHgiLCByYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgbV9pdGVtcy5yZXNpemUobnVtSXRlbXMgKyAxKTsKLQotICAgIGlmIChtX3J1bi5ydGwoKSkg
ewotICAgICAgICBmb3IgKGludCBpID0gbV9pdGVtcy5zaXplKCkgLSAyOyBpID49IDA7IGktLSkg
ewotICAgICAgICAgICAgaWYgKCFzaGFwZUFuZFBsYWNlSXRlbShjcCwgaSwgZm9udERhdGEsIGds
eXBoQnVmZmVyKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGVs
c2UgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9pdGVtcy5zaXplKCkgLSAx
OyBpKyspIHsKLSAgICAgICAgICAgIGlmICghc2hhcGVBbmRQbGFjZUl0ZW0oY3AsIGksIGZvbnRE
YXRhLCBnbHlwaEJ1ZmZlcikpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi12b2lkIFVuaXNjcmliZUNvbnRyb2xsZXI6OnJlc2V0Q29udHJvbEFuZFN0YXRl
KCkKLXsKLSAgICBtZW1zZXQoJm1fY29udHJvbCwgMCwgc2l6ZW9mKFNDUklQVF9DT05UUk9MKSk7
Ci0gICAgbWVtc2V0KCZtX3N0YXRlLCAwLCBzaXplb2YoU0NSSVBUX1NUQVRFKSk7Ci0KLSAgICAv
LyBTZXQgdXAgdGhlIGNvcnJlY3QgZGlyZWN0aW9uIGZvciB0aGUgcnVuLgotICAgIG1fc3RhdGUu
dUJpZGlMZXZlbCA9IG1fcnVuLnJ0bCgpOwotICAgIAotICAgIC8vIExvY2sgdGhlIGNvcnJlY3Qg
ZGlyZWN0aW9uYWwgb3ZlcnJpZGUuCi0gICAgbV9zdGF0ZS5mT3ZlcnJpZGVEaXJlY3Rpb24gPSBt
X3J1bi5kaXJlY3Rpb25hbE92ZXJyaWRlKCk7Ci19Ci0KLWJvb2wgVW5pc2NyaWJlQ29udHJvbGxl
cjo6c2hhcGVBbmRQbGFjZUl0ZW0oY29uc3QgVUNoYXIqIGNwLCB1bnNpZ25lZCBpLCBjb25zdCBG
b250KiBmb250RGF0YSwgR2x5cGhCdWZmZXIqIGdseXBoQnVmZmVyKQotewotICAgIC8vIERldGVy
bWluZSB0aGUgc3RyaW5nIGZvciB0aGlzIGl0ZW0uCi0gICAgY29uc3QgVUNoYXIqIHN0ciA9IGNw
ICsgbV9pdGVtc1tpXS5pQ2hhclBvczsKLSAgICBpbnQgbGVuID0gbV9pdGVtc1tpKzFdLmlDaGFy
UG9zIC0gbV9pdGVtc1tpXS5pQ2hhclBvczsKLSAgICBTQ1JJUFRfSVRFTSBpdGVtID0gbV9pdGVt
c1tpXTsKLQotICAgIC8vIFNldCB1cCBidWZmZXJzIHRvIGhvbGQgdGhlIHJlc3VsdHMgb2Ygc2hh
cGluZyB0aGUgaXRlbS4KLSAgICBWZWN0b3I8V09SRD4gZ2x5cGhzOwotICAgIFZlY3RvcjxXT1JE
PiBjbHVzdGVyczsKLSAgICBWZWN0b3I8U0NSSVBUX1ZJU0FUVFI+IHZpc3VhbEF0dHJpYnV0ZXM7
Ci0gICAgY2x1c3RlcnMucmVzaXplKGxlbik7Ci0gICAgIAotICAgIC8vIFNoYXBlIHRoZSBpdGVt
LgotICAgIC8vIFRoZSByZWNvbW1lbmRlZCBzaXplIGZvciB0aGUgZ2x5cGggYnVmZmVyIGlzIDEu
NSAqIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoICsgMTYgaW4gdGhlIHVuaXNjcmliZSBkb2NzLgotICAg
IC8vIEFwcGFyZW50bHkgdGhpcyBpcyBhIGdvb2Qgc2l6ZSB0byBhdm9pZCBoYXZpbmcgdG8gbWFr
ZSByZXBlYXRlZCBjYWxscyB0byBTY3JpcHRTaGFwZS4KLSAgICBnbHlwaHMucmVzaXplKDEuNSAq
IGxlbiArIDE2KTsKLSAgICB2aXN1YWxBdHRyaWJ1dGVzLnJlc2l6ZShnbHlwaHMuc2l6ZSgpKTsK
LQotICAgIGlmICghc2hhcGUoc3RyLCBsZW4sIGl0ZW0sIGZvbnREYXRhLCBnbHlwaHMsIGNsdXN0
ZXJzLCB2aXN1YWxBdHRyaWJ1dGVzKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBX
ZSBub3cgaGF2ZSBhIGNvbGxlY3Rpb24gb2YgZ2x5cGhzLgotICAgIFZlY3RvcjxHT0ZGU0VUPiBv
ZmZzZXRzOwotICAgIFZlY3RvcjxpbnQ+IGFkdmFuY2VzOwotICAgIG9mZnNldHMucmVzaXplKGds
eXBocy5zaXplKCkpOwotICAgIGFkdmFuY2VzLnJlc2l6ZShnbHlwaHMuc2l6ZSgpKTsKLSAgICBp
bnQgZ2x5cGhDb3VudCA9IDA7Ci0gICAgSFJFU1VMVCBwbGFjZVJlc3VsdCA9IFNjcmlwdFBsYWNl
KDAsIGZvbnREYXRhLT5zY3JpcHRDYWNoZSgpLCBnbHlwaHMuZGF0YSgpLCBnbHlwaHMuc2l6ZSgp
LCB2aXN1YWxBdHRyaWJ1dGVzLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJml0ZW0uYSwgYWR2YW5jZXMuZGF0YSgpLCBvZmZzZXRzLmRhdGEoKSwgMCk7Ci0g
ICAgaWYgKHBsYWNlUmVzdWx0ID09IEVfUEVORElORykgewotICAgICAgICAvLyBUaGUgc2NyaXB0
IGNhY2hlIGlzbid0IHByaW1lZCB3aXRoIGVub3VnaCBpbmZvIHlldC4gIFdlIG5lZWQgdG8gc2Vs
ZWN0IG91ciBIRk9OVCBpbnRvCi0gICAgICAgIC8vIGEgREMgYW5kIHBhc3MgdGhlIERDIGluIHRv
IFNjcmlwdFBsYWNlLgotICAgICAgICBIV25kREMgaGRjKDApOwotICAgICAgICBIRk9OVCBoZm9u
dCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5oZm9udCgpOwotICAgICAgICBIRk9OVCBvbGRG
b250ID0gKEhGT05UKVNlbGVjdE9iamVjdChoZGMsIGhmb250KTsKLSAgICAgICAgcGxhY2VSZXN1
bHQgPSBTY3JpcHRQbGFjZShoZGMsIGZvbnREYXRhLT5zY3JpcHRDYWNoZSgpLCBnbHlwaHMuZGF0
YSgpLCBnbHlwaHMuc2l6ZSgpLCB2aXN1YWxBdHRyaWJ1dGVzLmRhdGEoKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAmaXRlbS5hLCBhZHZhbmNlcy5kYXRhKCksIG9mZnNldHMu
ZGF0YSgpLCAwKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7Ci0gICAgfQot
ICAgIAotICAgIGlmIChGQUlMRUQocGxhY2VSZXN1bHQpIHx8IGdseXBocy5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gQ29udmVydCBhbGwgY2hhcnMgdGhhdCBzaG91
bGQgYmUgdHJlYXRlZCBhcyBzcGFjZXMgdG8gdXNlIHRoZSBzcGFjZSBnbHlwaC4KLSAgICAvLyBX
ZSBhbHNvIGNyZWF0ZSBhIG1hcCB0aGF0IGFsbG93cyB1cyB0byBxdWlja2x5IGdvIGZyb20gc3Bh
Y2UgZ2x5cGhzIGJhY2sgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLgotICAgIFZl
Y3RvcjxpbnQ+IHNwYWNlQ2hhcmFjdGVycyhnbHlwaHMuc2l6ZSgpKTsKLSAgICBzcGFjZUNoYXJh
Y3RlcnMuZmlsbCgtMSk7Ci0KLSAgICBjb25zdCBmbG9hdCBjTG9naWNhbFNjYWxlID0gZm9udERh
dGEtPnBsYXRmb3JtRGF0YSgpLnVzZUdESSgpID8gMS4wZiA6IDMyLjBmOwotICAgIGZsb2F0IHNw
YWNlV2lkdGggPSBmb250RGF0YS0+c3BhY2VXaWR0aCgpIC0gZm9udERhdGEtPnN5bnRoZXRpY0Jv
bGRPZmZzZXQoKTsKLSAgICB1bnNpZ25lZCBsb2dpY2FsU3BhY2VXaWR0aCA9IHNwYWNlV2lkdGgg
KiBjTG9naWNhbFNjYWxlOwotCi0gICAgZm9yIChpbnQgayA9IDA7IGsgPCBsZW47IGsrKykgewot
ICAgICAgICBVQ2hhciBjaCA9ICooc3RyICsgayk7Ci0gICAgICAgIGJvb2wgdHJlYXRBc1NwYWNl
ID0gRm9udENhc2NhZGU6OnRyZWF0QXNTcGFjZShjaCk7Ci0gICAgICAgIGJvb2wgdHJlYXRBc1pl
cm9XaWR0aFNwYWNlID0gRm9udENhc2NhZGU6OnRyZWF0QXNaZXJvV2lkdGhTcGFjZShjaCk7Ci0g
ICAgICAgIGlmICh0cmVhdEFzU3BhY2UgfHwgdHJlYXRBc1plcm9XaWR0aFNwYWNlKSB7Ci0gICAg
ICAgICAgICAvLyBTdWJzdGl0dXRlIGluIHRoZSBzcGFjZSBnbHlwaCBhdCB0aGUgYXBwcm9wcmlh
dGUgcGxhY2UgaW4gdGhlIGdseXBocwotICAgICAgICAgICAgLy8gYXJyYXkuCi0gICAgICAgICAg
ICBnbHlwaHNbY2x1c3RlcnNba11dID0gZm9udERhdGEtPnNwYWNlR2x5cGgoKTsKLSAgICAgICAg
ICAgIGFkdmFuY2VzW2NsdXN0ZXJzW2tdXSA9IHRyZWF0QXNTcGFjZSA/IGxvZ2ljYWxTcGFjZVdp
ZHRoIDogMDsKLSAgICAgICAgICAgIGlmICh0cmVhdEFzU3BhY2UpCi0gICAgICAgICAgICAgICAg
c3BhY2VDaGFyYWN0ZXJzW2NsdXN0ZXJzW2tdXSA9IG1fY3VycmVudENoYXJhY3RlciArIGsgKyBp
dGVtLmlDaGFyUG9zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUG9wdWxhdGUgb3VyIGds
eXBoIGJ1ZmZlciB3aXRoIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgYm9vbCBoYXNFeHRyYVNwYWNp
bmcgPSBtX2ZvbnQubGV0dGVyU3BhY2luZygpIHx8IG1fZm9udC53b3JkU3BhY2luZygpIHx8IG1f
cGFkZGluZzsKLSAgICAKLSAgICBmbG9hdCBsZWZ0RWRnZSA9IG1fcnVuV2lkdGhTb0ZhcjsKLQot
ICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBnbHlwaHMuc2l6ZSgpOyBrKyspIHsKLSAgICAg
ICAgR2x5cGggZ2x5cGggPSBnbHlwaHNba107Ci0gICAgICAgIGZsb2F0IGFkdmFuY2UgPSBhZHZh
bmNlc1trXSAvIGNMb2dpY2FsU2NhbGU7Ci0gICAgICAgIGZsb2F0IG9mZnNldFggPSBvZmZzZXRz
W2tdLmR1IC8gY0xvZ2ljYWxTY2FsZTsKLSAgICAgICAgZmxvYXQgb2Zmc2V0WSA9IG9mZnNldHNb
a10uZHYgLyBjTG9naWNhbFNjYWxlOwotCi0gICAgICAgIC8vIE1hdGNoIEFwcEtpdCdzIHJ1bGVz
IGZvciB0aGUgaW50ZWdlciB2cy4gbm9uLWludGVnZXIgcmVuZGVyaW5nIG1vZGVzLgotICAgICAg
ICBmbG9hdCByb3VuZGVkQWR2YW5jZSA9IHJvdW5kZihhZHZhbmNlKTsKLSAgICAgICAgaWYgKCFm
b250RGF0YS0+cGxhdGZvcm1EYXRhKCkuaXNTeXN0ZW1Gb250KCkpIHsKLSAgICAgICAgICAgIGFk
dmFuY2UgPSByb3VuZGVkQWR2YW5jZTsKLSAgICAgICAgICAgIG9mZnNldFggPSByb3VuZGYob2Zm
c2V0WCk7Ci0gICAgICAgICAgICBvZmZzZXRZID0gcm91bmRmKG9mZnNldFkpOwotICAgICAgICB9
Ci0KLSAgICAgICAgYWR2YW5jZSArPSBmb250RGF0YS0+c3ludGhldGljQm9sZE9mZnNldCgpOwot
Ci0gICAgICAgIGlmIChoYXNFeHRyYVNwYWNpbmcpIHsKLSAgICAgICAgICAgIC8vIElmIHdlJ3Jl
IGEgZ2x5cGggd2l0aCBhbiBhZHZhbmNlLCBnbyBhaGVhZCBhbmQgYWRkIGluIGxldHRlci1zcGFj
aW5nLgotICAgICAgICAgICAgLy8gVGhhdCB3YXkgd2Ugd2VlZCBvdXQgemVybyB3aWR0aCBsdXJr
ZXJzLiAgVGhpcyBiZWhhdmlvciBtYXRjaGVzIHRoZSBmYXN0IHRleHQgY29kZSBwYXRoLgotICAg
ICAgICAgICAgaWYgKGFkdmFuY2UgJiYgbV9mb250LmxldHRlclNwYWNpbmcoKSkKLSAgICAgICAg
ICAgICAgICBhZHZhbmNlICs9IG1fZm9udC5sZXR0ZXJTcGFjaW5nKCk7Ci0KLSAgICAgICAgICAg
IC8vIEhhbmRsZSBqdXN0aWZpY2F0aW9uIGFuZCB3b3JkLXNwYWNpbmcuCi0gICAgICAgICAgICBp
bnQgY2hhcmFjdGVySW5kZXggPSBzcGFjZUNoYXJhY3RlcnNba107Ci0gICAgICAgICAgICAvLyBj
aGFyYWN0ZXJJbmRleCBpcyBsZWZ0IGF0IHRoZSBpbml0aWFsIHZhbHVlIG9mIC0xIGZvciBnbHlw
aHMgdGhhdCBkbyBub3QgbWFwIGJhY2sgdG8gdHJlYXRlZC1hcy1zcGFjZSBjaGFyYWN0ZXJzLgot
ICAgICAgICAgICAgaWYgKGNoYXJhY3RlckluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gQWNjb3VudCBmb3IgcGFkZGluZy4gV2ViQ29yZSB1c2VzIHNwYWNlIHBhZGRpbmcgdG8ganVz
dGlmeSB0ZXh0LgotICAgICAgICAgICAgICAgIC8vIFdlIGRpc3RyaWJ1dGUgdGhlIHNwZWNpZmll
ZCBwYWRkaW5nIG92ZXIgdGhlIGF2YWlsYWJsZSBzcGFjZXMgaW4gdGhlIHJ1bi4KLSAgICAgICAg
ICAgICAgICBpZiAobV9wYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBsZWZ0
b3ZlciBwYWRkaW5nIGlmIG5vdCBldmVubHkgZGl2aXNpYmxlIGJ5IG51bWJlciBvZiBzcGFjZXMu
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BhZGRpbmcgPCBtX3BhZFBlclNwYWNlKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlICs9IG1fcGFkZGluZzsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIG1fcGFkZGluZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BhZGRpbmcgLT0gbV9wYWRQZXJTcGFjZTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgKz0gbV9wYWRQZXJTcGFjZTsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEFj
Y291bnQgZm9yIHdvcmQtc3BhY2luZy4KLSAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVySW5k
ZXggPiAwICYmIG1fZm9udC53b3JkU3BhY2luZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVD
aGFyIGNhbmRpZGF0ZVNwYWNlOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9ydW4uaXM4Qml0
KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVTcGFjZSA9ICoobV9ydW4uZGF0
YTgoY2hhcmFjdGVySW5kZXggLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVNwYWNlID0gKihtX3J1bi5kYXRhMTYoY2hhcmFj
dGVySW5kZXggLSAxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFGb250Q2FzY2FkZTo6
dHJlYXRBc1NwYWNlKGNhbmRpZGF0ZVNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFk
dmFuY2UgKz0gbV9mb250LndvcmRTcGFjaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbV9ydW5XaWR0aFNvRmFyICs9IGFkdmFuY2U7
Ci0KLSAgICAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gdGFrZSB0aGUgR09GRlNFVFMgZm9yIGNv
bWJpbmluZyBnbHlwaHMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIGdseXBoIGJ1ZmZlcgotICAgICAg
ICAvLyBhcyB3ZWxsLCBzbyB0aGF0IHdoZW4gdGhlIHRpbWUgY29tZXMgdG8gZHJhdyB0aG9zZSBn
bHlwaHMsIHdlIGNhbiBhcHBseSB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgLy8gdHJhbnNsYXRp
b24uCi0gICAgICAgIGlmIChnbHlwaEJ1ZmZlcikgewotICAgICAgICAgICAgRmxvYXRTaXplIHNp
emUob2Zmc2V0WCwgLW9mZnNldFkpOwotICAgICAgICAgICAgZ2x5cGhCdWZmZXItPmFkZChnbHlw
aCwgZm9udERhdGEsIGFkdmFuY2UsIEdseXBoQnVmZmVyOjpub09mZnNldCwgJnNpemUpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgRmxvYXRSZWN0IGdseXBoQm91bmRzID0gZm9udERhdGEtPmJvdW5k
c0ZvckdseXBoKGdseXBoKTsKLSAgICAgICAgZ2x5cGhCb3VuZHMubW92ZShtX2dseXBoT3JpZ2lu
LngoKSwgbV9nbHlwaE9yaWdpbi55KCkpOwotICAgICAgICBtX21pbkdseXBoQm91bmRpbmdCb3hY
ID0gbWluKG1fbWluR2x5cGhCb3VuZGluZ0JveFgsIGdseXBoQm91bmRzLngoKSk7Ci0gICAgICAg
IG1fbWF4R2x5cGhCb3VuZGluZ0JveFggPSBtYXgobV9tYXhHbHlwaEJvdW5kaW5nQm94WCwgZ2x5
cGhCb3VuZHMubWF4WCgpKTsKLSAgICAgICAgbV9taW5HbHlwaEJvdW5kaW5nQm94WSA9IG1pbiht
X21pbkdseXBoQm91bmRpbmdCb3hZLCBnbHlwaEJvdW5kcy55KCkpOwotICAgICAgICBtX21heEds
eXBoQm91bmRpbmdCb3hZID0gbWF4KG1fbWF4R2x5cGhCb3VuZGluZ0JveFksIGdseXBoQm91bmRz
Lm1heFkoKSk7Ci0gICAgICAgIG1fZ2x5cGhPcmlnaW4ubW92ZShhZHZhbmNlICsgb2Zmc2V0WCwg
LW9mZnNldFkpOwotCi0gICAgICAgIC8vIE11dGF0ZSB0aGUgZ2x5cGggYXJyYXkgdG8gY29udGFp
biBvdXIgYWx0ZXJlZCBhZHZhbmNlcy4KLSAgICAgICAgaWYgKG1fY29tcHV0aW5nT2Zmc2V0UG9z
aXRpb24pCi0gICAgICAgICAgICBhZHZhbmNlc1trXSA9IGFkdmFuY2U7Ci0gICAgfQotCi0gICAg
d2hpbGUgKG1fY29tcHV0aW5nT2Zmc2V0UG9zaXRpb24gJiYgbV9vZmZzZXRYID49IGxlZnRFZGdl
ICYmIG1fb2Zmc2V0WCA8IG1fcnVuV2lkdGhTb0ZhcikgewotICAgICAgICAvLyBUaGUgcG9zaXRp
b24gaXMgc29tZXdoZXJlIGluc2lkZSB0aGlzIHJ1bi4KLSAgICAgICAgaW50IHRyYWlsaW5nID0g
MDsKLSAgICAgICAgSFJFU1VMVCByYyA9IDo6U2NyaXB0WHRvQ1AobV9vZmZzZXRYIC0gbGVmdEVk
Z2UsIGNsdXN0ZXJzLnNpemUoKSwgZ2x5cGhzLnNpemUoKSwgY2x1c3RlcnMuZGF0YSgpLCB2aXN1
YWxBdHRyaWJ1dGVzLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXMuZGF0YSgp
LCAmaXRlbS5hLCAmbV9vZmZzZXRQb3NpdGlvbiwgJnRyYWlsaW5nKTsKLSAgICAgICAgaWYgKEZB
SUxFRChyYykpIHsKLSAgICAgICAgICAgIFdURkxvZ0Fsd2F5cygiVW5pc2NyaWJlQ29udHJvbGxl
cjo6c2hhcGVBbmRQbGFjZUl0ZW06IFNjcmlwdFh0b0NQIGZhaWxlZCByYz0lbHgiLCByYyk7Ci0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodHJhaWxpbmcg
JiYgbV9pbmNsdWRlUGFydGlhbEdseXBocyAmJiBtX29mZnNldFBvc2l0aW9uIDwgbGVuIC0gMSkg
ewotICAgICAgICAgICAgbV9vZmZzZXRQb3NpdGlvbiArPSBtX2N1cnJlbnRDaGFyYWN0ZXIgKyBt
X2l0ZW1zW2ldLmlDaGFyUG9zOwotICAgICAgICAgICAgbV9vZmZzZXRYICs9IG1fcnVuLnJ0bCgp
ID8gLXRyYWlsaW5nIDogdHJhaWxpbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBt
X2NvbXB1dGluZ09mZnNldFBvc2l0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICBtX29mZnNldFBv
c2l0aW9uICs9IG1fY3VycmVudENoYXJhY3RlciArIG1faXRlbXNbaV0uaUNoYXJQb3M7Ci0gICAg
ICAgICAgICBpZiAodHJhaWxpbmcgJiYgbV9pbmNsdWRlUGFydGlhbEdseXBocykKLSAgICAgICAg
ICAgICAgIG1fb2Zmc2V0UG9zaXRpb24rKzsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVuaXNjcmliZUNv
bnRyb2xsZXI6OnNoYXBlKGNvbnN0IFVDaGFyKiBzdHIsIGludCBsZW4sIFNDUklQVF9JVEVNIGl0
ZW0sIGNvbnN0IEZvbnQqIGZvbnREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBWZWN0b3I8V09SRD4mIGdseXBocywgVmVjdG9yPFdPUkQ+JiBjbHVzdGVycywKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFNDUklQVF9WSVNBVFRSPiYgdmlzdWFsQXR0
cmlidXRlcykKLXsKLSAgICBIV25kREMgaGRjOwotICAgIEhGT05UIG9sZEZvbnQgPSAwOwotICAg
IEhSRVNVTFQgc2hhcGVSZXN1bHQgPSBFX1BFTkRJTkc7Ci0gICAgaW50IGdseXBoQ291bnQgPSAw
OwotCi0gICAgaWYgKCFmb250RGF0YSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZG8g
ewotICAgICAgICBzaGFwZVJlc3VsdCA9IFNjcmlwdFNoYXBlKGhkYywgZm9udERhdGEtPnNjcmlw
dENhY2hlKCksIHN0ciwgbGVuLCBnbHlwaHMuc2l6ZSgpLCAmaXRlbS5hLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGdseXBocy5kYXRhKCksIGNsdXN0ZXJzLmRhdGEoKSwgdmlz
dWFsQXR0cmlidXRlcy5kYXRhKCksICZnbHlwaENvdW50KTsKLSAgICAgICAgaWYgKHNoYXBlUmVz
dWx0ID09IEVfUEVORElORykgewotICAgICAgICAgICAgLy8gVGhlIHNjcmlwdCBjYWNoZSBpc24n
dCBwcmltZWQgd2l0aCBlbm91Z2ggaW5mbyB5ZXQuICBXZSBuZWVkIHRvIHNlbGVjdCBvdXIgSEZP
TlQgaW50bwotICAgICAgICAgICAgLy8gYSBEQyBhbmQgcGFzcyB0aGUgREMgaW4gdG8gU2NyaXB0
U2hhcGUuCi0gICAgICAgICAgICBBU1NFUlQoIWhkYyk7Ci0gICAgICAgICAgICBoZGMuc2V0SFdu
ZCgwKTsKLSAgICAgICAgICAgIEhGT05UIGhmb250ID0gZm9udERhdGEtPnBsYXRmb3JtRGF0YSgp
Lmhmb250KCk7Ci0gICAgICAgICAgICBvbGRGb250ID0gKEhGT05UKVNlbGVjdE9iamVjdChoZGMs
IGhmb250KTsKLSAgICAgICAgfSBlbHNlIGlmIChzaGFwZVJlc3VsdCA9PSBFX09VVE9GTUVNT1JZ
KSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIHJlc2l6ZSBvdXIgYnVmZmVycy4KLSAgICAgICAg
ICAgIGdseXBocy5yZXNpemUoZ2x5cGhzLnNpemUoKSAqIDIpOwotICAgICAgICAgICAgdmlzdWFs
QXR0cmlidXRlcy5yZXNpemUoZ2x5cGhzLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxl
IChzaGFwZVJlc3VsdCA9PSBFX1BFTkRJTkcgfHwgc2hhcGVSZXN1bHQgPT0gRV9PVVRPRk1FTU9S
WSk7Ci0KLSAgICBpZiAoaGRjKQotICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsK
LQotICAgIGlmIChGQUlMRUQoc2hhcGVSZXN1bHQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBnbHlwaHMuc2hyaW5rKGdseXBoQ291bnQpOwotICAgIHZpc3VhbEF0dHJpYnV0ZXMuc2hy
aW5rKGdseXBoQ291bnQpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9VbmlzY3JpYmVDb250cm9sbGVy
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vVW5pc2NyaWJlQ29udHJv
bGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGMxNjhmYzZhNmFmZDc2MGZh
Yzg0ZWU5ZmIyYzc0YzQ1YzIzOWU5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9VbmlzY3Jp
YmVDb250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBVbmlzY3JpYmVDb250cm9sbGVyX2gKLSNkZWZp
bmUgVW5pc2NyaWJlQ29udHJvbGxlcl9oCi0KLSNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgotI2lu
Y2x1ZGUgIkdseXBoQnVmZmVyLmgiCi0jaW5jbHVkZSA8dXNwMTAuaD4KLSNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotY2xhc3MgVW5pc2NyaWJlQ29udHJv
bGxlciB7Ci1wdWJsaWM6Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlcihjb25zdCBGb250Q2FzY2Fk
ZSosIGNvbnN0IFRleHRSdW4mLCBIYXNoU2V0PGNvbnN0IEZvbnQqPiogZmFsbGJhY2tGb250cyA9
IDApOwotCi0gICAgLy8gQWR2YW5jZSBhbmQgbWVhc3VyZS9wbGFjZSB1cCB0byB0aGUgc3BlY2lm
aWVkIGNoYXJhY3Rlci4KLSAgICB2b2lkIGFkdmFuY2UodW5zaWduZWQgdG8sIEdseXBoQnVmZmVy
KiA9IDApOwotCi0gICAgLy8gQ29tcHV0ZSB0aGUgY2hhcmFjdGVyIG9mZnNldCBmb3IgYSBnaXZl
biB4IGNvb3JkaW5hdGUuCi0gICAgaW50IG9mZnNldEZvclBvc2l0aW9uKGludCB4LCBib29sIGlu
Y2x1ZGVQYXJ0aWFsR2x5cGhzKTsKLQotICAgIC8vIFJldHVybnMgdGhlIHdpZHRoIG9mIGV2ZXJ5
dGhpbmcgd2UndmUgY29uc3VtZWQgc28gZmFyLgotICAgIGZsb2F0IHJ1bldpZHRoU29GYXIoKSBj
b25zdCB7IHJldHVybiBtX3J1bldpZHRoU29GYXI7IH0KLQotICAgIGZsb2F0IG1pbkdseXBoQm91
bmRpbmdCb3hYKCkgY29uc3QgeyByZXR1cm4gbV9taW5HbHlwaEJvdW5kaW5nQm94WDsgfQotICAg
IGZsb2F0IG1heEdseXBoQm91bmRpbmdCb3hYKCkgY29uc3QgeyByZXR1cm4gbV9tYXhHbHlwaEJv
dW5kaW5nQm94WDsgfQotICAgIGZsb2F0IG1pbkdseXBoQm91bmRpbmdCb3hZKCkgY29uc3QgeyBy
ZXR1cm4gbV9taW5HbHlwaEJvdW5kaW5nQm94WTsgfQotICAgIGZsb2F0IG1heEdseXBoQm91bmRp
bmdCb3hZKCkgY29uc3QgeyByZXR1cm4gbV9tYXhHbHlwaEJvdW5kaW5nQm94WTsgfQotCi1wcml2
YXRlOiAgICAKLSAgICB2b2lkIHJlc2V0Q29udHJvbEFuZFN0YXRlKCk7Ci0KLSAgICB2b2lkIGl0
ZW1pemVTaGFwZUFuZFBsYWNlKGNvbnN0IFVDaGFyKiwgdW5zaWduZWQgbGVuZ3RoLCBjb25zdCBG
b250KiwgR2x5cGhCdWZmZXIqKTsKLSAgICBib29sIHNoYXBlQW5kUGxhY2VJdGVtKGNvbnN0IFVD
aGFyKiwgdW5zaWduZWQgaW5kZXgsIGNvbnN0IEZvbnQqLCBHbHlwaEJ1ZmZlciopOwotICAgIGJv
b2wgc2hhcGUoY29uc3QgVUNoYXIqIHN0ciwgaW50IGxlbiwgU0NSSVBUX0lURU0sIGNvbnN0IEZv
bnQqLAotICAgICAgICAgICAgICAgVmVjdG9yPFdPUkQ+JiBnbHlwaHMsIFZlY3RvcjxXT1JEPiYg
Y2x1c3RlcnMsCi0gICAgICAgICAgICAgICBWZWN0b3I8U0NSSVBUX1ZJU0FUVFI+JiB2aXN1YWxB
dHRyaWJ1dGVzKTsKLQotICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBtX2ZvbnQ7Ci0gICAgY29uc3Qg
VGV4dFJ1biYgbV9ydW47Ci0gICAgSGFzaFNldDxjb25zdCBGb250Kj4qIG1fZmFsbGJhY2tGb250
czsKLSAgICBGbG9hdFBvaW50IG1fZ2x5cGhPcmlnaW47Ci0gICAgZmxvYXQgbV9taW5HbHlwaEJv
dW5kaW5nQm94WDsKLSAgICBmbG9hdCBtX21heEdseXBoQm91bmRpbmdCb3hYOwotICAgIGZsb2F0
IG1fbWluR2x5cGhCb3VuZGluZ0JveFk7Ci0gICAgZmxvYXQgbV9tYXhHbHlwaEJvdW5kaW5nQm94
WTsKLQotICAgIFNDUklQVF9DT05UUk9MIG1fY29udHJvbDsKLSAgICBTQ1JJUFRfU1RBVEUgbV9z
dGF0ZTsKLSAgICBWZWN0b3I8U0NSSVBUX0lURU0+IG1faXRlbXM7Ci0gCi0gICAgdW5zaWduZWQg
bV9jdXJyZW50Q2hhcmFjdGVyOwotICAgIGludCBtX2VuZDsKLQotICAgIGZsb2F0IG1fcnVuV2lk
dGhTb0ZhcjsKLSAgICBmbG9hdCBtX3BhZGRpbmc7Ci0gICAgZmxvYXQgbV9wYWRQZXJTcGFjZTsK
LQotICAgIGJvb2wgbV9jb21wdXRpbmdPZmZzZXRQb3NpdGlvbjsKLSAgICBib29sIG1faW5jbHVk
ZVBhcnRpYWxHbHlwaHM7Ci0gICAgZmxvYXQgbV9vZmZzZXRYOwotICAgIGludCBtX29mZnNldFBv
c2l0aW9uOwotfTsKLQotfQotI2VuZGlmCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>