From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 89895 invoked by alias); 16 May 2016 00:46:13 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 87515 invoked by uid 89); 16 May 2016 00:46:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=FORM, Sign, sk:people, sk:people. X-HELO: mail-qg0-f53.google.com Received: from mail-qg0-f53.google.com (HELO mail-qg0-f53.google.com) (209.85.192.53) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 16 May 2016 00:46:00 +0000 Received: by mail-qg0-f53.google.com with SMTP id f74so83160293qge.2 for ; Sun, 15 May 2016 17:46:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=vgrSG3vZXOdBL7j0cioC8Q1OPxfd9dHeQhQTFyuz3dw=; b=Z7yqdQRuDtuLJ9is8i4jEynPmhKeLGDQbsZp9MQszgt2lTaf5cGG3tIn7q7fTLAoLr vllqRV+2sGFmcJSC+31EiWqa6KD/Jrm1aZgPZzbmaLJAjXmrsEZXJtvlLGTov51Ocutv QcRguxZIVS0EA96iLeI3/pJi3S+Q1A8wRPE1/HnSEO52p9ye7DENbNDjEhsgzCj1dii4 V7CgSI0GBqJ1SIJ80Js0gYn0BU/2Srd15m0H2jojqsfHHwjN9CxCebMBbuR78X3rfZwu SnxhUzYdpg/KCNq1xTO+CdONd7mBwDNbrxIYA0tf4KiedDhiEGf1m6JqEqD3ikPdT8Q3 Pq0w== X-Gm-Message-State: AOPr4FUE6ZRP8PXzuBu+p4e3luUu8a445hVgaftLaD1RGgEIc3KT5T3bVmSnLw+H+FPsNjnKZyCd2yWfq+NxbKbF MIME-Version: 1.0 X-Received: by 10.140.163.85 with SMTP id j82mr27981258qhj.40.1463359558302; Sun, 15 May 2016 17:45:58 -0700 (PDT) Received: by 10.200.42.71 with HTTP; Sun, 15 May 2016 17:45:58 -0700 (PDT) Date: Mon, 16 May 2016 00:46:00 -0000 Message-ID: Subject: [RFC] Type promotion pass and elimination of zext/sext From: Kugan Vivekanandarajah To: Richard Biener , "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary=001a113a3a34a6f19f0532eaf2e5 X-IsSubscribed: yes X-SW-Source: 2016-05/txt/msg01074.txt.bz2 --001a113a3a34a6f19f0532eaf2e5 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-length: 2491 Hi Richard, Now that stage1 is open, I would like to get the type promotion passes reviewed again. I have tested the patches on aarch64, x86-64, and ppc64le without any new execution failures. There some test-cases that fails for patterns. I will address them after getting feedback on the basic structure. I am attaching the pass itself for the review. Other needed patches are in http://people.linaro.org/~kugan.vivekanandarajah/pass/ You reviewed some of them. But I will post again after the main pass is acceptable. They all have to go in together. Couple of changes from last time: 1. When we promote SSA as part of promote_ssa, we either promote the definition. Or create a copy stmt that is inserted after the stmt that define it. i.e, we want to promote the SSA and reflect the promotion on all the uses (we promote in place). We do this because, we don=E2=80=99t want to change all the uses. +/* Promote definition DEF to promoted type. If the stmt that defines def + is def_stmt, make the type of def promoted type. If the stmt is such + that, result of the def_stmt cannot be of promoted type, create a new_d= ef + of the original_type and make the def_stmt assign its value to newdef. + Then, create a NOP_EXPR to convert new_def to def of promoted type. + + For example, for stmt with original_type char and promoted_type int: + char _1 =3D mem; + becomes: + char _2 =3D mem; + int _1 =3D (int)_2; + + If the def_stmt allows def to be promoted, promote def in-place + (and its arguments when needed). + + For example: + char _3 =3D _1 + _2; + becomes: + int _3 =3D _1 + _2; + Here, _1 and _2 will also be promoted. */ + However, if the defining stmt has to be the last stmt in the basic block (eg, stmt that can throw), and if there is more than one normal edges where we use this value, we cant insert the copy in all the edges. Please note that the copy stmt copes the value to promoted SSA with the same name. Therefore I had to return false in this case for promote_ssa and fixup uses. I ran into this while testing ppc64le. I am sure it can happen in other cases. 2. When the SSA defining statement is such that we cannot promote the definition as part of the stmt and we make a copy, I am also recording the original type copy and promoted copy to so that we can use them when we need. This can be improved. I will do that based on the feedback. Please let me know what you thing. Thanks, Kugan --001a113a3a34a6f19f0532eaf2e5 Content-Type: text/x-patch; charset=US-ASCII; name="0004-Add-new-type-promotion-pass.patch" Content-Disposition: attachment; filename="0004-Add-new-type-promotion-pass.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_io9afi6o0 Content-length: 46299 RnJvbSAzMzJlMGU5ZjkzOGM2YWY1MGU4MjZkODIyNGQwN2ViZjM2NzhhMGUw IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLdWdhbiBWaXZla2Fu YW5kYXJhamFoIDxrdWdhbi52aXZla2FuYW5kYXJhamFoQGxpbmFyby5vcmc+ CkRhdGU6IEZyaSwgMTMgTWF5IDIwMTYgMTM6NDE6MDEgKzEwMDAKU3ViamVj dDogW1BBVENIIDQvNF0gQWRkIG5ldyB0eXBlIHByb21vdGlvbiBwYXNzCgot LS0KIGdjYy9DaGFuZ2VMb2cgICAgICAgICAgICAgICAgIHwgIDEwICsKIGdj Yy9NYWtlZmlsZS5pbiAgICAgICAgICAgICAgIHwgICAxICsKIGdjYy9jb21t b24ub3B0ICAgICAgICAgICAgICAgIHwgICA0ICsKIGdjYy9kb2MvaW52b2tl LnRleGkgICAgICAgICAgIHwgIDEwICsKIGdjYy9naW1wbGUtc3NhLXR5cGUt cHJvbW90ZS5jIHwgOTU4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwogZ2NjL3Bhc3Nlcy5kZWYgICAgICAgICAgICAgICAg fCAgIDEgKwogZ2NjL3RpbWV2YXIuZGVmICAgICAgICAgICAgICAgfCAgIDEg KwogZ2NjL3RyZWUtcGFzcy5oICAgICAgICAgICAgICAgfCAgIDEgKwogOCBm aWxlcyBjaGFuZ2VkLCA5ODYgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy9naW1wbGUtc3NhLXR5cGUtcHJvbW90ZS5jCgpkaWZmIC0t Z2l0IGEvZ2NjL0NoYW5nZUxvZyBiL2djYy9DaGFuZ2VMb2cKaW5kZXggYjMx YTQ0NC4uNWYyYTkwYyAxMDA2NDQKLS0tIGEvZ2NjL0NoYW5nZUxvZworKysg Yi9nY2MvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMTUgQEAKIDIwMTYtMDUtMTIg IEt1Z2FuIFZpdmVrYW5hbmRhcmFqYWggIDxrdWdhbnZAbGluYXJvLm9yZz4K IAorCSogTWFrZWZpbGUuaW46IEFkZCBnaW1wbGUtc3NhLXR5cGUtcHJvbW90 ZS5vLgorCSogY29tbW9uLm9wdDogTmV3IG9wdGlvbiAtZnRyZWUtdHlwZS1w cm9tb3RlLgorCSogZG9jL2ludm9rZS50ZXhpOiBEb2N1bWVudCAtZnRyZWUt dHlwZS1wcm9tb3RlLgorCSogZ2ltcGxlLXNzYS10eXBlLXByb21vdGUuYzog TmV3IGZpbGUuCisJKiBwYXNzZXMuZGVmOiBEZWZpbmUgbmV3IHBhc3NfdHlw ZV9wcm9tb3RlLgorCSogdGltZXZhci5kZWY6IERlZmluZSBuZXcgVFZfVFJF RV9UWVBFX1BST01PVEUuCisJKiB0cmVlLXBhc3MuaCAobWFrZV9wYXNzX3R5 cGVfcHJvbW90ZSk6IE5ldy4KKworMjAxNi0wMy0zMSAgS3VnYW4gVml2ZWth bmFuZGFyYWphaCAgPGt1Z2FudkBsaW5hcm8ub3JnPgorCiAJKiBhdXRvLXBy b2ZpbGUuYyAoYWZkb19wcm9wYWdhdGVfY2lyY3VpdCk6IEluaXRpYWxpemUg b25seV9vbmUuCiAJKiB0cmVlLXNzYS11bmluaXQuYyAobm9ybWFsaXplX29u ZV9wcmVkKTogSGFuZGxlIFNFWFRfRVhQUi4KIApkaWZmIC0tZ2l0IGEvZ2Nj L01ha2VmaWxlLmluIGIvZ2NjL01ha2VmaWxlLmluCmluZGV4IDZjNWFkYzAu LmUwMDc1MGMgMTAwNjQ0Ci0tLSBhL2djYy9NYWtlZmlsZS5pbgorKysgYi9n Y2MvTWFrZWZpbGUuaW4KQEAgLTE1MjIsNiArMTUyMiw3IEBAIE9CSlMgPSBc CiAJdHJlZS12ZWN0LXNscC5vIFwKIAl0cmVlLXZlY3Rvcml6ZXIubyBcCiAJ dHJlZS12cnAubyBcCisJZ2ltcGxlLXNzYS10eXBlLXByb21vdGUubyBcCiAJ dHJlZS5vIFwKIAl2YWx0cmFjay5vIFwKIAl2YWx1ZS1wcm9mLm8gXApkaWZm IC0tZ2l0IGEvZ2NjL2NvbW1vbi5vcHQgYi9nY2MvY29tbW9uLm9wdAppbmRl eCA2ODJjYjQxLi5mODkxYzlkIDEwMDY0NAotLS0gYS9nY2MvY29tbW9uLm9w dAorKysgYi9nY2MvY29tbW9uLm9wdApAQCAtMjQ2Nyw2ICsyNDY3LDEwIEBA IENvbW1vbiBWYXIoZmxhZ191bmNvbnN0cmFpbmVkX2NvbW1vbnMpIE9wdGlt aXphdGlvbgogQXNzdW1lIGNvbW1vbiBkZWNsYXJhdGlvbnMgbWF5IGJlIG92 ZXJyaWRkZW4gd2l0aCBvbmVzIHdpdGggYSBsYXJnZXIKIHRyYWlsaW5nIGFy cmF5LgogCitmdHJlZS10eXBlLXByb21vdGUKK0NvbW1vbiBSZXBvcnQgVmFy KGZsYWdfdHJlZV90eXBlX3Byb21vdGUpIEluaXQoMSkgT3B0aW1pemF0aW9u CitQZXJmb3JtIFR5cGUgUHJvbW90aW9uIG9uIHRyZWVzLgorCiBmdW5pdC1h dC1hLXRpbWUKIENvbW1vbiBSZXBvcnQgVmFyKGZsYWdfdW5pdF9hdF9hX3Rp bWUpIEluaXQoMSkKIENvbXBpbGUgd2hvbGUgY29tcGlsYXRpb24gdW5pdCBh dCBhIHRpbWUuCmRpZmYgLS1naXQgYS9nY2MvZG9jL2ludm9rZS50ZXhpIGIv Z2NjL2RvYy9pbnZva2UudGV4aQppbmRleCAxMTc2ZDEyLi4wYjVhM2U5IDEw MDY0NAotLS0gYS9nY2MvZG9jL2ludm9rZS50ZXhpCisrKyBiL2djYy9kb2Mv aW52b2tlLnRleGkKQEAgLTc2MTksNiArNzYxOSwxNiBAQCBTcGxpdCBwYXRo cyBsZWFkaW5nIHRvIGxvb3AgYmFja2VkZ2VzLiAgVGhpcyBjYW4gaW1wcm92 ZSBkZWFkIGNvZGUKIGVsaW1pbmF0aW9uIGFuZCBjb21tb24gc3ViZXhwcmVz c2lvbiBlbGltaW5hdGlvbi4gIFRoaXMgaXMgZW5hYmxlZCBieQogZGVmYXVs dCBhdCBAb3B0aW9uey1PMn0gYW5kIGFib3ZlLgogCitAaXRlbSAtZnRyZWUt dHlwZS1wcm9tb3RlCitAb3BpbmRleCBmdHJlZS10eXBlLXByb21vdGUKK1Ro aXMgcGFzcyBhcHBsaWVzIHR5cGUgcHJvbW90aW9uIHRvIFNTQSBuYW1lcyBp biB0aGUgZnVuY3Rpb24gYW5kCitpbnNlcnRzIGFwcHJvcHJpYXRlIHRydW5j YXRpb25zIHRvIHByZXNlcnZlIHRoZSBzZW1hbnRpY3MuICBJZGVhIG9mCit0 aGlzIHBhc3MgaXMgdG8gcHJvbW90ZSBvcGVyYXRpb25zIHN1Y2ggYSB3YXkg dGhhdCB3ZSBjYW4gbWluaW1pc2UKK2dlbmVyYXRpb24gb2Ygc3VicmVnIGlu IFJUTCwgdGhhdCBpbnRlcm4gcmVzdWx0cyBpbiByZW1vdmFsIG9mCityZWR1 bmRhbnQgemVyby9zaWduIGV4dGVuc2lvbnMuCisKK1RoaXMgb3B0aW1pemF0 aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKwogQGl0ZW0gLWZzcGxpdC1p dnMtaW4tdW5yb2xsZXIKIEBvcGluZGV4IGZzcGxpdC1pdnMtaW4tdW5yb2xs ZXIKIEVuYWJsZXMgZXhwcmVzc2lvbiBvZiB2YWx1ZXMgb2YgaW5kdWN0aW9u IHZhcmlhYmxlcyBpbiBsYXRlciBpdGVyYXRpb25zCmRpZmYgLS1naXQgYS9n Y2MvZ2ltcGxlLXNzYS10eXBlLXByb21vdGUuYyBiL2djYy9naW1wbGUtc3Nh LXR5cGUtcHJvbW90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLjMxOWU2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvZ2ltcGxl LXNzYS10eXBlLXByb21vdGUuYwpAQCAtMCwwICsxLDk1OCBAQAorLyogVHlw ZSBwcm9tb3Rpb24gb2YgU1NBIG5hbWVzIHRvIG1pbmltaXNlIHJlZHVuZGFu dCB6ZXJvL3NpZ24gZXh0ZW5zaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDE1 LTIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMg ZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCith bnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKK2Fsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJ ZiBub3Qgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAq LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3lzdGVtLmgi CisjaW5jbHVkZSAiY29yZXR5cGVzLmgiCisjaW5jbHVkZSAiYmFja2VuZC5o IgorI2luY2x1ZGUgImhhc2gtc2V0LmgiCisjaW5jbHVkZSAibWFjaG1vZGUu aCIKKyNpbmNsdWRlICJ2ZWMuaCIKKyNpbmNsdWRlICJkb3VibGUtaW50Lmgi CisjaW5jbHVkZSAiaW5wdXQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNp bmNsdWRlICJ3aWRlLWludC5oIgorI2luY2x1ZGUgImluY2hhc2guaCIKKyNp bmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiZm9sZC1jb25zdC5oIgorI2lu Y2x1ZGUgInN0b3ItbGF5b3V0LmgiCisjaW5jbHVkZSAicHJlZGljdC5oIgor I2luY2x1ZGUgImZ1bmN0aW9uLmgiCisjaW5jbHVkZSAiZG9taW5hbmNlLmgi CisjaW5jbHVkZSAiY2ZnLmgiCisjaW5jbHVkZSAiYmFzaWMtYmxvY2suaCIK KyNpbmNsdWRlICJ0cmVlLXNzYS1hbGlhcy5oIgorI2luY2x1ZGUgImdpbXBs ZS1mb2xkLmgiCisjaW5jbHVkZSAidHJlZS1laC5oIgorI2luY2x1ZGUgImdp bXBsZS1leHByLmgiCisjaW5jbHVkZSAiaXMtYS5oIgorI2luY2x1ZGUgImdp bXBsZS5oIgorI2luY2x1ZGUgImdpbXBsZS1pdGVyYXRvci5oIgorI2luY2x1 ZGUgImdpbXBsZS1zc2EuaCIKKyNpbmNsdWRlICJ0cmVlLXBoaW5vZGVzLmgi CisjaW5jbHVkZSAic3NhLWl0ZXJhdG9ycy5oIgorI2luY2x1ZGUgInN0cmlu Z3Bvb2wuaCIKKyNpbmNsdWRlICJ0cmVlLXNzYW5hbWVzLmgiCisjaW5jbHVk ZSAidHJlZS1wYXNzLmgiCisjaW5jbHVkZSAiZ2ltcGxlLXByZXR0eS1wcmlu dC5oIgorI2luY2x1ZGUgImxhbmdob29rcy5oIgorI2luY2x1ZGUgInNiaXRt YXAuaCIKKyNpbmNsdWRlICJkb213YWxrLmgiCisjaW5jbHVkZSAidHJlZS1k ZmEuaCIKKyNpbmNsdWRlICJ0cmVlLXNzYS1sb29wLW5pdGVyLmgiCisKKy8q IFRoaXMgcGFzcyBhcHBsaWVzIHR5cGUgcHJvbW90aW9uIHRvIFNTQSBuYW1l cyBpbiB0aGUgZnVuY3Rpb24gYW5kCisgICBpbnNlcnRzIGFwcHJvcHJpYXRl IHRydW5jYXRpb25zLiAgSWRlYSBvZiB0aGlzIHBhc3MgaXMgdG8gcHJvbW90 ZSBvcGVyYXRpb25zCisgICBzdWNoIGEgd2F5IHRoYXQgd2UgY2FuIG1pbmlt aXNlIGdlbmVyYXRpb24gb2Ygc3VicmVnIGluIFJUTCwKKyAgIHRoYXQgaW4g dHVybiByZXN1bHRzIGluIHJlbW92YWwgb2YgcmVkdW5kYW50IHplcm8vc2ln biBleHRlbnNpb25zLiAgVGhpcyBwYXNzCisgICB3aWxsIHJ1biBwcmlvciB0 byBUaGUgVlJQIGFuZCBET00gc3VjaCB0aGF0IHRoZXkgd2lsbCBiZSBhYmxl IHRvIG9wdGltaXNlCisgICByZWR1bmRhbnQgdHJ1bmNhdGlvbnMgYW5kIGV4 dGVuc2lvbnMuICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBkaXNjdXNzaW9uIGZy b20KKyAgIGh0dHBzOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAx NC0wOS9tc2cwMDQ3Mi5odG1sLgorKi8KKworLyogU3RydWN0dXJlIHRvIGhv bGQgdGhlIHR5cGUgYW5kIHByb21vdGVkIHR5cGUgZm9yIHByb21vdGVkIHNz YSB2YXJpYWJsZXMuICAqLworc3RydWN0IHNzYV9uYW1lX2luZm8KK3sKKyAg dHJlZSBzc2E7CQkvKiBOYW1lIG9mIHRoZSBTU0FfTkFNRS4gICovCisgIHRy ZWUgdmFsXzE7CQkvKiBWYWx1ZSBpbiBvcmlnaW5hbCB0eXBlLCBpZiBwcmVz ZW50LiAgKi8KKyAgdHJlZSB0eXBlOwkJLyogT3JpZ2luYWwgdHlwZSBvZiBz c2EuICAqLworICB0cmVlIHByb21vdGVkX3R5cGU7CS8qIFByb21vdGVkIHR5 cGUgb2Ygc3NhLiAgKi8KK307CisKKy8qIE9ic3RhY2sgZm9yIHNzYV9uYW1l X2luZm8uICAqLworc3RhdGljIHN0cnVjdCBvYnN0YWNrIHNzYV9uYW1lX2lu Zm9fb2JzdGFjazsKKworc3RhdGljIHVuc2lnbmVkIG5fc3NhX3ZhbDsKK3N0 YXRpYyBzYml0bWFwIHNzYV90b19iZV9wcm9tb3RlZF9iaXRtYXA7CitzdGF0 aWMgaGFzaF9tYXAgPHRyZWUsIHNzYV9uYW1lX2luZm8gKj4gKnNzYV9uYW1l X2luZm9fbWFwOworCisvKiBJcyB0aGUgdHlwZSBwcmVjaXNpb24gb2sgZm9y IHByb21pdGlvbi4gICovCitzdGF0aWMgYm9vbAordHlwZV9wcmVjaXNpb25f b2sgKHRyZWUgdHlwZSkKK3sKKyAgcmV0dXJuIChUWVBFX1BSRUNJU0lPTiAo dHlwZSkKKwkgID09IEdFVF9NT0RFX1BSRUNJU0lPTiAoVFlQRV9NT0RFICh0 eXBlKSkpOworfQorCisvKiBSZXR1cm4gdGhlIHByb21vdGVkIHR5cGUgZm9y IFRZUEUuICAqLworc3RhdGljIHRyZWUKK2dldF9wcm9tb3RlZF90eXBlICh0 cmVlIHR5cGUpCit7CisgIHRyZWUgcHJvbW90ZWRfdHlwZTsKKyAgZW51bSBt YWNoaW5lX21vZGUgbW9kZTsKKyAgaW50IHVuczsKKworICBpZiAoUE9JTlRF Ul9UWVBFX1AgKHR5cGUpCisgICAgICB8fCAhSU5URUdSQUxfVFlQRV9QICh0 eXBlKQorICAgICAgfHwgIXR5cGVfcHJlY2lzaW9uX29rICh0eXBlKSkKKyAg ICByZXR1cm4gdHlwZTsKKworICBtb2RlID0gVFlQRV9NT0RFICh0eXBlKTsK KyNpZmRlZiBQUk9NT1RFX01PREUKKyAgdW5zID0gVFlQRV9TSUdOICh0eXBl KTsKKyAgUFJPTU9URV9NT0RFIChtb2RlLCB1bnMsIHR5cGUpOworI2VuZGlm CisgIHVucyA9IFRZUEVfU0lHTiAodHlwZSk7CisgIGlmIChUWVBFX1BSRUNJ U0lPTiAodHlwZSkgPT0gR0VUX01PREVfUFJFQ0lTSU9OIChtb2RlKSkKKyAg ICByZXR1cm4gdHlwZTsKKyAgcHJvbW90ZWRfdHlwZQorICAgID0gYnVpbGRf bm9uc3RhbmRhcmRfaW50ZWdlcl90eXBlIChHRVRfTU9ERV9QUkVDSVNJT04g KG1vZGUpLAorCQkJCSAgICAgIHVucyk7CisgIGdjY19hc3NlcnQgKFRZUEVf UFJFQ0lTSU9OIChwcm9tb3RlZF90eXBlKSA9PSBHRVRfTU9ERV9QUkVDSVNJ T04gKG1vZGUpKTsKKyAgcmV0dXJuIHByb21vdGVkX3R5cGU7Cit9CisKKy8q IFJldHVybiB0cnVlIGlmIHNzYSBOQU1FIGlzIGFscmVhZHkgY29uc2lkZXJl ZCBmb3IgcHJvbW90aW9uLiAgKi8KK3N0YXRpYyBib29sCitzc2FfcHJvbW90 ZWRfcCAodHJlZSBuYW1lKQoreworICBnY2NfYXNzZXJ0IChUUkVFX0NPREUg KG5hbWUpID09IFNTQV9OQU1FKTsKKyAgdW5zaWduZWQgaW50IGluZGV4ID0g U1NBX05BTUVfVkVSU0lPTiAobmFtZSk7CisgIGlmIChpbmRleCA8IG5fc3Nh X3ZhbCkKKyAgICByZXR1cm4gYml0bWFwX2JpdF9wIChzc2FfdG9fYmVfcHJv bW90ZWRfYml0bWFwLCBpbmRleCk7CisgIHJldHVybiB0cnVlOworfQorCisv KiBTZXQgc3NhIE5BTUUgYXMgY29uc2lkZXJlZCBmb3IgcHJvbW90aW9uLiAg Ki8KK3N0YXRpYyB2b2lkCitzZXRfc3NhX3Byb21vdGVkICh0cmVlIG5hbWUp Cit7CisgIGdjY19hc3NlcnQgKFRSRUVfQ09ERSAobmFtZSkgPT0gU1NBX05B TUUpOworICB1bnNpZ25lZCBpbnQgaW5kZXggPSBTU0FfTkFNRV9WRVJTSU9O IChuYW1lKTsKKyAgaWYgKGluZGV4IDwgbl9zc2FfdmFsKQorICAgIGJpdG1h cF9zZXRfYml0IChzc2FfdG9fYmVfcHJvbW90ZWRfYml0bWFwLCBpbmRleCk7 Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSB0cmVlIENPREUgZG9lcyBu b3QgcmVxdWlyZSB0aGUgcHJvcG1vdGVkIG9wZXJhbmQKKyAgIHRvIGJlIHRy dW5jYXRlZCAod2hlbiBzdHJheSBiaXRzIGFyZSBzZXQgYmV5b25kIHRoZSBv cmlnaW5hbCB0eXBlIGluCisgICBwcm9tb3RlZCBtb2RlKSB0byBwcmVzZXJ2 ZSB0aGUgc2VtYW50aWNzLiAgKi8KK3N0YXRpYyBib29sCitub3RfbmVlZGVk X3RydW5jYXRlZF9vcGVyYW5kX3AgKGVudW0gdHJlZV9jb2RlIGNvZGUpCit7 CisgIGlmIChUUkVFX0NPREVfQ0xBU1MgKGNvZGUpID09IHRjY19jb21wYXJp c29uCisgICAgICB8fCBjb2RlID09IFRSVU5DX0RJVl9FWFBSCisgICAgICB8 fCBjb2RlID09IENFSUxfRElWX0VYUFIKKyAgICAgIHx8IGNvZGUgPT0gRkxP T1JfRElWX0VYUFIKKyAgICAgIHx8IGNvZGUgPT0gUk9VTkRfRElWX0VYUFIK KyAgICAgIHx8IGNvZGUgPT0gVFJVTkNfTU9EX0VYUFIKKyAgICAgIHx8IGNv ZGUgPT0gQ0VJTF9NT0RfRVhQUgorICAgICAgfHwgY29kZSA9PSBGTE9PUl9N T0RfRVhQUgorICAgICAgfHwgY29kZSA9PSBST1VORF9NT0RfRVhQUgorICAg ICAgfHwgY29kZSA9PSBMU0hJRlRfRVhQUgorICAgICAgfHwgY29kZSA9PSBS U0hJRlRfRVhQUgorICAgICAgfHwgY29kZSA9PSBNQVhfRVhQUgorICAgICAg fHwgY29kZSA9PSBNSU5fRVhQUikKKyAgICByZXR1cm4gZmFsc2U7CisgIGVs c2UKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRydWUgaWYg TEhTIHdpbGwgYmUgcHJvbW90ZWQgbGF0ZXIuICAqLworc3RhdGljIGJvb2wK K3RvYmVfcHJvbW90ZWRfcCAodHJlZSBsaHMpCit7CisgIGlmIChUUkVFX0NP REUgKGxocykgPT0gU1NBX05BTUUKKyAgICAgICYmIElOVEVHUkFMX1RZUEVf UCAoVFJFRV9UWVBFIChsaHMpKQorICAgICAgJiYgIVZFQ1RPUl9UWVBFX1Ag KFRSRUVfVFlQRSAobGhzKSkKKyAgICAgICYmICFQT0lOVEVSX1RZUEVfUCAo VFJFRV9UWVBFIChsaHMpKQorICAgICAgJiYgIXNzYV9wcm9tb3RlZF9wIChs aHMpCisgICAgICAmJiAoZ2V0X3Byb21vdGVkX3R5cGUgKFRSRUVfVFlQRSAo bGhzKSkKKwkgICE9IFRSRUVfVFlQRSAobGhzKSkpCisgICAgcmV0dXJuIHRy dWU7CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIENvbnZl cnQgYW5kIHNpZ24tZXh0ZW5kIGNvbnN0YW50IENTVCB0byBUWVBFLiAgKi8K K3N0YXRpYyB0cmVlCitmb2xkX2NvbnZlcnRfc2V4dCAodHJlZSB0eXBlLCB0 cmVlIGNzdCkKK3sKKyAgd2lkZV9pbnQgd2lfY29ucyA9IGZvbGRfY29udmVy dCAodHlwZSwgY3N0KTsKKyAgd2lfY29ucyA9IHdpOjpleHQgKHdpX2NvbnMs IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGNzdCkpLCBTSUdORUQpOwor ICByZXR1cm4gd2lkZV9pbnRfdG9fdHJlZSAodHlwZSwgd2lfY29ucyk7Cit9 CisKKy8qIFByb21vdGUgY29uc3RhbnRzIGluIFNUTVQgdG8gVFlQRS4gICov CisKK3N0YXRpYyB2b2lkCitwcm9tb3RlX2NzdF9pbl9zdG10IChnaW1wbGUg KnN0bXQsIHRyZWUgdHlwZSkKK3sKKyAgdHJlZSBvcDsKKyAgc3NhX29wX2l0 ZXIgaXRlcjsKKyAgdXNlX29wZXJhbmRfcCBvcHJuZDsKKyAgaW50IGluZGV4 OworICB0cmVlIG9wMCwgb3AxOworCisgIHN3aXRjaCAoZ2ltcGxlX2NvZGUg KHN0bXQpKQorICAgIHsKKyAgICBjYXNlIEdJTVBMRV9BU1NJR046CisgICAg ICBpZiAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCkgPT0gQ09ORF9F WFBSCisJICAmJiBUUkVFX09QRVJBTkRfTEVOR1RIIChnaW1wbGVfYXNzaWdu X3JoczEgKHN0bXQpKSA9PSAyKQorCXsKKwkgIC8qIFByb21vdGUgSU5URUdF Ul9DU1QgdGhhdCBhcmUgdGNjX2NvbXBhcmUgYXJndW1lbnRzLiAgKi8KKwkg IG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKKwkgIG9wMCA9IFRS RUVfT1BFUkFORCAob3AsIDApOworCSAgb3AxID0gVFJFRV9PUEVSQU5EIChv cCwgMSk7CisJICBpZiAoVFJFRV9UWVBFIChvcDApICE9IFRSRUVfVFlQRSAo b3AxKSkKKwkgICAgeworCSAgICAgIGlmIChUUkVFX0NPREUgKG9wMCkgPT0g SU5URUdFUl9DU1QpCisJCVRSRUVfT1BFUkFORCAob3AsIDApID0gZm9sZF9j b252ZXJ0ICh0eXBlLCBvcDApOworCSAgICAgIGlmIChUUkVFX0NPREUgKG9w MSkgPT0gSU5URUdFUl9DU1QpCisJCVRSRUVfT1BFUkFORCAob3AsIDEpID0g Zm9sZF9jb252ZXJ0ICh0eXBlLCBvcDEpOworCSAgICB9CisJfQorICAgICAg LyogUHJvbW90ZSBJTlRFR0VSX0NTVCBpbiBHSU1QTEVfQVNTSUdOLiAgKi8K KyAgICAgIGlmIChub3RfbmVlZGVkX3RydW5jYXRlZF9vcGVyYW5kX3AgKGdp bXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpKSkKKwl7CisJICBvcCA9IGdp bXBsZV9hc3NpZ25fcmhzMyAoc3RtdCk7CisJICBpZiAob3AgJiYgVFJFRV9D T0RFIChvcCkgPT0gSU5URUdFUl9DU1QpCisJICAgIGdpbXBsZV9hc3NpZ25f c2V0X3JoczMgKHN0bXQsIGZvbGRfY29udmVydF9zZXh0ICh0eXBlLCBvcCkp OworCSAgb3AgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpOworCSAgaWYg KG9wICYmIFRSRUVfQ09ERSAob3ApID09IElOVEVHRVJfQ1NUKQorCSAgICBn aW1wbGVfYXNzaWduX3NldF9yaHMxIChzdG10LCBmb2xkX2NvbnZlcnRfc2V4 dCAodHlwZSwgb3ApKTsKKwkgIG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChz dG10KTsKKwkgIGlmIChvcCAmJiBUUkVFX0NPREUgKG9wKSA9PSBJTlRFR0VS X0NTVCkKKwkgICAgZ2ltcGxlX2Fzc2lnbl9zZXRfcmhzMiAoc3RtdCwgZm9s ZF9jb252ZXJ0X3NleHQgKHR5cGUsIG9wKSk7CisJfQorICAgICAgZWxzZQor CXsKKwkgIG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMzIChzdG10KTsKKwkgIGlm IChvcCAmJiBUUkVFX0NPREUgKG9wKSA9PSBJTlRFR0VSX0NTVCkKKwkgICAg Z2ltcGxlX2Fzc2lnbl9zZXRfcmhzMyAoc3RtdCwgZm9sZF9jb252ZXJ0ICh0 eXBlLCBvcCkpOworCSAgb3AgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQp OworCSAgaWYgKG9wICYmIFRSRUVfQ09ERSAob3ApID09IElOVEVHRVJfQ1NU KQorCSAgICBnaW1wbGVfYXNzaWduX3NldF9yaHMxIChzdG10LCBmb2xkX2Nv bnZlcnQgKHR5cGUsIG9wKSk7CisJICBvcCA9IGdpbXBsZV9hc3NpZ25fcmhz MiAoc3RtdCk7CisJICBpZiAob3AgJiYgVFJFRV9DT0RFIChvcCkgPT0gSU5U RUdFUl9DU1QpCisJICAgIGdpbXBsZV9hc3NpZ25fc2V0X3JoczIgKHN0bXQs IGZvbGRfY29udmVydCAodHlwZSwgb3ApKTsKKwl9CisgICAgICBicmVhazsK KworICAgIGNhc2UgR0lNUExFX1BISToKKwl7CisJICAvKiBQcm9tb3RlIElO VEVHRVJfQ1NUIGFyZ3VtZW50cyB0byBHSU1QTEVfUEhJLiAgKi8KKwkgIGdw aGkgKnBoaSA9IGFzX2EgPGdwaGkgKj4gKHN0bXQpOworCSAgRk9SX0VBQ0hf UEhJX0FSRyAob3BybmQsIHBoaSwgaXRlciwgU1NBX09QX1VTRSkKKwkgICAg eworCSAgICAgIG9wID0gVVNFX0ZST01fUFRSIChvcHJuZCk7CisJICAgICAg aW5kZXggPSBQSElfQVJHX0lOREVYX0ZST01fVVNFIChvcHJuZCk7CisJICAg ICAgaWYgKFRSRUVfQ09ERSAob3ApID09IElOVEVHRVJfQ1NUKQorCQlTRVRf UEhJX0FSR19ERUYgKHBoaSwgaW5kZXgsIGZvbGRfY29udmVydCAodHlwZSwg b3ApKTsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBH SU1QTEVfQ09ORDoKKwl7CisJICAvKiBQcm9tb3RlIElOVEVHRVJfQ1NUIHRo YXQgYXJlIEdJTVBMRV9DT05EIGFyZ3VtZW50cy4gICovCisJICBnY29uZCAq Y29uZCA9IGFzX2EgPGdjb25kICo+IChzdG10KTsKKwkgIG9wID0gZ2ltcGxl X2NvbmRfbGhzIChjb25kKTsKKwkgIGlmIChvcCAmJiBUUkVFX0NPREUgKG9w KSA9PSBJTlRFR0VSX0NTVCkKKwkgICAgZ2ltcGxlX2NvbmRfc2V0X2xocyAo Y29uZCwgZm9sZF9jb252ZXJ0ICh0eXBlLCBvcCkpOworCisJICBvcCA9IGdp bXBsZV9jb25kX3JocyAoY29uZCk7CisJICBpZiAob3AgJiYgVFJFRV9DT0RF IChvcCkgPT0gSU5URUdFUl9DU1QpCisJICAgIGdpbXBsZV9jb25kX3NldF9y aHMgKGNvbmQsIGZvbGRfY29udmVydCAodHlwZSwgb3ApKTsKKwl9CisgICAg ICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBnY2NfdW5yZWFjaGFi bGUgKCk7CisgICAgfQorfQorCisvKiBaZXJvL3NpZ24gZXh0ZW5kIFZBUiBh bmQgdHJ1bmNhdGUgdG8gSU5ORVJfVFlQRS4gQXNzaWduIHRoZSB6ZXJvL3Np Z24KKyAgIGV4dGVuZGVkIHZhbHVlIGluIE5FV19WQVIuICBHaW1wbGUgc3Rh dGVtZW50IHRoYXQgcGVyZm9ybXMgdGhlIHplcm8vc2lnbgorICAgZXh0ZW5z aW9uIGlzIHJldHVybmVkLiAgKi8KKworc3RhdGljIGdpbXBsZSAqCit6ZXJv X3NpZ25fZXh0ZW5kX3N0bXQgKHRyZWUgbmV3X3ZhciwgdHJlZSB2YXIsIHRy ZWUgaW5uZXJfdHlwZSkKK3sKKyAgZ2NjX2Fzc2VydCAoVFlQRV9QUkVDSVNJ T04gKFRSRUVfVFlQRSAodmFyKSkKKwkgICAgICA9PSBUWVBFX1BSRUNJU0lP TiAoVFJFRV9UWVBFIChuZXdfdmFyKSkpOworICBnY2NfYXNzZXJ0IChUWVBF X1BSRUNJU0lPTiAoVFJFRV9UWVBFICh2YXIpKSA+IFRZUEVfUFJFQ0lTSU9O IChpbm5lcl90eXBlKSk7CisgIGdpbXBsZSAqc3RtdDsKKworICBpZiAoVFlQ RV9VTlNJR05FRCAoaW5uZXJfdHlwZSkpCisgICAgeworICAgICAgLyogWmVy byBleHRlbmQuICAqLworICAgICAgdHJlZSBjc3QKKwk9IHdpZGVfaW50X3Rv X3RyZWUgKFRSRUVfVFlQRSAodmFyKSwKKwkJCSAgICB3aTo6bWFzayAoVFlQ RV9QUkVDSVNJT04gKGlubmVyX3R5cGUpLCBmYWxzZSwKKwkJCQkgICAgICBU WVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFICh2YXIpKSkpOworICAgICAgc3Rt dCA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKG5ld192YXIsIEJJVF9BTkRfRVhQ UiwgdmFyLCBjc3QpOworICAgIH0KKyAgZWxzZQorICAgIC8qIFNpZ24gZXh0 ZW5kLiAgKi8KKyAgICBzdG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAobmV3 X3ZhciwgU0VYVF9FWFBSLCB2YXIsCisJCQkJYnVpbGRfaW50X2NzdCAoVFJF RV9UWVBFICh2YXIpLAorCQkJCQkgICAgICAgVFlQRV9QUkVDSVNJT04gKGlu bmVyX3R5cGUpKSk7CisgIHJldHVybiBzdG10OworfQorCisvKiBDb3B5IGRl ZmF1bHQgc3NhIGRlZmluaXRpb24gRk9STSB0byBUTy4gVXNlZCBhcyBhIGhl bHBlciBiZWZvcmUgcHJvbW90aW5nCisgICB0aGUgU1NBLiAgKi8KK3N0YXRp YyB2b2lkCitjb3B5X2RlZmF1bHRfc3NhICh0cmVlIHRvLCB0cmVlIGZyb20p Cit7CisgIFNFVF9TU0FfTkFNRV9WQVJfT1JfSURFTlRJRklFUiAodG8sIFNT QV9OQU1FX1ZBUiAoZnJvbSkpOworICBTU0FfTkFNRV9ERUZfU1RNVCAodG8p ID0gU1NBX05BTUVfREVGX1NUTVQgKGZyb20pOworICBTRVRfU1NBX05BTUVf VkFSX09SX0lERU5USUZJRVIgKGZyb20sIE5VTExfVFJFRSk7CisgIFNTQV9O QU1FX0lTX0RFRkFVTFRfREVGIChmcm9tKSA9IDA7Cit9CisKKy8qIFByb21v dGUgZGVmaW5pdGlvbiBERUYgdG8gcHJvbW90ZWQgdHlwZS4gIElmIHRoZSBz dG10IHRoYXQgZGVmaW5lcyBkZWYKKyAgIGlzIGRlZl9zdG10LCBtYWtlIHRo ZSB0eXBlIG9mIGRlZiBwcm9tb3RlZCB0eXBlLiAgSWYgdGhlIHN0bXQgaXMg c3VjaAorICAgdGhhdCwgcmVzdWx0IG9mIHRoZSBkZWZfc3RtdCBjYW5ub3Qg YmUgb2YgcHJvbW90ZWQgdHlwZSwgY3JlYXRlIGEgbmV3X2RlZgorICAgb2Yg dGhlIG9yaWdpbmFsX3R5cGUgYW5kIG1ha2UgdGhlIGRlZl9zdG10IGFzc2ln biBpdHMgdmFsdWUgdG8gbmV3ZGVmLgorICAgVGhlbiwgY3JlYXRlIGEgTk9Q X0VYUFIgdG8gY29udmVydCBuZXdfZGVmIHRvIGRlZiBvZiBwcm9tb3RlZCB0 eXBlLgorCisgICBGb3IgZXhhbXBsZSwgZm9yIHN0bXQgd2l0aCBvcmlnaW5h bF90eXBlIGNoYXIgYW5kIHByb21vdGVkX3R5cGUgaW50OgorCQljaGFyIF8x ID0gbWVtOworCWJlY29tZXM6CisJCWNoYXIgXzIgPSBtZW07CisJCWludCBf MSA9IChpbnQpXzI7CisKKyAgIElmIHRoZSBkZWZfc3RtdCBhbGxvd3MgZGVm IHRvIGJlIHByb21vdGVkLCBwcm9tb3RlIGRlZiBpbi1wbGFjZQorICAgKGFu ZCBpdHMgYXJndW1lbnRzIHdoZW4gbmVlZGVkKS4KKworICAgRm9yIGV4YW1w bGU6CisJCWNoYXIgXzMgPSBfMSArIF8yOworCWJlY29tZXM6CisJCWludCBf MyA9IF8xICsgXzI7CisgICBIZXJlLCBfMSBhbmQgXzIgd2lsbCBhbHNvIGJl IHByb21vdGVkLiAgKi8KKworc3RhdGljIGJvb2wKK3Byb21vdGVfc3NhICh0 cmVlIGRlZiwgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSkKK3sKKyAgZ2lt cGxlICpkZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChkZWYpOworICBn aW1wbGUgKmNvcHlfc3RtdCA9IE5VTEw7CisgIGdpbXBsZV9zdG10X2l0ZXJh dG9yIGdzaTI7CisgIHRyZWUgb3JpZ2luYWxfdHlwZSA9IFRSRUVfVFlQRSAo ZGVmKTsKKyAgdHJlZSBuZXdfZGVmID0gTlVMTF9UUkVFOworICBzc2FfbmFt ZV9pbmZvICppbmZvOworICBib29sIGRvX25vdF9wcm9tb3RlID0gZmFsc2U7 CisgIHRyZWUgcHJvbW90ZWRfdHlwZSA9IGdldF9wcm9tb3RlZF90eXBlIChU UkVFX1RZUEUgKGRlZikpOworCisgIGluZm8gPSAoc3NhX25hbWVfaW5mbyAq KSBvYnN0YWNrX2FsbG9jICgmc3NhX25hbWVfaW5mb19vYnN0YWNrLAorCQkJ CQkgIHNpemVvZiAoc3NhX25hbWVfaW5mbykpOworICBpbmZvLT50eXBlID0g b3JpZ2luYWxfdHlwZTsKKyAgaW5mby0+cHJvbW90ZWRfdHlwZSA9IHByb21v dGVkX3R5cGU7CisgIGluZm8tPnNzYSA9IGRlZjsKKyAgaW5mby0+dmFsXzEg PSBOVUxMX1RSRUU7CisgIHNzYV9uYW1lX2luZm9fbWFwLT5wdXQgKGRlZiwg aW5mbyk7CisKKyAgc3dpdGNoIChnaW1wbGVfY29kZSAoZGVmX3N0bXQpKQor ICAgIHsKKyAgICBjYXNlIEdJTVBMRV9QSEk6CisgICAgICB7CisJLyogUHJv bW90ZSBkZWYgYnkgZml4aW5nIGl0cyB0eXBlIGFuZCBtYWtlIGRlZiBhbm9u eW1vdXMuICAqLworCVRSRUVfVFlQRSAoZGVmKSA9IHByb21vdGVkX3R5cGU7 CisJU0VUX1NTQV9OQU1FX1ZBUl9PUl9JREVOVElGSUVSIChkZWYsIE5VTExf VFJFRSk7CisJcHJvbW90ZV9jc3RfaW5fc3RtdCAoZGVmX3N0bXQsIHByb21v dGVkX3R5cGUpOworCWJyZWFrOworICAgICAgfQorCisgICAgY2FzZSBHSU1Q TEVfQVNNOgorICAgICAgeworCWdhc20gKmFzbV9zdG10ID0gYXNfYSA8Z2Fz bSAqPiAoZGVmX3N0bXQpOworCWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBp IDwgZ2ltcGxlX2FzbV9ub3V0cHV0cyAoYXNtX3N0bXQpOyArK2kpCisJICB7 CisJICAgIC8qIFByb21vdGUgZGVmIGFuZCBjb3B5IChpLmUuIGNvbnZlcnQp IHRoZSB2YWx1ZSBkZWZpbmVkCisJICAgICAgIGJ5IGFzbSB0byBkZWYuICAq LworCSAgICB0cmVlIGxpbmsgPSBnaW1wbGVfYXNtX291dHB1dF9vcCAoYXNt X3N0bXQsIGkpOworCSAgICB0cmVlIG9wID0gVFJFRV9WQUxVRSAobGluayk7 CisJICAgIGlmIChvcCA9PSBkZWYpCisJICAgICAgeworCQluZXdfZGVmID0g Y29weV9zc2FfbmFtZSAoZGVmKTsKKwkJc2V0X3NzYV9wcm9tb3RlZCAobmV3 X2RlZik7CisJCWNvcHlfZGVmYXVsdF9zc2EgKG5ld19kZWYsIGRlZik7CisJ CVRSRUVfVkFMVUUgKGxpbmspID0gbmV3X2RlZjsKKwkJZ2ltcGxlX2FzbV9z ZXRfb3V0cHV0X29wIChhc21fc3RtdCwgaSwgbGluayk7CisKKwkJVFJFRV9U WVBFIChkZWYpID0gcHJvbW90ZWRfdHlwZTsKKwkJY29weV9zdG10ID0gZ2lt cGxlX2J1aWxkX2Fzc2lnbiAoZGVmLCBOT1BfRVhQUiwgbmV3X2RlZik7CisJ CVNTQV9OQU1FX0lTX0RFRkFVTFRfREVGIChuZXdfZGVmKSA9IDA7CisJCWdp bXBsZV9zZXRfbG9jYXRpb24gKGNvcHlfc3RtdCwgZ2ltcGxlX2xvY2F0aW9u IChkZWZfc3RtdCkpOworCQlnc2kyID0gZ3NpX2Zvcl9zdG10IChkZWZfc3Rt dCk7CisJCWdzaV9pbnNlcnRfYWZ0ZXIgKCZnc2kyLCBjb3B5X3N0bXQsIEdT SV9ORVdfU1RNVCk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwlicmVh azsKKyAgICAgIH0KKworICAgIGNhc2UgR0lNUExFX05PUDoKKyAgICAgIHsK KwlnY2NfdW5yZWFjaGFibGUgKCk7CisgICAgICB9CisKKyAgICBjYXNlIEdJ TVBMRV9BU1NJR046CisgICAgICB7CisJZW51bSB0cmVlX2NvZGUgY29kZSA9 IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9zdG10KTsKKwl0cmVlIHJo cyA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQpOworCS8qIElmIFNT QSBkZWZpbnRpb24gaW4gREVGX1NUTVQgY2Fubm90IGJlIHByb21vdGVkLiAg Ki8KKwlpZiAoZ2ltcGxlX3Z1c2UgKGRlZl9zdG10KSAhPSBOVUxMX1RSRUUK KwkgICAgfHwgZ2ltcGxlX3ZkZWYgKGRlZl9zdG10KSAhPSBOVUxMX1RSRUUK KwkgICAgfHwgKEFOWV9JTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAoZGVm KSkKKwkJJiYgIW9wZXJhdGlvbl9ub190cmFwcGluZ19vdmVyZmxvdyAoVFJF RV9UWVBFIChkZWYpLCBjb2RlKSkKKwkgICAgfHwgVFJFRV9DT0RFX0NMQVNT IChjb2RlKSA9PSB0Y2NfcmVmZXJlbmNlCisJICAgIHx8IFRSRUVfQ09ERV9D TEFTUyAoY29kZSkgPT0gdGNjX2NvbXBhcmlzb24KKwkgICAgfHwgY29kZSA9 PSBMUk9UQVRFX0VYUFIKKwkgICAgfHwgY29kZSA9PSBSUk9UQVRFX0VYUFIK KwkgICAgfHwgY29kZSA9PSBWSUVXX0NPTlZFUlRfRVhQUgorCSAgICB8fCBj b2RlID09IFJFQUxQQVJUX0VYUFIKKwkgICAgfHwgY29kZSA9PSBJTUFHUEFS VF9FWFBSCisJICAgIHx8IGNvZGUgPT0gUkVEVUNfUExVU19FWFBSCisJICAg IHx8IGNvZGUgPT0gUkVEVUNfTUFYX0VYUFIKKwkgICAgfHwgY29kZSA9PSBS RURVQ19NSU5fRVhQUgorCSAgICB8fCAhSU5URUdSQUxfVFlQRV9QIChUUkVF X1RZUEUgKHJocykpKQorCSAgeworCSAgICBkb19ub3RfcHJvbW90ZSA9IHRy dWU7CisJICB9CisJZWxzZSBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAoY29k ZSkpCisJICB7CisJICAgIGlmICghdHlwZV9wcmVjaXNpb25fb2sgKFRSRUVf VFlQRSAocmhzKSkpCisJICAgICAgeworCQlkb19ub3RfcHJvbW90ZSA9IHRy dWU7CisJICAgICAgfQorCSAgICBlbHNlIGlmICh0eXBlc19jb21wYXRpYmxl X3AgKFRSRUVfVFlQRSAocmhzKSwgcHJvbW90ZWRfdHlwZSkpCisJICAgICAg eworCQkvKiBBcyB3ZSB0cmF2ZWwgc3RhdGVtZW50cyBpbiBkb21pbmF0ZWQg b3JkZXIsIGFyZ3VtZW50cworCQkgICBvZiBkZWZfc3RtdCB3aWxsIGJlIHZp c2l0ZWQgYmVmb3JlIHZpc2l0aW5nIGRlZi4gIElmIFJIUworCQkgICBpcyBh bHJlYWR5IHByb21vdGVkIGFuZCB0eXBlIGlzIGNvbXBhdGlibGUsIHdlIGNh biBjb252ZXJ0CisJCSAgIHRoZW0gaW50byBaRVJPL1NJR04gRVhURU5EIHN0 bXQuICAqLworCQlzc2FfbmFtZV9pbmZvICppbmZvID0gc3NhX25hbWVfaW5m b19tYXAtPmdldF9vcl9pbnNlcnQgKHJocyk7CisJCXRyZWUgdHlwZTsKKwkJ aWYgKGluZm8gPT0gTlVMTCkKKwkJICB0eXBlID0gVFJFRV9UWVBFIChyaHMp OworCQllbHNlCisJCSAgdHlwZSA9IGluZm8tPnR5cGU7CisJCWlmICgoVFlQ RV9QUkVDSVNJT04gKG9yaWdpbmFsX3R5cGUpCisJCSAgICAgPiBUWVBFX1BS RUNJU0lPTiAodHlwZSkpCisJCSAgICB8fCAoVFlQRV9VTlNJR05FRCAob3Jp Z2luYWxfdHlwZSkKKwkJCSE9IFRZUEVfVU5TSUdORUQgKHR5cGUpKSkKKwkJ ICB7CisJCSAgICBpZiAoVFlQRV9QUkVDSVNJT04gKG9yaWdpbmFsX3R5cGUp IDwgVFlQRV9QUkVDSVNJT04gKHR5cGUpKQorCQkgICAgICB0eXBlID0gb3Jp Z2luYWxfdHlwZTsKKwkJICAgIGdjY19hc3NlcnQgKHR5cGUgIT0gTlVMTF9U UkVFKTsKKwkJICAgIFRSRUVfVFlQRSAoZGVmKSA9IHByb21vdGVkX3R5cGU7 CisJCSAgICBjb3B5X3N0bXQgPSB6ZXJvX3NpZ25fZXh0ZW5kX3N0bXQgKGRl ZiwgcmhzLCB0eXBlKTsKKwkJICAgIFNFVF9TU0FfTkFNRV9WQVJfT1JfSURF TlRJRklFUiAoZGVmLCBOVUxMX1RSRUUpOworCQkgICAgZ3NpX3JlcGxhY2Ug KGdzaSwgY29weV9zdG10LCBmYWxzZSk7CisJCSAgfQorCQllbHNlCisJCSAg eworCQkgICAgVFJFRV9UWVBFIChkZWYpID0gcHJvbW90ZWRfdHlwZTsKKwkJ ICAgIFNFVF9TU0FfTkFNRV9WQVJfT1JfSURFTlRJRklFUiAoZGVmLCBOVUxM X1RSRUUpOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7 CisJCS8qIElmIFJIUyBpcyBub3QgcHJvbW90ZWQgT1IgdGhlaXIgdHlwZXMg YXJlIG5vdAorCQkgICBjb21wYXRpYmxlLCBjcmVhdGUgTk9QX0VYUFIgdGhh dCBjb252ZXJ0cworCQkgICBSSFMgdG8gIHByb21vdGVkIERFRiB0eXBlIGFu ZCBwZXJmb3JtIGEKKwkJICAgWkVSTy9TSUdOIEVYVEVORCB0byBnZXQgdGhl IHJlcXVpcmVkIHZhbHVlCisJCSAgIGZyb20gUkhTLiAgKi8KKwkJc3NhX25h bWVfaW5mbyAqaW5mbyA9IHNzYV9uYW1lX2luZm9fbWFwLT5nZXRfb3JfaW5z ZXJ0IChyaHMpOworCQlpZiAoaW5mbyAhPSBOVUxMKQorCQkgIHsKKwkJICAg IHRyZWUgdHlwZSA9IGluZm8tPnR5cGU7CisJCSAgICBuZXdfZGVmID0gY29w eV9zc2FfbmFtZSAocmhzKTsKKwkJICAgIFNFVF9TU0FfTkFNRV9WQVJfT1Jf SURFTlRJRklFUiAobmV3X2RlZiwgTlVMTF9UUkVFKTsKKwkJICAgIFRSRUVf VFlQRSAoZGVmKSA9IHByb21vdGVkX3R5cGU7CisJCSAgICBTRVRfU1NBX05B TUVfVkFSX09SX0lERU5USUZJRVIgKGRlZiwgTlVMTF9UUkVFKTsKKwkJICAg IGNvcHlfc3RtdCA9IHplcm9fc2lnbl9leHRlbmRfc3RtdCAobmV3X2RlZiwg cmhzLCB0eXBlKTsKKwkJICAgIGdpbXBsZV9zZXRfbG9jYXRpb24gKGNvcHlf c3RtdCwgZ2ltcGxlX2xvY2F0aW9uIChkZWZfc3RtdCkpOworCQkgICAgZ3Np MiA9IGdzaV9mb3Jfc3RtdCAoZGVmX3N0bXQpOworCQkgICAgZ3NpX2luc2Vy dF9iZWZvcmUgKCZnc2kyLCBjb3B5X3N0bXQsIEdTSV9ORVdfU1RNVCk7CisJ CSAgICBnYXNzaWduICpuZXdfZGVmX3N0bXQgPSBnaW1wbGVfYnVpbGRfYXNz aWduIChkZWYsIGNvZGUsIG5ld19kZWYpOworCQkgICAgZ3NpX3JlcGxhY2Ug KGdzaSwgbmV3X2RlZl9zdG10LCBmYWxzZSk7CisJCSAgfQorCQllbHNlCisJ CSAgeworCQkgICAgVFJFRV9UWVBFIChkZWYpID0gcHJvbW90ZWRfdHlwZTsK KwkJICAgIFNFVF9TU0FfTkFNRV9WQVJfT1JfSURFTlRJRklFUiAoZGVmLCBO VUxMX1RSRUUpOworCQkgIH0KKwkgICAgICB9CisJICB9CisJZWxzZQorCSAg eworCSAgICAvKiBQcm9tb3RlIGRlZiBieSBmaXhpbmcgaXRzIHR5cGUgYW5k IG1ha2UgZGVmIGFub255bW91cy4gICovCisJICAgIHByb21vdGVfY3N0X2lu X3N0bXQgKGRlZl9zdG10LCBwcm9tb3RlZF90eXBlKTsKKwkgICAgU0VUX1NT QV9OQU1FX1ZBUl9PUl9JREVOVElGSUVSIChkZWYsIE5VTExfVFJFRSk7CisJ ICAgIFRSRUVfVFlQRSAoZGVmKSA9IHByb21vdGVkX3R5cGU7CisJICB9CisJ YnJlYWs7CisgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgIGRvX25vdF9w cm9tb3RlID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGRv X25vdF9wcm9tb3RlKQorICAgIHsKKyAgICAgIC8qIFByb21vdGUgZGVmIGFu ZCBjb3B5IChpLmUuIGNvbnZlcnQpIHRoZSB2YWx1ZSBkZWZpbmVkCisJIGJ5 IHRoZSBzdG10IHRoYXQgY2Fubm90IGJlIHByb21vdGVkLiAgKi8KKyAgICAg IGlmIChsb29rdXBfc3RtdF9laF9scCAoZGVmX3N0bXQpID4gMAorCSAgfHwg KGdpbXBsZV9jb2RlIChkZWZfc3RtdCkgPT0gR0lNUExFX0NBTEwKKwkgICAg ICAmJiBnaW1wbGVfY2FsbF9jdHJsX2FsdGVyaW5nX3AgKGRlZl9zdG10KSkp CisJeworCSAgZWRnZV9pdGVyYXRvciBlaTsKKwkgIGVkZ2UgZTsKKwkgIGlu dCBjb3VudCA9IDA7CisKKwkgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBnaW1w bGVfYmIgKGRlZl9zdG10KS0+c3VjY3MpCisJICAgIHsKKwkgICAgICBpZiAo IShlLT5mbGFncyAmIEVER0VfQUJOT1JNQUwpKQorCQljb3VudCArKzsKKwkg ICAgfQorCisJICBpZiAoY291bnQgIT0gMSkKKwkgICAgeworCSAgICAgIGlu Zm8tPnZhbF8xID0gZGVmOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAg fQorCisJICBuZXdfZGVmID0gY29weV9zc2FfbmFtZSAoZGVmKTsKKwkgIHNl dF9zc2FfcHJvbW90ZWQgKG5ld19kZWYpOworCSAgU0VUX1NTQV9OQU1FX1ZB Ul9PUl9JREVOVElGSUVSIChkZWYsIE5VTExfVFJFRSk7CisJICBUUkVFX1RZ UEUgKGRlZikgPSBwcm9tb3RlZF90eXBlOworCSAgZ2ltcGxlX3NldF9saHMg KGRlZl9zdG10LCBuZXdfZGVmKTsKKwkgIGNvcHlfc3RtdCA9IGdpbXBsZV9i dWlsZF9hc3NpZ24gKGRlZiwgTk9QX0VYUFIsIG5ld19kZWYpOworCSAgZ2lt cGxlX3NldF9sb2NhdGlvbiAoY29weV9zdG10LCBnaW1wbGVfbG9jYXRpb24g KGRlZl9zdG10KSk7CisJICBnc2lfaW5zZXJ0X29uX2VkZ2UgKEZBTExUSFJV X0VER0UgKGdpbXBsZV9iYiAoZGVmX3N0bXQpKSwKKwkJCSAgICAgIGNvcHlf c3RtdCk7CisJICBpbmZvLT52YWxfMSA9IG5ld19kZWY7CisJfQorICAgICAg ZWxzZQorCXsKKwkgIG5ld19kZWYgPSBjb3B5X3NzYV9uYW1lIChkZWYpOwor CSAgc2V0X3NzYV9wcm9tb3RlZCAobmV3X2RlZik7CisJICBTRVRfU1NBX05B TUVfVkFSX09SX0lERU5USUZJRVIgKGRlZiwgTlVMTF9UUkVFKTsKKwkgIFRS RUVfVFlQRSAoZGVmKSA9IHByb21vdGVkX3R5cGU7CisJICBnaW1wbGVfc2V0 X2xocyAoZGVmX3N0bXQsIG5ld19kZWYpOworCSAgY29weV9zdG10ID0gZ2lt cGxlX2J1aWxkX2Fzc2lnbiAoZGVmLCBOT1BfRVhQUiwgbmV3X2RlZik7CisJ ICBnaW1wbGVfc2V0X2xvY2F0aW9uIChjb3B5X3N0bXQsIGdpbXBsZV9sb2Nh dGlvbiAoZGVmX3N0bXQpKTsKKwkgIGdzaTIgPSBnc2lfZm9yX3N0bXQgKGRl Zl9zdG10KTsKKwkgIGdzaV9pbnNlcnRfYWZ0ZXIgKCZnc2kyLCBjb3B5X3N0 bXQsIEdTSV9ORVdfU1RNVCk7CisJICBpbmZvLT52YWxfMSA9IG5ld19kZWY7 CisJfQorICAgIH0KKworICByZXNldF9mbG93X3NlbnNpdGl2ZV9pbmZvIChk ZWYpOworICBpZiAobmV3X2RlZiAmJiBUUkVFX05PX1dBUk5JTkcgKGRlZikp CisgICAgVFJFRV9OT19XQVJOSU5HIChuZXdfZGVmKSA9IDE7CisgIHJldHVy biB0cnVlOworfQorCisvKiBGaXggdGhlIChwcm9tb3RlZCkgVVNFIGluIHN0 bXRzIHdoZXJlIFVTRSBjYW5ub3QgYmUgYmUgcHJvbW90ZWQuICAqLworc3Rh dGljIHVuc2lnbmVkIGludAorZml4dXBfdXNlIChnaW1wbGUgKnN0bXQsIGdp bXBsZV9zdG10X2l0ZXJhdG9yICpnc2ksCisJICAgdXNlX29wZXJhbmRfcCBv cCwgdHJlZSB1c2UsIGludCBpbmQpCit7CisgIGdpbXBsZSAqY29weV9zdG10 OworICBzc2FfbmFtZV9pbmZvICoqaW5mbyA9IHNzYV9uYW1lX2luZm9fbWFw LT5nZXQgKHVzZSk7CisgIC8qIElmIFVTRSBpcyBub3QgcHJvbW90ZWQsIG5v dGhpbmcgdG8gZG8uICAqLworICBpZiAoIWluZm8gfHwgKmluZm8gPT0gTlVM TCkKKyAgICByZXR1cm4gMDsKKworICB0cmVlIHByb21vdGVkX3R5cGUgPSAo KmluZm8pLT5wcm9tb3RlZF90eXBlOworICB0cmVlIG9sZF90eXBlID0gKCpp bmZvKS0+dHlwZTsKKyAgYm9vbCBkb19ub3RfcHJvbW90ZSA9IGZhbHNlOwor CisgIHN3aXRjaCAoZ2ltcGxlX2NvZGUgKHN0bXQpKQorICAgIHsKKyAgICBj YXNlIEdJTVBMRV9ERUJVRzoKKwl7CisJICBTRVRfVVNFIChvcCwgZm9sZF9j b252ZXJ0IChvbGRfdHlwZSwgdXNlKSk7CisJICB1cGRhdGVfc3RtdCAoc3Rt dCk7CisJICBicmVhazsKKwl9CisKKyAgICBjYXNlIEdJTVBMRV9BU006Cisg ICAgY2FzZSBHSU1QTEVfQ0FMTDoKKyAgICBjYXNlIEdJTVBMRV9SRVRVUk46 CisgICAgY2FzZSBHSU1QTEVfU1dJVENIOgorCXsKKwkgIC8qIFVTRSBjYW5u b3QgYmUgcHJvbW90ZWQgaGVyZS4gICovCisJICBkb19ub3RfcHJvbW90ZSA9 IHRydWU7CisJICBicmVhazsKKwl9CisKKyAgICBjYXNlIEdJTVBMRV9BU1NJ R046CisJeworCSAgZW51bSB0cmVlX2NvZGUgY29kZSA9IGdpbXBsZV9hc3Np Z25fcmhzX2NvZGUgKHN0bXQpOworCSAgdHJlZSBsaHMgPSBnaW1wbGVfYXNz aWduX2xocyAoc3RtdCk7CisKKwkgIC8qIElmIFVzZSBkZWZpbnRpb24gaW4g U1RNVCBjYW5ub3QgYmUgcHJvbW90ZWQuICAqLworCSAgaWYgKGdpbXBsZV92 dXNlIChzdG10KSAhPSBOVUxMX1RSRUUKKwkgICAgICB8fCBnaW1wbGVfdmRl ZiAoc3RtdCkgIT0gTlVMTF9UUkVFCisJICAgICAgfHwgKEFOWV9JTlRFR1JB TF9UWVBFX1AgKFRSRUVfVFlQRSAobGhzKSkKKwkJICAmJiAhb3BlcmF0aW9u X25vX3RyYXBwaW5nX292ZXJmbG93IChUUkVFX1RZUEUgKGxocyksIGNvZGUp KQorCSAgICAgIHx8IGNvZGUgPT0gVklFV19DT05WRVJUX0VYUFIKKwkgICAg ICB8fCBjb2RlID09IExST1RBVEVfRVhQUgorCSAgICAgIHx8IGNvZGUgPT0g UlJPVEFURV9FWFBSCisJICAgICAgfHwgY29kZSA9PSBDT05TVFJVQ1RPUgor CSAgICAgIHx8IGNvZGUgPT0gQklUX0ZJRUxEX1JFRgorCSAgICAgIHx8IGNv ZGUgPT0gQ09NUExFWF9FWFBSCisJICAgICAgfHwgVkVDVE9SX1RZUEVfUCAo VFJFRV9UWVBFIChsaHMpKSkKKwkgICAgeworCSAgICAgIGRvX25vdF9wcm9t b3RlID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAoVFJFRV9UWVBFICh1 c2UpID09IG9sZF90eXBlKQorCSAgICB7CisJICAgICAgaWYgKFRSRUVfQ09E RV9DTEFTUyAoY29kZSkgPT0gdGNjX2NvbXBhcmlzb24pCisJCXByb21vdGVf Y3N0X2luX3N0bXQgKHN0bXQsIHByb21vdGVkX3R5cGUpOworCSAgICAgIHRy ZWUgdGVtcCA9IG1ha2Vfc3NhX25hbWUgKHByb21vdGVkX3R5cGUsIE5VTEwp OworCSAgICAgIGNvcHlfc3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHRl bXAsIE5PUF9FWFBSLCB1c2UpOworCSAgICAgIGdpbXBsZV9zZXRfbG9jYXRp b24gKGNvcHlfc3RtdCwgZ2ltcGxlX2xvY2F0aW9uIChzdG10KSk7CisJICAg ICAgZ3NpX2luc2VydF9iZWZvcmUgKGdzaSwgY29weV9zdG10LCBHU0lfTkVX X1NUTVQpOworCisJICAgICAgU0VUX1VTRSAob3AsIHRlbXApOworCSAgICAg IHVwZGF0ZV9zdG10IChzdG10KTsKKwkgICAgfQorCSAgZWxzZSBpZiAoIW5v dF9uZWVkZWRfdHJ1bmNhdGVkX29wZXJhbmRfcCAoY29kZSkpCisJICAgIHsK KwkgICAgICAvKiBQcm9tb3RlIHRoZSBjb25zdGFudCBpbiBjb21wYXJpc29u IHdoZW4gb3RoZXIgY29tcGFyaXNvbgorCQkgb3BlcmFuZCBpcyBwcm9tb3Rl ZC4gIEFsbCBvdGhlciBjb25zdGFudHMgYXJlIHByb21vdGVkIGFzCisJCSBw YXJ0IG9mIHByb21vdGluZyBkZWZpbml0aW9uIGluIHByb21vdGVfc3NhLiAg Ki8KKwkgICAgICBpZiAoVFJFRV9DT0RFX0NMQVNTIChjb2RlKSA9PSB0Y2Nf Y29tcGFyaXNvbikKKwkJcHJvbW90ZV9jc3RfaW5fc3RtdCAoc3RtdCwgcHJv bW90ZWRfdHlwZSk7CisJICAgICAgLyogSW4gc29tZSBzdG10cywgdmFsdWUg aW4gVVNFIGhhcyB0byBiZSBaRVJPL1NJR04KKwkJIEV4dGVuZGVkIGJhc2Vk IG9uIHRoZSBvcmlnaW5hbCB0eXBlIGZvciBjb3JyZWN0CisJCSByZXN1bHQu ICAqLworCSAgICAgIHRyZWUgdGVtcCA9IG1ha2Vfc3NhX25hbWUgKFRSRUVf VFlQRSAodXNlKSwgTlVMTCk7CisJICAgICAgY29weV9zdG10ID0gemVyb19z aWduX2V4dGVuZF9zdG10ICh0ZW1wLCB1c2UsIG9sZF90eXBlKTsKKwkgICAg ICBnaW1wbGVfc2V0X2xvY2F0aW9uIChjb3B5X3N0bXQsIGdpbXBsZV9sb2Nh dGlvbiAoc3RtdCkpOworCSAgICAgIGdzaV9pbnNlcnRfYmVmb3JlIChnc2ks IGNvcHlfc3RtdCwgR1NJX05FV19TVE1UKTsKKworCSAgICAgIFNFVF9VU0Ug KG9wLCB0ZW1wKTsKKwkgICAgICB1cGRhdGVfc3RtdCAoc3RtdCk7CisJICAg IH0KKwkgIGVsc2UgaWYgKENPTlZFUlRfRVhQUl9DT0RFX1AgKGNvZGUpCisJ CSAgIHx8IGNvZGUgPT0gRkxPQVRfRVhQUikKKwkgICAgeworCSAgICAgIGlm ICh0eXBlc19jb21wYXRpYmxlX3AgKFRSRUVfVFlQRSAobGhzKSwgcHJvbW90 ZWRfdHlwZSkpCisJCXsKKwkJICAvKiBUeXBlIG9mIExIUyBhbmQgcHJvbW90 ZWQgUkhTIGFyZSBjb21wYXRpYmxlLCB3ZSBjYW4KKwkJICAgICBjb252ZXJ0 IHRoaXMgaW50byBaRVJPL1NJR04gRVhURU5EIHN0bXQuICAqLworCQkgIGNv cHlfc3RtdCA9IHplcm9fc2lnbl9leHRlbmRfc3RtdCAobGhzLCB1c2UsIG9s ZF90eXBlKTsKKwkJICBnaW1wbGVfc2V0X2xvY2F0aW9uIChjb3B5X3N0bXQs IGdpbXBsZV9sb2NhdGlvbiAoc3RtdCkpOworCQkgIHNldF9zc2FfcHJvbW90 ZWQgKGxocyk7CisJCSAgZ3NpX3JlcGxhY2UgKGdzaSwgY29weV9zdG10LCBm YWxzZSk7CisJCX0KKwkgICAgICBlbHNlIGlmICghdG9iZV9wcm9tb3RlZF9w IChsaHMpCisJCSAgICAgICB8fCAhSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZ UEUgKGxocykpCisJCSAgICAgICB8fCAoVFlQRV9VTlNJR05FRCAoVFJFRV9U WVBFICh1c2UpKSAhPSBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKGxocykp KSkKKwkJeworCQkgIHRyZWUgdGVtcCA9IG1ha2Vfc3NhX25hbWUgKFRSRUVf VFlQRSAodXNlKSwgTlVMTCk7CisJCSAgY29weV9zdG10ID0gemVyb19zaWdu X2V4dGVuZF9zdG10ICh0ZW1wLCB1c2UsIG9sZF90eXBlKTsKKwkJICBnaW1w bGVfc2V0X2xvY2F0aW9uIChjb3B5X3N0bXQsIGdpbXBsZV9sb2NhdGlvbiAo c3RtdCkpOworCQkgIGdzaV9pbnNlcnRfYmVmb3JlIChnc2ksIGNvcHlfc3Rt dCwgR1NJX05FV19TVE1UKTsKKwkJICBTRVRfVVNFIChvcCwgdGVtcCk7CisJ CSAgdXBkYXRlX3N0bXQgKHN0bXQpOworCQl9CisJICAgIH0KKwkgIGJyZWFr OworCX0KKworICAgIGNhc2UgR0lNUExFX0NPTkQ6CisgICAgICBpZiAoVFJF RV9UWVBFICh1c2UpID09IG9sZF90eXBlKQorCXsKKwkgIHRyZWUgdGVtcCA9 IG1ha2Vfc3NhX25hbWUgKHByb21vdGVkX3R5cGUsIE5VTEwpOworCSAgY29w eV9zdG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAodGVtcCwgTk9QX0VYUFIs IHVzZSk7CisJICBnaW1wbGVfc2V0X2xvY2F0aW9uIChjb3B5X3N0bXQsIGdp bXBsZV9sb2NhdGlvbiAoc3RtdCkpOworCSAgZ3NpX2luc2VydF9iZWZvcmUg KGdzaSwgY29weV9zdG10LCBHU0lfTkVXX1NUTVQpOworCisJICBTRVRfVVNF IChvcCwgdGVtcCk7CisJICBwcm9tb3RlX2NzdF9pbl9zdG10IChzdG10LCBw cm9tb3RlZF90eXBlKTsKKwkgIHVwZGF0ZV9zdG10IChzdG10KTsKKwl9Cisg ICAgICBlbHNlCisJeworCSAgLyogSW4gR0lNUExFX0NPTkQsIHZhbHVlIGlu IFVTRSBoYXMgdG8gYmUgWkVSTy9TSUdOCisJICAgICBFeHRlbmRlZCBiYXNl ZCBvbiB0aGUgb3JpZ2luYWwgdHlwZSBmb3IgY29ycmVjdAorCSAgICAgcmVz dWx0LiAgKi8KKwkgIHRyZWUgdGVtcCA9IG1ha2Vfc3NhX25hbWUgKFRSRUVf VFlQRSAodXNlKSwgTlVMTCk7CisJICBjb3B5X3N0bXQgPSB6ZXJvX3NpZ25f ZXh0ZW5kX3N0bXQgKHRlbXAsIHVzZSwgb2xkX3R5cGUpOworCSAgZ2ltcGxl X3NldF9sb2NhdGlvbiAoY29weV9zdG10LCBnaW1wbGVfbG9jYXRpb24gKHN0 bXQpKTsKKwkgIGdzaV9pbnNlcnRfYmVmb3JlIChnc2ksIGNvcHlfc3RtdCwg R1NJX05FV19TVE1UKTsKKwkgIFNFVF9VU0UgKG9wLCB0ZW1wKTsKKwkgIHBy b21vdGVfY3N0X2luX3N0bXQgKHN0bXQsIHByb21vdGVkX3R5cGUpOworCSAg dXBkYXRlX3N0bXQgKHN0bXQpOworCX0KKyAgICAgIGJyZWFrOworICAgIGNh c2UgR0lNUExFX1BISToKKyAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9w IChUUkVFX1RZUEUgKHVzZSksIHByb21vdGVkX3R5cGUpKQorCXsKKwkgIHRy ZWUgdGVtcCA9IG1ha2Vfc3NhX25hbWUgKHByb21vdGVkX3R5cGUsIE5VTEwp OworCSAgY29weV9zdG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAodGVtcCwg Tk9QX0VYUFIsIHVzZSk7CisJICB2ZWM8ZWRnZSwgdmFfZ2M+ICpwcmVkcyA9 IGdpbXBsZV9iYiAoc3RtdCktPnByZWRzOworCSAgZWRnZSBlID0gKCpwcmVk cylbaW5kXTsKKwkgIGdzaV9pbnNlcnRfb25fZWRnZSAoZSwgY29weV9zdG10 KTsKKworCSAgU0VUX1VTRSAob3AsIHRlbXApOworCSAgdXBkYXRlX3N0bXQg KHN0bXQpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAg ICAgIGJyZWFrOworICAgIH0KKworICBpZiAoZG9fbm90X3Byb21vdGUpCisg ICAgeworICAgICAgLyogRk9SIHN0bXRzIHdoZXJlIFVTRSBjYW5ub3QgYmUg cHJvbW90ZWQsIGNyZWF0ZSBhbgorCSBvcmlnaW5hbCB0eXBlIGNvcHkuICAq LworICAgICAgdHJlZSB0ZW1wID0gKCppbmZvKS0+dmFsXzE7CisgICAgICBp ZiAodGVtcCAgPT0gTlVMTF9UUkVFKQorCXsKKwkgIHRlbXAgPSBjb3B5X3Nz YV9uYW1lICh1c2UpOworCSAgU0VUX1NTQV9OQU1FX1ZBUl9PUl9JREVOVElG SUVSICh0ZW1wLCBOVUxMX1RSRUUpOworCSAgc2V0X3NzYV9wcm9tb3RlZCAo dGVtcCk7CisJICBUUkVFX1RZUEUgKHRlbXApID0gb2xkX3R5cGU7CisJICBj b3B5X3N0bXQgPSBnaW1wbGVfYnVpbGRfYXNzaWduICh0ZW1wLCBOT1BfRVhQ UiwgdXNlKTsKKwkgIGdpbXBsZV9zZXRfbG9jYXRpb24gKGNvcHlfc3RtdCwg Z2ltcGxlX2xvY2F0aW9uIChzdG10KSk7CisJICBnc2lfaW5zZXJ0X2JlZm9y ZSAoZ3NpLCBjb3B5X3N0bXQsIEdTSV9ORVdfU1RNVCk7CisJfQorICAgICAg U0VUX1VTRSAob3AsIHRlbXApOworICAgICAgdXBkYXRlX3N0bXQgKHN0bXQp OworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9t b3RlX2FsbF9zc2FfZGVmaW5lZF93aXRoX25vcCAoKQoreworICB1bnNpZ25l ZCBuID0gbnVtX3NzYV9uYW1lcywgaTsKKyAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgZ3NpMjsKKyAgdHJlZSBuZXdfZGVmOworICBiYXNpY19ibG9jayBiYjsK KyAgZ2ltcGxlICpjb3B5X3N0bXQ7CisKKyAgZm9yIChpID0gMTsgaSA8IG47 ICsraSkKKyAgICB7CisgICAgICB0cmVlIG5hbWUgPSBzc2FfbmFtZSAoaSk7 CisgICAgICBpZiAobmFtZQorCSAgJiYgZ2ltcGxlX2NvZGUgKFNTQV9OQU1F X0RFRl9TVE1UIChuYW1lKSkgPT0gR0lNUExFX05PUAorCSAgJiYgdG9iZV9w cm9tb3RlZF9wIChuYW1lKQorCSAgJiYgIWhhc196ZXJvX3VzZXMgKG5hbWUp KQorCXsKKwkgIHRyZWUgcHJvbW90ZWRfdHlwZSA9IGdldF9wcm9tb3RlZF90 eXBlIChUUkVFX1RZUEUgKG5hbWUpKTsKKwkgIHNzYV9uYW1lX2luZm8gKmlu Zm87CisJICBzZXRfc3NhX3Byb21vdGVkIChuYW1lKTsKKwkgIGluZm8gPSAo c3NhX25hbWVfaW5mbyAqKSBvYnN0YWNrX2FsbG9jICgmc3NhX25hbWVfaW5m b19vYnN0YWNrLAorCQkJCQkJICBzaXplb2YgKHNzYV9uYW1lX2luZm8pKTsK KwkgIGluZm8tPnR5cGUgPSBUUkVFX1RZUEUgKG5hbWUpOworCSAgaW5mby0+ cHJvbW90ZWRfdHlwZSA9IHByb21vdGVkX3R5cGU7CisJICBpbmZvLT5zc2Eg PSBuYW1lOworCSAgaW5mby0+dmFsXzEgPSBOVUxMX1RSRUU7CisJICBzc2Ff bmFtZV9pbmZvX21hcC0+cHV0IChuYW1lLCBpbmZvKTsKKworCSAgaWYgKFNT QV9OQU1FX1ZBUiAobmFtZSkgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8q IFByb21vdGUgZGVmIGJ5IGZpeGluZyBpdHMgdHlwZSBmb3IgYW5vbnltb3Vz IGRlZi4gICovCisJICAgICAgVFJFRV9UWVBFIChuYW1lKSA9IHByb21vdGVk X3R5cGU7CisJICAgIH0KKwkgIGVsc2UgaWYgKFRSRUVfQ09ERSAoU1NBX05B TUVfVkFSIChuYW1lKSkgIT0gUEFSTV9ERUNMKQorCSAgICB7CisJICAgICAg Ym9vbCBub193YXJuID0gZmFsc2U7CisJICAgICAgbG9jYXRpb25fdCBsb2Mg PSBERUNMX1NPVVJDRV9MT0NBVElPTiAoU1NBX05BTUVfVkFSIChuYW1lKSk7 CisJICAgICAgaWYgKFRSRUVfTk9fV0FSTklORyAoU1NBX05BTUVfVkFSIChu YW1lKSkpCisJCW5vX3dhcm4gPSB0cnVlOworCSAgICAgIHRyZWUgdmFyID0g Y3JlYXRlX3RtcF9yZWcgKHByb21vdGVkX3R5cGUpOworCSAgICAgIERFQ0xf TkFNRSAodmFyKSA9IERFQ0xfTkFNRSAoU1NBX05BTUVfVkFSIChuYW1lKSk7 CisJICAgICAgc2V0X3NzYV9kZWZhdWx0X2RlZiAoY2Z1biwgU1NBX05BTUVf VkFSIChuYW1lKSwgTlVMTF9UUkVFKTsKKwkgICAgICBUUkVFX1RZUEUgKG5h bWUpID0gcHJvbW90ZWRfdHlwZTsKKwkgICAgICBTRVRfU1NBX05BTUVfVkFS X09SX0lERU5USUZJRVIgKG5hbWUsIHZhcik7CisJICAgICAgREVDTF9TT1VS Q0VfTE9DQVRJT04gKFNTQV9OQU1FX1ZBUiAobmFtZSkpID0gbG9jOworCSAg ICAgIHNldF9zc2FfZGVmYXVsdF9kZWYgKGNmdW4sIHZhciwgbmFtZSk7CisJ ICAgICAgaWYgKG5vX3dhcm4pCisJCVRSRUVfTk9fV0FSTklORyAodmFyKSA9 IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIENyZWF0 ZSBhIHByb21vdGVkIGNvcHkgb2YgcGFyYW1ldGVycy4gICovCisJICAgICAg YmIgPSBzaW5nbGVfc3VjYyAoRU5UUllfQkxPQ0tfUFRSX0ZPUl9GTiAoY2Z1 bikpOworCSAgICAgIGdjY19hc3NlcnQgKGJiKTsKKwkgICAgICBnc2kyID0g Z3NpX2FmdGVyX2xhYmVscyAoYmIpOworCSAgICAgIC8qIENyZWF0ZSBuZXdf ZGVmIG9mIHRoZSBvcmlnaW5hbCB0eXBlIGFuZCBzZXQgdGhhdCB0byBiZSB0 aGUKKwkJIHBhcmFtZXRlci4gICovCisJICAgICAgbmV3X2RlZiA9IGNvcHlf c3NhX25hbWUgKG5hbWUpOworCSAgICAgIHNldF9zc2FfcHJvbW90ZWQgKG5l d19kZWYpOworCSAgICAgIHNldF9zc2FfZGVmYXVsdF9kZWYgKGNmdW4sIFNT QV9OQU1FX1ZBUiAobmFtZSksIG5ld19kZWYpOworCSAgICAgIGNvcHlfZGVm YXVsdF9zc2EgKG5ld19kZWYsIG5hbWUpOworCisJICAgICAgLyogTm93IHBy b21vdGUgdGhlIGRlZiBhbmQgY29weSB0aGUgdmFsdWUgZnJvbSBwYXJhbWV0 ZXIuICAqLworCSAgICAgIFRSRUVfVFlQRSAobmFtZSkgPSBwcm9tb3RlZF90 eXBlOworCSAgICAgIGNvcHlfc3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24g KG5hbWUsIE5PUF9FWFBSLCBuZXdfZGVmKTsKKwkgICAgICBTU0FfTkFNRV9E RUZfU1RNVCAobmFtZSkgPSBjb3B5X3N0bXQ7CisJICAgICAgZ3NpX2luc2Vy dF9iZWZvcmUgKCZnc2kyLCBjb3B5X3N0bXQsIEdTSV9ORVdfU1RNVCk7CisJ ICAgICAgaW5mby0+dmFsXzEgPSBuZXdfZGVmOworCSAgICB9CisJICByZXNl dF9mbG93X3NlbnNpdGl2ZV9pbmZvIChuYW1lKTsKKwl9CisgICAgfQorfQor CisvKiBQcm9tb3RlIGFsbCB0aGUgc3RtdHMgaW4gdGhlIGJhc2ljIGJsb2Nr LiAgKi8KK3N0YXRpYyB2b2lkCitwcm9tb3RlX2FsbF9zdG10cyAoYmFzaWNf YmxvY2sgYmIpCit7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsKKyAg c3NhX29wX2l0ZXIgaXRlcjsKKyAgdHJlZSBkZWYsIHVzZTsKKyAgdXNlX29w ZXJhbmRfcCBvcDsKKworICBmb3IgKGdwaGlfaXRlcmF0b3IgZ3BpID0gZ3Np X3N0YXJ0X3BoaXMgKGJiKTsKKyAgICAgICAhZ3NpX2VuZF9wIChncGkpOyBn c2lfbmV4dCAoJmdwaSkpCisgICAgeworICAgICAgZ3BoaSAqcGhpID0gZ3Bp LnBoaSAoKTsKKyAgICAgIGludCBpbmQgPSAwOworICAgICAgRk9SX0VBQ0hf UEhJX0FSRyAob3AsIHBoaSwgaXRlciwgU1NBX09QX1VTRSkKKwl7CisJICB1 c2UgPSBVU0VfRlJPTV9QVFIgKG9wKTsKKwkgIGZpeHVwX3VzZSAocGhpLCAm Z3NpLCBvcCwgdXNlLCBpbmQrKyk7CisJfQorCisgICAgICBkZWYgPSBQSElf UkVTVUxUIChwaGkpOworICAgICAgaWYgKHRvYmVfcHJvbW90ZWRfcCAoZGVm KSkKKwlwcm9tb3RlX3NzYSAoZGVmLCAmZ3NpKTsKKyAgICB9CisKKyAgZm9y IChnc2kgPSBnc2lfc3RhcnRfYmIgKGJiKTsgIWdzaV9lbmRfcCAoZ3NpKTsg Z3NpX25leHQgKCZnc2kpKQorICAgIHsKKyAgICAgIGdpbXBsZSAqc3RtdCA9 IGdzaV9zdG10IChnc2kpOworICAgICAgRk9SX0VBQ0hfU1NBX1VTRV9PUEVS QU5EIChvcCwgc3RtdCwgaXRlciwgU1NBX09QX1VTRSkKKwl7CisJICB1c2Ug PSBVU0VfRlJPTV9QVFIgKG9wKTsKKwkgIGZpeHVwX3VzZSAoc3RtdCwgJmdz aSwgb3AsIHVzZSwgMCk7CisJfQorCisgICAgICBGT1JfRUFDSF9TU0FfVFJF RV9PUEVSQU5EIChkZWYsIHN0bXQsIGl0ZXIsIFNTQV9PUF9ERUYpCisJewor CSAgaW1tX3VzZV9pdGVyYXRvciB1aTI7CisJICBnaW1wbGUgKnVzZV9zdG10 OworCSAgdXNlX29wZXJhbmRfcCBvcDI7CisJICBzc2Ffb3BfaXRlciBpdGVy OworCSAgaWYgKCF0b2JlX3Byb21vdGVkX3AgKGRlZikpCisJICAgIGNvbnRp bnVlOworCSAgaWYgKHByb21vdGVfc3NhIChkZWYsICZnc2kpKQorCSAgICBj b250aW51ZTsKKwkgIC8qIElmIGRlZiBjYW5ub3QgYmUgcHJvbW90ZWQsIGZp eHVwIGFscmVhZHkgcHJvbW90ZWQKKwkgICAgIFBISSBzdG10cyB0aGF0IHVz ZSBkZWYuIFdlIG9ubHkgaGF2ZSB0byBkbyB0aGlzCisJICAgICBmb3IgKGJh Y2t3YXJkKSBQSEkgc3RtdHMgYXMgd2UgYXJlIHByb21vdGluZyBpbgorCSAg ICAgZG9taW5hbmNlIG9yZGVyLiAgKi8KKwkgIEZPUl9FQUNIX0lNTV9VU0Vf U1RNVCAodXNlX3N0bXQsIHVpMiwgZGVmKQorCSAgICB7CisJICAgICAgaW50 IGluZCA9IDA7CisJICAgICAgaWYgKGdpbXBsZV9jb2RlICh1c2Vfc3RtdCkg IT0gR0lNUExFX1BISQorCQkgIHx8IHR5cGVzX2NvbXBhdGlibGVfcCAoVFJF RV9UWVBFIChkZWYpLAorCQkJCQkgVFJFRV9UWVBFIChQSElfUkVTVUxUICh1 c2Vfc3RtdCkpKSkKKwkJY29udGludWU7CisJICAgICAgRk9SX0VBQ0hfUEhJ X0FSRyAob3AyLCBhc19hIDxncGhpICo+ICh1c2Vfc3RtdCksCisJCQkJaXRl ciwgU1NBX09QX1VTRSkKKwkJeworCQkgIGlmIChkZWYgPT0gVVNFX0ZST01f UFRSIChvcDIpKQorCQkgICAgZml4dXBfdXNlICh1c2Vfc3RtdCwgTlVMTCwg b3AyLCBkZWYsIGluZCk7CisJCSAgaW5kKys7CisJCX0KKwkgICAgfQorCX0K KyAgICB9Cit9CisKK2NsYXNzIHR5cGVfcHJvbW90aW9uX2RvbV93YWxrZXIg OiBwdWJsaWMgZG9tX3dhbGtlcgoreworcHVibGljOgorICB0eXBlX3Byb21v dGlvbl9kb21fd2Fsa2VyIChjZGlfZGlyZWN0aW9uIGRpcmVjdGlvbikKKyAg ICA6IGRvbV93YWxrZXIgKGRpcmVjdGlvbikge30KKyAgdmlydHVhbCBlZGdl IGJlZm9yZV9kb21fY2hpbGRyZW4gKGJhc2ljX2Jsb2NrIGJiKQorICAgIHsK KyAgICAgIHByb21vdGVfYWxsX3N0bXRzIChiYik7CisgICAgICByZXR1cm4g TlVMTDsKKyAgICB9Cit9OworCisvKiBNYWluIGVudHJ5IHBvaW50IHRvIHRo ZSBwYXNzLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2V4ZWN1dGVfdHlw ZV9wcm9tb3Rpb24gKHZvaWQpCit7CisgIG5fc3NhX3ZhbCA9IG51bV9zc2Ff bmFtZXM7CisgIHNzYV9uYW1lX2luZm9fbWFwID0gbmV3IGhhc2hfbWFwPHRy ZWUsIHNzYV9uYW1lX2luZm8gKj47CisgIHNzYV90b19iZV9wcm9tb3RlZF9i aXRtYXAgPSBzYml0bWFwX2FsbG9jIChuX3NzYV92YWwpOworICBiaXRtYXBf Y2xlYXIgKHNzYV90b19iZV9wcm9tb3RlZF9iaXRtYXApOworCisgIC8qIENy ZWF0ZSB0aGUgb2JzdGFjayB3aGVyZSBzc2FfbmFtZV9pbmZvIHdpbGwgcmVz aWRlLiAgKi8KKyAgZ2NjX29ic3RhY2tfaW5pdCAoJnNzYV9uYW1lX2luZm9f b2JzdGFjayk7CisKKyAgY2FsY3VsYXRlX2RvbWluYW5jZV9pbmZvIChDRElf RE9NSU5BVE9SUyk7CisgIHByb21vdGVfYWxsX3NzYV9kZWZpbmVkX3dpdGhf bm9wICgpOworICAvKiBXYWxrIHRoZSBDRkcgaW4gZG9taW5hdG9yIG9yZGVy LiAgKi8KKyAgdHlwZV9wcm9tb3Rpb25fZG9tX3dhbGtlciAoQ0RJX0RPTUlO QVRPUlMpCisgICAgLndhbGsgKEVOVFJZX0JMT0NLX1BUUl9GT1JfRk4gKGNm dW4pKTsKKyAgZ3NpX2NvbW1pdF9lZGdlX2luc2VydHMgKCk7CisKKyAgb2Jz dGFja19mcmVlICgmc3NhX25hbWVfaW5mb19vYnN0YWNrLCBOVUxMKTsKKyAg c2JpdG1hcF9mcmVlIChzc2FfdG9fYmVfcHJvbW90ZWRfYml0bWFwKTsKKyAg ZGVsZXRlIHNzYV9uYW1lX2luZm9fbWFwOworICByZXR1cm4gMDsKK30KKwor bmFtZXNwYWNlIHsKK2NvbnN0IHBhc3NfZGF0YSBwYXNzX2RhdGFfdHlwZV9w cm9tb3Rpb24gPQoreworICBHSU1QTEVfUEFTUywgLyogdHlwZSAqLworICAi cHJvbW90aW9uIiwgLyogbmFtZSAqLworICBPUFRHUk9VUF9OT05FLCAvKiBv cHRpbmZvX2ZsYWdzICovCisgIFRWX1RSRUVfVFlQRV9QUk9NT1RFLCAvKiB0 dl9pZCAqLworICBQUk9QX3NzYSwgLyogcHJvcGVydGllc19yZXF1aXJlZCAq LworICAwLCAvKiBwcm9wZXJ0aWVzX3Byb3ZpZGVkICovCisgIDAsIC8qIHBy b3BlcnRpZXNfZGVzdHJveWVkICovCisgIDAsIC8qIHRvZG9fZmxhZ3Nfc3Rh cnQgKi8KKyAgKFRPRE9fY2xlYW51cF9jZmcgfCBUT0RPX3VwZGF0ZV9zc2Eg fCBUT0RPX3ZlcmlmeV9hbGwpLAorfTsKKworY2xhc3MgcGFzc190eXBlX3By b21vdGlvbiA6IHB1YmxpYyBnaW1wbGVfb3B0X3Bhc3MKK3sKK3B1YmxpYzoK KyAgcGFzc190eXBlX3Byb21vdGlvbiAoZ2NjOjpjb250ZXh0ICpjdHh0KQor ICAgIDogZ2ltcGxlX29wdF9wYXNzIChwYXNzX2RhdGFfdHlwZV9wcm9tb3Rp b24sIGN0eHQpCisgIHt9CisKKyAgLyogb3B0X3Bhc3MgbWV0aG9kczogKi8K KyAgb3B0X3Bhc3MgKiBjbG9uZSAoKSB7IHJldHVybiBuZXcgcGFzc190eXBl X3Byb21vdGlvbiAobV9jdHh0KTsgfQorICB2aXJ0dWFsIGJvb2wgZ2F0ZSAo ZnVuY3Rpb24gKikgeyByZXR1cm4gZmxhZ190cmVlX3R5cGVfcHJvbW90ZSAh PSAwOyB9CisgIHZpcnR1YWwgdW5zaWduZWQgaW50IGV4ZWN1dGUgKGZ1bmN0 aW9uICopCisgICAgeworICAgICAgcmV0dXJuIGV4ZWN1dGVfdHlwZV9wcm9t b3Rpb24gKCk7CisgICAgfQorCit9OyAvLyBjbGFzcyBwYXNzX3R5cGVfcHJv bW90aW9uCisKK30gLy8gYW5vbiBuYW1lc3BhY2UKKworZ2ltcGxlX29wdF9w YXNzICoKK21ha2VfcGFzc190eXBlX3Byb21vdGUgKGdjYzo6Y29udGV4dCAq Y3R4dCkKK3sKKyAgcmV0dXJuIG5ldyBwYXNzX3R5cGVfcHJvbW90aW9uIChj dHh0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZ2NjL3Bhc3Nlcy5kZWYgYi9nY2Mv cGFzc2VzLmRlZgppbmRleCAwZTU1ODI5Li4zZGI2ZmY3IDEwMDY0NAotLS0g YS9nY2MvcGFzc2VzLmRlZgorKysgYi9nY2MvcGFzc2VzLmRlZgpAQCAtMzAx LDYgKzMwMSw3IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09Q WUlORzMuICBJZiBub3Qgc2VlCiAgICAgICBQT1BfSU5TRVJUX1BBU1NFUyAo KQogICAgICAgTkVYVF9QQVNTIChwYXNzX3NpbWR1aWRfY2xlYW51cCk7CiAg ICAgICBORVhUX1BBU1MgKHBhc3NfbG93ZXJfdmVjdG9yX3NzYSk7CisgICAg ICBORVhUX1BBU1MgKHBhc3NfdHlwZV9wcm9tb3RlKTsKICAgICAgIE5FWFRf UEFTUyAocGFzc19jc2VfcmVjaXByb2NhbHMpOwogICAgICAgTkVYVF9QQVNT IChwYXNzX3JlYXNzb2MsIGZhbHNlIC8qIGluc2VydF9wb3dpX3AgKi8pOwog ICAgICAgTkVYVF9QQVNTIChwYXNzX3N0cmVuZ3RoX3JlZHVjdGlvbik7CmRp ZmYgLS1naXQgYS9nY2MvdGltZXZhci5kZWYgYi9nY2MvdGltZXZhci5kZWYK aW5kZXggNzZiMDA4ZS4uMDY5ZGMzZCAxMDA2NDQKLS0tIGEvZ2NjL3RpbWV2 YXIuZGVmCisrKyBiL2djYy90aW1ldmFyLmRlZgpAQCAtMjgxLDYgKzI4MSw3 IEBAIERFRlRJTUVWQVIgKFRWX1ZUQUJMRV9WRVJJRklDQVRJT04gICAsICJ2 dGFibGUgdmVyaWZpY2F0aW9uIikKIERFRlRJTUVWQVIgKFRWX1RSRUVfVUJT QU4gICAgICAgICAgICAsICJ0cmVlIHVic2FuIikKIERFRlRJTUVWQVIgKFRW X0lOSVRJQUxJWkVfUlRMICAgICAgICAsICJpbml0aWFsaXplIHJ0bCIpCiBE RUZUSU1FVkFSIChUVl9HSU1QTEVfTEFERFJFU1MgICAgICAgLCAiYWRkcmVz cyBsb3dlcmluZyIpCitERUZUSU1FVkFSIChUVl9UUkVFX1RZUEVfUFJPTU9U RSAgICAgLCAidHJlZSB0eXBlIHByb21vdGUiKQogCiAvKiBFdmVyeXRoaW5n IGVsc2UgaW4gcmVzdF9vZl9jb21waWxhdGlvbiBub3QgaW5jbHVkZWQgYWJv dmUuICAqLwogREVGVElNRVZBUiAoVFZfRUFSTFlfTE9DQUwJICAgICAsICJl YXJseSBsb2NhbCBwYXNzZXMiKQpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtcGFz cy5oIGIvZ2NjL3RyZWUtcGFzcy5oCmluZGV4IDY2ZTEwM2EuLjgwZDMwZTcg MTAwNjQ0Ci0tLSBhL2djYy90cmVlLXBhc3MuaAorKysgYi9nY2MvdHJlZS1w YXNzLmgKQEAgLTQzOSw2ICs0MzksNyBAQCBleHRlcm4gZ2ltcGxlX29wdF9w YXNzICptYWtlX3Bhc3NfZnJlIChnY2M6OmNvbnRleHQgKmN0eHQpOwogZXh0 ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFrZV9wYXNzX2NoZWNrX2RhdGFfZGVw cyAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBnaW1wbGVfb3B0X3Bh c3MgKm1ha2VfcGFzc19jb3B5X3Byb3AgKGdjYzo6Y29udGV4dCAqY3R4dCk7 CiBleHRlcm4gZ2ltcGxlX29wdF9wYXNzICptYWtlX3Bhc3NfaXNvbGF0ZV9l cnJvbmVvdXNfcGF0aHMgKGdjYzo6Y29udGV4dCAqY3R4dCk7CitleHRlcm4g Z2ltcGxlX29wdF9wYXNzICptYWtlX3Bhc3NfdHlwZV9wcm9tb3RlIChnY2M6 OmNvbnRleHQgKmN0eHQpOwogZXh0ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFr ZV9wYXNzX3ZycCAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBnaW1w bGVfb3B0X3Bhc3MgKm1ha2VfcGFzc191bmNwcm9wIChnY2M6OmNvbnRleHQg KmN0eHQpOwogZXh0ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFrZV9wYXNzX3Jl dHVybl9zbG90IChnY2M6OmNvbnRleHQgKmN0eHQpOwotLSAKMS45LjEKCg== --001a113a3a34a6f19f0532eaf2e5--