From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Cecilio Pardo Newsgroups: gmane.emacs.bugs Subject: bug#73730: 31.0.50; Support for color fonts on MS-Windows Date: Wed, 16 Oct 2024 00:18:20 +0200 Message-ID: <0a0c622c-5b69-4f30-94b1-67a238e124b4@imayhem.com> References: <36a6b4d5-c719-44d6-957d-bcd7db5a854b@imayhem.com> <86o73s14x5.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------9JltLzaS03WOBeF5GImMdZjU" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="20749"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla Thunderbird Cc: 73730@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Oct 16 00:19:09 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1t0psi-0005GF-7m for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 16 Oct 2024 00:19:08 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1t0psO-0008Pi-CJ; Tue, 15 Oct 2024 18:18:48 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t0psL-0008Os-Qp for bug-gnu-emacs@gnu.org; Tue, 15 Oct 2024 18:18:45 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1t0psL-0007WA-IM for bug-gnu-emacs@gnu.org; Tue, 15 Oct 2024 18:18:45 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=In-Reply-To:From:References:MIME-Version:Date:To:Subject; bh=VrjMLwKdl/HCprgORFAhR2E2X0Bn0tuY5og3YkkhV+k=; b=Etn4X238E83XVvJTdyjJ2EYRIGe9OBekwTuUd0anFhvwcfg8xCYk+zamJX4QKdcnSIUg57W294mMy/RpxJXaJ+0svB724AeG2R5sPIYx1WFEFsKh5NT2zIR/fsEY2CdPhaiHDPIGysLR8SZeeSDQLpm3+rPsb7vI+ScaZfrSu60ncI3BbNbn3BGeHiLKLaZKst4rrcK/YdMY5kuoKYAronbdu+YQU0HzlLeHppy6roMcZ3hO6dggAcosVavPGa6i90DIze4kDactEz4UQia+ILJzkNWRSgyXa70ThLpbz6MaMnl2WU2m8aY61qulJEvV36GOuiDXou+oBblt/tEprg==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1t0psc-0007HX-Bk for bug-gnu-emacs@gnu.org; Tue, 15 Oct 2024 18:19:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Cecilio Pardo Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 15 Oct 2024 22:19:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 73730 X-GNU-PR-Package: emacs Original-Received: via spool by 73730-submit@debbugs.gnu.org id=B73730.172903073127956 (code B ref 73730); Tue, 15 Oct 2024 22:19:02 +0000 Original-Received: (at 73730) by debbugs.gnu.org; 15 Oct 2024 22:18:51 +0000 Original-Received: from localhost ([127.0.0.1]:57753 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t0psP-0007Gm-AS for submit@debbugs.gnu.org; Tue, 15 Oct 2024 18:18:51 -0400 Original-Received: from mail.imayhem.com ([82.223.54.191]:46375 helo=zealous-pike.82-223-54-191.plesk.page) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1t0psL-0007GH-G2 for 73730@debbugs.gnu.org; Tue, 15 Oct 2024 18:18:47 -0400 Original-Received: from [192.168.68.105] (111.red-88-21-7.staticip.rima-tde.net [88.21.7.111]) by zealous-pike.82-223-54-191.plesk.page (Postfix) with ESMTPSA id C94EB801FC; Tue, 15 Oct 2024 22:18:20 +0000 (UTC) Authentication-Results: zealous-pike.82-223-54-191.plesk.page; spf=pass (sender IP is 88.21.7.111) smtp.mailfrom=cpardo@imayhem.com smtp.helo=[192.168.68.105] Received-SPF: pass (zealous-pike.82-223-54-191.plesk.page: connection is authenticated) Content-Language: es-ES In-Reply-To: <86o73s14x5.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:293648 Archived-At: This is a multi-part message in MIME format. --------------9JltLzaS03WOBeF5GImMdZjU Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit The attached patch works without a new font driver. This requires the harfbuzz font backend to be available. It works by modifying the harfbuzz backend to use DirectWrite at some points, if it is available: - When encoding characters: w32hb_encode_char - When measuring text: w32font_text_extents - When drawing text: w32font_draw DirectWrite is setup by calling w32_initialize_direct_write. From that point, the function w32_use_direct_write will return true if DirectWrite is to be used. The lisp variable w32-inhibit-direct-write can switches it on and off. It builds with Mingw64 and Mingw. As mingw doesn't have the DirectWrite includes, I had to declare a lot of things at the start of the file. This line marks the end of that: /* End of dwrite_3.h definitions. */ I have tested this only on Windows 11. --------------9JltLzaS03WOBeF5GImMdZjU Content-Type: text/plain; charset=UTF-8; name="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.patch" Content-Disposition: attachment; filename*0="0001-Implement-drawing-text-with-DirectWrite-on-MS-Window.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2MDhmODE0MjE1NTNiMDg3Y2E3ZWI4MjJjMTRiNmQ4ODk3ODc3MTliIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDZWNpbGlvIFBhcmRvIDxjcGFyZG9AaW1heWhlbS5j b20+CkRhdGU6IFdlZCwgOSBPY3QgMjAyNCAxMTo0MDoyOCArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEltcGxlbWVudCBkcmF3aW5nIHRleHQgd2l0aCBEaXJlY3RXcml0ZSBvbiBNUy1XaW5k b3dzLgoKVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGNvbG9yIGZvbnRzLgoKKiBjb25maWd1cmUu YWM6IEFkZCBzcmMvdzMyZHJpdGUgdG8gVzMyX09CSgoqIHNyYy93MzJkd3JpdGUuYzogVGhp cyBpcyBhIG5ldyBmaWxlLgoodzMyLWluaXRpYWxpemUtZGlyZWN0LXdyaXRlKTogSW5pdGlh bGl6ZXMgdGhlIERpcmVjdFdyaXRlIGxpYnJhcnkgaWYKaXQgaXMgYXZhaWxhYmxlLCBhbmQg cmVxdWlyZWQgZ2xvYmFsIHZhcmlhYmxlcy4KKHczMl91c2VfZGlyZWN0X3dyaXRlKTogQWxs b3dzIHRvIGNoZWNrIGlmIERpcmVjdFdyaXRlIGlzIGF2YWlsYWJsZQphbmQgYWN0aXZhdGVk IGJ5IHRoZSB1c2VyLgoodzMyX2R3cml0ZV9lbmNvZGVfY2hhcik6IFJlcGxhY2VtZW50IGZv ciBoYXJmYnV6eidzIGVuY29kZV9jaGFyLgoodzMyX2R3cml0ZV90ZXh0X2V4dGVudHMpOiBS ZXBsYWNlbWVudCBmb3IgdzMyZm9udCB0ZXh0X2V4dGVudHMuCih3MzJfZHdyaXRlX2RyYXcp OiBSZXBsYWNlbWVudCBmb3IgdzMyZm9udCBkcmF3LgoodzMyX2R3cml0ZV9mcmVlX2NhY2hl ZF9mYWNlKTogVXNlZCBvbiB0aGUgZm9udCBkZWxldGlvbiBwcm9jZXNzIHRvCmFsc28gZGVs ZXRlIERpcmVjdFdyaXRlIGRhdGEuCih2ZXJpZnlfaHIpOiBWZXJpZnkgQ09NIG1ldGhvZCBy ZXN1bHRzLgoqIHNyYy93MzJmb250LmM6Cih3MzJmb250X3RleHRfZXh0ZW50cyk6IElmIERp cmVjdFdyaXRlIGlzIGVuYWJsZWQsIGNhbGwKdzMyX2R3cml0ZV90ZXh0X2V4dGVudHMuCih3 MzJmb250X2RyYXcpOiBJZiBEaXJlY3RXcml0ZSBpcyBlbmFibGVkLCBjYWxsIHczMl9kd3Jp dGVfZHJhdy4KKiBzcmMvdzMydW5pc2NyaWJlLmM6Cih3MzJoYl9lbmNvZGVfY2hhcik6IElm IERpcmVjdFdyaXRlIGlzIGVuYWJsZWQsIGNhbGwKdzMyX2R3cml0ZV9lbmNvZGVfY2hhci4K KHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9wZHVtcGVyKTogSW5pdGlhbGl6ZSBEaXJlY3RX cml0ZS4KKHVuaXNjcmliZV9jbG9zZSk6IEZyZWUgRGlyZWN0V3JpdGUgZGF0YSBmb3IgdGhl IGZvbnQuCi0tLQogY29uZmlndXJlLmFjICAgICAgIHwgICAyICstCiBzcmMvdzMyZHdyaXRl LmMgICAgfCA5MzAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCiBzcmMvdzMyZm9udC5jICAgICAgfCAgNTMgKystCiBzcmMvdzMydW5pc2NyaWJlLmMg fCAgMzkgKysKIDQgZmlsZXMgY2hhbmdlZCwgMTAxMCBpbnNlcnRpb25zKCspLCAxNCBkZWxl dGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdzMyZHdyaXRlLmMKCmRpZmYgLS1n aXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggOGE1YmE3ZGIzZDEuLmJh OWNkOGYwY2Q1IDEwMDY0NAotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFj CkBAIC0zMTcyLDcgKzMxNzIsNyBAQCBBQ19ERUZVTgogICBBQ19DSEVDS19UT09MKFtXSU5E UkVTXSwgW3dpbmRyZXNdLAogICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW05vIHJl c291cmNlIGNvbXBpbGVyIGZvdW5kLl0pXSkKICAgVzMyX09CSj0idzMyZm5zLm8gdzMybWVu dS5vIHczMnJlZy5vIHczMmZvbnQubyB3MzJ0ZXJtLm8iCi0gIFczMl9PQko9IiRXMzJfT0JK IHczMnhmbnMubyB3MzJzZWxlY3QubyB3MzJ1bmlzY3JpYmUubyB3MzJjeWd3aW54Lm8iCisg IFczMl9PQko9IiRXMzJfT0JKIHczMnhmbnMubyB3MzJzZWxlY3QubyB3MzJ1bmlzY3JpYmUu byB3MzJkd3JpdGUubyB3MzJjeWd3aW54Lm8iCiAgIEVNQUNTUkVTPSJlbWFjcy5yZXMiCiAg IGNhc2UgIiRjYW5vbmljYWwiIGluCiAgICAgeDg2XzY0LSotKikgRU1BQ1NfTUFOSUZFU1Q9 ImVtYWNzLXg2NC5tYW5pZmVzdCIgOzsKZGlmZiAtLWdpdCBhL3NyYy93MzJkd3JpdGUuYyBi L3NyYy93MzJkd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uY2RiNjFkZDcxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdzMyZHdyaXRlLmMKQEAg LTAsMCArMSw5MzAgQEAKKy8qIFN1cHBvcnQgZm9yIHVzaW5nIERpcmVjdFdyaXRlIG9uIE1T LVdpbmRvd3MgdG8gZHJhdyB0ZXh0LiBUaGlzIGFsbG93cworICAgZm9yIGNvbG9yIGZvbnRz LgorICAgQ29weXJpZ2h0IChDKSAyMDI0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCisKK0dOVSBFbWFjcyBpcyBm cmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Citp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZl cnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Cit5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisKK0dOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3 aXRoIEdOVSBFbWFjcy4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uICAqLworCisvKgorICBUaGlzIHJlcXVpcmVzIHRoZSBoYXJmYnV6eiBmb250IGJh Y2tlbmQgdG8gYmUgYXZhaWxhYmxlLgorCisgIEl0IHdvcmtzIGJ5IG1vZGlmeWluZyB0aGUg aGFyZmJ1enogYmFja2VuZCB0byB1c2UgRGlyZWN0V3JpdGUgYXQKKyAgc29tZSBwb2ludHMs IGlmIGl0IGlzIGF2YWlsYWJsZToKKworICAtIFdoZW4gZW5jb2RpbmcgY2hhcmFjdGVyczog dzMyaGJfZW5jb2RlX2NoYXIKKyAgLSBXaGVuIG1lYXN1cmluZyB0ZXh0OiB3MzJmb250X3Rl eHRfZXh0ZW50cworICAtIFdoZW4gZHJhd2luZyB0ZXh0OiB3MzJmb250X2RyYXcKKworICBE aXJlY3RXcml0ZSBpcyBzZXR1cCBieSBjYWxsaW5nIHczMl9pbml0aWFsaXplX2RpcmVjdF93 cml0ZS4gIEZyb20KKyAgdGhhdCBwb2ludCwgdGhlIGZ1bmN0aW9uIHczMl91c2VfZGlyZWN0 X3dyaXRlIHdpbGwgcmV0dXJuIHRydWUgaWYKKyAgRGlyZWN0V3JpdGUgaXMgdG8gYmUgdXNl ZC4gICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNp bmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgIncz MmZvbnQuaCIKKyNpbmNsdWRlICJ3MzJjb21tb24uaCIKKyNpbmNsdWRlICJ3MzJ0ZXJtLmgi CisKKyNpbmNsdWRlICJpbml0Z3VpZC5oIgorI2luY2x1ZGUgPG9sZTIuaD4KKyNpbmNsdWRl IDx1bmtud24uaD4KKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB3b3VsZCBiZSBp bmNsdWRlZCBmcm9tIGR3cml0ZV8zLmgsIGJ1dCBpdAorICAgaXMgbm90IGF2YWlsYWJsZSB3 aGVuIGJ1aWxkaW5nIHdpdGggTWluR1cuICBNZXRob2RzIHRoYXQgd2UgZG9uJ3QgdXNlCisg ICBhcmUgZGVjbGFyZWQgd2l0aCB0aGUgVU5VU0VEIG1hY3JvLCB0byBhdm9pZCBicmluZ2lu ZyBpbiBtb3JlIHR5cGVzCisgICB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZGVjbGFyZWQuCisq LworCisjZGVmaW5lIFVOVVNFRChuYW1lKSB2b2lkIChTVERNRVRIT0RDQUxMVFlQRSAqbmFt ZSkodm9pZCkKKworI2RlZmluZSBEV1JJVEVfRV9OT0NPTE9SIF9IUkVTVUxUX1RZUEVERUZf KDB4ODg5ODUwMENMKQorCit0eXBlZGVmIGVudW0gRFdSSVRFX1BJWEVMX0dFT01FVFJZIHsK KyAgICBEV1JJVEVfUElYRUxfR0VPTUVUUllfRkxBVCA9IDAsCisgICAgRFdSSVRFX1BJWEVM X0dFT01FVFJZX1JHQiA9IDEsCisgICAgRFdSSVRFX1BJWEVMX0dFT01FVFJZX0JHUiA9IDIK K30gRFdSSVRFX1BJWEVMX0dFT01FVFJZOworCit0eXBlZGVmIGVudW0gRFdSSVRFX1JFTkRF UklOR19NT0RFIHsKKyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfREVGQVVMVCA9IDAsCisg ICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX0FMSUFTRUQgPSAxLAorICAgIERXUklURV9SRU5E RVJJTkdfTU9ERV9HRElfQ0xBU1NJQyA9IDIsCisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RF X0dESV9OQVRVUkFMID0gMywKKyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfTkFUVVJBTCA9 IDQsCisgICAgRFdSSVRFX1JFTkRFUklOR19NT0RFX05BVFVSQUxfU1lNTUVUUklDID0gNSwK KyAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfT1VUTElORSA9IDYKK30gRFdSSVRFX1JFTkRF UklOR19NT0RFOworCit0eXBlZGVmIGVudW0gRFdSSVRFX01FQVNVUklOR19NT0RFIHsKKyAg ICBEV1JJVEVfTUVBU1VSSU5HX01PREVfTkFUVVJBTCA9IDAsCisgICAgRFdSSVRFX01FQVNV UklOR19NT0RFX0dESV9DTEFTU0lDID0gMSwKKyAgICBEV1JJVEVfTUVBU1VSSU5HX01PREVf R0RJX05BVFVSQUwgPSAyCit9IERXUklURV9NRUFTVVJJTkdfTU9ERTsKKwordHlwZWRlZiBl bnVtIERXUklURV9URVhUX0FOVElBTElBU19NT0RFIHsKKyAgICBEV1JJVEVfVEVYVF9BTlRJ QUxJQVNfTU9ERV9DTEVBUlRZUEUgPSAwLAorICAgIERXUklURV9URVhUX0FOVElBTElBU19N T0RFX0dSQVlTQ0FMRSA9IDEKK30gRFdSSVRFX1RFWFRfQU5USUFMSUFTX01PREU7CisKK3R5 cGVkZWYgZW51bSBEV1JJVEVfRkFDVE9SWV9UWVBFIHsKKyAgICBEV1JJVEVfRkFDVE9SWV9U WVBFX1NIQVJFRCA9IDAsCisgICAgRFdSSVRFX0ZBQ1RPUllfVFlQRV9JU09MQVRFRCA9IDEK K30gRFdSSVRFX0ZBQ1RPUllfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgRFdSSVRFX0ZPTlRf TUVUUklDUyB7CisgICAgVUlOVDE2IGRlc2lnblVuaXRzUGVyRW07CisgICAgVUlOVDE2IGFz Y2VudDsKKyAgICBVSU5UMTYgZGVzY2VudDsKKyAgICBJTlQxNiBsaW5lR2FwOworICAgIFVJ TlQxNiBjYXBIZWlnaHQ7CisgICAgVUlOVDE2IHhIZWlnaHQ7CisgICAgSU5UMTYgdW5kZXJs aW5lUG9zaXRpb247CisgICAgVUlOVDE2IHVuZGVybGluZVRoaWNrbmVzczsKKyAgICBJTlQx NiBzdHJpa2V0aHJvdWdoUG9zaXRpb247CisgICAgVUlOVDE2IHN0cmlrZXRocm91Z2hUaGlj a25lc3M7Cit9IERXUklURV9GT05UX01FVFJJQ1M7CisKK3R5cGVkZWYgc3RydWN0IERXUklU RV9HTFlQSF9NRVRSSUNTIHsKKyAgICBJTlQzMiBsZWZ0U2lkZUJlYXJpbmc7CisgICAgVUlO VDMyIGFkdmFuY2VXaWR0aDsKKyAgICBJTlQzMiByaWdodFNpZGVCZWFyaW5nOworICAgIElO VDMyIHRvcFNpZGVCZWFyaW5nOworICAgIFVJTlQzMiBhZHZhbmNlSGVpZ2h0OworICAgIElO VDMyIGJvdHRvbVNpZGVCZWFyaW5nOworICAgIElOVDMyIHZlcnRpY2FsT3JpZ2luWTsKK30g RFdSSVRFX0dMWVBIX01FVFJJQ1M7CisKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVSZW5k ZXJpbmdQYXJhbXMgSURXcml0ZVJlbmRlcmluZ1BhcmFtczsKK3R5cGVkZWYgaW50ZXJmYWNl IElEV3JpdGVGb250IElEV3JpdGVGb250OwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUdk aUludGVyb3AgSURXcml0ZUdkaUludGVyb3A7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRl RmFjdG9yeSBJRFdyaXRlRmFjdG9yeTsKK3R5cGVkZWYgaW50ZXJmYWNlIElEV3JpdGVGYWN0 b3J5MiBJRFdyaXRlRmFjdG9yeTI7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlRm9udEZh Y2UgSURXcml0ZUZvbnRGYWNlOwordHlwZWRlZiBpbnRlcmZhY2UgSURXcml0ZUJpdG1hcFJl bmRlclRhcmdldCBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0OwordHlwZWRlZiBpbnRlcmZh Y2UgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdl dDE7Cit0eXBlZGVmIGludGVyZmFjZSBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3Ig SURXcml0ZUNvbG9yR2x5cGhSdW5FbnVtZXJhdG9yOworCitERUZJTkVfR1VJRChJSURfSURX cml0ZUJpdG1hcFJlbmRlclRhcmdldDEsIDB4NzkxZTgyOTgsIDB4M2VmMywgMHg0MjMwLCAw eDk4LDB4ODAsIDB4YzksMHhiZCwweGVjLDB4YzQsMHgyMCwweDY0KTsKK0RFRklORV9HVUlE KElJRF9JRFdyaXRlRmFjdG9yeTIsIDB4MDQzOWZjNjAsIDB4Y2E0NCwgMHg0OTk0LCAweDhk LDB4ZWUsIDB4M2EsMHg5YSwweGY3LDB4YjcsMHgzMiwweGVjKTsKK0RFRklORV9HVUlEKElJ RF9JRFdyaXRlRmFjdG9yeSwgMHhiODU5ZWU1YSwgMHhkODM4LCAweDRiNWIsIDB4YTIsMHhl OCwgMHgxYSwweGRjLDB4N2QsMHg5MywweGRiLDB4NDgpOworCit0eXBlZGVmIHN0cnVjdCBE V1JJVEVfR0xZUEhfT0ZGU0VUIHsKKyAgICBGTE9BVCBhZHZhbmNlT2Zmc2V0OworICAgIEZM T0FUIGFzY2VuZGVyT2Zmc2V0OworfSBEV1JJVEVfR0xZUEhfT0ZGU0VUOworCit0eXBlZGVm IHN0cnVjdCBEV1JJVEVfR0xZUEhfUlVOIHsKKyAgICBJRFdyaXRlRm9udEZhY2UgKmZvbnRG YWNlOworICAgIEZMT0FUIGZvbnRFbVNpemU7CisgICAgVUlOVDMyIGdseXBoQ291bnQ7Cisg ICAgY29uc3QgVUlOVDE2ICpnbHlwaEluZGljZXM7CisgICAgY29uc3QgRkxPQVQgKmdseXBo QWR2YW5jZXM7CisgICAgY29uc3QgRFdSSVRFX0dMWVBIX09GRlNFVCAqZ2x5cGhPZmZzZXRz OworICAgIFdJTkJPT0wgaXNTaWRld2F5czsKKyAgICBVSU5UMzIgYmlkaUxldmVsOworfSAg RFdSSVRFX0dMWVBIX1JVTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0QzRENPTE9SVkFMVUUgewor ICBmbG9hdCByOworICBmbG9hdCBnOworICBmbG9hdCBiOworICBmbG9hdCBhOworfSBEM0RD T0xPUlZBTFVFOworCit0eXBlZGVmIEQzRENPTE9SVkFMVUUgRFdSSVRFX0NPTE9SX0Y7CisK K3R5cGVkZWYgc3RydWN0IERXUklURV9DT0xPUl9HTFlQSF9SVU4geworICAgIERXUklURV9H TFlQSF9SVU4gZ2x5cGhSdW47CisgICAgdm9pZCAqZ2x5cGhSdW5EZXNjcmlwdGlvbjsKKyAg ICBGTE9BVCBiYXNlbGluZU9yaWdpblg7CisgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5ZOwor ICAgIERXUklURV9DT0xPUl9GIHJ1bkNvbG9yOworICAgIFVJTlQxNiBwYWxldHRlSW5kZXg7 Cit9IERXUklURV9DT0xPUl9HTFlQSF9SVU47CisKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0 ZUZvbnRGYWNlVnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1F VEhPRENBTExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUZvbnRGYWNlICpU aGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7CisgIFVMT05HIChTVERNRVRI T0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRm9udEZhY2UgKlRoaXMpOworICBVTE9ORyAo U1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVGb250RmFjZSAqVGhpcyk7CisK KyAgVU5VU0VEKEdldFR5cGUpOworICBVTlVTRUQoR2V0RmlsZXMpOworICBVTlVTRUQoR2V0 SW5kZXgpOworICBVTlVTRUQoR2V0U2ltdWxhdGlvbnMpOworICBVTlVTRUQoSXNTeW1ib2xG b250KTsKKworICB2b2lkIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0TWV0cmljcykKKyAgICAo SURXcml0ZUZvbnRGYWNlICpUaGlzLCBEV1JJVEVfRk9OVF9NRVRSSUNTICptZXRyaWNzKTsK KworICBVTlVTRUQgKEdldEdseXBoQ291bnQpOworICBVTlVTRUQgKEdldERlc2lnbkdseXBo TWV0cmljcyk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldEdseXBoSW5k aWNlcykKKyAgICAoSURXcml0ZUZvbnRGYWNlICpUaGlzLCBjb25zdCBVSU5UMzIgKmNvZGVw b2ludHMsIFVJTlQzMiBjb3VudCwKKyAgICAgVUlOVDE2ICpnbHlwaF9pbmRpY2VzKTsKKwor ICBVTlVTRUQgKFRyeUdldEZvbnRUYWJsZSk7CisgIFVOVVNFRCAoUmVsZWFzZUZvbnRUYWJs ZSk7CisgIFVOVVNFRCAoR2V0R2x5cGhSdW5PdXRsaW5lKTsKKyAgVU5VU0VEIChHZXRSZWNv bW1lbmRlZFJlbmRlcmluZ01vZGUpOworICBVTlVTRUQgKEdldEdkaUNvbXBhdGlibGVNZXRy aWNzKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0R2RpQ29tcGF0aWJs ZUdseXBoTWV0cmljcykKKyAgICAoSURXcml0ZUZvbnRGYWNlICpUaGlzLAorICAgICBGTE9B VCBlbVNpemUsCisgICAgIEZMT0FUIHBpeGVsc19wZXJfZGlwLAorICAgICB2b2lkICp0cmFu c2Zvcm0sCisgICAgIFdJTkJPT0wgdXNlX2dkaV9uYXR1cmFsLAorICAgICBjb25zdCBVSU5U MTYgKmdseXBoX2luZGljZXMsCisgICAgIFVJTlQzMiBnbHlwaF9jb3VudCwKKyAgICAgRFdS SVRFX0dMWVBIX01FVFJJQ1MgKm1ldHJpY3MsCisgICAgIFdJTkJPT0wgaXNfc2lkZXdheXMp OworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGb250RmFjZVZ0Ymw7CisKK2ludGVyZmFj ZSBJRFdyaXRlRm9udEZhY2UgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUZvbnRGYWNlVnRi bCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZVJlbmRlcmluZ1BhcmFt c1Z0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxM VFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRo aXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhP RENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBV TE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVSZW5kZXJpbmdQYXJh bXMgKlRoaXMpOworCisgIEZMT0FUIChTVERNRVRIT0RDQUxMVFlQRSAqR2V0R2FtbWEpCisg ICAgKElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKlRoaXMpOworICBGTE9BVCAoU1RETUVUSE9E Q0FMTFRZUEUgKkdldEVuaGFuY2VkQ29udHJhc3QpCisgICAgKElEV3JpdGVSZW5kZXJpbmdQ YXJhbXMgKlRoaXMpOworICBGTE9BVCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldENsZWFyVHlw ZUxldmVsKQorICAgIChJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpUaGlzKTsKKyAgaW50IChT VERNRVRIT0RDQUxMVFlQRSAqR2V0UGl4ZWxHZW9tZXRyeSkKKyAgICAoSURXcml0ZVJlbmRl cmluZ1BhcmFtcyAqVGhpcyk7CisgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZVJlbmRlcmlu Z1BhcmFtc1Z0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zIHsKKyAg ICBDT05TVF9WVEJMIElEV3JpdGVSZW5kZXJpbmdQYXJhbXNWdGJsKiBscFZ0Ymw7Cit9Owor Cit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlRm9udFZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UK KworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAg KElEV3JpdGVGb250ICpUaGlzLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdk9iamVjdCk7Cisg IFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqQWRkUmVmKShJRFdyaXRlRm9udCAqVGhpcyk7 CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUZvbnQgKlRo aXMpOworCisgIFVOVVNFRCAoR2V0Rm9udEZhbWlseSk7CisgIFVOVVNFRCAoR2V0V2VpZ2h0 KTsKKyAgVU5VU0VEIChHZXRTdHJldGNoKTsKKyAgVU5VU0VEIChHZXRTdHlsZSk7CisgIFVO VVNFRCAoSXNTeW1ib2xGb250KTsKKyAgVU5VU0VEIChHZXRGYWNlTmFtZXMpOworICBVTlVT RUQgKEdldEluZm9ybWF0aW9uYWxTdHJpbmdzKTsKKyAgVU5VU0VEIChHZXRTaW11bGF0aW9u cyk7CisKKyAgdm9pZCAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldE1ldHJpY3MpCisgICAgKElE V3JpdGVGb250ICpUaGlzLCBEV1JJVEVfRk9OVF9NRVRSSUNTICptZXRyaWNzKTsKKworICBV TlVTRUQoSGFzQ2hhcmFjdGVyKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAq Q3JlYXRlRm9udEZhY2UpCisgICAgKElEV3JpdGVGb250ICpUaGlzLCBJRFdyaXRlRm9udEZh Y2UgKipmYWNlKTsKKworICBFTkRfSU5URVJGQUNFCit9IElEV3JpdGVGb250VnRibDsKKwor aW50ZXJmYWNlIElEV3JpdGVGb250IHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVGb250VnRi bCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUJpdG1hcFJlbmRlclRh cmdldFZ0YmwgeworICBCRUdJTl9JTlRFUkZBQ0UKKworICBIUkVTVUxUIChTVERNRVRIT0RD QUxMVFlQRSAqUXVlcnlJbnRlcmZhY2UpCisgICAgKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNU RE1FVEhPRENBTExUWVBFICpBZGRSZWYpKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRo aXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQgKlRoaXMpOworCisgIEhSRVNVTFQgKFNURE1FVEhPRENBTExUWVBF ICpEcmF3R2x5cGhSdW4pCisgICAgKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKlRoaXMs CisgICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWCwKKyAgICAgRkxPQVQgYmFzZWxpbmVPcmln aW5ZLAorICAgICBEV1JJVEVfTUVBU1VSSU5HX01PREUgbWVhc3VyaW5nX21vZGUsCisgICAg IGNvbnN0IERXUklURV9HTFlQSF9SVU4gKmdseXBoX3J1biwKKyAgICAgSURXcml0ZVJlbmRl cmluZ1BhcmFtcyAqcGFyYW1zLAorICAgICBDT0xPUlJFRiB0ZXh0Q29sb3IsCisgICAgIFJF Q1QgKmJsYWNrYm94X3JlY3QpOworCisgIEhEQyAoU1RETUVUSE9EQ0FMTFRZUEUgKkdldE1l bW9yeURDKShJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0ICpUaGlzKTsKKworICBVTlVTRUQg KEdldFBpeGVsc1BlckRpcCk7CisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlNl dFBpeGVsc1BlckRpcCkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqVGhpcywg RkxPQVQgcGl4ZWxzX3Blcl9kaXApOworCisgIFVOVVNFRCAoR2V0Q3VycmVudFRyYW5zZm9y bSk7CisgIFVOVVNFRCAoU2V0Q3VycmVudFRyYW5zZm9ybSk7CisgIFVOVVNFRCAoR2V0U2l6 ZSk7CisgIFVOVVNFRCAoUmVzaXplKTsKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlQml0 bWFwUmVuZGVyVGFyZ2V0VnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVCaXRtYXBSZW5kZXJU YXJnZXQgeworICAgIENPTlNUX1ZUQkwgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldFZ0Ymwq IGxwVnRibDsKK307CisKK3R5cGVkZWYgc3RydWN0IElEV3JpdGVCaXRtYXBSZW5kZXJUYXJn ZXQxVnRibCB7CisgIEJFR0lOX0lOVEVSRkFDRQorCisgIEhSRVNVTFQgKFNURE1FVEhPRENB TExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAoSURXcml0ZUJpdG1hcFJlbmRlclRhcmdl dDEgKlRoaXMsIFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNU RE1FVEhPRENBTExUWVBFICpBZGRSZWYpIChJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0MSAq VGhpcyk7CisgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkgKElEV3JpdGVC aXRtYXBSZW5kZXJUYXJnZXQxICpUaGlzKTsKKworICBVTlVTRUQgKERyYXdHbHlwaFJ1bik7 CisgIFVOVVNFRCAoR2V0TWVtb3J5REMpOworICBVTlVTRUQgKEdldFBpeGVsc1BlckRpcCk7 CisgIFVOVVNFRCAoU2V0UGl4ZWxzUGVyRGlwKTsKKyAgVU5VU0VEIChHZXRDdXJyZW50VHJh bnNmb3JtKTsKKyAgVU5VU0VEIChTZXRDdXJyZW50VHJhbnNmb3JtKTsKKyAgVU5VU0VEIChH ZXRTaXplKTsKKyAgVU5VU0VEIChSZXNpemUpOworICBVTlVTRUQgKEdldFRleHRBbnRpYWxp YXNNb2RlKTsKKworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqU2V0VGV4dEFudGlh bGlhc01vZGUpCisgICAgKElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxICpUaGlzLCBEV1JJ VEVfVEVYVF9BTlRJQUxJQVNfTU9ERSBtb2RlKTsKKworICBFTkRfSU5URVJGQUNFCit9IElE V3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQxIHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVCaXRtYXBSZW5kZXJU YXJnZXQxVnRibCogbHBWdGJsOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUdkaUlu dGVyb3BWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVUSE9E Q0FMTFRZUEUgKlF1ZXJ5SW50ZXJmYWNlKQorICAgIChJRFdyaXRlR2RpSW50ZXJvcCAqVGhp cywgUkVGSUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICBVTE9ORyAoU1RETUVUSE9E Q0FMTFRZUEUgKkFkZFJlZikoSURXcml0ZUdkaUludGVyb3AgKlRoaXMpOworICBVTE9ORyAo U1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2UpKElEV3JpdGVHZGlJbnRlcm9wICpUaGlzKTsK KworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqQ3JlYXRlRm9udEZyb21MT0dGT05U KQorICAgIChJRFdyaXRlR2RpSW50ZXJvcCAqVGhpcywgY29uc3QgTE9HRk9OVFcgKmxvZ2Zv bnQsCisgICAgIElEV3JpdGVGb250ICoqZm9udCk7CisKKyAgVU5VU0VEIChDb252ZXJ0Rm9u dFRvTE9HRk9OVCk7CisgIFVOVVNFRCAoQ29udmVydEZvbnRGYWNlVG9MT0dGT05UKTsKKyAg VU5VU0VEIChDcmVhdGVGb250RmFjZUZyb21IZGMpOworCisgIEhSRVNVTFQgKFNURE1FVEhP RENBTExUWVBFICpDcmVhdGVCaXRtYXBSZW5kZXJUYXJnZXQpCisgICAgKElEV3JpdGVHZGlJ bnRlcm9wICpUaGlzLCBIREMgaGRjLCBVSU5UMzIgd2lkdGgsIFVJTlQzMiBoZWlnaHQsCisg ICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQgKip0YXJnZXQpOworICBFTkRfSU5URVJG QUNFCit9IElEV3JpdGVHZGlJbnRlcm9wVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVHZGlJ bnRlcm9wIHsKKyAgICBDT05TVF9WVEJMIElEV3JpdGVHZGlJbnRlcm9wVnRibCogbHBWdGJs OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSURXcml0ZUZhY3RvcnlWdGJsIHsKKyAgQkVHSU5f SU5URVJGQUNFCisKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJm YWNlKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhpcywgUkVGSUlEIHJpaWQsIHZvaWQgKipw cHZPYmplY3QpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKkFkZFJlZikoSURXcml0 ZUZhY3RvcnkgKlRoaXMpOworICBVTE9ORyAoU1RETUVUSE9EQ0FMTFRZUEUgKlJlbGVhc2Up KElEV3JpdGVGYWN0b3J5ICpUaGlzKTsKKworICBVTlVTRUQgKEdldFN5c3RlbUZvbnRDb2xs ZWN0aW9uKTsKKyAgVU5VU0VEIChDcmVhdGVDdXN0b21Gb250Q29sbGVjdGlvbik7CisgIFVO VVNFRCAoUmVnaXN0ZXJGb250Q29sbGVjdGlvbkxvYWRlcik7CisgIFVOVVNFRCAoVW5yZWdp c3RlckZvbnRDb2xsZWN0aW9uTG9hZGVyKTsKKyAgVU5VU0VEIChDcmVhdGVGb250RmlsZVJl ZmVyZW5jZSk7CisgIFVOVVNFRCAoQ3JlYXRlQ3VzdG9tRm9udEZpbGVSZWZlcmVuY2UpOwor ICBVTlVTRUQgKENyZWF0ZUZvbnRGYWNlKTsKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZ UEUgKkNyZWF0ZVJlbmRlcmluZ1BhcmFtcykKKyAgICAoSURXcml0ZUZhY3RvcnkgKlRoaXMs IElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKipwYXJhbXMpOworICBVTlVTRUQgKENyZWF0ZU1v bml0b3JSZW5kZXJpbmdQYXJhbXMpOworICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAq Q3JlYXRlQ3VzdG9tUmVuZGVyaW5nUGFyYW1zKQorICAgIChJRFdyaXRlRmFjdG9yeSAqVGhp cywgRkxPQVQgZ2FtbWEsIEZMT0FUIGVuaGFuY2VkQ29udHJhc3QsCisgICAgIEZMT0FUIGNs ZWFydHlwZV9sZXZlbCwgRFdSSVRFX1BJWEVMX0dFT01FVFJZIGdlb21ldHJ5LAorICAgICBE V1JJVEVfUkVOREVSSU5HX01PREUgbW9kZSwgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyAqKnBh cmFtcyk7CisgIFVOVVNFRCAoUmVnaXN0ZXJGb250RmlsZUxvYWRlcik7CisgIFVOVVNFRCAo VW5yZWdpc3RlckZvbnRGaWxlTG9hZGVyKTsKKyAgVU5VU0VEIChDcmVhdGVUZXh0Rm9ybWF0 KTsKKyAgVU5VU0VEIChDcmVhdGVUeXBvZ3JhcGh5KTsKKyAgSFJFU1VMVCAoU1RETUVUSE9E Q0FMTFRZUEUgKkdldEdkaUludGVyb3ApCisgICAgKElEV3JpdGVGYWN0b3J5ICpUaGlzLCBJ RFdyaXRlR2RpSW50ZXJvcCAqKmdkaV9pbnRlcm9wKTsKKyAgVU5VU0VEIChDcmVhdGVUZXh0 TGF5b3V0KTsKKyAgVU5VU0VEIChDcmVhdGVHZGlDb21wYXRpYmxlVGV4dExheW91dCk7Cisg IFVOVVNFRCAoQ3JlYXRlRWxsaXBzaXNUcmltbWluZ1NpZ24pOworICBVTlVTRUQgKENyZWF0 ZVRleHRBbmFseXplcik7CisgIFVOVVNFRCAoQ3JlYXRlTnVtYmVyU3Vic3RpdHV0aW9uKTsK KyAgVU5VU0VEIChDcmVhdGVHbHlwaFJ1bkFuYWx5c2lzKTsKKyAgRU5EX0lOVEVSRkFDRQor fSBJRFdyaXRlRmFjdG9yeVZ0Ymw7CisKK2ludGVyZmFjZSBJRFdyaXRlRmFjdG9yeSB7IENP TlNUX1ZUQkwgSURXcml0ZUZhY3RvcnlWdGJsKiBscFZ0Ymw7IH07CisKK3R5cGVkZWYgc3Ry dWN0IElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvclZ0YmwgeworICAgIEJFR0lOX0lO VEVSRkFDRQorCisgICAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlF1ZXJ5SW50ZXJm YWNlKQorICAgICAgKElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqVGhpcywgUkVG SUlEIHJpaWQsIHZvaWQgKipwcHZPYmplY3QpOworICAgIFVMT05HIChTVERNRVRIT0RDQUxM VFlQRSAqQWRkUmVmKShJRFdyaXRlQ29sb3JHbHlwaFJ1bkVudW1lcmF0b3IgKlRoaXMpOwor ICAgIFVMT05HIChTVERNRVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUNvbG9yR2x5 cGhSdW5FbnVtZXJhdG9yICpUaGlzKTsKKworICAgIEhSRVNVTFQgKFNURE1FVEhPRENBTExU WVBFICpNb3ZlTmV4dCkoCisgICAgICAgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRv ciAqVGhpcywKKyAgICAgICAgV0lOQk9PTCAqaGFzUnVuKTsKKworICAgIEhSRVNVTFQgKFNU RE1FVEhPRENBTExUWVBFICpHZXRDdXJyZW50UnVuKSgKKyAgICAgICAgSURXcml0ZUNvbG9y R2x5cGhSdW5FbnVtZXJhdG9yICpUaGlzLAorICAgICAgICBjb25zdCBEV1JJVEVfQ09MT1Jf R0xZUEhfUlVOICoqcnVuKTsKKworICAgIEVORF9JTlRFUkZBQ0UKK30gSURXcml0ZUNvbG9y R2x5cGhSdW5FbnVtZXJhdG9yVnRibDsKKworaW50ZXJmYWNlIElEV3JpdGVDb2xvckdseXBo UnVuRW51bWVyYXRvciB7CisgICAgQ09OU1RfVlRCTCBJRFdyaXRlQ29sb3JHbHlwaFJ1bkVu dW1lcmF0b3JWdGJsKiBscFZ0Ymw7Cit9OworCit0eXBlZGVmIHN0cnVjdCBJRFdyaXRlRmFj dG9yeTJWdGJsIHsKKyAgQkVHSU5fSU5URVJGQUNFCisgIEhSRVNVTFQgKFNURE1FVEhPRENB TExUWVBFICpRdWVyeUludGVyZmFjZSkKKyAgICAgIChJRFdyaXRlRmFjdG9yeTIgKlRoaXMs IFJFRklJRCByaWlkLCB2b2lkICoqcHB2T2JqZWN0KTsKKyAgVUxPTkcgKFNURE1FVEhPRENB TExUWVBFICpBZGRSZWYpKElEV3JpdGVGYWN0b3J5MiAqVGhpcyk7CisgIFVMT05HIChTVERN RVRIT0RDQUxMVFlQRSAqUmVsZWFzZSkoSURXcml0ZUZhY3RvcnkyICpUaGlzKTsKKyAgVU5V U0VEIChHZXRTeXN0ZW1Gb250Q29sbGVjdGlvbik7CisgIFVOVVNFRCAoQ3JlYXRlQ3VzdG9t Rm9udENvbGxlY3Rpb24pOworICBVTlVTRUQgKFJlZ2lzdGVyRm9udENvbGxlY3Rpb25Mb2Fk ZXIpOworICBVTlVTRUQgKFVucmVnaXN0ZXJGb250Q29sbGVjdGlvbkxvYWRlcik7CisgIFVO VVNFRCAoQ3JlYXRlRm9udEZpbGVSZWZlcmVuY2UpOworICBVTlVTRUQgKENyZWF0ZUN1c3Rv bUZvbnRGaWxlUmVmZXJlbmNlKTsKKyAgVU5VU0VEIChDcmVhdGVGb250RmFjZSk7CisgIFVO VVNFRCAoQ3JlYXRlUmVuZGVyaW5nUGFyYW1zKTsKKyAgVU5VU0VEIChDcmVhdGVNb25pdG9y UmVuZGVyaW5nUGFyYW1zKTsKKyAgVU5VU0VEIChDcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJh bXMpOworICBVTlVTRUQgKFJlZ2lzdGVyRm9udEZpbGVMb2FkZXIpOworICBVTlVTRUQgKFVu cmVnaXN0ZXJGb250RmlsZUxvYWRlcik7CisgIFVOVVNFRCAoQ3JlYXRlVGV4dEZvcm1hdCk7 CisgIFVOVVNFRCAoQ3JlYXRlVHlwb2dyYXBoeSk7CisgIFVOVVNFRCAoR2V0R2RpSW50ZXJv cCk7CisgIFVOVVNFRCAoQ3JlYXRlVGV4dExheW91dCk7CisgIFVOVVNFRCAoQ3JlYXRlR2Rp Q29tcGF0aWJsZVRleHRMYXlvdXQpOworICBVTlVTRUQgKENyZWF0ZUVsbGlwc2lzVHJpbW1p bmdTaWduKTsKKyAgVU5VU0VEIChDcmVhdGVUZXh0QW5hbHl6ZXIpOworICBVTlVTRUQgKENy ZWF0ZU51bWJlclN1YnN0aXR1dGlvbik7CisgIFVOVVNFRCAoQ3JlYXRlR2x5cGhSdW5BbmFs eXNpcyk7CisKKyAgVU5VU0VEIChHZXRFdWRjRm9udENvbGxlY3Rpb24pOworICBVTlVTRUQg KElEV3JpdGVGYWN0b3J5MV9DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMpOworCisgIFVO VVNFRCAoR2V0U3lzdGVtRm9udEZhbGxiYWNrKTsKKyAgVU5VU0VEIChDcmVhdGVGb250RmFs bGJhY2tCdWlsZGVyKTsKKyAgSFJFU1VMVCAoU1RETUVUSE9EQ0FMTFRZUEUgKlRyYW5zbGF0 ZUNvbG9yR2x5cGhSdW4pCisgICAgKElEV3JpdGVGYWN0b3J5MiAqVGhpcywKKyAgICAgRkxP QVQgb3JpZ2luWCwKKyAgICAgRkxPQVQgb3JpZ2luWSwKKyAgICAgY29uc3QgRFdSSVRFX0dM WVBIX1JVTiAqcnVuLAorICAgICB2b2lkICpydW5kZXNjciwKKyAgICAgRFdSSVRFX01FQVNV UklOR19NT0RFIG1vZGUsCisgICAgIHZvaWQgKnRyYW5zZm9ybSwKKyAgICAgVUlOVDMyIHBh bGV0dGVfaW5kZXgsCisgICAgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqKmNv bG9ybGF5ZXJzKTsKKworICBVTlVTRUQgKElEV3JpdGVGYWN0b3J5Ml9DcmVhdGVDdXN0b21S ZW5kZXJpbmdQYXJhbXMpOworICBVTlVTRUQgKElEV3JpdGVGYWN0b3J5Ml9DcmVhdGVHbHlw aFJ1bkFuYWx5c2lzKTsKKyAgRU5EX0lOVEVSRkFDRQorfSBJRFdyaXRlRmFjdG9yeTJWdGJs OworCitpbnRlcmZhY2UgSURXcml0ZUZhY3RvcnkyIHsKKyAgICBDT05TVF9WVEJMIElEV3Jp dGVGYWN0b3J5MlZ0YmwqIGxwVnRibDsKK307CisKKy8qIEVuZCBvZiBkd3JpdGVfMy5oIGRl ZmluaXRpb25zLiAgKi8KKworLyogVmFsdWVzIHRvIHVzZSBmb3IgRGlyZWN0V3JpdGUgcmVu ZGVyaW5nLiAgKi8KKyNkZWZpbmUgTUVBU1VSSU5HX01PREUgRFdSSVRFX01FQVNVUklOR19N T0RFX05BVFVSQUwKKyNkZWZpbmUgUkVOREVSSU5HX01PREUgRFdSSVRFX1JFTkRFUklOR19N T0RFX05BVFVSQUxfU1lNTUVUUklDCisjZGVmaW5lIEFOVElBTElBU19NT0RFIERXUklURV9U RVhUX0FOVElBTElBU19NT0RFX0NMRUFSVFlQRQorCisjZGVmaW5lIFJFTEVBU0VfQ09NKGkp IChpKS0+bHBWdGJsLT5SZWxlYXNlIChpKQorCisvKiBHbG9iYWwgdmFyaWFibGVzIGZvciBE aXJlY3RXcml0ZS4gICovCitzdGF0aWMgYm9vbCBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlID0g ZmFsc2U7CitzdGF0aWMgSURXcml0ZUZhY3RvcnkgKmR3cml0ZV9mYWN0b3J5Oworc3RhdGlj IElEV3JpdGVGYWN0b3J5MiAqZHdyaXRlX2ZhY3RvcnkyOworc3RhdGljIElEV3JpdGVHZGlJ bnRlcm9wICpnZGlfaW50ZXJvcDsKK3N0YXRpYyBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zICpy ZW5kZXJpbmdfcGFyYW1zOworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzLiAgKi8KK3ZvaWQg dzMyX2luaXRpYWxpemVfZGlyZWN0X3dyaXRlICh2b2lkKTsKK2Jvb2wgdzMyX3VzZV9kaXJl Y3Rfd3JpdGUgKHN0cnVjdCB3MzJmb250X2luZm8gKnczMmZvbnQpOwordm9pZCB3MzJfZHdy aXRlX2RyYXcgKEhEQyBoZGMsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgKmdseXBocywgaW50 IGxlbiwKKwkJICAgICAgQ09MT1JSRUYgY29sb3IsIHN0cnVjdCBmb250ICpmb250ICk7Cit2 b2lkIHczMl9kd3JpdGVfdGV4dF9leHRlbnRzIChzdHJ1Y3QgZm9udCAqZm9udCwgY29uc3Qg dW5zaWduZWQgKmNvZGUsCisJCQkgICAgICBpbnQgbmdseXBocywgc3RydWN0IGZvbnRfbWV0 cmljcyAqbWV0cmljcyk7Cit1bnNpZ25lZCB3MzJfZHdyaXRlX2VuY29kZV9jaGFyIChzdHJ1 Y3QgZm9udCAqZm9udCwgaW50IGMpOwordm9pZCB3MzJfZHdyaXRlX2ZyZWVfY2FjaGVkX2Zh Y2Uodm9pZCAqY2FjaGUpOworCisvKiBUaGlzIHR3byBmdW5jdGlvbnMgYXJlIG9uIHczMnVu aW5zY3JpYmUuYyAgKi8KK3ZvaWQgKnczMl9mb250X2dldF9kd3JpdGVfY2FjaGUgKHN0cnVj dCBmb250ICpmb250LCBmbG9hdCAqZm9udF9zaXplKTsKK3ZvaWQgdzMyX2ZvbnRfc2V0X2R3 cml0ZV9jYWNoZSAoc3RydWN0IGZvbnQgKmZvbnQsIHZvaWQgKmNhY2hlLAorCQkJCWZsb2F0 IGZvbnRfc2l6ZSk7CisKK3N0YXRpYyB2b2lkCit2ZXJpZnlfaHIgKEhSRVNVTFQgaHIsIGNv bnN0IGNoYXIgKm1zZykKK3sKKyAgaWYgKEZBSUxFRCAoaHIpKQorICAgIGVtYWNzX2Fib3J0 ICgpOworfQorCisvKiBHZXRzIGEgSURXcml0ZUZvbnRGYWNlIGZyb20gYSBzdHJ1Y3QgZm9u dCAoaXRzIEhGT05UKS4gUmV0dXJucyB0aGUKKyAgIGZvbnQgc2l6ZSBpbiBwb2ludHMuICBJ dCBtYXkgZmFpbCB0byBnZXQgYSBEaXJlY3RXcml0ZSBmb250LCBhbmQgZmFjZQorICAgd2ls bCBiZSBOVUxMIG9uIHJldHVybi4gIFRoaXMgaGFwcGVucyBmb3Igc29tZSBmb250cyBsaWtl IENvdXJpZXIuCisKKyAgIE5ldmVyIGNhbGwgUmVsZWFzZSBvbiB0aGUgcmVzdWx0LCBhcyBp dCBpcyBjYWNoZWQgZm9yIHJldXNlIG9uIHRoZQorICAgc3RydWN0IGZvbnQuICAqLworc3Rh dGljIGZsb2F0CitnZXRfZm9udF9mYWNlIChzdHJ1Y3QgZm9udCAqaW5mb250LCBJRFdyaXRl Rm9udEZhY2UgKipmYWNlKQoreworICBIUkVTVUxUIGhyOworICBMT0dGT05UVyBsb2dmb250 OworICBJRFdyaXRlRm9udCAqZm9udDsKKyAgZmxvYXQgZm9udF9zaXplOworCisgIC8qIENo ZWNrIHRoZSBjYWNoZS4gICovCisgICpmYWNlID0gdzMyX2ZvbnRfZ2V0X2R3cml0ZV9jYWNo ZSAoaW5mb250LCAmZm9udF9zaXplKTsKKyAgaWYgKCpmYWNlKQorICAgIHJldHVybiBmb250 X3NpemU7CisKKyAgR2V0T2JqZWN0VyAoRk9OVF9IQU5ETEUoaW5mb250KSwgc2l6ZW9mIChM T0dGT05UVyksICZsb2dmb250KTsKKworICBociA9IGdkaV9pbnRlcm9wLT5scFZ0YmwtPgor ICAgIENyZWF0ZUZvbnRGcm9tTE9HRk9OVCAoZ2RpX2ludGVyb3AsIChjb25zdCBMT0dGT05U VyAqKSAmbG9nZm9udCwgJmZvbnQpOworCisgIGlmIChGQUlMRUQgKGhyKSkKKyAgICB7Cisg ICAgICAqZmFjZSA9IE5VTEw7CisgICAgICByZXR1cm4gMC4wOworICAgIH0KKworICBociA9 IGZvbnQtPmxwVnRibC0+Q3JlYXRlRm9udEZhY2UgKGZvbnQsIGZhY2UpOworICBSRUxFQVNF X0NPTSAoZm9udCk7CisgIHZlcmlmeV9ociAoaHIsICJGYWlsZWQgdG8gY3JlYXRlIERXcml0 ZUZvbnRGYWNlIik7CisgIHczMl9mb250X3NldF9kd3JpdGVfY2FjaGUgKGluZm9udCwgKmZh Y2UsIGFicyhsb2dmb250LmxmSGVpZ2h0KSk7CisKKyAgcmV0dXJuIGFicyhsb2dmb250Lmxm SGVpZ2h0KTsKK30KKwordm9pZAordzMyX2R3cml0ZV9mcmVlX2NhY2hlZF9mYWNlKHZvaWQg KmNhY2hlKQoreworICBpZiAoY2FjaGUpCisgICAgUkVMRUFTRV9DT00gKChJRFdyaXRlRm9u dEZhY2UgKikgY2FjaGUpOworfQorCitzdGF0aWMgZmxvYXQKK2NvbnZlcnRfbWV0cmljc19z eiggaW50IHN6LCBmbG9hdCBmb250X3NpemUsIGludCB1bml0c19wZXJfZW0gKQoreworICBy ZXR1cm4gKGZsb2F0KXN6ICogZm9udF9zaXplIC8gdW5pdHNfcGVyX2VtOworfQorCisKKy8q IERvZXMgbm90IGZpbGwgaW4gdGhlIGFzY2VudCBhbmQgZGVzY2VudCBmaWVsZHMgb2YgbWV0 cmljcy4gICovCitzdGF0aWMgdm9pZAordGV4dF9leHRlbnRzX2ludGVybmFsIChJRFdyaXRl Rm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2UsCisJCSAgICAgICBmbG9hdCBmb250X3NpemUs IGNvbnN0IHVuc2lnbmVkICpjb2RlLAorCQkgICAgICAgaW50IG5nbHlwaHMsIHN0cnVjdCBm b250X21ldHJpY3MgKm1ldHJpY3MpCit7CisgIEhSRVNVTFQgaHI7CisKKyAgRFdSSVRFX0ZP TlRfTUVUUklDUyBkd3JpdGVfZm9udF9tZXRyaWNzOworICBkd3JpdGVfZm9udF9mYWNlLT5s cFZ0YmwtPgorICAgIEdldE1ldHJpY3MgKGR3cml0ZV9mb250X2ZhY2UsICZkd3JpdGVfZm9u dF9tZXRyaWNzKTsKKworICBVSU5UMTYgKmluZGljZXMgPSBhbGxvY2EgKG5nbHlwaHMgKiBz aXplb2YgKFVJTlQxNikpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5nbHlwaHM7IGkrKykK KyAgICBpbmRpY2VzW2ldID0gY29kZVtpXTsKKworICBEV1JJVEVfR0xZUEhfTUVUUklDUyog Z21ldHJpY3MgPQorICAgIGFsbG9jYSAobmdseXBocyAqIHNpemVvZiAoRFdSSVRFX0dMWVBI X01FVFJJQ1MpKTsKKworICBociA9IGR3cml0ZV9mb250X2ZhY2UtPmxwVnRibC0+CisgICAg R2V0R2RpQ29tcGF0aWJsZUdseXBoTWV0cmljcyAoZHdyaXRlX2ZvbnRfZmFjZSwKKwkJCQkg IGZvbnRfc2l6ZSwKKwkJCQkgIDEuMCwKKwkJCQkgIE5VTEwsCisJCQkJICBUUlVFLAorCQkJ CSAgaW5kaWNlcywKKwkJCQkgIG5nbHlwaHMsCisJCQkJICBnbWV0cmljcywKKwkJCQkgIGZh bHNlKTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBHZXRHZGlDb21wYXRpYmxlR2x5 cGhNZXRyaWNzIik7CisKKyAgZmxvYXQgd2lkdGggPSAwOworICBpbnQgZHVfcGVyX2VtID0g ZHdyaXRlX2ZvbnRfbWV0cmljcy5kZXNpZ25Vbml0c1BlckVtOworCisgIGZvciAoaW50IGkg PSAwOyBpIDwgbmdseXBoczsgaSsrKQorICAgIHsKKyAgICAgIGZsb2F0IGFkdmFuY2UgPQor CWNvbnZlcnRfbWV0cmljc19zeiAoZ21ldHJpY3NbaV0uYWR2YW5jZVdpZHRoLCBmb250X3Np emUsIGR1X3Blcl9lbSk7CisKKyAgICAgIHdpZHRoICs9IGFkdmFuY2U7CisKKyAgICAgIGZs b2F0IGxiZWFyaW5nID0KKwlyb3VuZCAoY29udmVydF9tZXRyaWNzX3N6IChnbWV0cmljc1tp XS5sZWZ0U2lkZUJlYXJpbmcsIGZvbnRfc2l6ZSwKKwkJCQkgICBkdV9wZXJfZW0pKTsKKyAg ICAgIGZsb2F0IHJiZWFyaW5nID0KKwlyb3VuZCAoYWR2YW5jZSAtCisJICAgICAgIGNvbnZl cnRfbWV0cmljc19zeiAoZ21ldHJpY3NbaV0ucmlnaHRTaWRlQmVhcmluZywKKwkJCQkgICBm b250X3NpemUsIGR1X3Blcl9lbSkpOworICAgICAgaWYgKGkgPT0gMCkKKwl7CisJICBtZXRy aWNzLT5sYmVhcmluZyA9IGxiZWFyaW5nOworCSAgbWV0cmljcy0+cmJlYXJpbmcgPSByYmVh cmluZzsKKwl9CisgICAgICBpZiAobWV0cmljcy0+bGJlYXJpbmcgPiBsYmVhcmluZykKKwlt ZXRyaWNzLT5sYmVhcmluZyA9IGxiZWFyaW5nOworICAgICAgaWYgKG1ldHJpY3MtPnJiZWFy aW5nIDwgcmJlYXJpbmcpCisJbWV0cmljcy0+cmJlYXJpbmcgPSByYmVhcmluZzsKKyAgICB9 CisgIG1ldHJpY3MtPndpZHRoID0gcm91bmQod2lkdGgpOworfQorCit1bnNpZ25lZAordzMy X2R3cml0ZV9lbmNvZGVfY2hhciAoc3RydWN0IGZvbnQgKmZvbnQsIGludCBjKQoreworICBI UkVTVUxUIGhyOworICBJRFdyaXRlRm9udEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisgIFVJ TlQxNiBpbmRleDsKKworICBnZXRfZm9udF9mYWNlIChmb250LCAmZHdyaXRlX2ZvbnRfZmFj ZSk7CisgIGhyID0gZHdyaXRlX2ZvbnRfZmFjZS0+bHBWdGJsLT4KKyAgICBHZXRHbHlwaElu ZGljZXMgKGR3cml0ZV9mb250X2ZhY2UsICZjLCAxLCAmaW5kZXgpOworICB2ZXJpZnlfaHIg KGhyLCAiRmFpbGVkIHRvIEdldEdseXBoSW5kaWNlcyIpOworCisgIGlmIChpbmRleCA9PSAw KQorICAgIHJldHVybiBGT05UX0lOVkFMSURfQ09ERTsKKworICByZXR1cm4gaW5kZXg7Cit9 CisKK3ZvaWQKK3czMl9kd3JpdGVfdGV4dF9leHRlbnRzIChzdHJ1Y3QgZm9udCAqZm9udCwg Y29uc3QgdW5zaWduZWQgKmNvZGUsIGludCBuZ2x5cGhzLAorCQkJIHN0cnVjdCBmb250X21l dHJpY3MgKm1ldHJpY3MpCit7CisgIElEV3JpdGVGb250RmFjZSAqZHdyaXRlX2ZvbnRfZmFj ZTsKKworICBmbG9hdCBmb250X3NpemUgPSBnZXRfZm9udF9mYWNlIChmb250LCAmZHdyaXRl X2ZvbnRfZmFjZSk7CisKKyAgaWYgKGR3cml0ZV9mb250X2ZhY2UgPT0gTlVMTCkKKyAgICB7 CisgICAgICBtZXRyaWNzLT53aWR0aCA9IDA7CisgICAgICBtZXRyaWNzLT5sYmVhcmluZyA9 IDA7CisgICAgICBtZXRyaWNzLT5yYmVhcmluZyA9IDA7CisgICAgICByZXR1cm47CisgICAg fQorCisgIHRleHRfZXh0ZW50c19pbnRlcm5hbCAoZHdyaXRlX2ZvbnRfZmFjZSwgZm9udF9z aXplLCBjb2RlLCBuZ2x5cGhzLCBtZXRyaWNzKTsKKworICBtZXRyaWNzLT5hc2NlbnQgPSBm b250LT5hc2NlbnQ7CisgIG1ldHJpY3MtPmRlc2NlbnQgPSBmb250LT5kZXNjZW50OworfQor CisvKiBOZXZlciBjYWxsIFJlbGVhc2Ugb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMg ZnVuY3Rpb24sIGFzIGl0IGlzCisgICByZXVzZWQuICAqLworc3RhdGljIElEV3JpdGVCaXRt YXBSZW5kZXJUYXJnZXQgKgorZ2V0X2JpdG1hcF9yZW5kZXJfdGFyZ2V0IChIREMgaGRjLCBp bnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgIEhSRVNVTFQgaHI7CisgIHN0YXRpYyBJRFdy aXRlQml0bWFwUmVuZGVyVGFyZ2V0ICpicnQgPSBOVUxMOworICBzdGF0aWMgU0laRSBzaXpl ID0gezAsIDB9OworCisgIGlmIChicnQpCisgICAgeworICAgICAgLyogQ2hlY2sgaWYgd2Ug bmVlZCB0byBtYWtlIGEgYmlnZ2VyIG9uZS4gICovCisgICAgICBpZiAod2lkdGggPD0gc2l6 ZS5jeCAmJiBoZWlnaHQgPD0gc2l6ZS5jeSkKKwlyZXR1cm4gYnJ0OworICAgICAgUkVMRUFT RV9DT00gKGJydCk7CisgICAgfQorCisgIGlmICh3aWR0aCA+IHNpemUuY3gpCisgICAgc2l6 ZS5jeCA9IHdpZHRoOworICBpZiAoaGVpZ2h0ID4gc2l6ZS5jeSkKKyAgICBzaXplLmN5ID0g aGVpZ2h0OworCisgIGhyID0gZ2RpX2ludGVyb3AtPmxwVnRibC0+CisgICAgQ3JlYXRlQml0 bWFwUmVuZGVyVGFyZ2V0IChnZGlfaW50ZXJvcCwgaGRjLCBzaXplLmN4LCBzaXplLmN5LCAm YnJ0KTsKKyAgdmVyaWZ5X2hyIChociwgIkZhaWxlZCB0byBjcmVhdGUgRFdyaXRlQml0bWFw UmVuZGVyVGFyZ2V0Iik7CisKKyAgLyogV2UgaGFuZGxlIGhpZ2ggZHBpIGRpc3BsYXlzIGJ5 IGluY3Jlc2luZyBmb250IHNpemUsIHNvIG92ZXJyaWRlCisgICAgIFBpeGVsc1BlckRpcC4g ICovCisgIGJydC0+bHBWdGJsLT5TZXRQaXhlbHNQZXJEaXAgKGJydCwgMS4wKTsKKworICAv KiBUaGUgU2V0VGV4dEFudGlhbGlhc01vZGUgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGlu CisgICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQxLiAgKi8KKyAgSURXcml0ZUJpdG1h cFJlbmRlclRhcmdldDEgKmJydDE7CisgIGhyID0gYnJ0LT5scFZ0YmwtPgorICAgIFF1ZXJ5 SW50ZXJmYWNlIChicnQsICZJSURfSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldDEsICh2b2lk ICoqKSAmYnJ0MSk7CisgIGlmIChTVUNDRUVERUQgKGhyKSkKKyAgICB7CisgICAgICBicnQx LT5scFZ0YmwtPgorCVNldFRleHRBbnRpYWxpYXNNb2RlIChicnQxLCBBTlRJQUxJQVNfTU9E RSk7CisgICAgICBSRUxFQVNFX0NPTSAoYnJ0MSk7CisgICAgfQorCisgIHJldHVybiBicnQ7 Cit9CisKK3ZvaWQKK3czMl9pbml0aWFsaXplX2RpcmVjdF93cml0ZSAodm9pZCkKK3sKKyAg ZGlyZWN0X3dyaXRlX2F2YWlsYWJsZSA9IGZhbHNlOworICBITU9EVUxFIGRpcmVjdF93cml0 ZSA9IExvYWRMaWJyYXJ5ICgiZHdyaXRlLmRsbCIpOworICBpZiAoIWRpcmVjdF93cml0ZSkK KyAgICByZXR1cm47CisKKyAgLyogVGhpcyBpcyBvbmx5IHVzZWQgaGVyZSwgbm8gbmVlZCB0 byBkZWZpbmUgaXQgZ2xvYmFsbHkuICAqLworICB0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSAq Q3JlYXRlRmFjdG9yeSkgKERXUklURV9GQUNUT1JZX1RZUEUgZiwgUkVGSUlEIHIsIElVbmtu b3duKiogdSk7CisKKyAgQ3JlYXRlRmFjdG9yeSBjcmVhdGVfZmFjdG9yeQorICAgID0gKENy ZWF0ZUZhY3RvcnkpIGdldF9wcm9jX2FkZHIgKGRpcmVjdF93cml0ZSwgIkRXcml0ZUNyZWF0 ZUZhY3RvcnkiKTsKKworICBpZiAoIWNyZWF0ZV9mYWN0b3J5KQorICAgIHsKKyAgICAgIEZy ZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBI UkVTVUxUIGhyID0gY3JlYXRlX2ZhY3RvcnkgKERXUklURV9GQUNUT1JZX1RZUEVfU0hBUkVE LAorCQkJICAgICAgICZJSURfSURXcml0ZUZhY3RvcnksCisJCQkgICAgICAgKElVbmtub3du ICoqKSAmZHdyaXRlX2ZhY3RvcnkpOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAg ICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0ZSk7CisgICAgICByZXR1cm47CisgICAgfQor CisgIGhyID0gZHdyaXRlX2ZhY3RvcnktPmxwVnRibC0+CisgICAgUXVlcnlJbnRlcmZhY2Ug KGR3cml0ZV9mYWN0b3J5LCAmSUlEX0lEV3JpdGVGYWN0b3J5MiwKKwkJICAgICh2b2lkICoq KSAmZHdyaXRlX2ZhY3RvcnkyKTsKKworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAg ICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIEZyZWVMaWJyYXJ5IChk aXJlY3Rfd3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBociA9IGR3cml0ZV9m YWN0b3J5LT5scFZ0YmwtPgorICAgIEdldEdkaUludGVyb3AgKGR3cml0ZV9mYWN0b3J5LCAm Z2RpX2ludGVyb3ApOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAgICAgUkVMRUFT RV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFj dG9yeTIpOworICAgICAgRnJlZUxpYnJhcnkgKGRpcmVjdF93cml0ZSk7CisgICAgICByZXR1 cm47CisgICAgfQorCisgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMgKmRlZjsKKworICBociA9 IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPgorICAgIENyZWF0ZVJlbmRlcmluZ1BhcmFtcyAo ZHdyaXRlX2ZhY3RvcnksICZkZWYpOworICBpZiAoRkFJTEVEIChocikpCisgICAgeworICAg ICAgUkVMRUFTRV9DT00gKGR3cml0ZV9mYWN0b3J5KTsKKyAgICAgIFJFTEVBU0VfQ09NIChk d3JpdGVfZmFjdG9yeTIpOworICAgICAgUkVMRUFTRV9DT00gKGdkaV9pbnRlcm9wKTsKKyAg ICAgIEZyZWVMaWJyYXJ5IChkaXJlY3Rfd3JpdGUpOworICAgICAgcmV0dXJuOworICAgIH0K KworICAvKiByYW5nZTogWzAuMCwgMS4wXSAgKi8KKyAgZmxvYXQgZW5oYW5jZWRfY29udHJh c3QgPSBkZWYtPmxwVnRibC0+R2V0RW5oYW5jZWRDb250cmFzdChkZWYpOworICAvKiByYW5n ZTogWzAuMCwgMS4wXSAgKi8KKyAgZmxvYXQgY2xlYXJfdHlwZV9sZXZlbCA9IGRlZi0+bHBW dGJsLT5HZXRDbGVhclR5cGVMZXZlbChkZWYpOworICAvKiByYW5nZTogKDAuMCwgMjU2LjBd ICovCisgIGZsb2F0IGdhbW1hID0gMS40OyAvKiBkZWYtPmxwVnRibC0+R2V0R2FtbWEoZGVm KTsgKi8KKworICBociA9IGR3cml0ZV9mYWN0b3J5LT5scFZ0YmwtPgorICAgIENyZWF0ZUN1 c3RvbVJlbmRlcmluZ1BhcmFtcyAoZHdyaXRlX2ZhY3RvcnksCisJCQkJIGdhbW1hLAorCQkJ CSBlbmhhbmNlZF9jb250cmFzdCwKKwkJCQkgY2xlYXJfdHlwZV9sZXZlbCwKKwkJCQkgZGVm LT5scFZ0YmwtPkdldFBpeGVsR2VvbWV0cnkoZGVmKSwKKwkJCQkgUkVOREVSSU5HX01PREUs CisJCQkJICZyZW5kZXJpbmdfcGFyYW1zKTsKKyAgUkVMRUFTRV9DT00gKGRlZik7CisKKyAg aWYgKEZBSUxFRCAoaHIpKQorICAgIHsKKyAgICAgIFJFTEVBU0VfQ09NIChkd3JpdGVfZmFj dG9yeSk7CisgICAgICBSRUxFQVNFX0NPTSAoZHdyaXRlX2ZhY3RvcnkyKTsKKyAgICAgIFJF TEVBU0VfQ09NIChnZGlfaW50ZXJvcCk7CisgICAgICBGcmVlTGlicmFyeSAoZGlyZWN0X3dy aXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZGlyZWN0X3dyaXRlX2F2YWlsYWJs ZSA9IHRydWU7CisKKyAgREVGVkFSX0JPT0wgKCJ3MzItaW5oaWJpdC1kaXJlY3Qtd3JpdGUi LCB3MzJfaW5oaWJpdF9kaXJlY3Rfd3JpdGUsCisJICAgICAgIGRvYzogLyogSWYgdCwgZG9u J3QgdXNlIERpcmVjdFdyaXRlLiAgKi8pOworICB3MzJfaW5oaWJpdF9kaXJlY3Rfd3JpdGUg PSBmYWxzZTsKK30KKwordm9pZCB3MzJfZHdyaXRlX2RyYXcgKEhEQyBoZGMsIGludCB4LCBp bnQgeSwgdW5zaWduZWQgKmdseXBocywgaW50IGxlbiwKKwkJICAgICAgQ09MT1JSRUYgY29s b3IsIHN0cnVjdCBmb250ICpmb250KQoreworICBIUkVTVUxUIGhyOworICBJRFdyaXRlRm9u dEZhY2UgKmR3cml0ZV9mb250X2ZhY2U7CisKKyAgLyogV2hhdCB3ZSBnZXQgYXMgeSBpcyB0 aGUgYmFzZWxpbmUgcG9zaXRpb24uICAqLworICB5IC09IGZvbnQtPmFzY2VudDsKKworICBm bG9hdCBmb250X3NpemUgPSBnZXRfZm9udF9mYWNlIChmb250LCAmZHdyaXRlX2ZvbnRfZmFj ZSk7CisgIGlmIChkd3JpdGVfZm9udF9mYWNlID09IE5VTEwpCisgICAgcmV0dXJuOworCisg IHN0cnVjdCBmb250X21ldHJpY3MgbWV0cmljczsKKyAgdGV4dF9leHRlbnRzX2ludGVybmFs IChkd3JpdGVfZm9udF9mYWNlLCBmb250X3NpemUsIGdseXBocywgbGVuLCAmbWV0cmljcyk7 CisKKyAgaW50IGJpdG1hcF93aWR0aCA9IG1ldHJpY3Mud2lkdGggKyBtZXRyaWNzLnJiZWFy aW5nOworICBpbnQgYml0bWFwX2hlaWdodCA9IGZvbnQtPmFzY2VudCArIGZvbnQtPmRlc2Nl bnQ7CisKKyAgLyogV2UgbmV2ZXIgUmVsZWFzZSB0aGlzLCBnZXRfYml0bWFwX3JlbmRlcl90 YXJnZXQgcmV1c2VzIGl0LiAgKi8KKyAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCAqYml0 bWFwX3JlbmRlcl90YXJnZXQgPQorICAgIGdldF9iaXRtYXBfcmVuZGVyX3RhcmdldCAoaGRj LCBiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQpOworCisgIC8qIFRoaXMgREMgY2FuJ3Qg YmUgcmVsZWFzZWQuICAqLworICBIREMgdGV4dF9kYyA9IGJpdG1hcF9yZW5kZXJfdGFyZ2V0 LT5scFZ0YmwtPgorICAgIEdldE1lbW9yeURDIChiaXRtYXBfcmVuZGVyX3RhcmdldCk7CisK KyAgLyogQ29weSB0aGUgYmFja2dyb3VuZCBwaXhlbCB0byB0aGUgcmVuZGVyIHRhcmdldCBi aXRtYXAuICAqLworICBCaXRCbHQgKHRleHRfZGMsIDAsIDAsIGJpdG1hcF93aWR0aCwgYml0 bWFwX2hlaWdodCwgaGRjLCB4LCB5LCBTUkNDT1BZKTsKKworCisgIFVJTlQxNiAqaW5kaWNl cyA9IGFsbG9jYSAobGVuICogc2l6ZW9mIChVSU5UMTYpKTsKKworICBmb3IgKGludCBpID0g MDsgaSA8IGxlbjsgaSsrKQorICAgIGluZGljZXNbaV0gPSBnbHlwaHNbaV07CisKKyAgRkxP QVQgKmFkdmFuY2VzID0gYWxsb2NhIChsZW4gKiBzaXplb2YgKEZMT0FUKSk7CisKKyAgZm9y IChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICB0ZXh0X2V4dGVudHNf aW50ZXJuYWwgKGR3cml0ZV9mb250X2ZhY2UsIGZvbnRfc2l6ZSwgZ2x5cGhzICsgaSwgMSwK KwkJCSAgICAgJm1ldHJpY3MpOworICAgICAgYWR2YW5jZXNbaV0gPSBtZXRyaWNzLndpZHRo OworICAgIH0KKworICBEV1JJVEVfR0xZUEhfUlVOIGdseXBoX3J1bjsKKyAgZ2x5cGhfcnVu LmZvbnRGYWNlID0gZHdyaXRlX2ZvbnRfZmFjZTsKKyAgZ2x5cGhfcnVuLmZvbnRFbVNpemUg PSBmb250X3NpemU7CisgIGdseXBoX3J1bi5nbHlwaEluZGljZXMgPSBpbmRpY2VzOworICBn bHlwaF9ydW4uZ2x5cGhDb3VudCA9IGxlbjsKKyAgZ2x5cGhfcnVuLmlzU2lkZXdheXMgPSBm YWxzZTsKKyAgZ2x5cGhfcnVuLmJpZGlMZXZlbCA9IDA7CisgIGdseXBoX3J1bi5nbHlwaE9m ZnNldHMgPSBOVUxMOworICBnbHlwaF9ydW4uZ2x5cGhBZHZhbmNlcyA9IGFkdmFuY2VzOwor CisgIElEV3JpdGVDb2xvckdseXBoUnVuRW51bWVyYXRvciAqbGF5ZXJzOworICAvKiBUaGlz IGNhbGwgd2lsbCB0ZWxsIHVzIGlmIHdlIGhhY2UgdG8gaGFuZGxlIGFueSBjb2xvciBnbHlw aC4gICovCisgIGhyID0gZHdyaXRlX2ZhY3RvcnkyLT5scFZ0YmwtPgorICAgIFRyYW5zbGF0 ZUNvbG9yR2x5cGhSdW4gKGR3cml0ZV9mYWN0b3J5MiwKKwkJCSAgICAwLCBmb250LT5hc2Nl bnQsCisJCQkgICAgJmdseXBoX3J1biwKKwkJCSAgICBOVUxMLAorCQkJICAgIE1FQVNVUklO R19NT0RFLAorCQkJICAgIE5VTEwsCisJCQkgICAgMCwKKwkJCSAgICAmbGF5ZXJzKTsKKwor ICAvKiBObyBjb2xvci4gSnVzdCBkcmF3IHRoZSBHbHlwaFJ1bi4gICovCisgIGlmIChociA9 PSBEV1JJVEVfRV9OT0NPTE9SKQorICAgIHsKKyAgICAgIGJpdG1hcF9yZW5kZXJfdGFyZ2V0 LT5scFZ0YmwtPgorCURyYXdHbHlwaFJ1biAoYml0bWFwX3JlbmRlcl90YXJnZXQsCisJCSAg ICAgIDAsIGZvbnQtPmFzY2VudCwKKwkJICAgICAgTUVBU1VSSU5HX01PREUsCisJCSAgICAg ICZnbHlwaF9ydW4sCisJCSAgICAgIHJlbmRlcmluZ19wYXJhbXMsCisJCSAgICAgIGNvbG9y LAorCQkgICAgICBOVUxMKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0 aGVyZSB3ZXJlIGNvbG9yIGdseXBocywgbGF5ZXJzIGNvbnRhaW5zIGEgY29udGFpbnRzIGEg bGlzdAorCSBvZiBHbHlwaFJ1biB3aXRoIGEgY29sb3IgYW5kIGEgcG9zaXRpb24gZm9yIGVh Y2guICBXZSBkcmF3IHRoZW0KKwkgaW5kaXZpZHVhbGx5LiAgKi8KKyAgICAgIHZlcmlmeV9o ciAoaHIsICJGYWlsZWQgYXQgVHJhbnNsYXRlQ29sb3JHbHlwaFJ1biIpOworICAgICAgZm9y ICg7OykgeworCUhSRVNVTFQgaHI7CisJQk9PTCBtb3JlX2xheWVyczsKKwljb25zdCBEV1JJ VEVfQ09MT1JfR0xZUEhfUlVOICpsYXllcjsKKworCWhyID0gbGF5ZXJzLT5scFZ0YmwtPk1v dmVOZXh0IChsYXllcnMsICZtb3JlX2xheWVycyk7CisJdmVyaWZ5X2hyIChociwgIkZhaWxl ZCBhdCBNb3ZlTmV4dCIpOworCWlmICghbW9yZV9sYXllcnMpCisJICBicmVhazsKKwlociA9 IGxheWVycy0+bHBWdGJsLT5HZXRDdXJyZW50UnVuIChsYXllcnMsICZsYXllcik7CisJdmVy aWZ5X2hyIChociwgIkZhaWxlZCBhdCBHZXRDdXJyZW50UnVuIik7CisJYml0bWFwX3JlbmRl cl90YXJnZXQtPmxwVnRibC0+CisJICBEcmF3R2x5cGhSdW4gKGJpdG1hcF9yZW5kZXJfdGFy Z2V0LAorCQkJbGF5ZXItPmJhc2VsaW5lT3JpZ2luWCwgbGF5ZXItPmJhc2VsaW5lT3JpZ2lu WSwKKwkJCU1FQVNVUklOR19NT0RFLAorCQkJJmxheWVyLT5nbHlwaFJ1biwKKwkJCXJlbmRl cmluZ19wYXJhbXMsCisJCQlSR0IgKGxheWVyLT5ydW5Db2xvci5yICogMjU1LAorCQkJICAg ICBsYXllci0+cnVuQ29sb3IuZyAqIDI1NSwKKwkJCSAgICAgbGF5ZXItPnJ1bkNvbG9yLmIg KiAyNTUpLAorCQkJTlVMTCk7CisgICAgICB9CisgICAgICBSRUxFQVNFX0NPTSAobGF5ZXJz KTsKKyAgICB9CisKKyAgLyogRmluYWxseSwgY29weSB0aGUgcmVuZGVyZWQgdGV4dCBiYWNr IHRvIHRoZSBvcmlnaW5hbCBEQy4gICovCisgIEJpdEJsdCAoaGRjLCB4LCB5LCBiaXRtYXBf d2lkdGgsIGJpdG1hcF9oZWlnaHQsIHRleHRfZGMsIDAsIDAsIFNSQ0NPUFkpOworfQorCisv KiBSZXR1cm5zIHRydWUgaWYgRGlyZWN0V3JpdGUgaXMgdG8gYmUgdXNlZDoKKyAgIC0gSXMg aXMgYXZhaWxhYmxlLgorICAgLSBUaGUgZm9udCBpcyBoYW5kbGVkIGJ5IGhhcmZidXp6Cisg ICAtIHczMi1pbmhpYml0LWRpcmVjdC13cml0ZSBpcyBmYWxzZQorICovCitib29sCit3MzJf dXNlX2RpcmVjdF93cml0ZSAoc3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCkKK3sKKyNp ZmRlZiBIQVZFX0hBUkZCVVpaCisgIHJldHVybiBkaXJlY3Rfd3JpdGVfYXZhaWxhYmxlCisg ICAgJiYgdzMyZm9udC0+Zm9udC5kcml2ZXIgPT0gJmhhcmZidXp6X2ZvbnRfZHJpdmVyCisg ICAgJiYgIXczMl9pbmhpYml0X2RpcmVjdF93cml0ZTsKKyNlbHNlCisgIHJldHVybiBmYWxz ZTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc3JjL3czMmZvbnQuYyBiL3NyYy93MzJmb250 LmMKaW5kZXggZWZiNDJkODAzMzYuLjE2YWE5MzA4NTg0IDEwMDY0NAotLS0gYS9zcmMvdzMy Zm9udC5jCisrKyBiL3NyYy93MzJmb250LmMKQEAgLTU1LDYgKzU1LDEzIEBAICNkZWZpbmUg VklFVE5BTUVTRV9DSEFSU0VUIDE2MwogI2RlZmluZSBKT0hBQl9DSEFSU0VUIDEzMAogI2Vu ZGlmCiAKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgZnJvbSB3MzJ3cml0ZS5jICAqLworYm9v bCB3MzJfdXNlX2RpcmVjdF93cml0ZSAoc3RydWN0IHczMmZvbnRfaW5mbyAqdzMyZm9udCk7 Cit2b2lkIHczMl9kd3JpdGVfZHJhdyAoSERDIGhkYywgaW50IHgsIGludCB5LCB1bnNpZ25l ZCAqZ2x5cGhzLCBpbnQgbGVuLAorCQkgIENPTE9SUkVGIGNvbG9yLCBzdHJ1Y3QgZm9udCAq Zm9udCApOwordm9pZCB3MzJfZHdyaXRlX3RleHRfZXh0ZW50cyAoc3RydWN0IGZvbnQgKmZv bnQsIGNvbnN0IHVuc2lnbmVkICpjb2RlLAorCQkJICBpbnQgbmdseXBocywgc3RydWN0IGZv bnRfbWV0cmljcyAqbWV0cmljcyk7CisKIHN0YXRpYyB2b2lkIGZpbGxfaW5fbG9nZm9udCAo c3RydWN0IGZyYW1lICosIExPR0ZPTlQgKiwgTGlzcF9PYmplY3QpOwogCiBzdGF0aWMgQllU RSB3MzJfYW50aWFsaWFzX3R5cGUgKExpc3BfT2JqZWN0KTsKQEAgLTQ1Miw2ICs0NTksMTIg QEAgdzMyZm9udF90ZXh0X2V4dGVudHMgKHN0cnVjdCBmb250ICpmb250LCBjb25zdCB1bnNp Z25lZCAqY29kZSwKIAogICBtZW1zZXQgKG1ldHJpY3MsIDAsIHNpemVvZiAoc3RydWN0IGZv bnRfbWV0cmljcykpOwogCisgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyX2ZvbnQp KQorICAgIHsKKyAgICAgIHczMl9kd3JpdGVfdGV4dF9leHRlbnRzIChmb250LCBjb2RlLCBu Z2x5cGhzLCBtZXRyaWNzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgZm9yIChpID0g MCwgZmlyc3QgPSB0cnVlOyBpIDwgbmdseXBoczsgaSsrKQogICAgIHsKICAgICAgIHN0cnVj dCB3MzJfbWV0cmljX2NhY2hlICpjaGFyX21ldHJpYzsKQEAgLTcwNiwyMiArNzE5LDM2IEBA IHczMmZvbnRfZHJhdyAoc3RydWN0IGdseXBoX3N0cmluZyAqcywgaW50IGZyb20sIGludCB0 bywKICAgICAgIGludCBpOwogCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0J ewotCSAgV0NIQVIgYyA9IHMtPmNoYXIyYltmcm9tICsgaV0gJiAweEZGRkY7Ci0JICBFeHRU ZXh0T3V0VyAocy0+aGRjLCB4ICsgaSwgeSwgb3B0aW9ucywgTlVMTCwgJmMsIDEsIE5VTEwp OwotCX0KKwlpZiAodzMyX3VzZV9kaXJlY3Rfd3JpdGUgKHczMmZvbnQpKQorCSAgeworCSAg ICB3MzJfZHdyaXRlX2RyYXcgKHMtPmhkYywgeCwgeSwgcy0+Y2hhcjJiICsgZnJvbSwgMSwK KwkJCSBHZXRUZXh0Q29sb3Iocy0+aGRjKSwgcy0+Zm9udCk7CisJICB9CisJZWxzZQorCSAg eworCSAgICBXQ0hBUiBjID0gcy0+Y2hhcjJiW2Zyb20gKyBpXSAmIDB4RkZGRjsKKwkgICAg RXh0VGV4dE91dFcgKHMtPmhkYywgeCArIGksIHksIG9wdGlvbnMsIE5VTEwsICZjLCAxLCBO VUxMKTsKKwkgIH0KICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICAvKiBUaGUgbnVtYmVy IG9mIGdseXBocyBpbiBhIGdseXBoX3N0cmluZyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4KLQkg dGhlIG1heGltdW0gdmFsdWUgb2YgdGhlICd1c2VkJyBtZW1iZXIgb2YgYSBnbHlwaF9yb3cs IHNvIHdlCi0JIGFyZSBPSyB1c2luZyBhbGxvY2EgaGVyZS4gICovCi0gICAgICBlYXNzZXJ0 IChsZW4gPD0gU0hSVF9NQVgpOwotICAgICAgV0NIQVIgKmNoYXJzID0gYWxsb2NhIChsZW4g KiBzaXplb2YgKFdDSEFSKSk7Ci0gICAgICBpbnQgajsKLSAgICAgIGZvciAoaiA9IDA7IGog PCBsZW47IGorKykKLQljaGFyc1tqXSA9IHMtPmNoYXIyYltmcm9tICsgal0gJiAweEZGRkY7 Ci0gICAgICBFeHRUZXh0T3V0VyAocy0+aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxMLCBjaGFy cywgbGVuLCBOVUxMKTsKKyAgICAgIGlmICh3MzJfdXNlX2RpcmVjdF93cml0ZSAodzMyZm9u dCkpCisJeworCSAgdzMyX2R3cml0ZV9kcmF3ICggcy0+aGRjLCB4LCB5LAorCQkJcy0+Y2hh cjJiICsgZnJvbSwgbGVuLCBHZXRUZXh0Q29sb3Iocy0+aGRjKSwgcy0+Zm9udCApOworCX0K KyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiBhIGdseXBo X3N0cmluZyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4KKwkgICAgIHRoZSBtYXhpbXVtIHZhbHVl IG9mIHRoZSAndXNlZCcgbWVtYmVyIG9mIGEgZ2x5cGhfcm93LCBzbyB3ZQorCSAgICAgYXJl IE9LIHVzaW5nIGFsbG9jYSBoZXJlLiAgKi8KKwkgIGVhc3NlcnQgKGxlbiA8PSBTSFJUX01B WCk7CisJICBXQ0hBUiAqY2hhcnMgPSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsK KwkgIGludCBqOworCSAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQorCSAgICBjaGFyc1tq XSA9IHMtPmNoYXIyYltmcm9tICsgal0gJiAweEZGRkY7CisJICBFeHRUZXh0T3V0VyAocy0+ aGRjLCB4LCB5LCBvcHRpb25zLCBOVUxMLCBjaGFycywgbGVuLCBOVUxMKTsKKwl9CiAgICAg fQogCiAgIC8qIFJlc3RvcmUgY2xpcCByZWdpb24uICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3cz MnVuaXNjcmliZS5jIGIvc3JjL3czMnVuaXNjcmliZS5jCmluZGV4IGI3N2JmNTZiOGNmLi5h ZjA1ZDA1MDkzNiAxMDA2NDQKLS0tIGEvc3JjL3czMnVuaXNjcmliZS5jCisrKyBiL3NyYy93 MzJ1bmlzY3JpYmUuYwpAQCAtNDQsNiArNDQsMTUgQEAgI2RlZmluZSBfV0lOMzJfV0lOTlQg MHgwNjAwCiAjaW5jbHVkZSAicGR1bXBlci5oIgogI2luY2x1ZGUgInczMmNvbW1vbi5oIgog CisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gdzMyZHdyaXRlLmMgICovCitib29sIHcz Ml91c2VfZGlyZWN0X3dyaXRlIChzdHJ1Y3QgdzMyZm9udF9pbmZvICp3MzJmb250KTsKK3Vu c2lnbmVkIHczMl9kd3JpdGVfZW5jb2RlX2NoYXIgKHN0cnVjdCBmb250ICpmb250LCBpbnQg Yyk7Cit2b2lkIHczMl9kd3JpdGVfZnJlZV9jYWNoZWRfZmFjZSAodm9pZCAqY2FjaGUpOwor CisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZyb20gdGhpcyBmaWxlICAqLwordm9pZCAqdzMy X2ZvbnRfZ2V0X2R3cml0ZV9jYWNoZSAoc3RydWN0IGZvbnQgKmZvbnQsIGZsb2F0ICpmb250 X3NpemUpOwordm9pZCB3MzJfZm9udF9zZXRfZHdyaXRlX2NhY2hlIChzdHJ1Y3QgZm9udCAq Zm9udCwgdm9pZCAqY2FjaGUsIGZsb2F0IGZvbnRfc2l6ZSk7CisKIC8qIEV4dGVuc2lvbiBv ZiB3MzJmb250X2luZm8gdXNlZCBieSBVbmlzY3JpYmUgYW5kIEhhcmZCdXp6IGJhY2tlbmRz LiAgKi8KIHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvCiB7CkBAIC01NCw4ICs2MywyNSBA QCAjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDAKICAgdm9pZCAqY2FjaGU7CiAgIC8qIFRo aXMgaXMgdXNlZCBieSB0aGUgSGFyZkJ1enogYmFja2VuZCB0byBzdG9yZSB0aGUgZm9udCBz Y2FsZS4gICovCiAgIGRvdWJsZSBzY2FsZTsKKyAgLyogVGhpcyBpcyB1c2VkIGJ5IERpcmVj dFdyaXRlIHRvIHN0b3JlIHRoZSBGb250RmFjZSBvYmplY3QuCisgICAgIERpcmVjdFdyaXRl IHdvcmtzIG9uIHRvcCBvZiB0aGUgSGFyZkJ1enogYmFja2VuZCwgbW9kaWZ5aW5nIHNvbWUK KyAgICAgY2FsbHMuICAqLworICB2b2lkICpkd3JpdGVfY2FjaGU7CisgIGZsb2F0IGR3cml0 ZV9mb250X3NpemU7CiB9OwogCit2b2lkICp3MzJfZm9udF9nZXRfZHdyaXRlX2NhY2hlIChz dHJ1Y3QgZm9udCAqZm9udCwgZmxvYXQgKmZvbnRfc2l6ZSkKK3sKKyAgKmZvbnRfc2l6ZSA9 ICgoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCktPmR3cml0ZV9mb250X3Np emU7CisgIHJldHVybiAoKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQpLT5k d3JpdGVfY2FjaGU7Cit9CisKK3ZvaWQgdzMyX2ZvbnRfc2V0X2R3cml0ZV9jYWNoZSAoc3Ry dWN0IGZvbnQgKmZvbnQsIHZvaWQgKmNhY2hlLCBmbG9hdCBmb250X3NpemUpCit7CisgICgo c3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCktPmR3cml0ZV9mb250X3NpemUg PSBmb250X3NpemU7CisgICgoc3RydWN0IHVuaXNjcmliZV9mb250X2luZm8gKikgZm9udCkt PmR3cml0ZV9jYWNoZSA9IGNhY2hlOworfQorCiBpbnQgdW5pc2NyaWJlX2F2YWlsYWJsZSA9 IDA7CiAKIC8qIEVudW1Gb250RmFtaWxpZXNFeCBjYWxsYmFjay4gICovCkBAIC0yMDAsNiAr MjI2LDcgQEAgdW5pc2NyaWJlX29wZW4gKHN0cnVjdCBmcmFtZSAqZiwgTGlzcF9PYmplY3Qg Zm9udF9lbnRpdHksIGludCBwaXhlbF9zaXplKQogCiAgIC8qIEluaXRpYWxpemUgdGhlIGNh Y2hlIGZvciB0aGlzIGZvbnQuICAqLwogICB1bmlzY3JpYmVfZm9udC0+Y2FjaGUgPSBOVUxM OworICB1bmlzY3JpYmVfZm9udC0+ZHdyaXRlX2NhY2hlID0gTlVMTDsKIAogICAvKiBVbmlz Y3JpYmUgYW5kIEhhcmZCdXp6IGJhY2tlbmRzIHVzZSBnbHlwaCBpbmRpY2VzLiAgKi8KICAg dW5pc2NyaWJlX2ZvbnQtPnczMl9mb250LmdseXBoX2lkeCA9IEVUT19HTFlQSF9JTkRFWDsK QEAgLTIyMSw2ICsyNDgsNyBAQCB1bmlzY3JpYmVfY2xvc2UgKHN0cnVjdCBmb250ICpmb250 KQogICAgID0gKHN0cnVjdCB1bmlzY3JpYmVfZm9udF9pbmZvICopIGZvbnQ7CiAKICNpZmRl ZiBIQVZFX0hBUkZCVVpaCisgIHczMl9kd3JpdGVfZnJlZV9jYWNoZWRfZmFjZSAodW5pc2Ny aWJlX2ZvbnQtPmR3cml0ZV9jYWNoZSk7CiAgIGlmICh1bmlzY3JpYmVfZm9udC0+dzMyX2Zv bnQuZm9udC5kcml2ZXIgPT0gJmhhcmZidXp6X2ZvbnRfZHJpdmVyCiAgICAgICAmJiB1bmlz Y3JpYmVfZm9udC0+Y2FjaGUpCiAgICAgaGJfZm9udF9kZXN0cm95ICgoaGJfZm9udF90ICop IHVuaXNjcmliZV9mb250LT5jYWNoZSk7CkBAIC0xMzcyLDYgKzE0MDAsMTIgQEAgdzMyaGJf ZW5jb2RlX2NoYXIgKHN0cnVjdCBmb250ICpmb250LCBpbnQgYykKICAgc3RydWN0IHVuaXNj cmliZV9mb250X2luZm8gKnVuaXNjcmliZV9mb250CiAgICAgPSAoc3RydWN0IHVuaXNjcmli ZV9mb250X2luZm8gKikgZm9udDsKICAgZWFzc2VydCAodW5pc2NyaWJlX2ZvbnQtPnczMl9m b250LmZvbnQuZHJpdmVyID09ICZoYXJmYnV6el9mb250X2RyaXZlcik7CisKKyAgaWYgKHcz Ml91c2VfZGlyZWN0X3dyaXRlKCZ1bmlzY3JpYmVfZm9udC0+dzMyX2ZvbnQpKQorICAgIHsK KyAgICAgIHJldHVybiB3MzJfZHdyaXRlX2VuY29kZV9jaGFyKGZvbnQsIGMpOworICAgIH0K KwogICBoYl9mb250X3QgKmhiX2ZvbnQgPSB1bmlzY3JpYmVfZm9udC0+Y2FjaGU7CiAKICAg LyogRmlyc3QgdGltZSB3ZSB1c2UgdGhpcyBmb250IHdpdGggSGFyZkJ1enosIGNyZWF0ZSB0 aGUgaGJfZm9udF90CkBAIC0xNTMxLDYgKzE1NjUsOCBAQCBsb2FkX2hhcmZidXp6X2Z1bmNz IChITU9EVUxFIGxpYnJhcnkpCiB9CiAjZW5kaWYJLyogSEFWRV9IQVJGQlVaWiAqLwogCit2 b2lkIHczMl9pbml0aWFsaXplX2RpcmVjdF93cml0ZSAodm9pZCk7CisKIHN0YXRpYyB2b2lk CiBzeW1zX29mX3czMnVuaXNjcmliZV9mb3JfcGR1bXBlciAodm9pZCkKIHsKQEAgLTE2MjQs NSArMTY2MCw4IEBAIHN5bXNfb2ZfdzMydW5pc2NyaWJlX2Zvcl9wZHVtcGVyICh2b2lkKQog ICBoYXJmYnV6el9mb250X2RyaXZlci5jb21iaW5pbmdfY2FwYWJpbGl0eSA9IGhiZm9udF9j b21iaW5pbmdfY2FwYWJpbGl0eTsKICAgaGFyZmJ1enpfZm9udF9kcml2ZXIuYmVnaW5faGJf Zm9udCA9IHczMmhiX2JlZ2luX2ZvbnQ7CiAgIHJlZ2lzdGVyX2ZvbnRfZHJpdmVyICgmaGFy ZmJ1enpfZm9udF9kcml2ZXIsIE5VTEwpOworCisgIHczMl9pbml0aWFsaXplX2RpcmVjdF93 cml0ZSAoKTsKKwogI2VuZGlmCS8qIEhBVkVfSEFSRkJVWlogKi8KIH0KLS0gCjIuMzUuMS53 aW5kb3dzLjIKCg== --------------9JltLzaS03WOBeF5GImMdZjU--