From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by sourceware.org (Postfix) with ESMTPS id 1BC353889E34 for ; Tue, 15 Nov 2022 12:29:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1BC353889E34 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wr1-x431.google.com with SMTP id cl5so23985026wrb.9 for ; Tue, 15 Nov 2022 04:29:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id:from:to:cc :subject:date:message-id:reply-to; bh=27hhAisRNgM7fhLdShJoei+c7Rx1WRqYFs5x19Sx988=; b=K50kqZvGcrr1GwzhapPIRURDcwnBvSk2rjasbsVtGuRsKfa89gXPNbe6S2CHbx4i8G 0HEUbLdQI1O8ZA1q2dWUAatD1H/NJ3L3OONMUHjqvOYylE757g4a4PA57ZQr+2wz40F5 cmWoUC2RT5LSxyYY61ad7cVTRs4dFuLibHGn3ghsZEbxjRzUzfGRTa8cqidqCLh8PTGy KU1IYqWR65RUo3xjJ1j+NqJeB7ImSxfDrk14HyuVVNv0LlJV8S5kgiYxVxBmlh9X+gA3 xqNkKRTScEOvFQSTX9EV9KRuikaAcrR2z9eW+uMnP+RhDDdHGPDBQwHcQATh1JCNHFYR uOLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:subject:autocrypt:from:references:cc:to :content-language:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=27hhAisRNgM7fhLdShJoei+c7Rx1WRqYFs5x19Sx988=; b=YMe6kQgfvc+c+6bVl0kWf4c9fnHZeo3XVa1trz8zoMLgMB3/h1pBLBRULk63E6m9PJ 5bsjU8YQKvaXz9d/9tebwnTTHjPn6BRAGIvtpRplRdL9/0s3L7RSQpSicYl7lhPr6gH0 qP4LluMIAEv7MXFSrd82Xj/ZWPqlwKf0zk7O4FdjjxTg2LNLUsj7o6uz3D7dO7qkOjXb vjk4nnwcExkonKpnOk8T+byh3qzNjY94QGSEqRNXR0IrVPnu0UZXCBHAySqYV1b7DitR Ka24kwppsDQh19lazZLQ3C/VcmDuglBbyAd+O8CuLw1cTDxV+cEq7RZJhAvh4dUX5z/h i6Lw== X-Gm-Message-State: ANoB5pnewaLsfqcKfFku2C0wgx/8s8fChgM9/F2ziyZRcbJL3n0aQ2PG pIPVqZKSBbnmHNJUOAx1xYP/fcEGLToHmGM= X-Google-Smtp-Source: AA0mqf6AsAbBNHSARV4T/mjHcWIKaDMJhb1l+JhRiW3Axy13II4AtrapurRUQ5IFtRUN7qn7bkaYgg== X-Received: by 2002:adf:f0cd:0:b0:22e:344a:ec5e with SMTP id x13-20020adff0cd000000b0022e344aec5emr11102009wro.673.1668515386610; Tue, 15 Nov 2022 04:29:46 -0800 (PST) Received: from ?IPV6:2001:861:5e4c:3bb0:6424:328a:1734:3249? ([2001:861:5e4c:3bb0:6424:328a:1734:3249]) by smtp.gmail.com with ESMTPSA id c7-20020a1c3507000000b003c6f1732f65sm20236411wma.38.2022.11.15.04.29.45 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 15 Nov 2022 04:29:45 -0800 (PST) Message-ID: <27a74ae6-10fc-4834-33f6-2f8893f9453c@embecosm.com> Date: Tue, 15 Nov 2022 13:32:49 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Content-Language: en-US To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-38-arthur.cohen@embecosm.com> From: Arthur Cohen Autocrypt: addr=arthur.cohen@embecosm.com; keydata= xsFNBGIMH/sBEAC/+yKgi+y9knsqZUNIqlF85v9Lv0lZ2jOUgFgD5R10gz8j39vIYxM/DWA8 BGudqx/s0V3T2arTIJ9u9StA6846SD4lCmdFBUkE0ylOl9UjYrZpoNOYF85TrhwDBB8LxNzo pJxrQIv/WqU2pfs4+QyZuzNPWkGv1b06dDqY1hr7jUxJzAhRklGMyd6kPzr4lJUJLvIPxjQ1 Y+NXAiLrm7n7HqXeHxGBHFwxTRKMb720fcP8pkNQKZNoZBAhNr/665yIH3fV1+D/xsjbVkow BJn5MG3iburNfps50fMNNkBZgzIBRjBxdyJ7iJmpZRQkdLSEf/gpWEc/vUVs8OIdqT60vuFo ueuQUyntFuvGWyCP/o71+eaMdG1Xx8TROJM9usU+Zz3V8GwpPSUUiAI/tDhR/ANtrrJ7jbuh w/9fm7HLovGniQcpN2INgY/Ema3dmU7EWnFqeGymP8R3MQY1Ge8xqlNL1KGrp45ZHp623XgH +IDkvy1ne7RU+WuOPxKKWGeN9LfHNGfTX3ZvFCCxlnbU6KwwoeiLBVdkY1zbgA5LPIPrPtzQ vSPTivQswMkCEVrqLkBYnAXGiavx8V63HltdohJMvkE0wkH3XmsTgrbtqxADlHHz7WZbBWx9 G6OElEThcuT/H/pR9dxr83+qbkUpyIYxW3zP/kpz97oOElSyEQARAQABzShBcnRodXIgQ29o ZW4gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+wsGOBBMBCAA4FiEEhx8wPNj7cw6CrvzG GzRlsEStnGUFAmIMH/sCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQGzRlsEStnGW7 GhAApgjuTe1IRIGxhF8o2VLRYYOHugSI6tNBPpnOjRBbt/Uj5xECBLDtIx+/GR+fUSZ/wRj7 hIpbSoClfnCwQ5/Z0055MY8T9UsCwElOPluzCNmrmRPL2snMsAhhMxDVVtX5xvF25It0qRQJ LVKWiJPoPsQbl3ouaQhPbr2zeIAa74BlWn03zbUJdTXcdjd8+ZBnSGntqwV/hP/g1NwZzuxh roOq1UafPFd3RKwcuIRUkr5JE1ymNP4R8u3GU4/gwGr9s69wIEsBohPowgYGt84ZvLZpt84y Ufsf9CH4OE4/+x1QGumD1b9VcIv5/vZsg7Z8EXKibb6X5TM2vtCcNAHv+0KsERZyLHXn+GOj PQgISzPEcxYkeGNtEnf6IhsIfZyeUe2ZiMPz48Tok9w7r0XfhMCj2SMFjbAFfsufsglDnGO7 CRuCBXtYJYZInmf5XzaQ8FfMRPs9jZeD6SFZjFH00E1o5GLsY9le5euxLo1aLqDNqMp6I8R7 0rK65c7zRAnQ9CO8watmXsBMuJ0Y6Jmf/noFXn8SGVA9b7j+uumum1zToTSmPwhn83X3KwoX TmQ9RD1eiEBJDT9/phSTVDTqhsu8GJVzOIRVXKHxRZLZJo1pGt3YzbDlTshXAV4Ln5YsJIgy AuLU6vmH50QoZhuJK3xMnUaMRdxgyqZe5ACmWXXOwU0EYgwf+wEQAL5Bd4WYiqpsBgW1k/To zz4cThT+CueIqitD5lhTzEJ73SyrAmUiZrkSmR2Vc6G1mJEqozkmeXHjjQ8gMbz6HZBmacnJ hWObf1aUTHjowIsyT0hJJVag1Exq16lBUZCelNG0Jb07TnVWTi/2xHRTLsNVzTQpKnWC3OoA y6M9KwNp5I0hk2cJaFrMjz7/Q16kx8vOov28UcsNDhbq25W64fdEYZApNZI1sKk33tAQj4t0 BxHtG1Hb6EwxbPmVZpL07fmLLVWe3nI5znekXq8AHlUcPGpb4EjUIsmK8+VnGF3f0cDeSupJ WSaHiuufc/jONsM8ZiuYJ6i9Lr8IvgeTUZMXVrjwuIDaMLn5F24dmNSheuwLukQTTiB9LKfU yKZzkFb8Opiqzjng+psvkECIVwk5xaZgraKtivyq+RHGrhSzkJv17QLb7rEiMjKl+20v3xCY l8ogR/7O/slPZMisDV5QOEZEMrWfVYZCW5UIO+vXekTweJxVzPfrkUSpzce67iyeTzzNNwPl FnS/6eB1+IKKAtuxEhbOokBsYf+WnY7xdLGCLyVTXdg99oXZ9AJUUJL3dy9eIggZciQSzkhf eKykoUDmHUAAbWTAxWLwkJ/QBku/Ay5ffRQ9ukhngdu8PsyPGwsOORNIVYbKU0hMtqU7UjOz hVviQufJY2C4KCp5ABEBAAHCwXYEGAEIACAWIQSHHzA82PtzDoKu/MYbNGWwRK2cZQUCYgwf +wIbDAAKCRAbNGWwRK2cZQJ6D/95URtl/eu1akFC1VNqdghWrOAJiL8Jgk53cXug3GXoh8qj DYXT7S6zC6Gyq2nqhGy5JdNmZRdhFCIqZAg2DyBY/1gJEM0yLXEhWZy8AxuUaadAuUG8erdn gXD2az4glSKhjAM5oxRXkWB3P9lr5I2n0Yx7tPlFusfIInV/3RKOYezPS9seoJS31hb6dvYs f3/RGF5Fau3+sm4urTn7zqhqBYgqBmih8sgsifXAzsJ+tO33Cd10SPZmKlKlZWxouTL4Nky6 e2DJHX7phX1DIZBmJBIUvkK6uA7mdJ1yzQonNJq8nABtXBioO+YnP3msZPutEJzGnBjRSpJr 0FULqeIX5JTPqa023Kj2zvnFfqKrT6rgMUomNjQxCryix+EoBUvHcHAyWPQuYb38eV15GqcC jEezziKqTXPBETXkM3rq8+STsSwxn6wz6gwgC1sbj+IXUY2jGzq8fS/99uferADYXEnzKheU 5Q4gWv2XQ/juSJh6AuxTdlr7+5ndAmVUh8U0p47S5ErJnHt1H4pLxIoR7VM9YiIZHn833Xms 2QT2JVIVzL+opHU5XdoXPgd58b8Sxd2j1Fj8LevvZ4isfpr6ZHQ3S0sdOZFtg+Sdnri0Eg+Z g28sczMMKT0W+wb/dpZCA8p3ONJE5hWUhtUpNuhV7j8A4PBVzNHOqPWx7FJmBg== Subject: Re: [PATCH Rust front-end v3 37/46] gccrs: Add HIR to GCC GENERIC lowering for all nodes In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------o6NHHJQJAuWqBswmktjLrZ5w" X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------o6NHHJQJAuWqBswmktjLrZ5w Content-Type: multipart/mixed; boundary="------------B3aOl7ALSILCHFEdeGHlViEk"; protected-headers="v1" From: Arthur Cohen To: Richard Biener Cc: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org Message-ID: <27a74ae6-10fc-4834-33f6-2f8893f9453c@embecosm.com> Subject: Re: [PATCH Rust front-end v3 37/46] gccrs: Add HIR to GCC GENERIC lowering for all nodes References: <20221026081811.602573-1-arthur.cohen@embecosm.com> <20221026081811.602573-38-arthur.cohen@embecosm.com> In-Reply-To: --------------B3aOl7ALSILCHFEdeGHlViEk Content-Type: multipart/mixed; boundary="------------0EWczDzaU7KaPXNcK7GstdiF" --------------0EWczDzaU7KaPXNcK7GstdiF Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 DQoNCk9uIDExLzkvMjIgMTk6MDcsIFJpY2hhcmQgQmllbmVyIHdyb3RlOg0KPiBPbiBXZWQs IE9jdCAyNiwgMjAyMiBhdCAxMDozOSBBTSA8YXJ0aHVyLmNvaGVuQGVtYmVjb3NtLmNvbT4g d3JvdGU6DQo+Pg0KPj4gRnJvbTogUGhpbGlwIEhlcnJvbiA8cGhpbGlwLmhlcnJvbkBlbWJl Y29zbS5jb20+DQo+Pg0KPj4gVGhpcyBwYXRjaCBpbXBsZW1lbnRzIHRoZSBsb3dlcmluZyBt ZW50aW9ubmVkIGluIHRoZSBwcmV2aW91cyBwYXRjaCBmb3IgYWxsIEhJUiBub2Rlcy4NCj4+ DQo+PiBDby1hdXRob3JlZC1ieTogRGF2aWQgRmF1c3QgPGRhdmlkLmZhdXN0QG9yYWNsZS5j b20+DQo+PiAtLS0NCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtYmxvY2su Y2MgICAgICAgIHwgIDE1OCArDQo+PiAgIGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxl LWJsb2NrLmggICAgICAgICB8ICAyMTEgKysNCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9ydXN0 LWNvbXBpbGUtZXhwci5jYyAgICAgICAgIHwgMjc2NCArKysrKysrKysrKysrKysrKw0KPj4g ICBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1leHByLmggICAgICAgICAgfCAgMTQ4 ICsNCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtZXh0ZXJuLmggICAgICAg IHwgIDE3MiArDQo+PiAgIGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWZucGFyYW0u Y2MgICAgICB8ICAxMjEgKw0KPj4gICBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1m bnBhcmFtLmggICAgICAgfCAgIDcwICsNCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNv bXBpbGUtaW1wbGl0ZW0uY2MgICAgIHwgIDEwMSArDQo+PiAgIGdjYy9ydXN0L2JhY2tlbmQv cnVzdC1jb21waWxlLWltcGxpdGVtLmggICAgICB8ICAgOTEgKw0KPj4gICBnY2MvcnVzdC9i YWNrZW5kL3J1c3QtY29tcGlsZS1pbnRyaW5zaWMuY2MgICAgfCAgNTE1ICsrKw0KPj4gICBn Y2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1pbnRyaW5zaWMuaCAgICAgfCAgIDQwICsN Cj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtaXRlbS5jYyAgICAgICAgIHwg IDIwNiArKw0KPj4gICBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1pdGVtLmggICAg ICAgICAgfCAgIDg4ICsNCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtcGF0 dGVybi5jYyAgICAgIHwgIDMzMyArKw0KPj4gICBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29t cGlsZS1wYXR0ZXJuLmggICAgICAgfCAgIDk1ICsNCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9y dXN0LWNvbXBpbGUtcmVzb2x2ZS1wYXRoLmNjIHwgIDMwMSArKw0KPj4gICBnY2MvcnVzdC9i YWNrZW5kL3J1c3QtY29tcGlsZS1yZXNvbHZlLXBhdGguaCAgfCAgIDczICsNCj4+ICAgZ2Nj L3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtc3RtdC5jYyAgICAgICAgIHwgIDExNSArDQo+ PiAgIGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLXN0bXQuaCAgICAgICAgICB8ICAg NjkgKw0KPj4gICAuLi4vYmFja2VuZC9ydXN0LWNvbXBpbGUtc3RydWN0LWZpZWxkLWV4cHIu Y2MgfCAgIDgxICsNCj4+ICAgLi4uL2JhY2tlbmQvcnVzdC1jb21waWxlLXN0cnVjdC1maWVs ZC1leHByLmggIHwgICA0NiArDQo+PiAgIGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxl LXR5cGUuY2MgICAgICAgICB8ICA3MTMgKysrKysNCj4+ICAgZ2NjL3J1c3QvYmFja2VuZC9y dXN0LWNvbXBpbGUtdHlwZS5oICAgICAgICAgIHwgICA3OSArDQo+PiAgIGdjYy9ydXN0L2Jh Y2tlbmQvcnVzdC1jb21waWxlLXZhci1kZWNsLmggICAgICB8ICAgOTUgKw0KPj4gICAyNCBm aWxlcyBjaGFuZ2VkLCA2Njg1IGluc2VydGlvbnMoKykNCj4+ICAgY3JlYXRlIG1vZGUgMTAw NjQ0IGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWJsb2NrLmNjDQo+PiAgIGNyZWF0 ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1ibG9jay5oDQo+ PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1l eHByLmNjDQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3Qt Y29tcGlsZS1leHByLmgNCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0L2JhY2tl bmQvcnVzdC1jb21waWxlLWV4dGVybi5oDQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2Mv cnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1mbnBhcmFtLmNjDQo+PiAgIGNyZWF0ZSBtb2Rl IDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1mbnBhcmFtLmgNCj4+ICAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWltcGxp dGVtLmNjDQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3Qt Y29tcGlsZS1pbXBsaXRlbS5oDQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9i YWNrZW5kL3J1c3QtY29tcGlsZS1pbnRyaW5zaWMuY2MNCj4+ICAgY3JlYXRlIG1vZGUgMTAw NjQ0IGdjYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWludHJpbnNpYy5oDQo+PiAgIGNy ZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1pdGVtLmNj DQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGls ZS1pdGVtLmgNCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0L2JhY2tlbmQvcnVz dC1jb21waWxlLXBhdHRlcm4uY2MNCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy9ydXN0 L2JhY2tlbmQvcnVzdC1jb21waWxlLXBhdHRlcm4uaA0KPj4gICBjcmVhdGUgbW9kZSAxMDA2 NDQgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtcmVzb2x2ZS1wYXRoLmNjDQo+PiAg IGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1yZXNv bHZlLXBhdGguaA0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvYmFja2VuZC9y dXN0LWNvbXBpbGUtc3RtdC5jYw0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3Qv YmFja2VuZC9ydXN0LWNvbXBpbGUtc3RtdC5oDQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBn Y2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1zdHJ1Y3QtZmllbGQtZXhwci5jYw0KPj4g ICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtc3Ry dWN0LWZpZWxkLWV4cHIuaA0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3J1c3QvYmFj a2VuZC9ydXN0LWNvbXBpbGUtdHlwZS5jYw0KPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZ2Nj L3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtdHlwZS5oDQo+PiAgIGNyZWF0ZSBtb2RlIDEw MDY0NCBnY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS12YXItZGVjbC5oDQo+Pg0KPj4g ZGlmZiAtLWdpdCBhL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWJsb2NrLmNjIGIv Z2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtYmxvY2suY2MNCj4+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uOTk2NzRlMmQxZTcNCj4+IC0tLSAv ZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWJsb2Nr LmNjDQo+PiBAQCAtMCwwICsxLDE1OCBAQA0KPj4gKy8vIENvcHlyaWdodCAoQykgMjAyMC0y MDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4gKw0KPj4gKy8vIFRoaXMg ZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KPj4g Ky8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy IHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsvLyB2ZXJz aW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBv cg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFpbHMuDQo+ PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRo ZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWJsb2Nr LmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1zdG10LmgiDQo+PiArI2luY2x1ZGUg InJ1c3QtY29tcGlsZS1leHByLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4g K25hbWVzcGFjZSBDb21waWxlIHsNCj4+ICsNCj4+ICtDb21waWxlQmxvY2s6OkNvbXBpbGVC bG9jayAoQ29udGV4dCAqY3R4LCBCdmFyaWFibGUgKnJlc3VsdCkNCj4+ICsgIDogSElSQ29t cGlsZUJhc2UgKGN0eCksIHRyYW5zbGF0ZWQgKG51bGxwdHIpLCByZXN1bHQgKHJlc3VsdCkN Cj4+ICt7fQ0KPj4gKw0KPj4gK3RyZWUNCj4+ICtDb21waWxlQmxvY2s6OmNvbXBpbGUgKEhJ Ujo6QmxvY2tFeHByICpleHByLCBDb250ZXh0ICpjdHgsIEJ2YXJpYWJsZSAqcmVzdWx0KQ0K Pj4gK3sNCj4+ICsgIENvbXBpbGVCbG9jayBjb21waWxlciAoY3R4LCByZXN1bHQpOw0KPj4g KyAgY29tcGlsZXIudmlzaXQgKCpleHByKTsNCj4+ICsgIHJldHVybiBjb21waWxlci50cmFu c2xhdGVkOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUJsb2NrOjp2aXNp dCAoSElSOjpCbG9ja0V4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgZm5jb250ZXh0IGZuY3R4 ID0gY3R4LT5wZWVrX2ZuICgpOw0KPj4gKyAgdHJlZSBmbmRlY2wgPSBmbmN0eC5mbmRlY2w7 DQo+PiArICBMb2NhdGlvbiBzdGFydF9sb2NhdGlvbiA9IGV4cHIuZ2V0X2xvY3VzICgpOw0K Pj4gKyAgTG9jYXRpb24gZW5kX2xvY2F0aW9uID0gZXhwci5nZXRfZW5kX2xvY3VzICgpOw0K Pj4gKyAgYXV0byBib2R5X21hcHBpbmdzID0gZXhwci5nZXRfbWFwcGluZ3MgKCk7DQo+PiAr DQo+PiArICBSZXNvbHZlcjo6UmliICpyaWIgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFjdHgt PmdldF9yZXNvbHZlciAoKS0+ZmluZF9uYW1lX3JpYiAoYm9keV9tYXBwaW5ncy5nZXRfbm9k ZWlkICgpLCAmcmliKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZmF0YWxfZXJyb3Ig KGV4cHIuZ2V0X2xvY3VzICgpLCAiZmFpbGVkIHRvIHNldHVwIGxvY2FscyBwZXIgYmxvY2si KTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHN0ZDo6dmVj dG9yPEJ2YXJpYWJsZSAqPiBsb2NhbHMNCj4+ICsgICAgPSBjb21waWxlX2xvY2Fsc19mb3Jf YmxvY2sgKGN0eCwgKnJpYiwgZm5kZWNsKTsNCj4+ICsNCj4+ICsgIHRyZWUgZW5jbG9zaW5n X3Njb3BlID0gY3R4LT5wZWVrX2VuY2xvc2luZ19zY29wZSAoKTsNCj4+ICsgIHRyZWUgbmV3 X2Jsb2NrID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+YmxvY2sgKGZuZGVjbCwgZW5jbG9zaW5n X3Njb3BlLCBsb2NhbHMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0YXJ0X2xvY2F0aW9uLCBlbmRfbG9jYXRpb24pOw0KPj4gKyAgY3R4 LT5wdXNoX2Jsb2NrIChuZXdfYmxvY2spOw0KPj4gKw0KPj4gKyAgZm9yIChhdXRvICZzIDog ZXhwci5nZXRfc3RhdGVtZW50cyAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gY29t cGlsZWRfZXhwciA9IENvbXBpbGVTdG10OjpDb21waWxlIChzLmdldCAoKSwgY3R4KTsNCj4+ ICsgICAgICBpZiAoY29tcGlsZWRfZXhwciAhPSBudWxscHRyKQ0KPj4gKyAgICAgICB7DQo+ PiArICAgICAgICAgdHJlZSBzID0gY29udmVydF90b192b2lkIChjb21waWxlZF9leHByLCBJ Q1ZfU1RBVEVNRU5UKTsNCj4+ICsgICAgICAgICBjdHgtPmFkZF9zdGF0ZW1lbnQgKHMpOw0K Pj4gKyAgICAgICB9DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGlmIChleHByLmhhc19leHBy ICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgLy8gdGhlIHByZXZpb3VzIHBhc3NlcyB3aWxs IGVuc3VyZSB0aGlzIGlzIGEgdmFsaWQgcmV0dXJuIG9yDQo+PiArICAgICAgLy8gYSB2YWxp ZCB0cmFpbGluZyBleHByZXNzaW9uDQo+PiArICAgICAgdHJlZSBjb21waWxlZF9leHByID0g Q29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4cHIuZXhwci5nZXQgKCksIGN0eCk7DQo+PiArICAg ICAgaWYgKGNvbXBpbGVkX2V4cHIgIT0gbnVsbHB0cikNCj4+ICsgICAgICAgew0KPj4gKyAg ICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikNCj4+ICsgICAgICAgICAgIHsNCj4+ICsg ICAgICAgICAgICAgY3R4LT5hZGRfc3RhdGVtZW50IChjb21waWxlZF9leHByKTsNCj4+ICsg ICAgICAgICAgIH0NCj4+ICsgICAgICAgICBlbHNlDQo+PiArICAgICAgICAgICB7DQo+PiAr ICAgICAgICAgICAgIHRyZWUgcmVzdWx0X3JlZmVyZW5jZSA9IGN0eC0+Z2V0X2JhY2tlbmQg KCktPnZhcl9leHByZXNzaW9uICgNCj4+ICsgICAgICAgICAgICAgICByZXN1bHQsIGV4cHIu Z2V0X2ZpbmFsX2V4cHIgKCktPmdldF9sb2N1cyAoKSk7DQo+PiArDQo+PiArICAgICAgICAg ICAgIHRyZWUgYXNzaWdubWVudA0KPj4gKyAgICAgICAgICAgICAgID0gY3R4LT5nZXRfYmFj a2VuZCAoKS0+YXNzaWdubWVudF9zdGF0ZW1lbnQgKHJlc3VsdF9yZWZlcmVuY2UsDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29tcGlsZWRfZXhwciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdldF9sb2N1cyAoKSk7DQo+ PiArICAgICAgICAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAoYXNzaWdubWVudCk7DQo+PiAr ICAgICAgICAgICB9DQo+PiArICAgICAgIH0NCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgY3R4 LT5wb3BfYmxvY2sgKCk7DQo+PiArICB0cmFuc2xhdGVkID0gbmV3X2Jsb2NrOw0KPj4gK30N Cj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUNvbmRpdGlvbmFsQmxvY2tzOjp2aXNpdCAo SElSOjpJZkV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgZm5jb250ZXh0IGZuY3R4ID0gY3R4 LT5wZWVrX2ZuICgpOw0KPj4gKyAgdHJlZSBmbmRlY2wgPSBmbmN0eC5mbmRlY2w7DQo+PiAr ICB0cmVlIGNvbmRpdGlvbl9leHByID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4cHIuZ2V0 X2lmX2NvbmRpdGlvbiAoKSwgY3R4KTsNCj4+ICsgIHRyZWUgdGhlbl9ibG9jayA9IENvbXBp bGVCbG9jazo6Y29tcGlsZSAoZXhwci5nZXRfaWZfYmxvY2sgKCksIGN0eCwgcmVzdWx0KTsN Cj4+ICsNCj4+ICsgIHRyYW5zbGF0ZWQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgp LT5pZl9zdGF0ZW1lbnQgKGZuZGVjbCwgY29uZGl0aW9uX2V4cHIsIHRoZW5fYmxvY2ssDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGV4cHIu Z2V0X2xvY3VzICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVDb25k aXRpb25hbEJsb2Nrczo6dmlzaXQgKEhJUjo6SWZFeHByQ29uc2VxRWxzZSAmZXhwcikNCj4+ ICt7DQo+PiArICBmbmNvbnRleHQgZm5jdHggPSBjdHgtPnBlZWtfZm4gKCk7DQo+PiArICB0 cmVlIGZuZGVjbCA9IGZuY3R4LmZuZGVjbDsNCj4+ICsgIHRyZWUgY29uZGl0aW9uX2V4cHIg PSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfaWZfY29uZGl0aW9uICgpLCBjdHgp Ow0KPj4gKyAgdHJlZSB0aGVuX2Jsb2NrID0gQ29tcGlsZUJsb2NrOjpjb21waWxlIChleHBy LmdldF9pZl9ibG9jayAoKSwgY3R4LCByZXN1bHQpOw0KPj4gKyAgdHJlZSBlbHNlX2Jsb2Nr ID0gQ29tcGlsZUJsb2NrOjpjb21waWxlIChleHByLmdldF9lbHNlX2Jsb2NrICgpLCBjdHgs IHJlc3VsdCk7DQo+PiArDQo+PiArICB0cmFuc2xhdGVkDQo+PiArICAgID0gY3R4LT5nZXRf YmFja2VuZCAoKS0+aWZfc3RhdGVtZW50IChmbmRlY2wsIGNvbmRpdGlvbl9leHByLCB0aGVu X2Jsb2NrLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl bHNlX2Jsb2NrLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQN Cj4+ICtDb21waWxlQ29uZGl0aW9uYWxCbG9ja3M6OnZpc2l0IChISVI6OklmRXhwckNvbnNl cUlmICZleHByKQ0KPj4gK3sNCj4+ICsgIGZuY29udGV4dCBmbmN0eCA9IGN0eC0+cGVla19m biAoKTsNCj4+ICsgIHRyZWUgZm5kZWNsID0gZm5jdHguZm5kZWNsOw0KPj4gKyAgdHJlZSBj b25kaXRpb25fZXhwciA9IENvbXBpbGVFeHByOjpDb21waWxlIChleHByLmdldF9pZl9jb25k aXRpb24gKCksIGN0eCk7DQo+PiArICB0cmVlIHRoZW5fYmxvY2sgPSBDb21waWxlQmxvY2s6 OmNvbXBpbGUgKGV4cHIuZ2V0X2lmX2Jsb2NrICgpLCBjdHgsIHJlc3VsdCk7DQo+PiArDQo+ PiArICAvLyBlbHNlIGJsb2NrDQo+PiArICBzdGQ6OnZlY3RvcjxCdmFyaWFibGUgKj4gbG9j YWxzOw0KPj4gKyAgTG9jYXRpb24gc3RhcnRfbG9jYXRpb24gPSBleHByLmdldF9jb25zZXFf aWZfZXhwciAoKS0+Z2V0X2xvY3VzICgpOw0KPj4gKyAgTG9jYXRpb24gZW5kX2xvY2F0aW9u ID0gZXhwci5nZXRfY29uc2VxX2lmX2V4cHIgKCktPmdldF9sb2N1cyAoKTsgLy8gRklYTUUN Cj4+ICsgIHRyZWUgZW5jbG9zaW5nX3Njb3BlID0gY3R4LT5wZWVrX2VuY2xvc2luZ19zY29w ZSAoKTsNCj4+ICsgIHRyZWUgZWxzZV9ibG9jayA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmJs b2NrIChmbmRlY2wsIGVuY2xvc2luZ19zY29wZSwgbG9jYWxzLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbG9jYXRpb24sIGVu ZF9sb2NhdGlvbik7DQo+PiArICBjdHgtPnB1c2hfYmxvY2sgKGVsc2VfYmxvY2spOw0KPj4g Kw0KPj4gKyAgdHJlZSBlbHNlX3N0bXRfZGVjbA0KPj4gKyAgICA9IENvbXBpbGVDb25kaXRp b25hbEJsb2Nrczo6Y29tcGlsZSAoZXhwci5nZXRfY29uc2VxX2lmX2V4cHIgKCksIGN0eCwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsN Cj4+ICsgIGN0eC0+YWRkX3N0YXRlbWVudCAoZWxzZV9zdG10X2RlY2wpOw0KPj4gKw0KPj4g KyAgY3R4LT5wb3BfYmxvY2sgKCk7DQo+PiArDQo+PiArICB0cmFuc2xhdGVkDQo+PiArICAg ID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+aWZfc3RhdGVtZW50IChmbmRlY2wsIGNvbmRpdGlv bl9leHByLCB0aGVuX2Jsb2NrLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBlbHNlX2Jsb2NrLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArfQ0KPj4g Kw0KPj4gK30gLy8gbmFtZXNwYWNlIENvbXBpbGUNCj4+ICt9IC8vIG5hbWVzcGFjZSBSdXN0 DQo+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtYmxvY2su aCBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWJsb2NrLmgNCj4+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uY2RkMTdmMTljYTINCj4+IC0t LSAvZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWJs b2NrLmgNCj4+IEBAIC0wLDAgKzEsMjExIEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIw LTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhp cyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+ PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBw dWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZl cnNpb24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZ IG9yDQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4N Cj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUg dGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251 Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpZm5kZWYgUlVTVF9DT01QSUxFX0JMT0NL DQo+PiArI2RlZmluZSBSVVNUX0NPTVBJTEVfQkxPQ0sNCj4+ICsNCj4+ICsjaW5jbHVkZSAi cnVzdC1jb21waWxlLWJhc2UuaCINCj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiAr bmFtZXNwYWNlIENvbXBpbGUgew0KPj4gKw0KPj4gK2NsYXNzIENvbXBpbGVCbG9jayA6IHBy aXZhdGUgSElSQ29tcGlsZUJhc2UNCj4+ICt7DQo+PiArcHVibGljOg0KPj4gKyAgc3RhdGlj IHRyZWUgY29tcGlsZSAoSElSOjpCbG9ja0V4cHIgKmV4cHIsIENvbnRleHQgKmN0eCwgQnZh cmlhYmxlICpyZXN1bHQpOw0KPj4gKw0KPj4gK3Byb3RlY3RlZDoNCj4+ICsgIHZvaWQgdmlz aXQgKEhJUjo6QmxvY2tFeHByICZleHByKTsNCj4+ICsNCj4+ICtwcml2YXRlOg0KPj4gKyAg Q29tcGlsZUJsb2NrIChDb250ZXh0ICpjdHgsIEJ2YXJpYWJsZSAqcmVzdWx0KTsNCj4+ICsN Cj4+ICsgIHRyZWUgdHJhbnNsYXRlZDsNCj4+ICsgIEJ2YXJpYWJsZSAqcmVzdWx0Ow0KPj4g K307DQo+PiArDQo+PiArY2xhc3MgQ29tcGlsZUNvbmRpdGlvbmFsQmxvY2tzIDogcHVibGlj IEhJUkNvbXBpbGVCYXNlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cHVibGljIEhJUjo6SElSRXhwcmVzc2lvblZpc2l0b3INCj4+ICt7DQo+PiArcHVibGljOg0K Pj4gKyAgc3RhdGljIHRyZWUgY29tcGlsZSAoSElSOjpJZkV4cHIgKmV4cHIsIENvbnRleHQg KmN0eCwgQnZhcmlhYmxlICpyZXN1bHQpDQo+PiArICB7DQo+PiArICAgIENvbXBpbGVDb25k aXRpb25hbEJsb2NrcyByZXNvbHZlciAoY3R4LCByZXN1bHQpOw0KPj4gKyAgICBleHByLT5h Y2NlcHRfdmlzIChyZXNvbHZlcik7DQo+PiArICAgIHJldHVybiByZXNvbHZlci50cmFuc2xh dGVkOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpJZkV4cHIgJmV4 cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpJZkV4cHJDb25zZXFFbHNl ICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6SWZFeHByQ29uc2Vx SWYgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKw0KPj4gKyAgLy8gRW1wdHkgdmlzaXQgZm9yIHVu dXNlZCBFeHByZXNzaW9uIEhJUiBub2Rlcy4NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UGF0 aEluRXhwcmVzc2lvbiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpR dWFsaWZpZWRQYXRoSW5FeHByZXNzaW9uICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZp c2l0IChISVI6OkNsb3N1cmVFeHBySW5uZXIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQg dmlzaXQgKEhJUjo6Q2xvc3VyZUV4cHJJbm5lclR5cGVkICYpIG92ZXJyaWRlIHt9DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OlN0cnVjdEV4cHJGaWVsZElkZW50aWZpZXIgJikgb3ZlcnJp ZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6U3RydWN0RXhwckZpZWxkSWRlbnRpZmll clZhbHVlICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlN0cnVjdEV4 cHJGaWVsZEluZGV4VmFsdWUgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJ Ujo6U3RydWN0RXhwclN0cnVjdCAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpTdHJ1Y3RFeHByU3RydWN0RmllbGRzICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lk IHZpc2l0IChISVI6OkxpdGVyYWxFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZp c2l0IChISVI6OkJvcnJvd0V4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6RGVyZWZlcmVuY2VFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0 IChISVI6OkVycm9yUHJvcGFnYXRpb25FeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lk IHZpc2l0IChISVI6Ok5lZ2F0aW9uRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2 aXNpdCAoSElSOjpBcml0aG1ldGljT3JMb2dpY2FsRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4g KyAgdm9pZCB2aXNpdCAoSElSOjpDb21wYXJpc29uRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4g KyAgdm9pZCB2aXNpdCAoSElSOjpMYXp5Qm9vbGVhbkV4cHIgJikgb3ZlcnJpZGUge30NCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6VHlwZUNhc3RFeHByICYpIG92ZXJyaWRlIHt9DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OkFzc2lnbm1lbnRFeHByICYpIG92ZXJyaWRlIHt9DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OkNvbXBvdW5kQXNzaWdubWVudEV4cHIgJikgb3ZlcnJpZGUg e30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6R3JvdXBlZEV4cHIgJikgb3ZlcnJpZGUge30N Cj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6QXJyYXlFeHByICYpIG92ZXJyaWRlIHt9DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OkFycmF5SW5kZXhFeHByICYpIG92ZXJyaWRlIHt9DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OlR1cGxlRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9p ZCB2aXNpdCAoSElSOjpUdXBsZUluZGV4RXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9p ZCB2aXNpdCAoSElSOjpDYWxsRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNp dCAoSElSOjpNZXRob2RDYWxsRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNp dCAoSElSOjpGaWVsZEFjY2Vzc0V4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlz aXQgKEhJUjo6QmxvY2tFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChI SVI6OkNvbnRpbnVlRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElS OjpCcmVha0V4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFu Z2VGcm9tVG9FeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlJh bmdlRnJvbUV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFu Z2VUb0V4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFuZ2VG dWxsRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpSYW5nZUZy b21Ub0luY2xFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlJh bmdlVG9JbmNsRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpS ZXR1cm5FeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlVuc2Fm ZUJsb2NrRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpMb29w RXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpXaGlsZUxvb3BF eHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OldoaWxlTGV0TG9v cEV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6Rm9yTG9vcEV4 cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6SWZFeHByQ29uc2Vx SWZMZXQgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6SWZMZXRFeHBy ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklmTGV0RXhwckNvbnNl cUVsc2UgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6SWZMZXRFeHBy Q29uc2VxSWYgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6SWZMZXRF eHByQ29uc2VxSWZMZXQgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 TWF0Y2hFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkF3YWl0 RXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpBc3luY0Jsb2Nr RXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKw0KPj4gK3ByaXZhdGU6DQo+PiArICBDb21waWxl Q29uZGl0aW9uYWxCbG9ja3MgKENvbnRleHQgKmN0eCwgQnZhcmlhYmxlICpyZXN1bHQpDQo+ PiArICAgIDogSElSQ29tcGlsZUJhc2UgKGN0eCksIHRyYW5zbGF0ZWQgKG51bGxwdHIpLCBy ZXN1bHQgKHJlc3VsdCkNCj4+ICsgIHt9DQo+PiArDQo+PiArICB0cmVlIHRyYW5zbGF0ZWQ7 DQo+PiArICBCdmFyaWFibGUgKnJlc3VsdDsNCj4+ICt9Ow0KPj4gKw0KPj4gK2NsYXNzIENv bXBpbGVFeHByV2l0aEJsb2NrIDogcHVibGljIEhJUkNvbXBpbGVCYXNlLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSElSOjpISVJFeHByZXNzaW9uVmlzaXRv cg0KPj4gK3sNCj4+ICtwdWJsaWM6DQo+PiArICBzdGF0aWMgdHJlZSBjb21waWxlIChISVI6 OkV4cHJXaXRoQmxvY2sgKmV4cHIsIENvbnRleHQgKmN0eCwNCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgQnZhcmlhYmxlICpyZXN1bHQpDQo+PiArICB7DQo+PiArICAgIENvbXBpbGVF eHByV2l0aEJsb2NrIHJlc29sdmVyIChjdHgsIHJlc3VsdCk7DQo+PiArICAgIGV4cHItPmFj Y2VwdF92aXMgKHJlc29sdmVyKTsNCj4+ICsgICAgcmV0dXJuIHJlc29sdmVyLnRyYW5zbGF0 ZWQ7DQo+PiArICB9DQo+PiArDQo+PiArICB2b2lkIHZpc2l0IChISVI6OklmRXhwciAmZXhw cikgb3ZlcnJpZGUNCj4+ICsgIHsNCj4+ICsgICAgdHJhbnNsYXRlZCA9IENvbXBpbGVDb25k aXRpb25hbEJsb2Nrczo6Y29tcGlsZSAoJmV4cHIsIGN0eCwgcmVzdWx0KTsNCj4+ICsgIH0N Cj4+ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6SWZFeHByQ29uc2VxRWxzZSAmZXhwcikg b3ZlcnJpZGUNCj4+ICsgIHsNCj4+ICsgICAgdHJhbnNsYXRlZCA9IENvbXBpbGVDb25kaXRp b25hbEJsb2Nrczo6Y29tcGlsZSAoJmV4cHIsIGN0eCwgcmVzdWx0KTsNCj4+ICsgIH0NCj4+ ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6SWZFeHByQ29uc2VxSWYgJmV4cHIpIG92ZXJy aWRlDQo+PiArICB7DQo+PiArICAgIHRyYW5zbGF0ZWQgPSBDb21waWxlQ29uZGl0aW9uYWxC bG9ja3M6OmNvbXBpbGUgKCZleHByLCBjdHgsIHJlc3VsdCk7DQo+PiArICB9DQo+PiArDQo+ PiArICAvLyBFbXB0eSB2aXNpdCBmb3IgdW51c2VkIEV4cHJlc3Npb24gSElSIG5vZGVzLg0K Pj4gKyAgdm9pZCB2aXNpdCAoSElSOjpQYXRoSW5FeHByZXNzaW9uICYpIG92ZXJyaWRlIHt9 DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlF1YWxpZmllZFBhdGhJbkV4cHJlc3Npb24gJikg b3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6Q2xvc3VyZUV4cHJJbm5lciAm KSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpDbG9zdXJlRXhwcklubmVy VHlwZWQgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6U3RydWN0RXhw ckZpZWxkSWRlbnRpZmllciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElS OjpTdHJ1Y3RFeHByRmllbGRJZGVudGlmaWVyVmFsdWUgJikgb3ZlcnJpZGUge30NCj4+ICsg IHZvaWQgdmlzaXQgKEhJUjo6U3RydWN0RXhwckZpZWxkSW5kZXhWYWx1ZSAmKSBvdmVycmlk ZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpTdHJ1Y3RFeHByU3RydWN0ICYpIG92ZXJy aWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlN0cnVjdEV4cHJTdHJ1Y3RGaWVsZHMg Jikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6TGl0ZXJhbEV4cHIgJikg b3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6Qm9ycm93RXhwciAmKSBvdmVy cmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpEZXJlZmVyZW5jZUV4cHIgJikgb3Zl cnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6RXJyb3JQcm9wYWdhdGlvbkV4cHIg Jikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6TmVnYXRpb25FeHByICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkFyaXRobWV0aWNPckxvZ2lj YWxFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkNvbXBhcmlz b25FeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkxhenlCb29s ZWFuRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpUeXBlQ2Fz dEV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6QXNzaWdubWVu dEV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6Q29tcG91bmRB c3NpZ25tZW50RXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpH cm91cGVkRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpBcnJh eUV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6QXJyYXlJbmRl eEV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6VHVwbGVFeHBy ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlR1cGxlSW5kZXhFeHBy ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkNhbGxFeHByICYpIG92 ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6Ok1ldGhvZENhbGxFeHByICYpIG92 ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkZpZWxkQWNjZXNzRXhwciAmKSBv dmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpCbG9ja0V4cHIgJikgb3ZlcnJp ZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6Q29udGludWVFeHByICYpIG92ZXJyaWRl IHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkJyZWFrRXhwciAmKSBvdmVycmlkZSB7fQ0K Pj4gKyAgdm9pZCB2aXNpdCAoSElSOjpSYW5nZUZyb21Ub0V4cHIgJikgb3ZlcnJpZGUge30N Cj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFuZ2VGcm9tRXhwciAmKSBvdmVycmlkZSB7fQ0K Pj4gKyAgdm9pZCB2aXNpdCAoSElSOjpSYW5nZVRvRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4g KyAgdm9pZCB2aXNpdCAoSElSOjpSYW5nZUZ1bGxFeHByICYpIG92ZXJyaWRlIHt9DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OlJhbmdlRnJvbVRvSW5jbEV4cHIgJikgb3ZlcnJpZGUge30N Cj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFuZ2VUb0luY2xFeHByICYpIG92ZXJyaWRlIHt9 DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlJldHVybkV4cHIgJikgb3ZlcnJpZGUge30NCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6VW5zYWZlQmxvY2tFeHByICYpIG92ZXJyaWRlIHt9DQo+ PiArICB2b2lkIHZpc2l0IChISVI6Okxvb3BFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2 b2lkIHZpc2l0IChISVI6OldoaWxlTG9vcEV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZv aWQgdmlzaXQgKEhJUjo6V2hpbGVMZXRMb29wRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpGb3JMb29wRXhwciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9p ZCB2aXNpdCAoSElSOjpJZkV4cHJDb25zZXFJZkxldCAmKSBvdmVycmlkZSB7fQ0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpJZkxldEV4cHIgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQg dmlzaXQgKEhJUjo6SWZMZXRFeHByQ29uc2VxRWxzZSAmKSBvdmVycmlkZSB7fQ0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpJZkxldEV4cHJDb25zZXFJZiAmKSBvdmVycmlkZSB7fQ0KPj4g KyAgdm9pZCB2aXNpdCAoSElSOjpJZkxldEV4cHJDb25zZXFJZkxldCAmKSBvdmVycmlkZSB7 fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpNYXRjaEV4cHIgJikgb3ZlcnJpZGUge30NCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6QXdhaXRFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArICB2 b2lkIHZpc2l0IChISVI6OkFzeW5jQmxvY2tFeHByICYpIG92ZXJyaWRlIHt9DQo+PiArDQo+ PiArcHJpdmF0ZToNCj4+ICsgIENvbXBpbGVFeHByV2l0aEJsb2NrIChDb250ZXh0ICpjdHgs IEJ2YXJpYWJsZSAqcmVzdWx0KQ0KPj4gKyAgICA6IEhJUkNvbXBpbGVCYXNlIChjdHgpLCB0 cmFuc2xhdGVkIChudWxscHRyKSwgcmVzdWx0IChyZXN1bHQpDQo+PiArICB7fQ0KPj4gKw0K Pj4gKyAgdHJlZSB0cmFuc2xhdGVkOw0KPj4gKyAgQnZhcmlhYmxlICpyZXN1bHQ7DQo+PiAr fTsNCj4+ICsNCj4+ICt9IC8vIG5hbWVzcGFjZSBDb21waWxlDQo+PiArfSAvLyBuYW1lc3Bh Y2UgUnVzdA0KPj4gKw0KPj4gKyNlbmRpZiAvLyBSVVNUX0NPTVBJTEVfQkxPQ0sNCj4+IGRp ZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1leHByLmNjIGIvZ2Nj L3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtZXhwci5jYw0KPj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi44NjVhZDI1MGYyYw0KPj4gLS0tIC9kZXYv bnVsbA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtZXhwci5jYw0K Pj4gQEAgLTAsMCArMSwyNzY0IEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhpcyBmaWxl IGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiArLy8g dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZlcnNpb24u DQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+ PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ICsN Cj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZp bGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtZXhwci5oIg0K Pj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtc3RydWN0LWZpZWxkLWV4cHIuaCINCj4+ICsj aW5jbHVkZSAicnVzdC1oaXItdHJhaXQtcmVzb2x2ZS5oIg0KPj4gKyNpbmNsdWRlICJydXN0 LWhpci1wYXRoLXByb2JlLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtaGlyLXR5cGUtYm91bmRz LmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1wYXR0ZXJuLmgiDQo+PiArI2luY2x1 ZGUgInJ1c3QtY29tcGlsZS1yZXNvbHZlLXBhdGguaCINCj4+ICsjaW5jbHVkZSAicnVzdC1j b21waWxlLWJsb2NrLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1pbXBsaXRlbS5o Ig0KPj4gKyNpbmNsdWRlICJydXN0LWNvbnN0ZXhwci5oIg0KPj4gKw0KPj4gKyNpbmNsdWRl ICJmb2xkLWNvbnN0LmgiDQo+PiArI2luY2x1ZGUgInJlYWxtcGZyLmgiDQo+PiArI2luY2x1 ZGUgImNvbnZlcnQuaCINCj4+ICsjaW5jbHVkZSAicHJpbnQtdHJlZS5oIg0KPj4gKw0KPj4g K25hbWVzcGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2UgQ29tcGlsZSB7DQo+PiArDQo+PiAr Q29tcGlsZUV4cHI6OkNvbXBpbGVFeHByIChDb250ZXh0ICpjdHgpDQo+PiArICA6IEhJUkNv bXBpbGVCYXNlIChjdHgpLCB0cmFuc2xhdGVkIChlcnJvcl9tYXJrX25vZGUpDQo+PiAre30N Cj4+ICsNCj4+ICt0cmVlDQo+PiArQ29tcGlsZUV4cHI6OkNvbXBpbGUgKEhJUjo6RXhwciAq ZXhwciwgQ29udGV4dCAqY3R4KQ0KPj4gK3sNCj4+ICsgIENvbXBpbGVFeHByIGNvbXBpbGVy IChjdHgpOw0KPj4gKyAgZXhwci0+YWNjZXB0X3ZpcyAoY29tcGlsZXIpOw0KPj4gKyAgcmV0 dXJuIGNvbXBpbGVyLnRyYW5zbGF0ZWQ7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtD b21waWxlRXhwcjo6dmlzaXQgKEhJUjo6VHVwbGVJbmRleEV4cHIgJmV4cHIpDQo+PiArew0K Pj4gKyAgSElSOjpFeHByICp0dXBsZV9leHByID0gZXhwci5nZXRfdHVwbGVfZXhwciAoKS5n ZXQgKCk7DQo+PiArICBUdXBsZUluZGV4IGluZGV4ID0gZXhwci5nZXRfdHVwbGVfaW5kZXgg KCk7DQo+PiArDQo+PiArICB0cmVlIHJlY2VpdmVyX3JlZiA9IENvbXBpbGVFeHByOjpDb21w aWxlICh0dXBsZV9leHByLCBjdHgpOw0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnR1 cGxlX2V4cHJfdHkgPSBudWxscHRyOw0KPj4gKyAgYm9vbCBvaw0KPj4gKyAgICA9IGN0eC0+ Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAodHVwbGVfZXhwci0+Z2V0X21hcHBpbmdzICgp LmdldF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJnR1cGxlX2V4cHJfdHkpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ ICsgIC8vIGRvIHdlIG5lZWQgdG8gYWRkIGFuIGluZGlyZWN0IHJlZmVyZW5jZQ0KPj4gKyAg aWYgKHR1cGxlX2V4cHJfdHktPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpSRUYp DQo+PiArICAgIHsNCj4+ICsgICAgICB0cmVlIGluZGlyZWN0ID0gaW5kaXJlY3RfZXhwcmVz c2lvbiAocmVjZWl2ZXJfcmVmLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArICAgICAgcmVj ZWl2ZXJfcmVmID0gaW5kaXJlY3Q7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyYW5zbGF0 ZWQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5zdHJ1Y3RfZmllbGRfZXhwcmVz c2lvbiAocmVjZWl2ZXJfcmVmLCBpbmRleCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdldF9sb2N1cyAoKSk7DQo+PiAr fQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6VHVwbGVF eHByICZleHByKQ0KPj4gK3sNCj4+ICsgIGlmIChleHByLmlzX3VuaXQgKCkpDQo+PiArICAg IHsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+dW5pdF9l eHByZXNzaW9uICgpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgVHlUeTo6QmFzZVR5cGUgKnR5dHkgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFjdHgtPmdl dF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKGV4cHIuZ2V0X21hcHBpbmdzICgpLmdldF9oaXJp ZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXR5 KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZmF0YWxfZXJyb3IgKGV4cHIuZ2V0X2xv Y3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgcmVzb2x2ZSB0 eXBlIGZvciB0aGlzIFR1cGxlRXhwciIpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAg fQ0KPj4gKw0KPj4gKyAgdHJlZSB0dXBsZV90eXBlID0gVHlUeVJlc29sdmVDb21waWxlOjpj b21waWxlIChjdHgsIHR5dHkpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKHR1cGxlX3R5cGUgIT0g bnVsbHB0cik7DQo+PiArDQo+PiArICAvLyB0aGlzIGFzc3VtZXMgYWxsIGZpZWxkcyBhcmUg aW4gb3JkZXIgZnJvbSB0eXBlIHJlc29sdXRpb24NCj4+ICsgIHN0ZDo6dmVjdG9yPHRyZWU+ IHZhbHM7DQo+PiArICBmb3IgKGF1dG8gJmVsZW0gOiBleHByLmdldF90dXBsZV9lbGVtcyAo KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gZSA9IENvbXBpbGVFeHByOjpDb21waWxl IChlbGVtLmdldCAoKSwgY3R4KTsNCj4+ICsgICAgICB2YWxzLnB1c2hfYmFjayAoZSk7DQo+ PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyYW5zbGF0ZWQNCj4+ICsgICAgPSBjdHgtPmdldF9i YWNrZW5kICgpLT5jb25zdHJ1Y3Rvcl9leHByZXNzaW9uICh0dXBsZV90eXBlLCBmYWxzZSwg dmFscywgLTEsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQN Cj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6UmV0dXJuRXhwciAmZXhwcikNCj4+ICt7 DQo+PiArICBhdXRvIGZuY29udGV4dCA9IGN0eC0+cGVla19mbiAoKTsNCj4+ICsNCj4+ICsg IHN0ZDo6dmVjdG9yPHRyZWU+IHJldHN0bXRzOw0KPj4gKyAgaWYgKGV4cHIuaGFzX3JldHVy bl9leHByICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgdHJlZSBjb21waWxlZF9leHByID0g Q29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4cHIucmV0dXJuX2V4cHIuZ2V0ICgpLCBjdHgpOw0K Pj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChjb21waWxlZF9leHByICE9IG51bGxwdHIpOw0KPj4g Kw0KPj4gKyAgICAgIHJldHN0bXRzLnB1c2hfYmFjayAoY29tcGlsZWRfZXhwcik7DQo+PiAr ICAgIH0NCj4+ICsNCj4+ICsgIGF1dG8gcyA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnJldHVy bl9zdGF0ZW1lbnQgKGZuY29udGV4dC5mbmRlY2wsIHJldHN0bXRzLA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdldF9sb2N1 cyAoKSk7DQo+PiArICBjdHgtPmFkZF9zdGF0ZW1lbnQgKHMpOw0KPj4gK30NCj4+ICsNCj4+ ICt2b2lkDQo+PiArQ29tcGlsZUV4cHI6OnZpc2l0IChISVI6OkFyaXRobWV0aWNPckxvZ2lj YWxFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIGF1dG8gb3AgPSBleHByLmdldF9leHByX3R5 cGUgKCk7DQo+PiArICBhdXRvIGxocyA9IENvbXBpbGVFeHByOjpDb21waWxlIChleHByLmdl dF9saHMgKCksIGN0eCk7DQo+PiArICBhdXRvIHJocyA9IENvbXBpbGVFeHByOjpDb21waWxl IChleHByLmdldF9yaHMgKCksIGN0eCk7DQo+PiArDQo+PiArICAvLyB0aGlzIG1pZ2h0IGJl IGFuIG9wZXJhdG9yIG92ZXJsb2FkIHNpdHVhdGlvbiBsZXRzIGNoZWNrDQo+PiArICBUeVR5 OjpGblR5cGUgKmZudHlwZTsNCj4+ICsgIGJvb2wgaXNfb3Bfb3ZlcmxvYWQgPSBjdHgtPmdl dF90eWN0eCAoKS0+bG9va3VwX29wZXJhdG9yX292ZXJsb2FkICgNCj4+ICsgICAgZXhwci5n ZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLCAmZm50eXBlKTsNCj4+ICsgIGlmIChpc19v cF9vdmVybG9hZCkNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gbGFuZ19pdGVtX3R5cGUN Cj4+ICsgICAgICAgPSBBbmFseXNpczo6UnVzdExhbmdJdGVtOjpPcGVyYXRvclRvTGFuZ0l0 ZW0gKGV4cHIuZ2V0X2V4cHJfdHlwZSAoKSk7DQo+PiArICAgICAgdHJhbnNsYXRlZCA9IHJl c29sdmVfb3BlcmF0b3Jfb3ZlcmxvYWQgKGxhbmdfaXRlbV90eXBlLCBleHByLCBsaHMsIHJo cywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl eHByLmdldF9saHMgKCksIGV4cHIuZ2V0X3JocyAoKSk7DQo+PiArICAgICAgcmV0dXJuOw0K Pj4gKyAgICB9DQo+PiArDQo+PiArICB0cmFuc2xhdGVkDQo+PiArICAgID0gY3R4LT5nZXRf YmFja2VuZCAoKS0+YXJpdGhtZXRpY19vcl9sb2dpY2FsX2V4cHJlc3Npb24gKG9wLCBsaHMs IHJocywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBleHByLmdldF9sb2N1cyAoKSk7DQo+IA0KPiBIbW0sIHNvICd0 cmFuc2xhdGVkJyBpcyBzb21lIGdsb2JhbCBzdGF0ZT8hICBJIGd1ZXNzIEknbGwgZ2V0IHRv IHNvbWUgbmljZQ0KPiB0b3BsZXZlbCBjb21tZW50IGVsc2V3aGVyZSBleHBsYWluaW5nIGhv dyB0aGUgbG93ZXJpbmcgInZpc2l0IiBwcm9jZXNzIHdvcmtzDQo+IGFuZCBnZW5lcmF0ZXMg R0VORVJJQz8gIFRoZSBjb3JyZXNwb25kaW5nIGhlYWRlciBhdCBsZWFzdCBkb2Vzbid0IGhh dmUgdGhhdC4NCj4gDQoNCmB0cmFuc2xhdGVkYCBpcyBhIG1lbWJlciBvZiBvdXIgYENvbXBp bGVFeHByYCB2aXNpdG9yLiBXZSB1cGRhdGUgaXQgYXMgDQp3ZSBnbyB0aHJvdWdoIHRoZSB2 aXNpdG9yIGFuZCByZXVzZSBpdCBsYXRlciBvbi4NCg0KPj4gK30NCj4+ICsNCj4+ICt2b2lk DQo+PiArQ29tcGlsZUV4cHI6OnZpc2l0IChISVI6OkNvbXBvdW5kQXNzaWdubWVudEV4cHIg JmV4cHIpDQo+PiArew0KPj4gKyAgYXV0byBvcCA9IGV4cHIuZ2V0X2V4cHJfdHlwZSAoKTsN Cj4+ICsgIGF1dG8gbGhzID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4cHIuZ2V0X2xlZnRf ZXhwciAoKS5nZXQgKCksIGN0eCk7DQo+PiArICBhdXRvIHJocyA9IENvbXBpbGVFeHByOjpD b21waWxlIChleHByLmdldF9yaWdodF9leHByICgpLmdldCAoKSwgY3R4KTsNCj4+ICsNCj4+ ICsgIC8vIHRoaXMgbWlnaHQgYmUgYW4gb3BlcmF0b3Igb3ZlcmxvYWQgc2l0dWF0aW9uIGxl dHMgY2hlY2sNCj4+ICsgIFR5VHk6OkZuVHlwZSAqZm50eXBlOw0KPj4gKyAgYm9vbCBpc19v cF9vdmVybG9hZCA9IGN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfb3BlcmF0b3Jfb3Zlcmxv YWQgKA0KPj4gKyAgICBleHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZmbnR5 cGUpOw0KPj4gKyAgaWYgKGlzX29wX292ZXJsb2FkKQ0KPj4gKyAgICB7DQo+PiArICAgICAg YXV0byBsYW5nX2l0ZW1fdHlwZQ0KPj4gKyAgICAgICA9IEFuYWx5c2lzOjpSdXN0TGFuZ0l0 ZW06OkNvbXBvdW5kQXNzaWdubWVudE9wZXJhdG9yVG9MYW5nSXRlbSAoDQo+PiArICAgICAg ICAgZXhwci5nZXRfZXhwcl90eXBlICgpKTsNCj4+ICsgICAgICBhdXRvIGNvbXBvdW5kX2Fz c2lnbm1lbnQNCj4+ICsgICAgICAgPSByZXNvbHZlX29wZXJhdG9yX292ZXJsb2FkIChsYW5n X2l0ZW1fdHlwZSwgZXhwciwgbGhzLCByaHMsDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZXhwci5nZXRfbGVmdF9leHByICgpLmdldCAoKSwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdldF9yaWdodF9leHByICgp LmdldCAoKSk7DQo+PiArICAgICAgY3R4LT5hZGRfc3RhdGVtZW50IChjb21wb3VuZF9hc3Np Z25tZW50KTsNCj4+ICsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ ICsgIGF1dG8gb3BlcmF0b3JfZXhwcg0KPj4gKyAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCkt PmFyaXRobWV0aWNfb3JfbG9naWNhbF9leHByZXNzaW9uIChvcCwgbGhzLCByaHMsDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgdHJlZSBhc3NpZ25tZW50DQo+IA0K PiBPSywgc28gdGhpcyBpcyAndHJlZScgLSB0aGF0IGhlbHBzLiAgQWxsIHRoZSAnYXV0bycg c3R1ZmYganVzdCBtYWtlcw0KPiB0aGluZ3MgcmFuZG9tDQo+IGdpYmJlcmlzaCB0byBhIGNh c3VhbCByZXZpZXdlciA6Lw0KDQpTb3JyeSBhYm91dCB0aGF0LiBJJ2xsIGltcHJvdmUgdGhl IHNpdHVhdGlvbiBlc3BlY2lhbGx5IGluIHRoZSBmaWxlcyANCndoZXJlIHdlIGludGVyYWN0 IHdpdGggR0NDL2NyZWF0ZSBgdHJlZWBzLg0KDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2Vu ZCAoKS0+YXNzaWdubWVudF9zdGF0ZW1lbnQgKGxocywgb3BlcmF0b3JfZXhwciwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdl dF9sb2N1cyAoKSk7DQo+PiArICBjdHgtPmFkZF9zdGF0ZW1lbnQgKGFzc2lnbm1lbnQpOw0K Pj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUV4cHI6OnZpc2l0IChISVI6Ok5l Z2F0aW9uRXhwciAmZXhwcikNCj4+ICt7DQo+PiArICBhdXRvIG9wID0gZXhwci5nZXRfZXhw cl90eXBlICgpOw0KPj4gKyAgYXV0byBuZWdhdGVkX2V4cHIgPSBDb21waWxlRXhwcjo6Q29t cGlsZSAoZXhwci5nZXRfZXhwciAoKS5nZXQgKCksIGN0eCk7DQo+PiArICBhdXRvIGxvY2F0 aW9uID0gZXhwci5nZXRfbG9jdXMgKCk7DQo+PiArDQo+PiArICAvLyB0aGlzIG1pZ2h0IGJl IGFuIG9wZXJhdG9yIG92ZXJsb2FkIHNpdHVhdGlvbiBsZXRzIGNoZWNrDQo+PiArICBUeVR5 OjpGblR5cGUgKmZudHlwZTsNCj4+ICsgIGJvb2wgaXNfb3Bfb3ZlcmxvYWQgPSBjdHgtPmdl dF90eWN0eCAoKS0+bG9va3VwX29wZXJhdG9yX292ZXJsb2FkICgNCj4+ICsgICAgZXhwci5n ZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLCAmZm50eXBlKTsNCj4+ICsgIGlmIChpc19v cF9vdmVybG9hZCkNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gbGFuZ19pdGVtX3R5cGUN Cj4+ICsgICAgICAgPSBBbmFseXNpczo6UnVzdExhbmdJdGVtOjpOZWdhdGlvbk9wZXJhdG9y VG9MYW5nSXRlbSAob3ApOw0KPj4gKyAgICAgIHRyYW5zbGF0ZWQNCj4+ICsgICAgICAgPSBy ZXNvbHZlX29wZXJhdG9yX292ZXJsb2FkIChsYW5nX2l0ZW1fdHlwZSwgZXhwciwgbmVnYXRl ZF9leHByLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxw dHIsIGV4cHIuZ2V0X2V4cHIgKCkuZ2V0ICgpLCBudWxscHRyKTsNCj4+ICsgICAgICByZXR1 cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyYW5zbGF0ZWQNCj4+ICsgICAgPSBjdHgt PmdldF9iYWNrZW5kICgpLT5uZWdhdGlvbl9leHByZXNzaW9uIChvcCwgbmVnYXRlZF9leHBy LCBsb2NhdGlvbik7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6 dmlzaXQgKEhJUjo6Q29tcGFyaXNvbkV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgYXV0byBv cCA9IGV4cHIuZ2V0X2V4cHJfdHlwZSAoKTsNCj4+ICsgIGF1dG8gbGhzID0gQ29tcGlsZUV4 cHI6OkNvbXBpbGUgKGV4cHIuZ2V0X2xocyAoKSwgY3R4KTsNCj4+ICsgIGF1dG8gcmhzID0g Q29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4cHIuZ2V0X3JocyAoKSwgY3R4KTsNCj4+ICsgIGF1 dG8gbG9jYXRpb24gPSBleHByLmdldF9sb2N1cyAoKTsNCj4+ICsNCj4+ICsgIHRyYW5zbGF0 ZWQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5jb21wYXJpc29uX2V4cHJlc3Np b24gKG9wLCBsaHMsIHJocywgbG9jYXRpb24pOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+ PiArQ29tcGlsZUV4cHI6OnZpc2l0IChISVI6OkxhenlCb29sZWFuRXhwciAmZXhwcikNCj4+ ICt7DQo+PiArICBhdXRvIG9wID0gZXhwci5nZXRfZXhwcl90eXBlICgpOw0KPj4gKyAgYXV0 byBsaHMgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfbGhzICgpLCBjdHgpOw0K Pj4gKyAgYXV0byByaHMgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfcmhzICgp LCBjdHgpOw0KPj4gKyAgYXV0byBsb2NhdGlvbiA9IGV4cHIuZ2V0X2xvY3VzICgpOw0KPj4g Kw0KPj4gKyAgdHJhbnNsYXRlZA0KPj4gKyAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmxh enlfYm9vbGVhbl9leHByZXNzaW9uIChvcCwgbGhzLCByaHMsIGxvY2F0aW9uKTsNCj4+ICt9 DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVFeHByOjp2aXNpdCAoSElSOjpUeXBlQ2Fz dEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnR5cGVfdG9fY2Fz dF90b190eSA9IG51bGxwdHI7DQo+PiArICBpZiAoIWN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29r dXBfdHlwZSAoZXhwci5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfdG9fY2FzdF90b190eSkp DQo+PiArICAgIHsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gZXJyb3JfbWFya19ub2RlOw0K Pj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5 cGUgKmNhc3RlZF90eXR5ID0gbnVsbHB0cjsNCj4+ICsgIGlmICghY3R4LT5nZXRfdHljdHgg KCktPmxvb2t1cF90eXBlICgNCj4+ICsgICAgICAgZXhwci5nZXRfY2FzdGVkX2V4cHIgKCkt PmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZjYXN0ZWRfdHl0eSkpDQo+PiArICAg IHsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gZXJyb3JfbWFya19ub2RlOw0KPj4gKyAgICAg IHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgYXV0byB0eXBlX3RvX2Nhc3RfdG8g PSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgdHlwZV90b19jYXN0X3RvX3R5 KTsNCj4+ICsgIGF1dG8gY2FzdGVkX2V4cHIgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhw ci5nZXRfY2FzdGVkX2V4cHIgKCkuZ2V0ICgpLCBjdHgpOw0KPj4gKw0KPj4gKyAgc3RkOjp2 ZWN0b3I8UmVzb2x2ZXI6OkFkanVzdG1lbnQ+ICphZGp1c3RtZW50cyA9IG51bGxwdHI7DQo+ PiArICBib29sIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF9jYXN0X2F1dG9kZXJl Zl9tYXBwaW5ncyAoDQo+PiArICAgIGV4cHIuZ2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAo KSwgJmFkanVzdG1lbnRzKTsNCj4+ICsgIGlmIChvaykNCj4+ICsgICAgew0KPj4gKyAgICAg IGNhc3RlZF9leHByDQo+PiArICAgICAgID0gcmVzb2x2ZV9hZGp1c3RlbWVudHMgKCphZGp1 c3RtZW50cywgY2FzdGVkX2V4cHIsIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICsgICAgfQ0K Pj4gKw0KPj4gKyAgdHJhbnNsYXRlZA0KPj4gKyAgICA9IHR5cGVfY2FzdF9leHByZXNzaW9u ICh0eXBlX3RvX2Nhc3RfdG8sIGNhc3RlZF9leHByLCBleHByLmdldF9sb2N1cyAoKSk7DQo+ PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6SWZF eHByICZleHByKQ0KPj4gK3sNCj4+ICsgIGF1dG8gc3RtdCA9IENvbXBpbGVDb25kaXRpb25h bEJsb2Nrczo6Y29tcGlsZSAoJmV4cHIsIGN0eCwgbnVsbHB0cik7DQo+PiArICBjdHgtPmFk ZF9zdGF0ZW1lbnQgKHN0bXQpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGls ZUV4cHI6OnZpc2l0IChISVI6OklmRXhwckNvbnNlcUVsc2UgJmV4cHIpDQo+PiArew0KPj4g KyAgVHlUeTo6QmFzZVR5cGUgKmlmX3R5cGUgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFjdHgt PmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKGV4cHIuZ2V0X21hcHBpbmdzICgpLmdldF9o aXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZp Zl90eXBlKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0 X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBsb29rdXAg dHlwZSBvZiBJZkV4cHJDb25zZXFFbHNlIik7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAg ICB9DQo+PiArDQo+PiArICBCdmFyaWFibGUgKnRtcCA9IE5VTEw7DQo+PiArICBib29sIG5l ZWRzX3RlbXAgPSAhaWZfdHlwZS0+aXNfdW5pdCAoKTsNCj4+ICsgIGlmIChuZWVkc190ZW1w KQ0KPj4gKyAgICB7DQo+PiArICAgICAgZm5jb250ZXh0IGZuY3R4ID0gY3R4LT5wZWVrX2Zu ICgpOw0KPj4gKyAgICAgIHRyZWUgZW5jbG9zaW5nX3Njb3BlID0gY3R4LT5wZWVrX2VuY2xv c2luZ19zY29wZSAoKTsNCj4+ICsgICAgICB0cmVlIGJsb2NrX3R5cGUgPSBUeVR5UmVzb2x2 ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgaWZfdHlwZSk7DQo+PiArDQo+PiArICAgICAgYm9v bCBpc19hZGRyZXNzX3Rha2VuID0gZmFsc2U7DQo+PiArICAgICAgdHJlZSByZXRfdmFyX3N0 bXQgPSBudWxscHRyOw0KPj4gKyAgICAgIHRtcCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnRl bXBvcmFyeV92YXJpYWJsZSAoDQo+PiArICAgICAgIGZuY3R4LmZuZGVjbCwgZW5jbG9zaW5n X3Njb3BlLCBibG9ja190eXBlLCBOVUxMLCBpc19hZGRyZXNzX3Rha2VuLA0KPj4gKyAgICAg ICBleHByLmdldF9sb2N1cyAoKSwgJnJldF92YXJfc3RtdCk7DQo+PiArICAgICAgY3R4LT5h ZGRfc3RhdGVtZW50IChyZXRfdmFyX3N0bXQpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBh dXRvIHN0bXQgPSBDb21waWxlQ29uZGl0aW9uYWxCbG9ja3M6OmNvbXBpbGUgKCZleHByLCBj dHgsIHRtcCk7DQo+PiArICBjdHgtPmFkZF9zdGF0ZW1lbnQgKHN0bXQpOw0KPj4gKw0KPj4g KyAgaWYgKHRtcCAhPSBOVUxMKQ0KPj4gKyAgICB7DQo+PiArICAgICAgdHJhbnNsYXRlZCA9 IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnZhcl9leHByZXNzaW9uICh0bXAsIGV4cHIuZ2V0X2xv Y3VzICgpKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGls ZUV4cHI6OnZpc2l0IChISVI6OklmRXhwckNvbnNlcUlmICZleHByKQ0KPj4gK3sNCj4+ICsg IFR5VHk6OkJhc2VUeXBlICppZl90eXBlID0gbnVsbHB0cjsNCj4+ICsgIGlmICghY3R4LT5n ZXRfdHljdHggKCktPmxvb2t1cF90eXBlIChleHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGly aWQgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWZf dHlwZSkpDQo+PiArICAgIHsNCj4+ICsgICAgICBydXN0X2Vycm9yX2F0IChleHByLmdldF9s b2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gbG9va3VwIHR5 cGUgb2YgSWZFeHByQ29uc2VxRWxzZSIpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAg fQ0KPj4gKw0KPj4gKyAgQnZhcmlhYmxlICp0bXAgPSBOVUxMOw0KPj4gKyAgYm9vbCBuZWVk c190ZW1wID0gIWlmX3R5cGUtPmlzX3VuaXQgKCk7DQo+PiArICBpZiAobmVlZHNfdGVtcCkN Cj4+ICsgICAgew0KPj4gKyAgICAgIGZuY29udGV4dCBmbmN0eCA9IGN0eC0+cGVla19mbiAo KTsNCj4+ICsgICAgICB0cmVlIGVuY2xvc2luZ19zY29wZSA9IGN0eC0+cGVla19lbmNsb3Np bmdfc2NvcGUgKCk7DQo+PiArICAgICAgdHJlZSBibG9ja190eXBlID0gVHlUeVJlc29sdmVD b21waWxlOjpjb21waWxlIChjdHgsIGlmX3R5cGUpOw0KPj4gKw0KPj4gKyAgICAgIGJvb2wg aXNfYWRkcmVzc190YWtlbiA9IGZhbHNlOw0KPj4gKyAgICAgIHRyZWUgcmV0X3Zhcl9zdG10 ID0gbnVsbHB0cjsNCj4+ICsgICAgICB0bXAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT50ZW1w b3JhcnlfdmFyaWFibGUgKA0KPj4gKyAgICAgICBmbmN0eC5mbmRlY2wsIGVuY2xvc2luZ19z Y29wZSwgYmxvY2tfdHlwZSwgTlVMTCwgaXNfYWRkcmVzc190YWtlbiwNCj4+ICsgICAgICAg ZXhwci5nZXRfbG9jdXMgKCksICZyZXRfdmFyX3N0bXQpOw0KPj4gKyAgICAgIGN0eC0+YWRk X3N0YXRlbWVudCAocmV0X3Zhcl9zdG10KTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgYXV0 byBzdG10ID0gQ29tcGlsZUNvbmRpdGlvbmFsQmxvY2tzOjpjb21waWxlICgmZXhwciwgY3R4 LCB0bXApOw0KPj4gKyAgY3R4LT5hZGRfc3RhdGVtZW50IChzdG10KTsNCj4+ICsNCj4+ICsg IGlmICh0bXAgIT0gTlVMTCkNCj4+ICsgICAgew0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBj dHgtPmdldF9iYWNrZW5kICgpLT52YXJfZXhwcmVzc2lvbiAodG1wLCBleHByLmdldF9sb2N1 cyAoKSk7DQo+PiArICAgIH0NCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVF eHByOjp2aXNpdCAoSElSOjpCbG9ja0V4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgVHlUeTo6 QmFzZVR5cGUgKmJsb2NrX3R5dHkgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFjdHgtPmdldF90 eWN0eCAoKS0+bG9va3VwX3R5cGUgKGV4cHIuZ2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAo KSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja190 eXR5KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X2xv Y3VzICgpLCAiZmFpbGVkIHRvIGxvb2t1cCB0eXBlIG9mIEJsb2NrRXhwciIpOw0KPj4gKyAg ICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgQnZhcmlhYmxlICp0bXAgPSBO VUxMOw0KPj4gKyAgYm9vbCBuZWVkc190ZW1wID0gIWJsb2NrX3R5dHktPmlzX3VuaXQgKCk7 DQo+PiArICBpZiAobmVlZHNfdGVtcCkNCj4+ICsgICAgew0KPj4gKyAgICAgIGZuY29udGV4 dCBmbmN0eCA9IGN0eC0+cGVla19mbiAoKTsNCj4+ICsgICAgICB0cmVlIGVuY2xvc2luZ19z Y29wZSA9IGN0eC0+cGVla19lbmNsb3Npbmdfc2NvcGUgKCk7DQo+PiArICAgICAgdHJlZSBi bG9ja190eXBlID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIGJsb2NrX3R5 dHkpOw0KPj4gKw0KPj4gKyAgICAgIGJvb2wgaXNfYWRkcmVzc190YWtlbiA9IGZhbHNlOw0K Pj4gKyAgICAgIHRyZWUgcmV0X3Zhcl9zdG10ID0gbnVsbHB0cjsNCj4+ICsgICAgICB0bXAg PSBjdHgtPmdldF9iYWNrZW5kICgpLT50ZW1wb3JhcnlfdmFyaWFibGUgKA0KPj4gKyAgICAg ICBmbmN0eC5mbmRlY2wsIGVuY2xvc2luZ19zY29wZSwgYmxvY2tfdHlwZSwgTlVMTCwgaXNf YWRkcmVzc190YWtlbiwNCj4+ICsgICAgICAgZXhwci5nZXRfbG9jdXMgKCksICZyZXRfdmFy X3N0bXQpOw0KPj4gKyAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAocmV0X3Zhcl9zdG10KTsN Cj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgYXV0byBibG9ja19zdG10ID0gQ29tcGlsZUJsb2Nr Ojpjb21waWxlICgmZXhwciwgY3R4LCB0bXApOw0KPj4gKyAgcnVzdF9hc3NlcnQgKFRSRUVf Q09ERSAoYmxvY2tfc3RtdCkgPT0gQklORF9FWFBSKTsNCj4+ICsgIGN0eC0+YWRkX3N0YXRl bWVudCAoYmxvY2tfc3RtdCk7DQo+PiArDQo+PiArICBpZiAodG1wICE9IE5VTEwpDQo+PiAr ICAgIHsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+dmFy X2V4cHJlc3Npb24gKHRtcCwgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICB9DQo+PiAr fQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6VW5zYWZl QmxvY2tFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIGV4cHIuZ2V0X2Jsb2NrX2V4cHIgKCkt PmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBp bGVFeHByOjp2aXNpdCAoSElSOjpTdHJ1Y3RFeHByU3RydWN0ICZzdHJ1Y3RfZXhwcikNCj4+ ICt7DQo+PiArICBUeVR5OjpCYXNlVHlwZSAqdHl0eSA9IG51bGxwdHI7DQo+PiArICBpZiAo IWN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAoc3RydWN0X2V4cHIuZ2V0X21hcHBp bmdzICgpLmdldF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICZ0eXR5KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQg KHN0cnVjdF9leHByLmdldF9sb2N1cyAoKSwgInVua25vd24gdHlwZSIpOw0KPj4gKyAgICAg IHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcnVzdF9hc3NlcnQgKHR5dHktPmlz X3VuaXQgKCkpOw0KPj4gKyAgdHJhbnNsYXRlZCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnVu aXRfZXhwcmVzc2lvbiAoKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVF eHByOjp2aXNpdCAoSElSOjpTdHJ1Y3RFeHByU3RydWN0RmllbGRzICZzdHJ1Y3RfZXhwcikN Cj4+ICt7DQo+PiArICBUeVR5OjpCYXNlVHlwZSAqdHl0eSA9IG51bGxwdHI7DQo+PiArICBp ZiAoIWN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAoc3RydWN0X2V4cHIuZ2V0X21h cHBpbmdzICgpLmdldF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICZ0eXR5KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3Jf YXQgKHN0cnVjdF9leHByLmdldF9sb2N1cyAoKSwgInVua25vd24gdHlwZSIpOw0KPj4gKyAg ICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gaXQgbXVzdCBiZSBhbiBB RFQNCj4+ICsgIHJ1c3RfYXNzZXJ0ICh0eXR5LT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBl S2luZDo6QURUKTsNCj4+ICsgIFR5VHk6OkFEVFR5cGUgKmFkdCA9IHN0YXRpY19jYXN0PFR5 VHk6OkFEVFR5cGUgKj4gKHR5dHkpOw0KPj4gKw0KPj4gKyAgLy8gd2hhdCB2YXJpYW50IGlz IGl0Pw0KPj4gKyAgaW50IHVuaW9uX2Rpc3JpbWluYXRvciA9IHN0cnVjdF9leHByLnVuaW9u X2luZGV4Ow0KPj4gKyAgVHlUeTo6VmFyaWFudERlZiAqdmFyaWFudCA9IG51bGxwdHI7DQo+ PiArICBpZiAoIWFkdC0+aXNfZW51bSAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3Rf YXNzZXJ0IChhZHQtPm51bWJlcl9vZl92YXJpYW50cyAoKSA9PSAxKTsNCj4+ICsgICAgICB2 YXJpYW50ID0gYWR0LT5nZXRfdmFyaWFudHMgKCkuYXQgKDApOw0KPj4gKyAgICB9DQo+PiAr ICBlbHNlDQo+PiArICAgIHsNCj4+ICsgICAgICBIaXJJZCB2YXJpYW50X2lkOw0KPj4gKyAg ICAgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3ZhcmlhbnRfZGVmaW5p dGlvbiAoDQo+PiArICAgICAgIHN0cnVjdF9leHByLmdldF9zdHJ1Y3RfbmFtZSAoKS5nZXRf bWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLA0KPj4gKyAgICAgICAmdmFyaWFudF9pZCk7DQo+ PiArICAgICAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ICsgICAgICBvaw0KPj4gKyAg ICAgICA9IGFkdC0+bG9va3VwX3ZhcmlhbnRfYnlfaWQgKHZhcmlhbnRfaWQsICZ2YXJpYW50 LCAmdW5pb25fZGlzcmltaW5hdG9yKTsNCj4+ICsgICAgICBydXN0X2Fzc2VydCAob2spOw0K Pj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBjb21waWxlIGl0DQo+PiArICB0cmVlIGNvbXBp bGVkX2FkdF90eXBlID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIHR5dHkp Ow0KPj4gKw0KPj4gKyAgc3RkOjp2ZWN0b3I8dHJlZT4gYXJndW1lbnRzOw0KPj4gKyAgaWYg KGFkdC0+aXNfdW5pb24gKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBydXN0X2Fzc2VydCAo c3RydWN0X2V4cHIuZ2V0X2ZpZWxkcyAoKS5zaXplICgpID09IDEpOw0KPj4gKw0KPj4gKyAg ICAgIC8vIGFzc2lnbm1lbnRzIGFyZSBjb2VyY2lvbiBzaXRlcyBzbyBsZXRzIGNvbnZlcnQg dGhlIHJ2YWx1ZSBpZg0KPj4gKyAgICAgIC8vIG5lY2Vzc2FyeQ0KPj4gKyAgICAgIGF1dG8g cmVzcGVjdGl2ZV9maWVsZCA9IHZhcmlhbnQtPmdldF9maWVsZF9hdF9pbmRleCAodW5pb25f ZGlzcmltaW5hdG9yKTsNCj4+ICsgICAgICBhdXRvIGV4cGVjdGVkID0gcmVzcGVjdGl2ZV9m aWVsZC0+Z2V0X2ZpZWxkX3R5cGUgKCk7DQo+PiArDQo+PiArICAgICAgLy8gcHJvY2VzcyBh cmd1bWVudHMNCj4+ICsgICAgICBhdXRvICZhcmd1bWVudCA9IHN0cnVjdF9leHByLmdldF9m aWVsZHMgKCkuYXQgKDApOw0KPj4gKyAgICAgIGF1dG8gbHZhbHVlX2xvY3VzDQo+PiArICAg ICAgID0gY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9sb2NhdGlvbiAoZXhwZWN0ZWQt PmdldF90eV9yZWYgKCkpOw0KPj4gKyAgICAgIGF1dG8gcnZhbHVlX2xvY3VzID0gYXJndW1l bnQtPmdldF9sb2N1cyAoKTsNCj4+ICsgICAgICBhdXRvIHJ2YWx1ZSA9IENvbXBpbGVTdHJ1 Y3RFeHByRmllbGQ6OkNvbXBpbGUgKGFyZ3VtZW50LmdldCAoKSwgY3R4KTsNCj4+ICsNCj4+ ICsgICAgICBUeVR5OjpCYXNlVHlwZSAqYWN0dWFsID0gbnVsbHB0cjsNCj4+ICsgICAgICBi b29sIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlICgNCj4+ICsgICAgICAg YXJndW1lbnQtPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZhY3R1YWwpOw0KPj4g Kw0KPj4gKyAgICAgIGlmIChvaykNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIHJ2YWx1 ZQ0KPj4gKyAgICAgICAgICAgPSBjb2VyY2lvbl9zaXRlIChhcmd1bWVudC0+Z2V0X21hcHBp bmdzICgpLmdldF9oaXJpZCAoKSwgcnZhbHVlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBhY3R1YWwsIGV4cGVjdGVkLCBsdmFsdWVfbG9jdXMsIHJ2YWx1ZV9sb2N1cyk7 DQo+PiArICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAvLyBhZGQgaXQgdG8gdGhlIGxpc3QN Cj4+ICsgICAgICBhcmd1bWVudHMucHVzaF9iYWNrIChydmFsdWUpOw0KPj4gKyAgICB9DQo+ PiArICBlbHNlDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyB0aGlzIGFzc3VtZXMgYWxsIGZp ZWxkcyBhcmUgaW4gb3JkZXIgZnJvbSB0eXBlIHJlc29sdXRpb24gYW5kIGlmIGENCj4+ICsg ICAgICAvLyBiYXNlIHN0cnVjdCB3YXMgc3BlY2lmaWVkIHRob3NlIGZpZWxkcyBhcmUgZmls ZWQgdmlhIGFjY2Vzb3JzDQo+PiArICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJ1 Y3RfZXhwci5nZXRfZmllbGRzICgpLnNpemUgKCk7IGkrKykNCj4+ICsgICAgICAgew0KPj4g KyAgICAgICAgIC8vIGFzc2lnbm1lbnRzIGFyZSBjb2VyY2lvbiBzaXRlcyBzbyBsZXRzIGNv bnZlcnQgdGhlIHJ2YWx1ZSBpZg0KPj4gKyAgICAgICAgIC8vIG5lY2Vzc2FyeQ0KPj4gKyAg ICAgICAgIGF1dG8gcmVzcGVjdGl2ZV9maWVsZCA9IHZhcmlhbnQtPmdldF9maWVsZF9hdF9p bmRleCAoaSk7DQo+PiArICAgICAgICAgYXV0byBleHBlY3RlZCA9IHJlc3BlY3RpdmVfZmll bGQtPmdldF9maWVsZF90eXBlICgpOw0KPj4gKw0KPj4gKyAgICAgICAgIC8vIHByb2Nlc3Mg YXJndW1lbnRzDQo+PiArICAgICAgICAgYXV0byAmYXJndW1lbnQgPSBzdHJ1Y3RfZXhwci5n ZXRfZmllbGRzICgpLmF0IChpKTsNCj4+ICsgICAgICAgICBhdXRvIGx2YWx1ZV9sb2N1cw0K Pj4gKyAgICAgICAgICAgPSBjdHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX2xvY2F0aW9u IChleHBlY3RlZC0+Z2V0X3R5X3JlZiAoKSk7DQo+PiArICAgICAgICAgYXV0byBydmFsdWVf bG9jdXMgPSBhcmd1bWVudC0+Z2V0X2xvY3VzICgpOw0KPj4gKyAgICAgICAgIGF1dG8gcnZh bHVlID0gQ29tcGlsZVN0cnVjdEV4cHJGaWVsZDo6Q29tcGlsZSAoYXJndW1lbnQuZ2V0ICgp LCBjdHgpOw0KPj4gKw0KPj4gKyAgICAgICAgIFR5VHk6OkJhc2VUeXBlICphY3R1YWwgPSBu dWxscHRyOw0KPj4gKyAgICAgICAgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9v a3VwX3R5cGUgKA0KPj4gKyAgICAgICAgICAgYXJndW1lbnQtPmdldF9tYXBwaW5ncyAoKS5n ZXRfaGlyaWQgKCksICZhY3R1YWwpOw0KPj4gKw0KPj4gKyAgICAgICAgIC8vIGNvZXJjZSBp dCBpZiByZXF1aXJlZC9wb3NzaWJsZSBzZWUNCj4+ICsgICAgICAgICAvLyBjb21waWxlL3Rv cnR1cmUvc3RydWN0X2Jhc2VfaW5pdF8xLnJzDQo+PiArICAgICAgICAgaWYgKG9rKQ0KPj4g KyAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAgICBydmFsdWUNCj4+ICsgICAgICAgICAg ICAgICA9IGNvZXJjaW9uX3NpdGUgKGFyZ3VtZW50LT5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hp cmlkICgpLCBydmFsdWUsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh Y3R1YWwsIGV4cGVjdGVkLCBsdmFsdWVfbG9jdXMsIHJ2YWx1ZV9sb2N1cyk7DQo+PiArICAg ICAgICAgICB9DQo+PiArDQo+PiArICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0DQo+ PiArICAgICAgICAgYXJndW1lbnRzLnB1c2hfYmFjayAocnZhbHVlKTsNCj4+ICsgICAgICAg fQ0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyB0aGUgY29uc3RydWN0b3IgZGVwZW5kcyBv biB3aGV0aGVyIHRoaXMgaXMgYWN0dWFsbHkgYW4gZW51bSBvciBub3QgaWYNCj4+ICsgIC8v IGl0cyBhbiBlbnVtIHdlIG5lZWQgdG8gc2V0dXAgdGhlIGRpc2NyaW1pbmF0b3INCj4+ICsg IHN0ZDo6dmVjdG9yPHRyZWU+IGN0b3JfYXJndW1lbnRzOw0KPj4gKyAgaWYgKGFkdC0+aXNf ZW51bSAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIEhJUjo6RXhwciAqZGlzY3JpbV9leHBy ID0gdmFyaWFudC0+Z2V0X2Rpc2NyaW1pbmFudCAoKTsNCj4+ICsgICAgICB0cmVlIGRpc2Ny aW1fZXhwcl9ub2RlID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKGRpc2NyaW1fZXhwciwgY3R4 KTsNCj4+ICsgICAgICB0cmVlIGZvbGRlZF9kaXNjcmltX2V4cHIgPSBmb2xkX2V4cHIgKGRp c2NyaW1fZXhwcl9ub2RlKTsNCj4+ICsgICAgICB0cmVlIHF1YWxpZmllciA9IGZvbGRlZF9k aXNjcmltX2V4cHI7DQo+PiArDQo+PiArICAgICAgY3Rvcl9hcmd1bWVudHMucHVzaF9iYWNr IChxdWFsaWZpZXIpOw0KPj4gKyAgICB9DQo+PiArICBmb3IgKGF1dG8gJmFyZyA6IGFyZ3Vt ZW50cykNCj4+ICsgICAgY3Rvcl9hcmd1bWVudHMucHVzaF9iYWNrIChhcmcpOw0KPj4gKw0K Pj4gKyAgdHJhbnNsYXRlZCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmNvbnN0cnVjdG9yX2V4 cHJlc3Npb24gKA0KPj4gKyAgICBjb21waWxlZF9hZHRfdHlwZSwgYWR0LT5pc19lbnVtICgp LCBjdG9yX2FyZ3VtZW50cywgdW5pb25fZGlzcmltaW5hdG9yLA0KPj4gKyAgICBzdHJ1Y3Rf ZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGls ZUV4cHI6OnZpc2l0IChISVI6Okdyb3VwZWRFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIHRy YW5zbGF0ZWQgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfZXhwcl9pbl9wYXJl bnMgKCkuZ2V0ICgpLCBjdHgpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGls ZUV4cHI6OnZpc2l0IChISVI6OkZpZWxkQWNjZXNzRXhwciAmZXhwcikNCj4+ICt7DQo+PiAr ICBISVI6OkV4cHIgKnJlY2VpdmVyX2V4cHIgPSBleHByLmdldF9yZWNlaXZlcl9leHByICgp LmdldCAoKTsNCj4+ICsgIHRyZWUgcmVjZWl2ZXJfcmVmID0gQ29tcGlsZUV4cHI6OkNvbXBp bGUgKHJlY2VpdmVyX2V4cHIsIGN0eCk7DQo+PiArDQo+PiArICAvLyByZXNvbHZlIHRoZSBy ZWNlaXZlciBiYWNrIHRvIEFEVCB0eXBlDQo+PiArICBUeVR5OjpCYXNlVHlwZSAqcmVjZWl2 ZXIgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5 cGUgKA0KPj4gKyAgICAgICBleHByLmdldF9yZWNlaXZlcl9leHByICgpLT5nZXRfbWFwcGlu Z3MgKCkuZ2V0X2hpcmlkICgpLCAmcmVjZWl2ZXIpKQ0KPj4gKyAgICB7DQo+PiArICAgICAg cnVzdF9lcnJvcl9hdCAoZXhwci5nZXRfcmVjZWl2ZXJfZXhwciAoKS0+Z2V0X2xvY3VzICgp LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgInVucmVzb2x2ZWQgdHlwZSBmb3IgcmVjZWl2 ZXIiKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHNpemVf dCBmaWVsZF9pbmRleCA9IDA7DQo+PiArICBpZiAocmVjZWl2ZXItPmdldF9raW5kICgpID09 IFR5VHk6OlR5cGVLaW5kOjpBRFQpDQo+PiArICAgIHsNCj4+ICsgICAgICBUeVR5OjpBRFRU eXBlICphZHQgPSBzdGF0aWNfY2FzdDxUeVR5OjpBRFRUeXBlICo+IChyZWNlaXZlcik7DQo+ PiArICAgICAgcnVzdF9hc3NlcnQgKCFhZHQtPmlzX2VudW0gKCkpOw0KPj4gKyAgICAgIHJ1 c3RfYXNzZXJ0IChhZHQtPm51bWJlcl9vZl92YXJpYW50cyAoKSA9PSAxKTsNCj4+ICsNCj4+ ICsgICAgICBUeVR5OjpWYXJpYW50RGVmICp2YXJpYW50ID0gYWR0LT5nZXRfdmFyaWFudHMg KCkuYXQgKDApOw0KPj4gKyAgICAgIGJvb2wgb2sNCj4+ICsgICAgICAgPSB2YXJpYW50LT5s b29rdXBfZmllbGQgKGV4cHIuZ2V0X2ZpZWxkX25hbWUgKCksIG51bGxwdHIsICZmaWVsZF9p bmRleCk7DQo+PiArICAgICAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsgICAgfQ0KPj4gKyAg ZWxzZSBpZiAocmVjZWl2ZXItPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpSRUYp DQo+PiArICAgIHsNCj4+ICsgICAgICBUeVR5OjpSZWZlcmVuY2VUeXBlICpyID0gc3RhdGlj X2Nhc3Q8VHlUeTo6UmVmZXJlbmNlVHlwZSAqPiAocmVjZWl2ZXIpOw0KPj4gKyAgICAgIFR5 VHk6OkJhc2VUeXBlICpiID0gci0+Z2V0X2Jhc2UgKCk7DQo+PiArICAgICAgcnVzdF9hc3Nl cnQgKGItPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpBRFQpOw0KPj4gKw0KPj4g KyAgICAgIFR5VHk6OkFEVFR5cGUgKmFkdCA9IHN0YXRpY19jYXN0PFR5VHk6OkFEVFR5cGUg Kj4gKGIpOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0ICghYWR0LT5pc19lbnVtICgpKTsNCj4+ ICsgICAgICBydXN0X2Fzc2VydCAoYWR0LT5udW1iZXJfb2ZfdmFyaWFudHMgKCkgPT0gMSk7 DQo+PiArDQo+PiArICAgICAgVHlUeTo6VmFyaWFudERlZiAqdmFyaWFudCA9IGFkdC0+Z2V0 X3ZhcmlhbnRzICgpLmF0ICgwKTsNCj4+ICsgICAgICBib29sIG9rDQo+PiArICAgICAgID0g dmFyaWFudC0+bG9va3VwX2ZpZWxkIChleHByLmdldF9maWVsZF9uYW1lICgpLCBudWxscHRy LCAmZmllbGRfaW5kZXgpOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+ PiArICAgICAgdHJlZSBpbmRpcmVjdCA9IGluZGlyZWN0X2V4cHJlc3Npb24gKHJlY2VpdmVy X3JlZiwgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICAgIHJlY2VpdmVyX3JlZiA9IGlu ZGlyZWN0Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICB0cmFuc2xhdGVkDQo+PiArICAgID0g Y3R4LT5nZXRfYmFja2VuZCAoKS0+c3RydWN0X2ZpZWxkX2V4cHJlc3Npb24gKHJlY2VpdmVy X3JlZiwgZmllbGRfaW5kZXgsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gK30NCj4+ICsN Cj4+ICt2b2lkDQo+PiArQ29tcGlsZUV4cHI6OnZpc2l0IChISVI6OlF1YWxpZmllZFBhdGhJ bkV4cHJlc3Npb24gJmV4cHIpDQo+PiArew0KPj4gKyAgdHJhbnNsYXRlZCA9IFJlc29sdmVQ YXRoUmVmOjpDb21waWxlIChleHByLCBjdHgpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+ PiArQ29tcGlsZUV4cHI6OnZpc2l0IChISVI6OlBhdGhJbkV4cHJlc3Npb24gJmV4cHIpDQo+ PiArew0KPj4gKyAgdHJhbnNsYXRlZCA9IFJlc29sdmVQYXRoUmVmOjpDb21waWxlIChleHBy LCBjdHgpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUV4cHI6OnZpc2l0 IChISVI6Okxvb3BFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIFR5VHk6OkJhc2VUeXBlICpi bG9ja190eXR5ID0gbnVsbHB0cjsNCj4+ICsgIGlmICghY3R4LT5nZXRfdHljdHggKCktPmxv b2t1cF90eXBlIChleHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksDQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tfdHl0eSkpDQo+PiAr ICAgIHsNCj4+ICsgICAgICBydXN0X2Vycm9yX2F0IChleHByLmdldF9sb2N1cyAoKSwgImZh aWxlZCB0byBsb29rdXAgdHlwZSBvZiBCbG9ja0V4cHIiKTsNCj4+ICsgICAgICByZXR1cm47 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGZuY29udGV4dCBmbmN0eCA9IGN0eC0+cGVla19m biAoKTsNCj4+ICsgIHRyZWUgZW5jbG9zaW5nX3Njb3BlID0gY3R4LT5wZWVrX2VuY2xvc2lu Z19zY29wZSAoKTsNCj4+ICsgIHRyZWUgYmxvY2tfdHlwZSA9IFR5VHlSZXNvbHZlQ29tcGls ZTo6Y29tcGlsZSAoY3R4LCBibG9ja190eXR5KTsNCj4+ICsNCj4+ICsgIGJvb2wgaXNfYWRk cmVzc190YWtlbiA9IGZhbHNlOw0KPj4gKyAgdHJlZSByZXRfdmFyX3N0bXQgPSBOVUxMX1RS RUU7DQo+PiArICBCdmFyaWFibGUgKnRtcCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnRlbXBv cmFyeV92YXJpYWJsZSAoDQo+PiArICAgIGZuY3R4LmZuZGVjbCwgZW5jbG9zaW5nX3Njb3Bl LCBibG9ja190eXBlLCBOVUxMLCBpc19hZGRyZXNzX3Rha2VuLA0KPj4gKyAgICBleHByLmdl dF9sb2N1cyAoKSwgJnJldF92YXJfc3RtdCk7DQo+PiArICBjdHgtPmFkZF9zdGF0ZW1lbnQg KHJldF92YXJfc3RtdCk7DQo+PiArICBjdHgtPnB1c2hfbG9vcF9jb250ZXh0ICh0bXApOw0K Pj4gKw0KPj4gKyAgaWYgKGV4cHIuaGFzX2xvb3BfbGFiZWwgKCkpDQo+PiArICAgIHsNCj4+ ICsgICAgICBISVI6Okxvb3BMYWJlbCAmbG9vcF9sYWJlbCA9IGV4cHIuZ2V0X2xvb3BfbGFi ZWwgKCk7DQo+PiArICAgICAgdHJlZSBsYWJlbA0KPj4gKyAgICAgICA9IGN0eC0+Z2V0X2Jh Y2tlbmQgKCktPmxhYmVsIChmbmN0eC5mbmRlY2wsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGxvb3BfbGFiZWwuZ2V0X2xpZmV0aW1lICgpLmdldF9uYW1l ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wX2xh YmVsLmdldF9sb2N1cyAoKSk7DQo+PiArICAgICAgdHJlZSBsYWJlbF9kZWNsID0gY3R4LT5n ZXRfYmFja2VuZCAoKS0+bGFiZWxfZGVmaW5pdGlvbl9zdGF0ZW1lbnQgKGxhYmVsKTsNCj4+ ICsgICAgICBjdHgtPmFkZF9zdGF0ZW1lbnQgKGxhYmVsX2RlY2wpOw0KPj4gKyAgICAgIGN0 eC0+aW5zZXJ0X2xhYmVsX2RlY2wgKA0KPj4gKyAgICAgICBsb29wX2xhYmVsLmdldF9saWZl dGltZSAoKS5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLCBsYWJlbCk7DQo+PiArICAg IH0NCj4+ICsNCj4+ICsgIHRyZWUgbG9vcF9iZWdpbl9sYWJlbA0KPj4gKyAgICA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPmxhYmVsIChmbmN0eC5mbmRlY2wsICIiLCBleHByLmdldF9sb2N1 cyAoKSk7DQo+PiArICB0cmVlIGxvb3BfYmVnaW5fbGFiZWxfZGVjbA0KPj4gKyAgICA9IGN0 eC0+Z2V0X2JhY2tlbmQgKCktPmxhYmVsX2RlZmluaXRpb25fc3RhdGVtZW50IChsb29wX2Jl Z2luX2xhYmVsKTsNCj4+ICsgIGN0eC0+YWRkX3N0YXRlbWVudCAobG9vcF9iZWdpbl9sYWJl bF9kZWNsKTsNCj4+ICsgIGN0eC0+cHVzaF9sb29wX2JlZ2luX2xhYmVsIChsb29wX2JlZ2lu X2xhYmVsKTsNCj4+ICsNCj4+ICsgIHRyZWUgY29kZV9ibG9jaw0KPj4gKyAgICA9IENvbXBp bGVCbG9jazo6Y29tcGlsZSAoZXhwci5nZXRfbG9vcF9ibG9jayAoKS5nZXQgKCksIGN0eCwg bnVsbHB0cik7DQo+PiArICB0cmVlIGxvb3BfZXhwcg0KPj4gKyAgICA9IGN0eC0+Z2V0X2Jh Y2tlbmQgKCktPmxvb3BfZXhwcmVzc2lvbiAoY29kZV9ibG9jaywgZXhwci5nZXRfbG9jdXMg KCkpOw0KPj4gKyAgY3R4LT5hZGRfc3RhdGVtZW50IChsb29wX2V4cHIpOw0KPj4gKw0KPj4g KyAgY3R4LT5wb3BfbG9vcF9jb250ZXh0ICgpOw0KPj4gKyAgdHJhbnNsYXRlZCA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPnZhcl9leHByZXNzaW9uICh0bXAsIGV4cHIuZ2V0X2xvY3VzICgp KTsNCj4+ICsNCj4+ICsgIGN0eC0+cG9wX2xvb3BfYmVnaW5fbGFiZWwgKCk7DQo+PiArfQ0K Pj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6V2hpbGVMb29w RXhwciAmZXhwcikNCj4+ICt7DQo+PiArICBmbmNvbnRleHQgZm5jdHggPSBjdHgtPnBlZWtf Zm4gKCk7DQo+PiArICBpZiAoZXhwci5oYXNfbG9vcF9sYWJlbCAoKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIEhJUjo6TG9vcExhYmVsICZsb29wX2xhYmVsID0gZXhwci5nZXRfbG9vcF9s YWJlbCAoKTsNCj4+ICsgICAgICB0cmVlIGxhYmVsDQo+PiArICAgICAgID0gY3R4LT5nZXRf YmFja2VuZCAoKS0+bGFiZWwgKGZuY3R4LmZuZGVjbCwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbG9vcF9sYWJlbC5nZXRfbGlmZXRpbWUgKCkuZ2V0X25h bWUgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3Bf bGFiZWwuZ2V0X2xvY3VzICgpKTsNCj4+ICsgICAgICB0cmVlIGxhYmVsX2RlY2wgPSBjdHgt PmdldF9iYWNrZW5kICgpLT5sYWJlbF9kZWZpbml0aW9uX3N0YXRlbWVudCAobGFiZWwpOw0K Pj4gKyAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAobGFiZWxfZGVjbCk7DQo+PiArICAgICAg Y3R4LT5pbnNlcnRfbGFiZWxfZGVjbCAoDQo+PiArICAgICAgIGxvb3BfbGFiZWwuZ2V0X2xp ZmV0aW1lICgpLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksIGxhYmVsKTsNCj4+ICsg ICAgfQ0KPj4gKw0KPj4gKyAgc3RkOjp2ZWN0b3I8QnZhcmlhYmxlICo+IGxvY2FsczsNCj4+ ICsgIExvY2F0aW9uIHN0YXJ0X2xvY2F0aW9uID0gZXhwci5nZXRfbG9vcF9ibG9jayAoKS0+ Z2V0X2xvY3VzICgpOw0KPj4gKyAgTG9jYXRpb24gZW5kX2xvY2F0aW9uID0gZXhwci5nZXRf bG9vcF9ibG9jayAoKS0+Z2V0X2xvY3VzICgpOyAvLyBGSVhNRQ0KPj4gKw0KPj4gKyAgdHJl ZSBlbmNsb3Npbmdfc2NvcGUgPSBjdHgtPnBlZWtfZW5jbG9zaW5nX3Njb3BlICgpOw0KPj4g KyAgdHJlZSBsb29wX2Jsb2NrDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+Ymxv Y2sgKGZuY3R4LmZuZGVjbCwgZW5jbG9zaW5nX3Njb3BlLCBsb2NhbHMsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbG9jYXRpb24sIGVuZF9sb2NhdGlv bik7DQo+PiArICBjdHgtPnB1c2hfYmxvY2sgKGxvb3BfYmxvY2spOw0KPj4gKw0KPj4gKyAg dHJlZSBsb29wX2JlZ2luX2xhYmVsDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+ bGFiZWwgKGZuY3R4LmZuZGVjbCwgIiIsIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICsgIHRy ZWUgbG9vcF9iZWdpbl9sYWJlbF9kZWNsDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2VuZCAo KS0+bGFiZWxfZGVmaW5pdGlvbl9zdGF0ZW1lbnQgKGxvb3BfYmVnaW5fbGFiZWwpOw0KPj4g KyAgY3R4LT5hZGRfc3RhdGVtZW50IChsb29wX2JlZ2luX2xhYmVsX2RlY2wpOw0KPj4gKyAg Y3R4LT5wdXNoX2xvb3BfYmVnaW5fbGFiZWwgKGxvb3BfYmVnaW5fbGFiZWwpOw0KPj4gKw0K Pj4gKyAgdHJlZSBjb25kaXRpb24NCj4+ICsgICAgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAo ZXhwci5nZXRfcHJlZGljYXRlX2V4cHIgKCkuZ2V0ICgpLCBjdHgpOw0KPj4gKyAgdHJlZSBl eGl0X2V4cHINCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5leGl0X2V4cHJlc3Np b24gKGNvbmRpdGlvbiwgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgY3R4LT5hZGRfc3Rh dGVtZW50IChleGl0X2V4cHIpOw0KPj4gKw0KPj4gKyAgdHJlZSBjb2RlX2Jsb2NrX3N0bXQN Cj4+ICsgICAgPSBDb21waWxlQmxvY2s6OmNvbXBpbGUgKGV4cHIuZ2V0X2xvb3BfYmxvY2sg KCkuZ2V0ICgpLCBjdHgsIG51bGxwdHIpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKFRSRUVfQ09E RSAoY29kZV9ibG9ja19zdG10KSA9PSBCSU5EX0VYUFIpOw0KPj4gKyAgY3R4LT5hZGRfc3Rh dGVtZW50IChjb2RlX2Jsb2NrX3N0bXQpOw0KPj4gKw0KPj4gKyAgY3R4LT5wb3BfbG9vcF9i ZWdpbl9sYWJlbCAoKTsNCj4+ICsgIGN0eC0+cG9wX2Jsb2NrICgpOw0KPj4gKw0KPj4gKyAg dHJlZSBsb29wX2V4cHINCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5sb29wX2V4 cHJlc3Npb24gKGxvb3BfYmxvY2ssIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICsgIGN0eC0+ YWRkX3N0YXRlbWVudCAobG9vcF9leHByKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4g K0NvbXBpbGVFeHByOjp2aXNpdCAoSElSOjpCcmVha0V4cHIgJmV4cHIpDQo+PiArew0KPj4g KyAgaWYgKGV4cHIuaGFzX2JyZWFrX2V4cHIgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICB0 cmVlIGNvbXBpbGVkX2V4cHIgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfZXhw ciAoKS5nZXQgKCksIGN0eCk7DQo+PiArDQo+PiArICAgICAgQnZhcmlhYmxlICpsb29wX3Jl c3VsdF9ob2xkZXIgPSBjdHgtPnBlZWtfbG9vcF9jb250ZXh0ICgpOw0KPj4gKyAgICAgIHRy ZWUgcmVzdWx0X3JlZmVyZW5jZQ0KPj4gKyAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCkt PnZhcl9leHByZXNzaW9uIChsb29wX3Jlc3VsdF9ob2xkZXIsDQo+PiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2V4cHIgKCktPmdl dF9sb2N1cyAoKSk7DQo+PiArDQo+PiArICAgICAgdHJlZSBhc3NpZ25tZW50DQo+PiArICAg ICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+YXNzaWdubWVudF9zdGF0ZW1lbnQgKHJlc3Vs dF9yZWZlcmVuY2UsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbXBpbGVkX2V4cHIsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsN Cj4+ICsgICAgICBjdHgtPmFkZF9zdGF0ZW1lbnQgKGFzc2lnbm1lbnQpOw0KPj4gKyAgICB9 DQo+PiArDQo+PiArICBpZiAoZXhwci5oYXNfbGFiZWwgKCkpDQo+PiArICAgIHsNCj4+ICsg ICAgICBOb2RlSWQgcmVzb2x2ZWRfbm9kZV9pZCA9IFVOS05PV05fTk9ERUlEOw0KPj4gKyAg ICAgIGlmICghY3R4LT5nZXRfcmVzb2x2ZXIgKCktPmxvb2t1cF9yZXNvbHZlZF9sYWJlbCAo DQo+PiArICAgICAgICAgICBleHByLmdldF9sYWJlbCAoKS5nZXRfbWFwcGluZ3MgKCkuZ2V0 X25vZGVpZCAoKSwgJnJlc29sdmVkX25vZGVfaWQpKQ0KPj4gKyAgICAgICB7DQo+PiArICAg ICAgICAgcnVzdF9lcnJvcl9hdCAoDQo+PiArICAgICAgICAgICBleHByLmdldF9sYWJlbCAo KS5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAiZmFpbGVkIHRvIHJlc29sdmUgY29t cGlsZWQgbGFiZWwgZm9yIGxhYmVsICVzIiwNCj4+ICsgICAgICAgICAgIGV4cHIuZ2V0X2xh YmVsICgpLmdldF9tYXBwaW5ncyAoKS5hc19zdHJpbmcgKCkuY19zdHIgKCkpOw0KPj4gKyAg ICAgICAgIHJldHVybjsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIEhpcklkIHJl ZiA9IFVOS05PV05fSElSSUQ7DQo+PiArICAgICAgaWYgKCFjdHgtPmdldF9tYXBwaW5ncyAo KS0+bG9va3VwX25vZGVfdG9faGlyIChyZXNvbHZlZF9ub2RlX2lkLCAmcmVmKSkNCj4+ICsg ICAgICAgew0KPj4gKyAgICAgICAgIHJ1c3RfZmF0YWxfZXJyb3IgKGV4cHIuZ2V0X2xvY3Vz ICgpLCAicmV2ZXJzZSBsb29rdXAgbGFiZWwgZmFpbHVyZSIpOw0KPj4gKyAgICAgICAgIHJl dHVybjsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIHRyZWUgbGFiZWwgPSBOVUxM X1RSRUU7DQo+PiArICAgICAgaWYgKCFjdHgtPmxvb2t1cF9sYWJlbF9kZWNsIChyZWYsICZs YWJlbCkpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBydXN0X2Vycm9yX2F0IChleHBy LmdldF9sYWJlbCAoKS5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgImZhaWxlZCB0byBsb29rdXAgY29tcGlsZWQgbGFiZWwiKTsNCj4+ICsgICAgICAgICBy ZXR1cm47DQo+PiArICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICB0cmVlIGdvdG9fbGFiZWwN Cj4+ICsgICAgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5nb3RvX3N0YXRlbWVudCAobGFi ZWwsIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICsgICAgICBjdHgtPmFkZF9zdGF0ZW1lbnQg KGdvdG9fbGFiZWwpOw0KPj4gKyAgICB9DQo+PiArICBlbHNlDQo+PiArICAgIHsNCj4+ICsg ICAgICB0cmVlIGV4aXRfZXhwciA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmV4aXRfZXhwcmVz c2lvbiAoDQo+PiArICAgICAgIGN0eC0+Z2V0X2JhY2tlbmQgKCktPmJvb2xlYW5fY29uc3Rh bnRfZXhwcmVzc2lvbiAodHJ1ZSksDQo+PiArICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsN Cj4gDQo+IFNvIEkgdG9vayB0aGUgY2hhbmNlIGdyZXBwaW5nIGZvciAtPmV4aXRfZXhwcmVz c2lvbiBhbmQgZm91bmQNCj4gDQo+IHRyZWUNCj4gR2NjX2JhY2tlbmQ6OmV4aXRfZXhwcmVz c2lvbiAodHJlZSBjb25kX3RyZWUsIExvY2F0aW9uIGxvY3VzKQ0KPiB7DQo+ICAgIHJldHVy biBmb2xkX2J1aWxkMV9sb2MgKGxvY3VzLmdjY19sb2NhdGlvbiAoKSwgRVhJVF9FWFBSLCB2 b2lkX3R5cGVfbm9kZSwNCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZF90cmVl KTsNCj4gfQ0KPiANCj4gSSBjYW4gc2VlIGhvdyBpdCBtaWdodCBsb29rICJuaWNlciIgdG8g dHlwZSBleGl0X2V4cHJlc3Npb24gKC4uLikgcmF0aGVyDQo+IHRoYW4gb3Blbi1jb2Rpbmcg dGhlIGZvbGRfYnVpbGQxX2xvYyBsb2dpYyBidXQgZm9yIHN1cmUgdGhpcyAiQysrIGFic3Ry YWN0aW9uIg0KPiBpcyBhIGRpc3RyYWN0aW9uIGZyb20gd2hhdCB0aGUgY29kZSBhY3R1YWxs eSBkb2VzLiAgQXQgbGVhc3QgdG8gbWUgOykNCj4gVGhlIHNhbWUgYXBwbGllcyB0byBtdWNo IG9mIHRoZSByYW5nZXIgY29kZSBhcyB3ZWxsLCBzbyBpdCBzZWVtcyBHQ0MNCj4gd2Fsa3Mg aW4gdGhpcyBkaXJlY3Rpb24gLi4uDQo+IA0KDQpUaGlzIGNvZGUgZXhpc3RzIGJlY2F1c2Ug aXQgd2FzIHBvcnRlZCBvdmVyIGZyb20gdGhlIEdvIGZyb250ZW5kLCB3aGljaCANCmFic3Ry YWN0cyBvdmVyIG11bHRpcGxlIGJhY2tlbmRzLiBCdXQgd2UgcGxhbiBvbiByZW1vdmluZyB0 aGF0IA0KYWJzdHJhY3Rpb24gc28gaXQgc2hvdWxkIGhlbHAgbWFrZSB0aGluZ3MgZWFzaWVy Lg0KDQo+PiArICAgICAgY3R4LT5hZGRfc3RhdGVtZW50IChleGl0X2V4cHIpOw0KPj4gKyAg ICB9DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJ Ujo6Q29udGludWVFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIHRyZWUgbGFiZWwgPSBjdHgt PnBlZWtfbG9vcF9iZWdpbl9sYWJlbCAoKTsNCj4+ICsgIGlmIChleHByLmhhc19sYWJlbCAo KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIE5vZGVJZCByZXNvbHZlZF9ub2RlX2lkID0gVU5L Tk9XTl9OT0RFSUQ7DQo+PiArICAgICAgaWYgKCFjdHgtPmdldF9yZXNvbHZlciAoKS0+bG9v a3VwX3Jlc29sdmVkX2xhYmVsICgNCj4+ICsgICAgICAgICAgIGV4cHIuZ2V0X2xhYmVsICgp LmdldF9tYXBwaW5ncyAoKS5nZXRfbm9kZWlkICgpLCAmcmVzb2x2ZWRfbm9kZV9pZCkpDQo+ PiArICAgICAgIHsNCj4+ICsgICAgICAgICBydXN0X2Vycm9yX2F0ICgNCj4+ICsgICAgICAg ICAgIGV4cHIuZ2V0X2xhYmVsICgpLmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICJm YWlsZWQgdG8gcmVzb2x2ZSBjb21waWxlZCBsYWJlbCBmb3IgbGFiZWwgJXMiLA0KPj4gKyAg ICAgICAgICAgZXhwci5nZXRfbGFiZWwgKCkuZ2V0X21hcHBpbmdzICgpLmFzX3N0cmluZyAo KS5jX3N0ciAoKSk7DQo+PiArICAgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgICB9DQo+PiAr DQo+PiArICAgICAgSGlySWQgcmVmID0gVU5LTk9XTl9ISVJJRDsNCj4+ICsgICAgICBpZiAo IWN0eC0+Z2V0X21hcHBpbmdzICgpLT5sb29rdXBfbm9kZV90b19oaXIgKHJlc29sdmVkX25v ZGVfaWQsICZyZWYpKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgcnVzdF9mYXRhbF9l cnJvciAoZXhwci5nZXRfbG9jdXMgKCksICJyZXZlcnNlIGxvb2t1cCBsYWJlbCBmYWlsdXJl Iik7DQo+PiArICAgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgICB9DQo+PiArDQo+PiArICAg ICAgaWYgKCFjdHgtPmxvb2t1cF9sYWJlbF9kZWNsIChyZWYsICZsYWJlbCkpDQo+PiArICAg ICAgIHsNCj4+ICsgICAgICAgICBydXN0X2Vycm9yX2F0IChleHByLmdldF9sYWJlbCAoKS5n ZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBs b29rdXAgY29tcGlsZWQgbGFiZWwiKTsNCj4+ICsgICAgICAgICByZXR1cm47DQo+PiArICAg ICAgIH0NCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgdHJhbnNsYXRlZCA9IGN0eC0+Z2V0X2Jh Y2tlbmQgKCktPmdvdG9fc3RhdGVtZW50IChsYWJlbCwgZXhwci5nZXRfbG9jdXMgKCkpOw0K Pj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUV4cHI6OnZpc2l0IChISVI6OkJv cnJvd0V4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgdHJlZSBtYWluX2V4cHIgPSBDb21waWxl RXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfZXhwciAoKS5nZXQgKCksIGN0eCk7DQo+PiArICBp ZiAoU0xJQ0VfVFlQRV9QIChUUkVFX1RZUEUgKG1haW5fZXhwcikpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgdHJhbnNsYXRlZCA9IG1haW5fZXhwcjsNCj4+ICsgICAgICByZXR1cm47DQo+ PiArICAgIH0NCj4+ICsNCj4+ICsgIFR5VHk6OkJhc2VUeXBlICp0eXR5ID0gbnVsbHB0cjsN Cj4+ICsgIGlmICghY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlIChleHByLmdldF9t YXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAmdHl0eSkpDQo+PiArICAgIHJldHVybjsNCj4+ICsNCj4+ICsgIHRy YW5zbGF0ZWQgPSBhZGRyZXNzX2V4cHJlc3Npb24gKG1haW5fZXhwciwgZXhwci5nZXRfbG9j dXMgKCkpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUV4cHI6OnZpc2l0 IChISVI6OkRlcmVmZXJlbmNlRXhwciAmZXhwcikNCj4+ICt7DQo+PiArICBUeVR5OjpCYXNl VHlwZSAqdHl0eSA9IG51bGxwdHI7DQo+PiArICBpZiAoIWN0eC0+Z2V0X3R5Y3R4ICgpLT5s b29rdXBfdHlwZSAoZXhwci5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5dHkpKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgcnVzdF9mYXRhbF9lcnJvciAoZXhwci5nZXRfbG9jdXMgKCksDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCByZXNvbHZlIHR5cGUgZm9yIHRoaXMg VHVwbGVFeHByIik7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiAr ICB0cmVlIG1haW5fZXhwciA9IENvbXBpbGVFeHByOjpDb21waWxlIChleHByLmdldF9leHBy ICgpLmdldCAoKSwgY3R4KTsNCj4+ICsNCj4+ICsgIC8vIHRoaXMgbWlnaHQgYmUgYW4gb3Bl cmF0b3Igb3ZlcmxvYWQgc2l0dWF0aW9uIGxldHMgY2hlY2sNCj4+ICsgIFR5VHk6OkZuVHlw ZSAqZm50eXBlOw0KPj4gKyAgYm9vbCBpc19vcF9vdmVybG9hZCA9IGN0eC0+Z2V0X3R5Y3R4 ICgpLT5sb29rdXBfb3BlcmF0b3Jfb3ZlcmxvYWQgKA0KPj4gKyAgICBleHByLmdldF9tYXBw aW5ncyAoKS5nZXRfaGlyaWQgKCksICZmbnR5cGUpOw0KPj4gKyAgaWYgKGlzX29wX292ZXJs b2FkKQ0KPj4gKyAgICB7DQo+PiArICAgICAgYXV0byBsYW5nX2l0ZW1fdHlwZSA9IEFuYWx5 c2lzOjpSdXN0TGFuZ0l0ZW06Okl0ZW1UeXBlOjpERVJFRjsNCj4+ICsgICAgICB0cmVlIG9w ZXJhdG9yX292ZXJsb2FkX2NhbGwNCj4+ICsgICAgICAgPSByZXNvbHZlX29wZXJhdG9yX292 ZXJsb2FkIChsYW5nX2l0ZW1fdHlwZSwgZXhwciwgbWFpbl9leHByLCBudWxscHRyLA0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2V4cHIgKCku Z2V0ICgpLCBudWxscHRyKTsNCj4+ICsNCj4+ICsgICAgICAvLyBydXN0IGRlcmVmIGFsd2F5 cyByZXR1cm5zIGEgcmVmZXJlbmNlIGZyb20gdGhpcyBvdmVybG9hZCB0aGVuIHdlIGNhbg0K Pj4gKyAgICAgIC8vIGFjdHVhbGx5IGRvIHRoZSBpbmRpcmVjdGlvbg0KPj4gKyAgICAgIG1h aW5fZXhwciA9IG9wZXJhdG9yX292ZXJsb2FkX2NhbGw7DQo+PiArICAgIH0NCj4+ICsNCj4+ ICsgIHRyZWUgZXhwZWN0ZWRfdHlwZSA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAo Y3R4LCB0eXR5KTsNCj4+ICsgIGlmIChTTElDRV9UWVBFX1AgKFRSRUVfVFlQRSAobWFpbl9l eHByKSkgJiYgU0xJQ0VfVFlQRV9QIChleHBlY3RlZF90eXBlKSkNCj4+ICsgICAgew0KPj4g KyAgICAgIHRyYW5zbGF0ZWQgPSBtYWluX2V4cHI7DQo+PiArICAgICAgcmV0dXJuOw0KPj4g KyAgICB9DQo+PiArDQo+PiArICB0cmFuc2xhdGVkID0gaW5kaXJlY3RfZXhwcmVzc2lvbiAo bWFpbl9leHByLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQN Cj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6TGl0ZXJhbEV4cHIgJmV4cHIpDQo+PiAr ew0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnR5dHkgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFj dHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKGV4cHIuZ2V0X21hcHBpbmdzICgpLmdl dF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZ0eXR5KSkNCj4+ICsgICAgcmV0dXJuOw0KPj4gKw0KPj4gKyAgc3dpdGNoIChleHByLmdl dF9saXRfdHlwZSAoKSkNCj4+ICsgICAgew0KPj4gKyAgICBjYXNlIEhJUjo6TGl0ZXJhbDo6 Qk9PTDoNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY29tcGlsZV9ib29sX2xpdGVyYWwgKGV4 cHIsIHR5dHkpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsNCj4+ICsgICAgY2FzZSBISVI6 OkxpdGVyYWw6OklOVDoNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY29tcGlsZV9pbnRlZ2Vy X2xpdGVyYWwgKGV4cHIsIHR5dHkpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsNCj4+ICsg ICAgY2FzZSBISVI6OkxpdGVyYWw6OkZMT0FUOg0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBj b21waWxlX2Zsb2F0X2xpdGVyYWwgKGV4cHIsIHR5dHkpOw0KPj4gKyAgICAgIHJldHVybjsN Cj4+ICsNCj4+ICsgICAgY2FzZSBISVI6OkxpdGVyYWw6OkNIQVI6DQo+PiArICAgICAgdHJh bnNsYXRlZCA9IGNvbXBpbGVfY2hhcl9saXRlcmFsIChleHByLCB0eXR5KTsNCj4+ICsgICAg ICByZXR1cm47DQo+PiArDQo+PiArICAgIGNhc2UgSElSOjpMaXRlcmFsOjpCWVRFOg0KPj4g KyAgICAgIHRyYW5zbGF0ZWQgPSBjb21waWxlX2J5dGVfbGl0ZXJhbCAoZXhwciwgdHl0eSk7 DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKw0KPj4gKyAgICBjYXNlIEhJUjo6TGl0ZXJhbDo6 U1RSSU5HOg0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBjb21waWxlX3N0cmluZ19saXRlcmFs IChleHByLCB0eXR5KTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArDQo+PiArICAgIGNhc2Ug SElSOjpMaXRlcmFsOjpCWVRFX1NUUklORzoNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY29t cGlsZV9ieXRlX3N0cmluZ19saXRlcmFsIChleHByLCB0eXR5KTsNCj4+ICsgICAgICByZXR1 cm47DQo+PiArICAgIH0NCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVFeHBy Ojp2aXNpdCAoSElSOjpBc3NpZ25tZW50RXhwciAmZXhwcikNCj4+ICt7DQo+PiArICBhdXRv IGx2YWx1ZSA9IENvbXBpbGVFeHByOjpDb21waWxlIChleHByLmdldF9saHMgKCksIGN0eCk7 DQo+PiArICBhdXRvIHJ2YWx1ZSA9IENvbXBpbGVFeHByOjpDb21waWxlIChleHByLmdldF9y aHMgKCksIGN0eCk7DQo+PiArDQo+PiArICAvLyBhc3NpZ25tZW50cyBhcmUgY29lcmNpb24g c2l0ZXMgc28gbGV0cyBjb252ZXJ0IHRoZSBydmFsdWUgaWYgbmVjZXNzYXJ5DQo+PiArICBU eVR5OjpCYXNlVHlwZSAqZXhwZWN0ZWQgPSBudWxscHRyOw0KPj4gKyAgVHlUeTo6QmFzZVR5 cGUgKmFjdHVhbCA9IG51bGxwdHI7DQo+PiArDQo+PiArICBib29sIG9rOw0KPj4gKyAgb2sg PSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKA0KPj4gKyAgICBleHByLmdldF9s aHMgKCktPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZleHBlY3RlZCk7DQo+PiAr ICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgb2sgPSBjdHgtPmdldF90eWN0eCAo KS0+bG9va3VwX3R5cGUgKA0KPj4gKyAgICBleHByLmdldF9yaHMgKCktPmdldF9tYXBwaW5n cyAoKS5nZXRfaGlyaWQgKCksICZhY3R1YWwpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKG9rKTsN Cj4+ICsNCj4+ICsgIHJ2YWx1ZSA9IGNvZXJjaW9uX3NpdGUgKGV4cHIuZ2V0X21hcHBpbmdz ICgpLmdldF9oaXJpZCAoKSwgcnZhbHVlLCBhY3R1YWwsDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgIGV4cGVjdGVkLCBleHByLmdldF9saHMgKCktPmdldF9sb2N1cyAoKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5nZXRfcmhzICgpLT5nZXRfbG9jdXMg KCkpOw0KPj4gKw0KPj4gKyAgdHJlZSBhc3NpZ25tZW50DQo+PiArICAgID0gY3R4LT5nZXRf YmFja2VuZCAoKS0+YXNzaWdubWVudF9zdGF0ZW1lbnQgKGx2YWx1ZSwgcnZhbHVlLA0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIu Z2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ICsgIGN0eC0+YWRkX3N0YXRlbWVudCAoYXNzaWdu bWVudCk7DQo+PiArfQ0KPj4gKw0KPj4gKy8vIEhlbHBlciBmb3Igc29ydF90dXBsZV9wYXR0 ZXJucy4NCj4+ICsvLyBEZXRlcm1pbmUgd2hldGhlciBQYXR0ZXJucyBhIGFuZCBiIGFyZSBy ZWFsbHkgdGhlIHNhbWUgcGF0dGVybi4NCj4+ICsvLyBGSVhNRTogVGhpcyBpcyBhIG5hc3R5 IGhhY2sgdG8gYXZvaWQgcHJvcGVybHkgaW1wbGVtZW50aW5nIGEgY29tcGFyaXNvbg0KPj4g Ky8vICAgICAgICBmb3IgUGF0dGVybnMsIHdoaWNoIHdlIHJlYWxseSBwcm9iYWJseSBkbyB3 YW50IGF0IHNvbWUgcG9pbnQuDQo+PiArc3RhdGljIGJvb2wNCj4+ICtwYXR0ZXJuc19tZXJn ZWFibGUgKEhJUjo6UGF0dGVybiAqYSwgSElSOjpQYXR0ZXJuICpiKQ0KPj4gK3sNCj4+ICsg IGlmICghYSB8fCAhYikNCj4+ICsgICAgcmV0dXJuIGZhbHNlOw0KPj4gKw0KPj4gKyAgSElS OjpQYXR0ZXJuOjpQYXR0ZXJuVHlwZSBwYXRfdHlwZSA9IGEtPmdldF9wYXR0ZXJuX3R5cGUg KCk7DQo+PiArICBpZiAoYi0+Z2V0X3BhdHRlcm5fdHlwZSAoKSAhPSBwYXRfdHlwZSkNCj4+ ICsgICAgcmV0dXJuIGZhbHNlOw0KPj4gKw0KPj4gKyAgc3dpdGNoIChwYXRfdHlwZSkNCj4+ ICsgICAgew0KPj4gKyAgICAgIGNhc2UgSElSOjpQYXR0ZXJuOjpQYXR0ZXJuVHlwZTo6UEFU SDogew0KPj4gKyAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBmYXIgdG9vIG5haXZlDQo+PiAr ICAgICAgIEhJUjo6UGF0aFBhdHRlcm4gJmFyZWYgPSAqc3RhdGljX2Nhc3Q8SElSOjpQYXRo UGF0dGVybiAqPiAoYSk7DQo+PiArICAgICAgIEhJUjo6UGF0aFBhdHRlcm4gJmJyZWYgPSAq c3RhdGljX2Nhc3Q8SElSOjpQYXRoUGF0dGVybiAqPiAoYik7DQo+PiArICAgICAgIGlmIChh cmVmLmdldF9udW1fc2VnbWVudHMgKCkgIT0gYnJlZi5nZXRfbnVtX3NlZ21lbnRzICgpKQ0K Pj4gKyAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsNCj4+ICsgICAgICAgY29uc3QgYXV0 byAmYXNlZ3MgPSBhcmVmLmdldF9zZWdtZW50cyAoKTsNCj4+ICsgICAgICAgY29uc3QgYXV0 byAmYnNlZ3MgPSBicmVmLmdldF9zZWdtZW50cyAoKTsNCj4+ICsgICAgICAgZm9yIChzaXpl X3QgaSA9IDA7IGkgPCBhc2Vncy5zaXplICgpOyBpKyspDQo+PiArICAgICAgICAgew0KPj4g KyAgICAgICAgICAgaWYgKGFzZWdzW2ldLmFzX3N0cmluZyAoKSAhPSBic2Vnc1tpXS5hc19z dHJpbmcgKCkpDQo+PiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCj4+ICsgICAgICAg ICB9DQo+PiArICAgICAgIHJldHVybiB0cnVlOw0KPj4gKyAgICAgIH0NCj4+ICsgICAgICBi cmVhazsNCj4+ICsgICAgICBjYXNlIEhJUjo6UGF0dGVybjo6UGF0dGVyblR5cGU6OkxJVEVS QUw6IHsNCj4+ICsgICAgICAgSElSOjpMaXRlcmFsUGF0dGVybiAmYXJlZiA9ICpzdGF0aWNf Y2FzdDxISVI6OkxpdGVyYWxQYXR0ZXJuICo+IChhKTsNCj4+ICsgICAgICAgSElSOjpMaXRl cmFsUGF0dGVybiAmYnJlZiA9ICpzdGF0aWNfY2FzdDxISVI6OkxpdGVyYWxQYXR0ZXJuICo+ IChiKTsNCj4+ICsgICAgICAgcmV0dXJuIGFyZWYuZ2V0X2xpdGVyYWwgKCkuaXNfZXF1YWwg KGJyZWYuZ2V0X2xpdGVyYWwgKCkpOw0KPj4gKyAgICAgIH0NCj4+ICsgICAgICBicmVhazsN Cj4+ICsgICAgICBjYXNlIEhJUjo6UGF0dGVybjo6UGF0dGVyblR5cGU6OklERU5USUZJRVI6 IHsNCj4+ICsgICAgICAgLy8gVE9ETw0KPj4gKyAgICAgIH0NCj4+ICsgICAgICBicmVhazsN Cj4+ICsgICAgY2FzZSBISVI6OlBhdHRlcm46OlBhdHRlcm5UeXBlOjpXSUxEQ0FSRDoNCj4+ ICsgICAgICByZXR1cm4gdHJ1ZTsNCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAg ICAvLyBUT0RPDQo+PiArDQo+PiArICAgIGRlZmF1bHQ6Ow0KPj4gKyAgICB9DQo+PiArICBy ZXR1cm4gZmFsc2U7DQo+PiArfQ0KPj4gKw0KPj4gKy8vIEEgbGl0dGxlIGNvbnRhaW5lciBm b3IgcmVhcnJhbmdpbmcgdGhlIHBhdHRlcm5zIGFuZCBjYXNlcyBpbiBhIG1hdGNoDQo+PiAr Ly8gZXhwcmVzc2lvbiB3aGlsZSBzaW1wbGlmeWluZy4NCj4+ICtzdHJ1Y3QgUGF0dGVybk1l cmdlDQo+PiArew0KPj4gKyAgc3RkOjp1bmlxdWVfcHRyPEhJUjo6TWF0Y2hDYXNlPiB3aWxk Y2FyZDsNCj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxISVI6OlBhdHRlcm4+ PiBoZWFkczsNCj4+ICsgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEhJUjo6TWF0Y2hDYXNl Pj4gY2FzZXM7DQo+PiArfTsNCj4+ICsNCj4+ICsvLyBIZWxwZXIgZm9yIHNpbXBsaWZ5X3R1 cGxlX21hdGNoLg0KPj4gKy8vIEZvciBlYWNoIHR1cGxlIHBhdHRlcm4gaW4gYSBnaXZlbiBt YXRjaCwgcHVsbCBvdXQgdGhlIGZpcnN0IGVsdCBvZiB0aGUNCj4+ICsvLyB0dXBsZSBhbmQg Y29uc3RydWN0IGEgbmV3IE1hdGNoQ2FzZSB3aXRoIHRoZSByZW1haW5pbmcgdHVwbGUgZWx0 cyBhcyB0aGUNCj4+ICsvLyBwYXR0ZXJuLiBSZXR1cm4gYSBtYXBwaW5nIGZyb20gZWFjaCBf dW5pcXVlXyBmaXJzdCB0dXBsZSBlbGVtZW50IHRvIGENCj4+ICsvLyB2ZWMgb2YgY2FzZXMg Zm9yIGEgbmV3IG1hdGNoLg0KPj4gKy8vDQo+PiArLy8gRklYTUU6IFRoaXMgdXNlZCB0byBi ZSBhIHN0ZDo6bWFwPFBhdHRlcm4sIFZlYzxNYXRjaENhc2U+PiwgYnV0IGl0IGRvZXNuJ3QN Cj4+ICsvLyBhY3R1YWxseSB3b3JrIGxpa2Ugd2Ugd2FudCAtIHRoZSBQYXR0ZXJuIGluY2x1 ZGVzIGFuIEhJUiBJRCwgd2hpY2ggaXMgdW5pcXVlDQo+PiArLy8gcGVyIFBhdHRlcm4gb2Jq ZWN0LiBUaGlzIG1lYW5zIHdlIGRvbid0IGhhdmUgYSBnb29kIG1lYW5zIGZvciBjb21wYXJp bmcNCj4+ICsvLyBQYXR0ZXJucy4gSXQgd291bGQgcHJvYmFibHkgYmUgYmVzdCB0byBhY3R1 YWxseSBpbXBsZW1lbnQgYSBtZWFucyBvZg0KPj4gKy8vIHByb3Blcmx5IGNvbXBhcmluZyBw YXR0ZXJucywgYW5kIHRoZW4gdXNlIGFuIGFjdHVhbCBtYXAuDQo+PiArLy8NCj4+ICtzdGF0 aWMgc3RydWN0IFBhdHRlcm5NZXJnZQ0KPj4gK3NvcnRfdHVwbGVfcGF0dGVybnMgKEhJUjo6 TWF0Y2hFeHByICZleHByKQ0KPj4gK3sNCj4+ICsgIHJ1c3RfYXNzZXJ0IChleHByLmdldF9z Y3J1dGluZWVfZXhwciAoKS0+Z2V0X2V4cHJlc3Npb25fdHlwZSAoKQ0KPj4gKyAgICAgICAg ICAgICAgPT0gSElSOjpFeHByOjpFeHByVHlwZTo6VHVwbGUpOw0KPj4gKw0KPj4gKyAgc3Ry dWN0IFBhdHRlcm5NZXJnZSByZXN1bHQ7DQo+PiArICByZXN1bHQud2lsZGNhcmQgPSBudWxs cHRyOw0KPj4gKyAgcmVzdWx0LmhlYWRzID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRy PEhJUjo6UGF0dGVybj4+ICgpOw0KPj4gKyAgcmVzdWx0LmNhc2VzID0gc3RkOjp2ZWN0b3I8 c3RkOjp2ZWN0b3I8SElSOjpNYXRjaENhc2U+PiAoKTsNCj4+ICsNCj4+ICsgIGZvciAoYXV0 byAmbWF0Y2hfY2FzZSA6IGV4cHIuZ2V0X21hdGNoX2Nhc2VzICgpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgSElSOjpNYXRjaEFybSAmY2FzZV9hcm0gPSBtYXRjaF9jYXNlLmdldF9hcm0g KCk7DQo+PiArDQo+PiArICAgICAgLy8gRklYTUU6IE5vdGUgd2UgYXJlIG9ubHkgZGVhbGlu ZyB3aXRoIHRoZSBmaXJzdCBwYXR0ZXJuIGluIHRoZSBhcm0uDQo+PiArICAgICAgLy8gVGhl IHBhdHRlcm5zIHZlY3RvciBpbiB0aGUgYXJtIG1pZ2h0IGhvbGQgbWFueSBwYXR0ZXJucywg d2hpY2ggYXJlIHRoZQ0KPj4gKyAgICAgIC8vIHBhdHRlcm5zIHNlcGFyYXRlZCBieSB0aGUg J3wnIHRva2VuLiBSdXN0YyBhYnN0cmFjdHMgdGhlc2UgYXMgIk9yIg0KPj4gKyAgICAgIC8v IHBhdHRlcm5zLCBhbmQgcGFydCBvZiBpdHMgc2ltcGxpZmljYXRpb24gcHJvY2VzcyBpcyB0 byBnZXQgcmlkIG9mIHRoZW0uDQo+PiArICAgICAgLy8gV2Ugc2hvdWxkIGdldCByaWQgb2Yg dGhlIE9ScyB0b28sIG1heWJlIGhlcmUgb3IgZWFybGllciB0aGFuIGhlcmU/DQo+PiArICAg ICAgYXV0byBwYXQgPSBjYXNlX2FybS5nZXRfcGF0dGVybnMgKClbMF0tPmNsb25lX3BhdHRl cm4gKCk7DQo+PiArDQo+PiArICAgICAgLy8gUmVjb3JkIHdpbGRjYXJkcyBzbyB3ZSBjYW4g YWRkIHRoZW0gaW4gaW5uZXIgbWF0Y2hlcy4NCj4+ICsgICAgICBpZiAocGF0LT5nZXRfcGF0 dGVybl90eXBlICgpID09IEhJUjo6UGF0dGVybjo6UGF0dGVyblR5cGU6OldJTERDQVJEKQ0K Pj4gKyAgICAgICB7DQo+PiArICAgICAgICAgLy8gVGhlICp3aG9sZSogcGF0dGVybiBpcyBh IHdpbGQgY2FyZCAoXykuDQo+PiArICAgICAgICAgcmVzdWx0LndpbGRjYXJkDQo+PiArICAg ICAgICAgICA9IHN0ZDo6dW5pcXVlX3B0cjxISVI6Ok1hdGNoQ2FzZT4gKG5ldyBISVI6Ok1h dGNoQ2FzZSAobWF0Y2hfY2FzZSkpOw0KPj4gKyAgICAgICAgIGNvbnRpbnVlOw0KPj4gKyAg ICAgICB9DQo+PiArDQo+PiArICAgICAgcnVzdF9hc3NlcnQgKHBhdC0+Z2V0X3BhdHRlcm5f dHlwZSAoKQ0KPj4gKyAgICAgICAgICAgICAgICAgID09IEhJUjo6UGF0dGVybjo6UGF0dGVy blR5cGU6OlRVUExFKTsNCj4+ICsNCj4+ICsgICAgICBhdXRvIHJlZiA9ICpzdGF0aWNfY2Fz dDxISVI6OlR1cGxlUGF0dGVybiAqPiAocGF0LmdldCAoKSk7DQo+PiArDQo+PiArICAgICAg cnVzdF9hc3NlcnQgKHJlZi5oYXNfdHVwbGVfcGF0dGVybl9pdGVtcyAoKSk7DQo+PiArDQo+ PiArICAgICAgYXV0byBpdGVtcw0KPj4gKyAgICAgICA9IEhJUjo6VHVwbGVQYXR0ZXJuIChy ZWYpLmdldF9pdGVtcyAoKS0+Y2xvbmVfdHVwbGVfcGF0dGVybl9pdGVtcyAoKTsNCj4+ICsg ICAgICBpZiAoaXRlbXMtPmdldF9wYXR0ZXJuX3R5cGUgKCkNCj4+ICsgICAgICAgICA9PSBI SVI6OlR1cGxlUGF0dGVybkl0ZW1zOjpUdXBsZVBhdHRlcm5JdGVtVHlwZTo6TVVMVElQTEUp DQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBhdXRvIGl0ZW1zX3JlZg0KPj4gKyAgICAg ICAgICAgPSAqc3RhdGljX2Nhc3Q8SElSOjpUdXBsZVBhdHRlcm5JdGVtc011bHRpcGxlICo+ IChpdGVtcy5nZXQgKCkpOw0KPj4gKw0KPj4gKyAgICAgICAgIC8vIFBvcCB0aGUgZmlyc3Qg cGF0dGVybiBvdXQNCj4+ICsgICAgICAgICBhdXRvIHBhdHRlcm5zID0gc3RkOjp2ZWN0b3I8 c3RkOjp1bmlxdWVfcHRyPEhJUjo6UGF0dGVybj4+ICgpOw0KPj4gKyAgICAgICAgIGF1dG8g Zmlyc3QgPSBpdGVtc19yZWYuZ2V0X3BhdHRlcm5zICgpWzBdLT5jbG9uZV9wYXR0ZXJuICgp Ow0KPj4gKyAgICAgICAgIGZvciAoYXV0byBwID0gaXRlbXNfcmVmLmdldF9wYXR0ZXJucyAo KS5iZWdpbiAoKSArIDE7DQo+PiArICAgICAgICAgICAgICBwICE9IGl0ZW1zX3JlZi5nZXRf cGF0dGVybnMgKCkuZW5kICgpOyBwKyspDQo+PiArICAgICAgICAgICB7DQo+PiArICAgICAg ICAgICAgIHBhdHRlcm5zLnB1c2hfYmFjayAoKCpwKS0+Y2xvbmVfcGF0dGVybiAoKSk7DQo+ PiArICAgICAgICAgICB9DQo+PiArDQo+PiArICAgICAgICAgLy8gaWYgdGhlcmUgaXMgb25s eSBvbmUgcGF0dGVybiBsZWZ0LCBkb24ndCBtYWtlIGEgdHVwbGUgb3V0IG9mIGl0DQo+PiAr ICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEhJUjo6UGF0dGVybj4gcmVzdWx0X3BhdHRlcm47 DQo+PiArICAgICAgICAgaWYgKHBhdHRlcm5zLnNpemUgKCkgPT0gMSkNCj4+ICsgICAgICAg ICAgIHsNCj4+ICsgICAgICAgICAgICAgcmVzdWx0X3BhdHRlcm4gPSBzdGQ6Om1vdmUgKHBh dHRlcm5zWzBdKTsNCj4+ICsgICAgICAgICAgIH0NCj4+ICsgICAgICAgICBlbHNlDQo+PiAr ICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgIGF1dG8gbmV3X2l0ZW1zID0gc3RkOjp1 bmlxdWVfcHRyPEhJUjo6VHVwbGVQYXR0ZXJuSXRlbXM+ICgNCj4+ICsgICAgICAgICAgICAg ICBuZXcgSElSOjpUdXBsZVBhdHRlcm5JdGVtc011bHRpcGxlIChzdGQ6Om1vdmUgKHBhdHRl cm5zKSkpOw0KPj4gKw0KPj4gKyAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYSBUdXBsZVBh dHRlcm4gZnJvbSB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybnMNCj4+ICsgICAgICAgICAgICAg cmVzdWx0X3BhdHRlcm4gPSBzdGQ6OnVuaXF1ZV9wdHI8SElSOjpQYXR0ZXJuPiAoDQo+PiAr ICAgICAgICAgICAgICAgbmV3IEhJUjo6VHVwbGVQYXR0ZXJuIChyZWYuZ2V0X3BhdHRlcm5f bWFwcGluZ3MgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzdGQ6Om1vdmUgKG5ld19pdGVtcyksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZWYuZ2V0X2xvY3VzICgpKSk7DQo+PiArICAgICAgICAgICB9DQo+ PiArDQo+PiArICAgICAgICAgLy8gSSBkb24ndCBrbm93IHdoeSB3ZSBuZWVkIHRvIG1ha2Ug Zm9vIHNlcGFyYXRlbHkgaGVyZSBidXQNCj4+ICsgICAgICAgICAvLyB1c2luZyB0aGUgeyBu ZXdfdHVwbGUgfSBzeW50YXggaW4gbmV3X2FybSBjb25zdHJ1Y3RvciBkb2VzIG5vdA0KPj4g KyAgICAgICAgIC8vIGNvbXBpbGUuDQo+PiArICAgICAgICAgYXV0byBmb28gPSBzdGQ6OnZl Y3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SElSOjpQYXR0ZXJuPj4gKCk7DQo+PiArICAgICAgICAg Zm9vLmVtcGxhY2VfYmFjayAoc3RkOjptb3ZlIChyZXN1bHRfcGF0dGVybikpOw0KPj4gKyAg ICAgICAgIEhJUjo6TWF0Y2hBcm0gbmV3X2FybSAoc3RkOjptb3ZlIChmb28pLCBMb2NhdGlv biAoKSwgbnVsbHB0ciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFT VDo6QXR0clZlYyAoKSk7DQo+PiArDQo+PiArICAgICAgICAgSElSOjpNYXRjaENhc2UgbmV3 X2Nhc2UgKG1hdGNoX2Nhc2UuZ2V0X21hcHBpbmdzICgpLCBuZXdfYXJtLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9jYXNlLmdldF9leHByICgpLT5j bG9uZV9leHByICgpKTsNCj4+ICsNCj4+ICsgICAgICAgICBib29sIHB1c2hlZCA9IGZhbHNl Ow0KPj4gKyAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0LmhlYWRzLnNp emUgKCk7IGkrKykNCj4+ICsgICAgICAgICAgIHsNCj4+ICsgICAgICAgICAgICAgaWYgKHBh dHRlcm5zX21lcmdlYWJsZSAocmVzdWx0LmhlYWRzW2ldLmdldCAoKSwgZmlyc3QuZ2V0ICgp KSkNCj4+ICsgICAgICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgICByZXN1bHQu Y2FzZXNbaV0ucHVzaF9iYWNrIChuZXdfY2FzZSk7DQo+PiArICAgICAgICAgICAgICAgICBw dXNoZWQgPSB0cnVlOw0KPj4gKyAgICAgICAgICAgICAgIH0NCj4+ICsgICAgICAgICAgIH0N Cj4+ICsNCj4+ICsgICAgICAgICBpZiAoIXB1c2hlZCkNCj4+ICsgICAgICAgICAgIHsNCj4+ ICsgICAgICAgICAgICAgcmVzdWx0LmhlYWRzLnB1c2hfYmFjayAoc3RkOjptb3ZlIChmaXJz dCkpOw0KPj4gKyAgICAgICAgICAgICByZXN1bHQuY2FzZXMucHVzaF9iYWNrICh7bmV3X2Nh c2V9KTsNCj4+ICsgICAgICAgICAgIH0NCj4+ICsgICAgICAgfQ0KPj4gKyAgICAgIGVsc2Ug LyogVHVwbGVQYXR0ZXJuSXRlbVR5cGU6OlJBTkdFRCAqLw0KPj4gKyAgICAgICB7DQo+PiAr ICAgICAgICAgLy8gRklYTUUNCj4+ICsgICAgICAgICBnY2NfdW5yZWFjaGFibGUgKCk7DQo+ PiArICAgICAgIH0NCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJuIHJlc3VsdDsNCj4+ ICt9DQo+PiArDQo+PiArLy8gSGVscGVyIGZvciBDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6 TWF0Y2hFeHByKS4NCj4+ICsvLyBHaXZlbiBhIE1hdGNoRXhwciB3aGVyZSB0aGUgc2NydXRp bmVlIGlzIHNvbWUga2luZCBvZiB0dXBsZSwgYnVpbGQgYW4NCj4+ICsvLyBlcXVpdmFsZW50 IG1hdGNoIHdoZXJlIG9ubHkgb25lIGVsZW1lbnQgb2YgdGhlIHR1cGxlIGlzIGV4YW1pbmVk IGF0IGEgdGltZS4NCj4+ICsvLyBUaGlzIHJlc3VsdGluZyBtYXRjaCBjYW4gdGhlbiBiZSBs b3dlcmVkIHRvIGEgU1dJVENIX0VYUFIgdHJlZSBkaXJlY3RseS4NCj4+ICsvLw0KPj4gKy8v IFRoZSBhcHByb2FjaCBpcyBhcyBmb2xsb3dzOg0KPj4gKy8vIDEuIFNwbGl0IHRoZSBzY3J1 dGluZWUgYW5kIGVhY2ggcGF0dGVybiBpbnRvIHRoZSBmaXJzdCAoaGVhZCkgYW5kIHRoZQ0K Pj4gKy8vICAgIHJlc3QgKHRhaWwpLg0KPj4gKy8vIDIuIEJ1aWxkIGEgbWFwcGluZyBvZiB1 bmlxdWUgcGF0dGVybiBoZWFkcyB0byB0aGUgY2FzZXMgKHRhaWwgYW5kIGV4cHIpDQo+PiAr Ly8gICAgdGhhdCBzaGFyZWQgdGhhdCBwYXR0ZXJuIGhlYWQgaW4gdGhlIG9yaWdpbmFsIG1h dGNoLg0KPj4gKy8vICAgIChUaGlzIGlzIHRoZSBqb2Igb2Ygc29ydF90dXBsZV9wYXR0ZXJu cyAoKSkuDQo+PiArLy8gMy4gRm9yIGVhY2ggdW5pcXVlIHBhdHRlcm4gaGVhZCwgYnVpbGQg YSBuZXcgTWF0Y2hDYXNlIHdoZXJlIHRoZSBwYXR0ZXJuDQo+PiArLy8gICAgaXMgdGhlIHVu aXF1ZSBoZWFkLCBhbmQgdGhlIGV4cHJlc3Npb24gaXMgYSBuZXcgbWF0Y2ggd2hlcmU6DQo+ PiArLy8gICAgLSBUaGUgc2NydXRpbmVlIGlzIHRoZSB0YWlsIG9mIHRoZSBvcmlnaW5hbCBz Y3J1dGluZWUNCj4+ICsvLyAgICAtIFRoZSBjYXNlcyBhcmUgYXJlIHRob3NlIGJ1aWx0IGJ5 IHRoZSBtYXBwaW5nIGluIHN0ZXAgMiwgaS5lLiB0aGUNCj4+ICsvLyAgICAgIHRhaWxzIG9m IHRoZSBwYXR0ZXJucyBhbmQgdGhlIGNvcnJlc3BvbmluZyBleHByZXNzaW9ucyBmcm9tIHRo ZQ0KPj4gKy8vICAgICAgb3JpZ2luYWwgbWF0Y2ggZXhwcmVzc2lvbi4NCj4+ICsvLyA0LiBE byB0aGlzIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGlubmVyIG1hdGNoLCB1bnRpbCB0aGVyZSBp cyBub3RoaW5nIG1vcmUNCj4+ICsvLyAgICB0byBzaW1wbGlmeS4NCj4+ICsvLyA1LiBCdWls ZCB0aGUgcmVzdWx0aW5nIG1hdGNoIHdoaWNoIHNjcnV0aW5pemVzIHRoZSBoZWFkIG9mIHRo ZSBvcmlnaW5hbA0KPj4gKy8vICAgIHNjcnV0aW5lZSwgdXNpbmcgdGhlIGNhc2VzIGJ1aWx0 IGluIHN0ZXAgMy4NCj4+ICtzdGF0aWMgSElSOjpNYXRjaEV4cHINCj4+ICtzaW1wbGlmeV90 dXBsZV9tYXRjaCAoSElSOjpNYXRjaEV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgaWYgKGV4 cHIuZ2V0X3NjcnV0aW5lZV9leHByICgpLT5nZXRfZXhwcmVzc2lvbl90eXBlICgpDQo+PiAr ICAgICAgIT0gSElSOjpFeHByOjpFeHByVHlwZTo6VHVwbGUpDQo+PiArICAgIHJldHVybiBl eHByOw0KPj4gKw0KPj4gKyAgYXV0byByZWYgPSAqc3RhdGljX2Nhc3Q8SElSOjpUdXBsZUV4 cHIgKj4gKGV4cHIuZ2V0X3NjcnV0aW5lZV9leHByICgpLmdldCAoKSk7DQo+PiArDQo+PiAr ICBhdXRvICZ0YWlsID0gcmVmLmdldF90dXBsZV9lbGVtcyAoKTsNCj4+ICsgIHJ1c3RfYXNz ZXJ0ICh0YWlsLnNpemUgKCkgPiAxKTsNCj4+ICsNCj4+ICsgIGF1dG8gaGVhZCA9IHN0ZDo6 bW92ZSAodGFpbFswXSk7DQo+PiArICB0YWlsLmVyYXNlICh0YWlsLmJlZ2luICgpLCB0YWls LmJlZ2luICgpICsgMSk7DQo+PiArDQo+PiArICAvLyBlLmcuDQo+PiArICAvLyBtYXRjaCAo dHVwQSwgdHVwQiwgdHVwQykgew0KPj4gKyAgLy8gICAoYTEsIGIxLCBjMSkgPT4geyBibGsx IH0sDQo+PiArICAvLyAgIChhMiwgYjIsIGMyKSA9PiB7IGJsazIgfSwNCj4+ICsgIC8vICAg KGExLCBiMywgYzMpID0+IHsgYmxrMyB9LA0KPj4gKyAgLy8gfQ0KPj4gKyAgLy8gdGFpbCA9 ICh0dXBCLCB0dXBDKQ0KPj4gKyAgLy8gaGVhZCA9IHR1cEENCj4+ICsNCj4+ICsgIC8vIE1h a2Ugc3VyZSB0aGUgdGFpbCBpcyBvbmx5IGEgdHVwbGUgaWYgaXQgY29uc2lzdHMgb2YgYXQg bGVhc3QgMiBlbGVtZW50cy4NCj4+ICsgIHN0ZDo6dW5pcXVlX3B0cjxISVI6OkV4cHI+IHJl bWFpbmluZzsNCj4+ICsgIGlmICh0YWlsLnNpemUgKCkgPT0gMSkNCj4+ICsgICAgcmVtYWlu aW5nID0gc3RkOjptb3ZlICh0YWlsWzBdKTsNCj4+ICsgIGVsc2UNCj4+ICsgICAgcmVtYWlu aW5nID0gc3RkOjp1bmlxdWVfcHRyPEhJUjo6RXhwcj4gKA0KPj4gKyAgICAgIG5ldyBISVI6 OlR1cGxlRXhwciAocmVmLmdldF9tYXBwaW5ncyAoKSwgc3RkOjptb3ZlICh0YWlsKSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgQVNUOjpBdHRyVmVjICgpLCByZWYuZ2V0X291 dGVyX2F0dHJzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICByZWYuZ2V0X2xv Y3VzICgpKSk7DQo+PiArDQo+PiArICAvLyBlLmcuDQo+PiArICAvLyBhMSAtPiBbKGIxLCBj MSkgPT4geyBibGsxIH0sDQo+PiArICAvLyAgICAgICAgKGIzLCBjMykgPT4geyBibGszIH1d DQo+PiArICAvLyBhMiAtPiBbKGIyLCBjMikgPT4geyBibGsyIH1dDQo+PiArICBzdHJ1Y3Qg UGF0dGVybk1lcmdlIG1hcCA9IHNvcnRfdHVwbGVfcGF0dGVybnMgKGV4cHIpOw0KPj4gKw0K Pj4gKyAgc3RkOjp2ZWN0b3I8SElSOjpNYXRjaENhc2U+IGNhc2VzOw0KPj4gKyAgLy8gQ29u c3RydWN0IHRoZSBpbm5lciBtYXRjaCBmb3IgZWFjaCB1bmlxdWUgZmlyc3QgZWx0IG9mIHRo ZSB0dXBsZQ0KPj4gKyAgLy8gcGF0dGVybnMNCj4+ICsgIGZvciAoc2l6ZV90IGkgPSAwOyBp IDwgbWFwLmhlYWRzLnNpemUgKCk7IGkrKykNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8g aW5uZXJfbWF0Y2hfY2FzZXMgPSBtYXAuY2FzZXNbaV07DQo+PiArDQo+PiArICAgICAgLy8g SWYgdGhlcmUgaXMgYSB3aWxkY2FyZCBhdCB0aGUgb3V0ZXIgbWF0Y2ggbGV2ZWwsIHRoZW4g bmVlZCB0bw0KPj4gKyAgICAgIC8vIHByb3BlZ2F0ZSB0aGUgd2lsZGNhcmQgY2FzZSBpbnRv ICpldmVyeSogaW5uZXIgbWF0Y2guDQo+PiArICAgICAgLy8gRklYTUU6IEl0IGlzIHByb2Jh Ymx5IG5vdCBjb3JyZWN0IHRvIGFkZCB0aGlzIHVuY29uZGl0aW9uYWxseSwgd2hhdCBpZg0K Pj4gKyAgICAgIC8vIHdlIGhhdmUgYSBwYXR0ZXJuIGxpa2UgKGEsIF8sIGMpPyBUaGVuIHRo ZXJlIGlzIGFscmVhZHkgYSB3aWxkY2FyZCBpbg0KPj4gKyAgICAgIC8vIHRoZSBpbm5lciBt YXRjaGVzLCBhbmQgaGF2aW5nIHR3byB3aWxsIGNhdXNlIHR3byAnZGVmYXVsdDonIGJsb2Nr cw0KPj4gKyAgICAgIC8vIHdoaWNoIGlzIGFuIGVycm9yLg0KPj4gKyAgICAgIGlmIChtYXAu d2lsZGNhcmQgIT0gbnVsbHB0cikNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIGlubmVy X21hdGNoX2Nhc2VzLnB1c2hfYmFjayAoKihtYXAud2lsZGNhcmQuZ2V0ICgpKSk7DQo+PiAr ICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAvLyBtYXRjaCAodHVwQiwgdHVwQykgew0KPj4g KyAgICAgIC8vICAgKGIxLCBjMSkgPT4geyBibGsxIH0sDQo+PiArICAgICAgLy8gICAoYjMs IGMzKSA9PiB7IGJsazMgfQ0KPj4gKyAgICAgIC8vIH0NCj4+ICsgICAgICBISVI6Ok1hdGNo RXhwciBpbm5lcl9tYXRjaCAoZXhwci5nZXRfbWFwcGluZ3MgKCksDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLT5jbG9uZV9leHByICgpLCBpbm5l cl9tYXRjaF9jYXNlcywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBB U1Q6OkF0dHJWZWMgKCksIGV4cHIuZ2V0X291dGVyX2F0dHJzICgpLA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ ICsgICAgICBpbm5lcl9tYXRjaCA9IHNpbXBsaWZ5X3R1cGxlX21hdGNoIChpbm5lcl9tYXRj aCk7DQo+PiArDQo+PiArICAgICAgYXV0byBvdXRlcl9hcm1fcGF0ID0gc3RkOjp2ZWN0b3I8 c3RkOjp1bmlxdWVfcHRyPEhJUjo6UGF0dGVybj4+ICgpOw0KPj4gKyAgICAgIG91dGVyX2Fy bV9wYXQuZW1wbGFjZV9iYWNrIChtYXAuaGVhZHNbaV0tPmNsb25lX3BhdHRlcm4gKCkpOw0K Pj4gKw0KPj4gKyAgICAgIEhJUjo6TWF0Y2hBcm0gb3V0ZXJfYXJtIChzdGQ6Om1vdmUgKG91 dGVyX2FybV9wYXQpLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArDQo+PiArICAgICAgLy8g TmVlZCB0byBtb3ZlIHRoZSBpbm5lciBtYXRjaCB0byB0aGUgaGVhcCBhbmQgcHV0IGl0IGlu IGEgdW5pcXVlX3B0ciB0bw0KPj4gKyAgICAgIC8vIGJ1aWxkIHRoZSBhY3R1YWwgbWF0Y2gg Y2FzZSBvZiB0aGUgb3V0ZXIgZXhwcmVzc2lvbg0KPj4gKyAgICAgIC8vIGF1dG8gaW5uZXJf ZXhwciA9IHN0ZDo6dW5pcXVlX3B0cjxISVI6OkV4cHI+IChuZXcgSElSOjpNYXRjaEV4cHIN Cj4+ICsgICAgICAvLyAoaW5uZXJfbWF0Y2gpKTsNCj4+ICsgICAgICBhdXRvIGlubmVyX2V4 cHIgPSBpbm5lcl9tYXRjaC5jbG9uZV9leHByICgpOw0KPj4gKw0KPj4gKyAgICAgIC8vIGEx ID0+IG1hdGNoICh0dXBCLCB0dXBDKSB7IC4uLiB9DQo+PiArICAgICAgSElSOjpNYXRjaENh c2Ugb3V0ZXJfY2FzZSAoZXhwci5nZXRfbWFwcGluZ3MgKCksIG91dGVyX2FybSwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSAoaW5uZXJfZXhwcikp Ow0KPj4gKw0KPj4gKyAgICAgIGNhc2VzLnB1c2hfYmFjayAob3V0ZXJfY2FzZSk7DQo+PiAr ICAgIH0NCj4+ICsNCj4+ICsgIC8vIElmIHRoZXJlIHdhcyBhIHdpbGRjYXJkLCBtYWtlIHN1 cmUgdG8gaW5jbHVkZSBpdCBhdCB0aGUgb3V0ZXIgbWF0Y2ggbGV2ZWwNCj4+ICsgIC8vIHRv by4NCj4+ICsgIGlmIChtYXAud2lsZGNhcmQgIT0gbnVsbHB0cikNCj4+ICsgICAgew0KPj4g KyAgICAgIGNhc2VzLnB1c2hfYmFjayAoKihtYXAud2lsZGNhcmQuZ2V0ICgpKSk7DQo+PiAr ICAgIH0NCj4+ICsNCj4+ICsgIC8vIG1hdGNoIHR1cEEgew0KPj4gKyAgLy8gICBhMSA9PiBt YXRjaCAodHVwQiwgdHVwQykgew0KPj4gKyAgLy8gICAgIChiMSwgYzEpID0+IHsgYmxrMSB9 LA0KPj4gKyAgLy8gICAgIChiMywgYzMpID0+IHsgYmxrMyB9DQo+PiArICAvLyAgIH0NCj4+ ICsgIC8vICAgYTIgPT4gbWF0Y2ggKHR1cEIsIHR1cEMpIHsNCj4+ICsgIC8vICAgICAoYjIs IGMyKSA9PiB7IGJsazIgfQ0KPj4gKyAgLy8gICB9DQo+PiArICAvLyB9DQo+PiArICBISVI6 Ok1hdGNoRXhwciBvdXRlcl9tYXRjaCAoZXhwci5nZXRfbWFwcGluZ3MgKCksIHN0ZDo6bW92 ZSAoaGVhZCksIGNhc2VzLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNU OjpBdHRyVmVjICgpLCBleHByLmdldF9vdXRlcl9hdHRycyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ICsgIHJl dHVybiBvdXRlcl9tYXRjaDsNCj4+ICt9DQo+IA0KPiBMb3RzIG9mIGNvbW1lbnRzIGFib3Zl ISAgR29vZCEgIE1pc3NlZCB0aGVtIGVsc2V3aGVyZSAoaW4gd2hhdCB5b3UnZCBwcm9iYWJs eQ0KPiBjYWxsIGJvaWxlcnBsYXRlIGNvZGUpDQo+IA0KPj4gKy8vIEhlbHBlciBmb3IgQ29t cGlsZUV4cHI6OnZpc2l0IChISVI6Ok1hdGNoRXhwcikuDQo+PiArLy8gQ2hlY2sgdGhhdCB0 aGUgc2NydXRpbmVlIG9mIEVYUFIgaXMgYSB2YWxpZCBraW5kIG9mIGV4cHJlc3Npb24gdG8g bWF0Y2ggb24uDQo+PiArLy8gUmV0dXJuIHRoZSBUeXBlS2luZCBvZiB0aGUgc2NydXRpbmVl IGlmIGl0IGlzIHZhbGlkLCBvciBUeVR5OjpUeXBlS2luZDo6RVJST1INCj4+ICsvLyBpZiBu b3QuDQo+PiArc3RhdGljIFR5VHk6OlR5cGVLaW5kDQo+PiArY2hlY2tfbWF0Y2hfc2NydXRp bmVlIChISVI6Ok1hdGNoRXhwciAmZXhwciwgQ29udGV4dCAqY3R4KQ0KPj4gK3sNCj4+ICsg IFR5VHk6OkJhc2VUeXBlICpzY3J1dGluZWVfZXhwcl90eXR5ID0gbnVsbHB0cjsNCj4+ICsg IGlmICghY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlICgNCj4+ICsgICAgICAgZXhw ci5nZXRfc2NydXRpbmVlX2V4cHIgKCktPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCks DQo+PiArICAgICAgICZzY3J1dGluZWVfZXhwcl90eXR5KSkNCj4+ICsgICAgew0KPj4gKyAg ICAgIHJldHVybiBUeVR5OjpUeXBlS2luZDo6RVJST1I7DQo+PiArICAgIH0NCj4+ICsNCj4+ ICsgIFR5VHk6OlR5cGVLaW5kIHNjcnV0aW5lZV9raW5kID0gc2NydXRpbmVlX2V4cHJfdHl0 eS0+Z2V0X2tpbmQgKCk7DQo+PiArICBydXN0X2Fzc2VydCAoKFR5VHk6OmlzX3ByaW1pdGl2 ZV90eXBlX2tpbmQgKHNjcnV0aW5lZV9raW5kKQ0KPj4gKyAgICAgICAgICAgICAgICYmIHNj cnV0aW5lZV9raW5kICE9IFR5VHk6OlR5cGVLaW5kOjpORVZFUikNCj4+ICsgICAgICAgICAg ICAgIHx8IHNjcnV0aW5lZV9raW5kID09IFR5VHk6OlR5cGVLaW5kOjpBRFQNCj4+ICsgICAg ICAgICAgICAgIHx8IHNjcnV0aW5lZV9raW5kID09IFR5VHk6OlR5cGVLaW5kOjpUVVBMRSk7 DQo+PiArDQo+PiArICBpZiAoc2NydXRpbmVlX2tpbmQgPT0gVHlUeTo6VHlwZUtpbmQ6OkFE VCkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8vIHRoaXMgd2lsbCBuZWVkIHRvIGNoYW5nZSBi dXQgZm9yIG5vdyB0aGUgZmlyc3QgcGFzcyBpbXBsZW1lbnRhdGlvbiwNCj4+ICsgICAgICAv LyBsZXRzIGFzc2VydCB0aGlzIGlzIHRoZSBjYXNlDQo+PiArICAgICAgVHlUeTo6QURUVHlw ZSAqYWR0ID0gc3RhdGljX2Nhc3Q8VHlUeTo6QURUVHlwZSAqPiAoc2NydXRpbmVlX2V4cHJf dHl0eSk7DQo+PiArICAgICAgcnVzdF9hc3NlcnQgKGFkdC0+aXNfZW51bSAoKSk7DQo+PiAr ICAgICAgcnVzdF9hc3NlcnQgKGFkdC0+bnVtYmVyX29mX3ZhcmlhbnRzICgpID4gMCk7DQo+ PiArICAgIH0NCj4+ICsgIGVsc2UgaWYgKHNjcnV0aW5lZV9raW5kID09IFR5VHk6OlR5cGVL aW5kOjpGTE9BVCkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8vIEZJWE1FOiBDQVNFX0xBQkVM X0VYUFIgZG9lcyBub3Qgc3VwcG9ydCBmbG9hdGluZyBwb2ludCB0eXBlcy4NCj4+ICsgICAg ICAvLyBGaW5kIGFub3RoZXIgd2F5IHRvIGNvbXBpbGUgdGhlc2UuDQo+PiArICAgICAgcnVz dF9zb3JyeV9hdCAoZXhwci5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAg ICAibWF0Y2ggb24gZmxvYXRpbmctcG9pbnQgdHlwZXMgaXMgbm90IHlldCBzdXBwb3J0ZWQi KTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKmV4cHJfdHl0eSA9 IG51bGxwdHI7DQo+PiArICBpZiAoIWN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAo ZXhwci5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJmV4cHJfdHl0eSkpDQo+PiArICAgIHsNCj4+ICsg ICAgICByZXR1cm4gVHlUeTo6VHlwZUtpbmQ6OkVSUk9SOw0KPj4gKyAgICB9DQo+PiArDQo+ PiArICByZXR1cm4gc2NydXRpbmVlX2tpbmQ7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6TWF0Y2hFeHByICZleHByKQ0KPj4gK3sNCj4+ ICsgIC8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2NpbnQvQmFzaWMtU3Rh dGVtZW50cy5odG1sI0Jhc2ljLVN0YXRlbWVudHMNCj4+ICsgIC8vIFRPRE8NCj4+ICsgIC8v IFNXSVRDSF9BTExfQ0FTRVNfUCBpcyB0cnVlIGlmIHRoZSBzd2l0Y2ggaW5jbHVkZXMgYSBk ZWZhdWx0IGxhYmVsIG9yIHRoZQ0KPj4gKyAgLy8gY2FzZSBsYWJlbCByYW5nZXMgY292ZXIg YWxsIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24NCj4+ICsN Cj4+ICsgIC8qIFN3aXRjaCBleHByZXNzaW9uLg0KPj4gKw0KPj4gKyAgICAgVFJFRV9UWVBF IGlzIHRoZSBvcmlnaW5hbCB0eXBlIG9mIHRoZSBjb25kaXRpb24sIGJlZm9yZSBhbnkNCj4+ ICsgICAgIGxhbmd1YWdlIHJlcXVpcmVkIHR5cGUgY29udmVyc2lvbnMuICBJdCBtYXkgYmUg TlVMTCwgaW4gd2hpY2ggY2FzZQ0KPj4gKyAgICAgdGhlIG9yaWdpbmFsIHR5cGUgYW5kIGZp bmFsIHR5cGVzIGFyZSBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lLg0KPj4gKw0KPj4gKyAgICAg T3BlcmFuZCAwIGlzIHRoZSBleHByZXNzaW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgYnJhbmNo LA0KPj4gKyAgICAgT3BlcmFuZCAxIGlzIHRoZSBib2R5IG9mIHRoZSBzd2l0Y2gsIHdoaWNo IHByb2JhYmx5IGNvbnRhaW5zDQo+PiArICAgICAgIENBU0VfTEFCRUxfRVhQUnMuICBJdCBt YXkgYWxzbyBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIG9wZXJhbmQgMg0KPj4gKyAgICAgICBt dXN0IG5vdCBiZSBOVUxMLiAgKi8NCj4+ICsgIC8vIERFRlRSRUVDT0RFIChTV0lUQ0hfRVhQ UiwgInN3aXRjaF9leHByIiwgdGNjX3N0YXRlbWVudCwgMikNCj4+ICsNCj4+ICsgIC8qIFVz ZWQgdG8gcmVwcmVzZW50IGEgY2FzZSBsYWJlbC4NCj4+ICsNCj4+ICsgICAgIE9wZXJhbmQg MCBpcyBDQVNFX0xPVy4gIEl0IG1heSBiZSBOVUxMX1RSRUUsIGluIHdoaWNoIGNhc2UgdGhl IGxhYmVsDQo+PiArICAgICAgIGlzIGEgJ2RlZmF1bHQnIGxhYmVsLg0KPj4gKyAgICAgT3Bl cmFuZCAxIGlzIENBU0VfSElHSC4gIElmIGl0IGlzIE5VTExfVFJFRSwgdGhlIGxhYmVsIGlz IGEgc2ltcGxlDQo+PiArICAgICAgIChvbmUtdmFsdWUpIGNhc2UgbGFiZWwuICBJZiBpdCBp cyBub24tTlVMTF9UUkVFLCB0aGUgY2FzZSBpcyBhIHJhbmdlLg0KPj4gKyAgICAgT3BlcmFu ZCAyIGlzIENBU0VfTEFCRUwsIHdoaWNoIGhhcyB0aGUgY29ycmVzcG9uZGluZyBMQUJFTF9E RUNMLg0KPj4gKyAgICAgT3BlcmFuZCAzIGlzIENBU0VfQ0hBSU4uICBUaGlzIG9wZXJhbmQg aXMgb25seSB1c2VkIGluIHRyZWUtY2ZnLmNjIHRvDQo+PiArICAgICAgIHNwZWVkIHVwIHRo ZSBsb29rdXAgb2YgY2FzZSBsYWJlbHMgd2hpY2ggdXNlIGEgcGFydGljdWxhciBlZGdlIGlu DQo+PiArICAgICAgIHRoZSBjb250cm9sIGZsb3cgZ3JhcGguICAqLw0KPj4gKyAgLy8gREVG VFJFRUNPREUgKENBU0VfTEFCRUxfRVhQUiwgImNhc2VfbGFiZWxfZXhwciIsIHRjY19zdGF0 ZW1lbnQsIDQpDQo+IA0KPiBUaGUgY3V0JnBhc3RlIGZyb20gdHJlZS5kZWYgY2FuIHByb2Jh Ymx5IGJlIHJlbW92ZWQuDQo+IA0KPj4gKyAgVHlUeTo6VHlwZUtpbmQgc2NydXRpbmVlX2tp bmQgPSBjaGVja19tYXRjaF9zY3J1dGluZWUgKGV4cHIsIGN0eCk7DQo+PiArICBpZiAoc2Ny dXRpbmVlX2tpbmQgPT0gVHlUeTo6VHlwZUtpbmQ6OkVSUk9SKQ0KPj4gKyAgICB7DQo+PiAr ICAgICAgdHJhbnNsYXRlZCA9IGVycm9yX21hcmtfbm9kZTsNCj4+ICsgICAgICByZXR1cm47 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIFR5VHk6OkJhc2VUeXBlICpleHByX3R5dHkgPSBu dWxscHRyOw0KPj4gKyAgaWYgKCFjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKGV4 cHIuZ2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZleHByX3R5dHkpKQ0KPj4gKyAgICB7DQo+PiArICAg ICAgdHJhbnNsYXRlZCA9IGVycm9yX21hcmtfbm9kZTsNCj4+ICsgICAgICByZXR1cm47DQo+ PiArICAgIH0NCj4+ICsNCj4+ICsgIGZuY29udGV4dCBmbmN0eCA9IGN0eC0+cGVla19mbiAo KTsNCj4+ICsgIEJ2YXJpYWJsZSAqdG1wID0gTlVMTDsNCj4+ICsgIGJvb2wgbmVlZHNfdGVt cCA9ICFleHByX3R5dHktPmlzX3VuaXQgKCk7DQo+PiArICBpZiAobmVlZHNfdGVtcCkNCj4+ ICsgICAgew0KPj4gKyAgICAgIHRyZWUgZW5jbG9zaW5nX3Njb3BlID0gY3R4LT5wZWVrX2Vu Y2xvc2luZ19zY29wZSAoKTsNCj4+ICsgICAgICB0cmVlIGJsb2NrX3R5cGUgPSBUeVR5UmVz b2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgZXhwcl90eXR5KTsNCj4+ICsNCj4+ICsgICAg ICBib29sIGlzX2FkZHJlc3NfdGFrZW4gPSBmYWxzZTsNCj4+ICsgICAgICB0cmVlIHJldF92 YXJfc3RtdCA9IG51bGxwdHI7DQo+PiArICAgICAgdG1wID0gY3R4LT5nZXRfYmFja2VuZCAo KS0+dGVtcG9yYXJ5X3ZhcmlhYmxlICgNCj4+ICsgICAgICAgZm5jdHguZm5kZWNsLCBlbmNs b3Npbmdfc2NvcGUsIGJsb2NrX3R5cGUsIE5VTEwsIGlzX2FkZHJlc3NfdGFrZW4sDQo+PiAr ICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpLCAmcmV0X3Zhcl9zdG10KTsNCj4+ICsgICAgICBj dHgtPmFkZF9zdGF0ZW1lbnQgKHJldF92YXJfc3RtdCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ ICsgIC8vIGxldHMgY29tcGlsZSB0aGUgc2NydXRpbmVlIGV4cHJlc3Npb24NCj4+ICsgIHRy ZWUgbWF0Y2hfc2NydXRpbmVlX2V4cHINCj4+ICsgICAgPSBDb21waWxlRXhwcjo6Q29tcGls ZSAoZXhwci5nZXRfc2NydXRpbmVlX2V4cHIgKCkuZ2V0ICgpLCBjdHgpOw0KPj4gKw0KPj4g KyAgdHJlZSBtYXRjaF9zY3J1dGluZWVfZXhwcl9xdWFsaWZpZXJfZXhwcjsNCj4+ICsgIGlm IChUeVR5Ojppc19wcmltaXRpdmVfdHlwZV9raW5kIChzY3J1dGluZWVfa2luZCkpDQo+PiAr ICAgIHsNCj4+ICsgICAgICBtYXRjaF9zY3J1dGluZWVfZXhwcl9xdWFsaWZpZXJfZXhwciA9 IG1hdGNoX3NjcnV0aW5lZV9leHByOw0KPj4gKyAgICB9DQo+PiArICBlbHNlIGlmIChzY3J1 dGluZWVfa2luZCA9PSBUeVR5OjpUeXBlS2luZDo6QURUKQ0KPj4gKyAgICB7DQo+PiArICAg ICAgLy8gbmVlZCB0byBhY2Nlc3MgcXVhbGlmaWVyIHRoZSBmaWVsZCwgaWYgd2UgdXNlIFFV QUxfVU5JT05fVFlQRSB0aGlzDQo+PiArICAgICAgLy8gd291bGQgYmUgREVDTF9RVUFMSUZJ RVIgaSB0aGluay4gRm9yIG5vdyB0aGlzIHdpbGwganVzdCBhY2Nlc3MgdGhlDQo+PiArICAg ICAgLy8gZmlyc3QgcmVjb3JkIGZpZWxkIGFuZCBpdHMgcmVzcGVjdGl2ZSBxdWFsaWZpZXIg YmVjYXVzZSBpdCB3aWxsIGFsd2F5cw0KPj4gKyAgICAgIC8vIGJlIHNldCBiZWNhdXNlIHRo aXMgaXMgYWxsIGEgYmlnIHNwZWNpYWwgdW5pb24NCj4+ICsgICAgICB0cmVlIHNjcnV0aW5l ZV9maXJzdF9yZWNvcmRfZXhwcg0KPj4gKyAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCkt PnN0cnVjdF9maWVsZF9leHByZXNzaW9uICgNCj4+ICsgICAgICAgICBtYXRjaF9zY3J1dGlu ZWVfZXhwciwgMCwgZXhwci5nZXRfc2NydXRpbmVlX2V4cHIgKCktPmdldF9sb2N1cyAoKSk7 DQo+PiArICAgICAgbWF0Y2hfc2NydXRpbmVlX2V4cHJfcXVhbGlmaWVyX2V4cHINCj4+ICsg ICAgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5zdHJ1Y3RfZmllbGRfZXhwcmVzc2lvbiAo DQo+PiArICAgICAgICAgc2NydXRpbmVlX2ZpcnN0X3JlY29yZF9leHByLCAwLA0KPj4gKyAg ICAgICAgIGV4cHIuZ2V0X3NjcnV0aW5lZV9leHByICgpLT5nZXRfbG9jdXMgKCkpOw0KPj4g KyAgICB9DQo+PiArICBlbHNlIGlmIChzY3J1dGluZWVfa2luZCA9PSBUeVR5OjpUeXBlS2lu ZDo6VFVQTEUpDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBtYXRjaCBvbiB0dXBsZSBiZWNv bWVzIGEgc2VyaWVzIG9mIG5lc3RlZCBzd2l0Y2hlcywgd2l0aCBvbmUgbGV2ZWwNCj4+ICsg ICAgICAvLyBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSB0dXBsZSBmcm9tIGxlZnQgdG8gcmln aHQuDQo+PiArICAgICAgYXV0byBleHBydHlwZSA9IGV4cHIuZ2V0X3NjcnV0aW5lZV9leHBy ICgpLT5nZXRfZXhwcmVzc2lvbl90eXBlICgpOw0KPj4gKyAgICAgIHN3aXRjaCAoZXhwcnR5 cGUpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBjYXNlIEhJUjo6RXhwcjo6RXhwclR5 cGU6OlR1cGxlOiB7DQo+PiArICAgICAgICAgICAvLyBCdWlsZCBhbiBlcXVpdmFsZW50IGV4 cHJlc3Npb24gd2hpY2ggaXMgbmljZXIgdG8gbG93ZXIuDQo+PiArICAgICAgICAgICBISVI6 Ok1hdGNoRXhwciBvdXRlcl9tYXRjaCA9IHNpbXBsaWZ5X3R1cGxlX21hdGNoIChleHByKTsN Cj4+ICsNCj4+ICsgICAgICAgICAgIC8vIFdlJ3ZlIHJlYXJyYW5nZWQgdGhlIG1hdGNoIGlu dG8gc29tZXRoaW5nIHRoYXQgbG93ZXJzIGJldHRlcg0KPj4gKyAgICAgICAgICAgLy8gdG8g R0VORVJJQyB0cmVlcy4NCj4+ICsgICAgICAgICAgIC8vIEZvciBhY3R1YWxseSBkb2luZyB0 aGUgbG93ZXJpbmcgd2UgbmVlZCB0byBjb21waWxlIHRoZSBtYXRjaA0KPj4gKyAgICAgICAg ICAgLy8gd2UndmUganVzdCBtYWRlLiBCdXQgd2UncmUgaGFsZi13YXkgdGhyb3VnaCBjb21w aWxpbmcgdGhlDQo+PiArICAgICAgICAgICAvLyBvcmlnaW5hbCBvbmUuDQo+PiArICAgICAg ICAgICAvLyAuLi4NCj4+ICsgICAgICAgICAgIC8vIEZvciBub3csIGxldCdzIGp1c3QgcmVw bGFjZSB0aGUgb3JpZ2luYWwgd2l0aCB0aGUgcmVhcnJhbmdlZCBvbmUNCj4+ICsgICAgICAg ICAgIC8vIHdlIGp1c3QgbWFkZSwgYW5kIGNvbXBpbGUgdGhhdCBpbnN0ZWFkLiBXaGF0IGNv dWxkIGdvIHdyb25nPyA6KQ0KPj4gKyAgICAgICAgICAgLy8NCj4+ICsgICAgICAgICAgIC8v IEZJWE1FOiBXaGF0IGFib3V0IHdoZW4gd2UgZGVjaWRlIGEgdGVtcG9yYXJ5IGlzIG5lZWRl ZCBhYm92ZT8NCj4+ICsgICAgICAgICAgIC8vICAgICAgICBXZSBtaWdodCBoYXZlIGFscmVh ZHkgcHVzaGVkIGEgc3RhdGVtZW50IGZvciBpdCB0aGF0DQo+PiArICAgICAgICAgICAvLyAg ICAgICAgd2Ugbm8gbG9uZ2VyIG5lZWQuIFByb2JhYmx5IG5lZWQgdG8gcmVhcnJhbmdlIHRo ZSBvcmRlcg0KPj4gKyAgICAgICAgICAgLy8gICAgICAgIG9mIHRoZXNlIHN0ZXBzLg0KPj4g KyAgICAgICAgICAgZXhwciA9IG91dGVyX21hdGNoOw0KPj4gKw0KPj4gKyAgICAgICAgICAg c2NydXRpbmVlX2tpbmQgPSBjaGVja19tYXRjaF9zY3J1dGluZWUgKGV4cHIsIGN0eCk7DQo+ PiArICAgICAgICAgICBpZiAoc2NydXRpbmVlX2tpbmQgPT0gVHlUeTo6VHlwZUtpbmQ6OkVS Uk9SKQ0KPj4gKyAgICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgdHJhbnNsYXRl ZCA9IGVycm9yX21hcmtfbm9kZTsNCj4+ICsgICAgICAgICAgICAgICByZXR1cm47DQo+PiAr ICAgICAgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgICAgIC8vIE5vdyBjb21waWxlIHRo ZSBzY3J1dGluZWUgb2YgdGhlIHNpbXBsaWZpZWQgbWF0Y2guDQo+PiArICAgICAgICAgICAv LyBGSVhNRTogdGhpcyBwYXJ0IGlzIGR1cGxpY2F0ZWQgZnJvbSBhYm92ZS4NCj4+ICsgICAg ICAgICAgIG1hdGNoX3NjcnV0aW5lZV9leHByDQo+PiArICAgICAgICAgICAgID0gQ29tcGls ZUV4cHI6OkNvbXBpbGUgKGV4cHIuZ2V0X3NjcnV0aW5lZV9leHByICgpLmdldCAoKSwgY3R4 KTsNCj4+ICsNCj4+ICsgICAgICAgICAgIGlmIChUeVR5Ojppc19wcmltaXRpdmVfdHlwZV9r aW5kIChzY3J1dGluZWVfa2luZCkpDQo+PiArICAgICAgICAgICAgIHsNCj4+ICsgICAgICAg ICAgICAgICBtYXRjaF9zY3J1dGluZWVfZXhwcl9xdWFsaWZpZXJfZXhwciA9IG1hdGNoX3Nj cnV0aW5lZV9leHByOw0KPj4gKyAgICAgICAgICAgICB9DQo+PiArICAgICAgICAgICBlbHNl IGlmIChzY3J1dGluZWVfa2luZCA9PSBUeVR5OjpUeXBlS2luZDo6QURUKQ0KPj4gKyAgICAg ICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhY2Nlc3MgcXVhbGlm aWVyIHRoZSBmaWVsZCwgaWYgd2UgdXNlIFFVQUxfVU5JT05fVFlQRQ0KPj4gKyAgICAgICAg ICAgICAgIC8vIHRoaXMgd291bGQgYmUgREVDTF9RVUFMSUZJRVIgaSB0aGluay4gRm9yIG5v dyB0aGlzIHdpbGwganVzdA0KPj4gKyAgICAgICAgICAgICAgIC8vIGFjY2VzcyB0aGUgZmly c3QgcmVjb3JkIGZpZWxkIGFuZCBpdHMgcmVzcGVjdGl2ZSBxdWFsaWZpZXINCj4+ICsgICAg ICAgICAgICAgICAvLyBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHNldCBiZWNhdXNlIHRo aXMgaXMgYWxsIGEgYmlnDQo+PiArICAgICAgICAgICAgICAgLy8gc3BlY2lhbCB1bmlvbg0K Pj4gKyAgICAgICAgICAgICAgIHRyZWUgc2NydXRpbmVlX2ZpcnN0X3JlY29yZF9leHByDQo+ PiArICAgICAgICAgICAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnN0cnVjdF9maWVs ZF9leHByZXNzaW9uICgNCj4+ICsgICAgICAgICAgICAgICAgICAgbWF0Y2hfc2NydXRpbmVl X2V4cHIsIDAsDQo+PiArICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X3NjcnV0aW5lZV9l eHByICgpLT5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICAgICAgICAgICAgIG1hdGNoX3NjcnV0 aW5lZV9leHByX3F1YWxpZmllcl9leHByDQo+PiArICAgICAgICAgICAgICAgICA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPnN0cnVjdF9maWVsZF9leHByZXNzaW9uICgNCj4+ICsgICAgICAg ICAgICAgICAgICAgc2NydXRpbmVlX2ZpcnN0X3JlY29yZF9leHByLCAwLA0KPj4gKyAgICAg ICAgICAgICAgICAgICBleHByLmdldF9zY3J1dGluZWVfZXhwciAoKS0+Z2V0X2xvY3VzICgp KTsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgICAgZWxzZQ0KPj4gKyAgICAg ICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoZXJlIGFyZSBvdGhl ciBjYXNlcywgYnV0IGl0IGJldHRlciBub3QgYmUgYSBUdXBsZQ0KPj4gKyAgICAgICAgICAg ICAgIGdjY191bnJlYWNoYWJsZSAoKTsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAg ICAgIH0NCj4+ICsgICAgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgICAgICBjYXNlIEhJ Ujo6RXhwcjo6RXhwclR5cGU6OlBhdGg6IHsNCj4+ICsgICAgICAgICAgIC8vIEZJWE1FDQo+ PiArICAgICAgICAgICBnY2NfdW5yZWFjaGFibGUgKCk7DQo+PiArICAgICAgICAgfQ0KPj4g KyAgICAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICAgICBkZWZhdWx0Og0KPj4gKyAgICAg ICAgIGdjY191bnJlYWNoYWJsZSAoKTsNCj4+ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiAr ICBlbHNlDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBGSVhNRTogbWF0Y2ggb24gb3RoZXIg dHlwZXMgb2YgZXhwcmVzc2lvbnMgbm90IHlldCBpbXBsZW1lbnRlZC4NCj4+ICsgICAgICBn Y2NfdW5yZWFjaGFibGUgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIHNldHVwIHRo ZSBlbmQgbGFiZWwgc28gdGhlIGNhc2VzIGNhbiBleGl0IHByb3Blcmx5DQo+PiArICB0cmVl IGZuZGVjbCA9IGZuY3R4LmZuZGVjbDsNCj4+ICsgIExvY2F0aW9uIGVuZF9sYWJlbF9sb2N1 cyA9IGV4cHIuZ2V0X2xvY3VzICgpOyAvLyBGSVhNRQ0KPj4gKyAgdHJlZSBlbmRfbGFiZWwN Cj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5sYWJlbCAoZm5kZWNsLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIC8qIGVtcHR5IGNyZWF0ZXMgYW4g YXJ0aWZpY2lhbCBsYWJlbCAqLywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBlbmRfbGFiZWxfbG9jdXMpOw0KPj4gKyAgdHJlZSBlbmRfbGFiZWxfZGVjbF9zdGF0 ZW1lbnQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5sYWJlbF9kZWZpbml0aW9u X3N0YXRlbWVudCAoZW5kX2xhYmVsKTsNCj4+ICsNCj4+ICsgIC8vIHNldHVwIHRoZSBzd2l0 Y2gtYm9keS1ibG9jaw0KPj4gKyAgTG9jYXRpb24gc3RhcnRfbG9jYXRpb247IC8vIEZJWE1F DQo+PiArICBMb2NhdGlvbiBlbmRfbG9jYXRpb247ICAgLy8gRklYTUUNCj4+ICsgIHRyZWUg ZW5jbG9zaW5nX3Njb3BlID0gY3R4LT5wZWVrX2VuY2xvc2luZ19zY29wZSAoKTsNCj4+ICsg IHRyZWUgc3dpdGNoX2JvZHlfYmxvY2sNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgp LT5ibG9jayAoZm5kZWNsLCBlbmNsb3Npbmdfc2NvcGUsIHt9LCBzdGFydF9sb2NhdGlvbiwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfbG9jYXRpb24pOw0K Pj4gKyAgY3R4LT5wdXNoX2Jsb2NrIChzd2l0Y2hfYm9keV9ibG9jayk7DQo+PiArDQo+PiAr ICBmb3IgKGF1dG8gJmthc2UgOiBleHByLmdldF9tYXRjaF9jYXNlcyAoKSkNCj4+ICsgICAg ew0KPj4gKyAgICAgIC8vIGZvciBub3cgbGV0cyBqdXN0IGdldCBzaW5nbGUgcGF0dGVybidz IHdvcmtpbmcNCj4+ICsgICAgICBISVI6Ok1hdGNoQXJtICZrYXNlX2FybSA9IGthc2UuZ2V0 X2FybSAoKTsNCj4+ICsgICAgICBydXN0X2Fzc2VydCAoa2FzZV9hcm0uZ2V0X3BhdHRlcm5z ICgpLnNpemUgKCkgPiAwKTsNCj4+ICsNCj4+ICsgICAgICAvLyBnZW5lcmF0ZSBpbXBsaWNp dCBsYWJlbA0KPj4gKyAgICAgIExvY2F0aW9uIGFybV9sb2N1cyA9IGthc2VfYXJtLmdldF9s b2N1cyAoKTsNCj4+ICsgICAgICB0cmVlIGNhc2VfbGFiZWwgPSBjdHgtPmdldF9iYWNrZW5k ICgpLT5sYWJlbCAoDQo+PiArICAgICAgIGZuZGVjbCwgIiIgLyogZW1wdHkgY3JlYXRlcyBh biBhcnRpZmljaWFsIGxhYmVsICovLCBhcm1fbG9jdXMpOw0KPj4gKw0KPj4gKyAgICAgIC8v IHNldHVwIHRoZSBiaW5kaW5ncyBmb3IgdGhlIGJsb2NrDQo+PiArICAgICAgZm9yIChhdXRv ICZrYXNlX3BhdHRlcm4gOiBrYXNlX2FybS5nZXRfcGF0dGVybnMgKCkpDQo+PiArICAgICAg IHsNCj4+ICsgICAgICAgICB0cmVlIHN3aXRjaF9rYXNlX2V4cHINCj4+ICsgICAgICAgICAg ID0gQ29tcGlsZVBhdHRlcm5DYXNlTGFiZWxFeHByOjpDb21waWxlIChrYXNlX3BhdHRlcm4u Z2V0ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNhc2VfbGFiZWwsIGN0eCk7DQo+PiArICAgICAgICAgY3R4LT5hZGRfc3Rh dGVtZW50IChzd2l0Y2hfa2FzZV9leHByKTsNCj4+ICsNCj4+ICsgICAgICAgICBDb21waWxl UGF0dGVybkJpbmRpbmdzOjpDb21waWxlIChrYXNlX3BhdHRlcm4uZ2V0ICgpLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3NjcnV0aW5l ZV9leHByLCBjdHgpOw0KPj4gKyAgICAgICB9DQo+PiArDQo+PiArICAgICAgLy8gY29tcGls ZSB0aGUgZXhwciBhbmQgc2V0dXAgdGhlIGFzc2lnbm1lbnQgaWYgcmVxdWlyZWQgd2hlbiB0 bXAgIT0gTlVMTA0KPj4gKyAgICAgIHRyZWUga2FzZV9leHByX3RyZWUgPSBDb21waWxlRXhw cjo6Q29tcGlsZSAoa2FzZS5nZXRfZXhwciAoKS5nZXQgKCksIGN0eCk7DQo+PiArICAgICAg aWYgKHRtcCAhPSBOVUxMKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgdHJlZSByZXN1 bHRfcmVmZXJlbmNlDQo+PiArICAgICAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnZh cl9leHByZXNzaW9uICh0bXAsIGFybV9sb2N1cyk7DQo+PiArICAgICAgICAgdHJlZSBhc3Np Z25tZW50DQo+PiArICAgICAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmFzc2lnbm1l bnRfc3RhdGVtZW50IChyZXN1bHRfcmVmZXJlbmNlLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2FzZV9leHByX3RyZWUs DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBhcm1fbG9jdXMpOw0KPj4gKyAgICAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAo YXNzaWdubWVudCk7DQo+PiArICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAvLyBnbyB0byBl bmQgbGFiZWwNCj4+ICsgICAgICB0cmVlIGdvdG9fZW5kX2xhYmVsID0gYnVpbGQxX2xvYyAo YXJtX2xvY3VzLmdjY19sb2NhdGlvbiAoKSwgR09UT19FWFBSLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRfdHlwZV9ub2RlLCBlbmRfbGFiZWwp Ow0KPj4gKyAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAoZ290b19lbmRfbGFiZWwpOw0KPj4g KyAgICB9DQo+PiArDQo+PiArICAvLyBzZXR1cCB0aGUgc3dpdGNoIGV4cHJlc3Npb24NCj4+ ICsgIHRyZWUgbWF0Y2hfYm9keSA9IGN0eC0+cG9wX2Jsb2NrICgpOw0KPj4gKyAgdHJlZSBt YXRjaF9leHByX3N0bXQNCj4+ICsgICAgPSBidWlsZDJfbG9jIChleHByLmdldF9sb2N1cyAo KS5nY2NfbG9jYXRpb24gKCksIFNXSVRDSF9FWFBSLA0KPj4gKyAgICAgICAgICAgICAgICAg VFJFRV9UWVBFIChtYXRjaF9zY3J1dGluZWVfZXhwcl9xdWFsaWZpZXJfZXhwciksDQo+PiAr ICAgICAgICAgICAgICAgICBtYXRjaF9zY3J1dGluZWVfZXhwcl9xdWFsaWZpZXJfZXhwciwg bWF0Y2hfYm9keSk7DQo+PiArICBjdHgtPmFkZF9zdGF0ZW1lbnQgKG1hdGNoX2V4cHJfc3Rt dCk7DQo+PiArICBjdHgtPmFkZF9zdGF0ZW1lbnQgKGVuZF9sYWJlbF9kZWNsX3N0YXRlbWVu dCk7DQo+PiArDQo+PiArICBpZiAodG1wICE9IE5VTEwpDQo+PiArICAgIHsNCj4+ICsgICAg ICB0cmFuc2xhdGVkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+dmFyX2V4cHJlc3Npb24gKHRt cCwgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICB9DQo+PiArfQ0KPj4gKw0KPj4gK3Zv aWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6Q2FsbEV4cHIgJmV4cHIpDQo+PiAr ew0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnR5dHkgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFj dHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKA0KPj4gKyAgICAgICBleHByLmdldF9m bmV4cHIgKCktPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZ0eXR5KSkNCj4+ICsg ICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X2xvY3VzICgpLCAidW5r bm93biB0eXBlIik7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiAr ICAvLyBtdXN0IGJlIGEgdHVwbGUgY29uc3RydWN0b3INCj4+ICsgIGJvb2wgaXNfZm4gPSB0 eXR5LT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6Rk5ERUYNCj4+ICsgICAgICAg ICAgICAgIHx8IHR5dHktPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpGTlBUUjsN Cj4+ICsgIGJvb2wgaXNfYWR0X2N0b3IgPSAhaXNfZm47DQo+PiArICBpZiAoaXNfYWR0X2N0 b3IpDQo+PiArICAgIHsNCj4+ICsgICAgICBydXN0X2Fzc2VydCAodHl0eS0+Z2V0X2tpbmQg KCkgPT0gVHlUeTo6VHlwZUtpbmQ6OkFEVCk7DQo+PiArICAgICAgVHlUeTo6QURUVHlwZSAq YWR0ID0gc3RhdGljX2Nhc3Q8VHlUeTo6QURUVHlwZSAqPiAodHl0eSk7DQo+PiArICAgICAg dHJlZSBjb21waWxlZF9hZHRfdHlwZSA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAo Y3R4LCB0eXR5KTsNCj4+ICsNCj4+ICsgICAgICAvLyB3aGF0IHZhcmlhbnQgaXMgaXQ/DQo+ PiArICAgICAgaW50IHVuaW9uX2Rpc3JpbWluYXRvciA9IC0xOw0KPj4gKyAgICAgIFR5VHk6 OlZhcmlhbnREZWYgKnZhcmlhbnQgPSBudWxscHRyOw0KPj4gKyAgICAgIGlmICghYWR0LT5p c19lbnVtICgpKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAgcnVzdF9hc3NlcnQgKGFk dC0+bnVtYmVyX29mX3ZhcmlhbnRzICgpID09IDEpOw0KPj4gKyAgICAgICAgIHZhcmlhbnQg PSBhZHQtPmdldF92YXJpYW50cyAoKS5hdCAoMCk7DQo+PiArICAgICAgIH0NCj4+ICsgICAg ICBlbHNlDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBIaXJJZCB2YXJpYW50X2lkOw0K Pj4gKyAgICAgICAgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3Zhcmlh bnRfZGVmaW5pdGlvbiAoDQo+PiArICAgICAgICAgICBleHByLmdldF9mbmV4cHIgKCktPmdl dF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZ2YXJpYW50X2lkKTsNCj4+ICsgICAgICAg ICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgICAgICAgIG9rID0gYWR0LT5sb29r dXBfdmFyaWFudF9ieV9pZCAodmFyaWFudF9pZCwgJnZhcmlhbnQsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5pb25fZGlzcmltaW5hdG9yKTsN Cj4+ICsgICAgICAgICBydXN0X2Fzc2VydCAob2spOw0KPj4gKyAgICAgICB9DQo+PiArDQo+ PiArICAgICAgLy8gdGhpcyBhc3N1bWVzIGFsbCBmaWVsZHMgYXJlIGluIG9yZGVyIGZyb20g dHlwZSByZXNvbHV0aW9uIGFuZCBpZiBhDQo+PiArICAgICAgLy8gYmFzZSBzdHJ1Y3Qgd2Fz IHNwZWNpZmllZCB0aG9zZSBmaWVsZHMgYXJlIGZpbGVkIHZpYSBhY2Nlc29ycw0KPj4gKyAg ICAgIHN0ZDo6dmVjdG9yPHRyZWU+IGFyZ3VtZW50czsNCj4+ICsgICAgICBmb3IgKHNpemVf dCBpID0gMDsgaSA8IGV4cHIuZ2V0X2FyZ3VtZW50cyAoKS5zaXplICgpOyBpKyspDQo+PiAr ICAgICAgIHsNCj4+ICsgICAgICAgICBhdXRvICZhcmd1bWVudCA9IGV4cHIuZ2V0X2FyZ3Vt ZW50cyAoKS5hdCAoaSk7DQo+PiArICAgICAgICAgYXV0byBydmFsdWUgPSBDb21waWxlRXhw cjo6Q29tcGlsZSAoYXJndW1lbnQuZ2V0ICgpLCBjdHgpOw0KPj4gKw0KPj4gKyAgICAgICAg IC8vIGFzc2lnbm1lbnRzIGFyZSBjb2VyY2lvbiBzaXRlcyBzbyBsZXRzIGNvbnZlcnQgdGhl IHJ2YWx1ZSBpZg0KPj4gKyAgICAgICAgIC8vIG5lY2Vzc2FyeQ0KPj4gKyAgICAgICAgIGF1 dG8gcmVzcGVjdGl2ZV9maWVsZCA9IHZhcmlhbnQtPmdldF9maWVsZF9hdF9pbmRleCAoaSk7 DQo+PiArICAgICAgICAgYXV0byBleHBlY3RlZCA9IHJlc3BlY3RpdmVfZmllbGQtPmdldF9m aWVsZF90eXBlICgpOw0KPj4gKw0KPj4gKyAgICAgICAgIFR5VHk6OkJhc2VUeXBlICphY3R1 YWwgPSBudWxscHRyOw0KPj4gKyAgICAgICAgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAo KS0+bG9va3VwX3R5cGUgKA0KPj4gKyAgICAgICAgICAgYXJndW1lbnQtPmdldF9tYXBwaW5n cyAoKS5nZXRfaGlyaWQgKCksICZhY3R1YWwpOw0KPj4gKyAgICAgICAgIHJ1c3RfYXNzZXJ0 IChvayk7DQo+PiArDQo+PiArICAgICAgICAgLy8gY29lcmNlIGl0IGlmIHJlcXVpcmVkDQo+ PiArICAgICAgICAgTG9jYXRpb24gbHZhbHVlX2xvY3VzDQo+PiArICAgICAgICAgICA9IGN0 eC0+Z2V0X21hcHBpbmdzICgpLT5sb29rdXBfbG9jYXRpb24gKGV4cGVjdGVkLT5nZXRfdHlf cmVmICgpKTsNCj4+ICsgICAgICAgICBMb2NhdGlvbiBydmFsdWVfbG9jdXMgPSBhcmd1bWVu dC0+Z2V0X2xvY3VzICgpOw0KPj4gKyAgICAgICAgIHJ2YWx1ZQ0KPj4gKyAgICAgICAgICAg PSBjb2VyY2lvbl9zaXRlIChhcmd1bWVudC0+Z2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAo KSwgcnZhbHVlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwsIGV4 cGVjdGVkLCBsdmFsdWVfbG9jdXMsIHJ2YWx1ZV9sb2N1cyk7DQo+PiArDQo+PiArICAgICAg ICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0DQo+PiArICAgICAgICAgYXJndW1lbnRzLnB1c2hf YmFjayAocnZhbHVlKTsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIC8vIHRoZSBj b25zdHJ1Y3RvciBkZXBlbmRzIG9uIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseSBhbiBlbnVt IG9yIG5vdCBpZg0KPj4gKyAgICAgIC8vIGl0cyBhbiBlbnVtIHdlIG5lZWQgdG8gc2V0dXAg dGhlIGRpc2NyaW1pbmF0b3INCj4+ICsgICAgICBzdGQ6OnZlY3Rvcjx0cmVlPiBjdG9yX2Fy Z3VtZW50czsNCj4+ICsgICAgICBpZiAoYWR0LT5pc19lbnVtICgpKQ0KPj4gKyAgICAgICB7 DQo+PiArICAgICAgICAgSElSOjpFeHByICpkaXNjcmltX2V4cHIgPSB2YXJpYW50LT5nZXRf ZGlzY3JpbWluYW50ICgpOw0KPj4gKyAgICAgICAgIHRyZWUgZGlzY3JpbV9leHByX25vZGUg PSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZGlzY3JpbV9leHByLCBjdHgpOw0KPj4gKyAgICAg ICAgIHRyZWUgZm9sZGVkX2Rpc2NyaW1fZXhwciA9IGZvbGRfZXhwciAoZGlzY3JpbV9leHBy X25vZGUpOw0KPj4gKyAgICAgICAgIHRyZWUgcXVhbGlmaWVyID0gZm9sZGVkX2Rpc2NyaW1f ZXhwcjsNCj4+ICsNCj4+ICsgICAgICAgICBjdG9yX2FyZ3VtZW50cy5wdXNoX2JhY2sgKHF1 YWxpZmllcik7DQo+PiArICAgICAgIH0NCj4+ICsgICAgICBmb3IgKGF1dG8gJmFyZyA6IGFy Z3VtZW50cykNCj4+ICsgICAgICAgY3Rvcl9hcmd1bWVudHMucHVzaF9iYWNrIChhcmcpOw0K Pj4gKw0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5jb25z dHJ1Y3Rvcl9leHByZXNzaW9uICgNCj4+ICsgICAgICAgY29tcGlsZWRfYWR0X3R5cGUsIGFk dC0+aXNfZW51bSAoKSwgY3Rvcl9hcmd1bWVudHMsIHVuaW9uX2Rpc3JpbWluYXRvciwNCj4+ ICsgICAgICAgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKw0KPj4gKyAgICAgIHJldHVybjsN Cj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgYXV0byBnZXRfcGFyYW1ldGVyX3R5dHlfYXRfaW5k ZXgNCj4+ICsgICAgPSBbXSAoY29uc3QgVHlUeTo6QmFzZVR5cGUgKmJhc2UsIHNpemVfdCBp bmRleCwNCj4+ICsgICAgICAgICBUeVR5OjpCYXNlVHlwZSAqKnJlc3VsdCkgLT4gYm9vbCB7 DQo+PiArICAgIGJvb2wgaXNfZm4gPSBiYXNlLT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBl S2luZDo6Rk5ERUYNCj4+ICsgICAgICAgICAgICAgICAgfHwgYmFzZS0+Z2V0X2tpbmQgKCkg PT0gVHlUeTo6VHlwZUtpbmQ6OkZOUFRSOw0KPj4gKyAgICBydXN0X2Fzc2VydCAoaXNfZm4p Ow0KPj4gKw0KPj4gKyAgICBpZiAoYmFzZS0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6VHlwZUtp bmQ6OkZOUFRSKQ0KPj4gKyAgICAgIHsNCj4+ICsgICAgICAgY29uc3QgVHlUeTo6Rm5QdHIg KmZuID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlUeTo6Rm5QdHIgKj4gKGJhc2UpOw0KPj4gKyAg ICAgICAqcmVzdWx0ID0gZm4tPnBhcmFtX2F0IChpbmRleCk7DQo+PiArDQo+PiArICAgICAg IHJldHVybiB0cnVlOw0KPj4gKyAgICAgIH0NCj4+ICsNCj4+ICsgICAgY29uc3QgVHlUeTo6 Rm5UeXBlICpmbiA9IHN0YXRpY19jYXN0PGNvbnN0IFR5VHk6OkZuVHlwZSAqPiAoYmFzZSk7 DQo+PiArICAgIGF1dG8gcGFyYW0gPSBmbi0+cGFyYW1fYXQgKGluZGV4KTsNCj4+ICsgICAg KnJlc3VsdCA9IHBhcmFtLnNlY29uZDsNCj4+ICsNCj4+ICsgICAgcmV0dXJuIHRydWU7DQo+ PiArICB9Ow0KPj4gKw0KPj4gKyAgYm9vbCBpc192YXJhZGljID0gZmFsc2U7DQo+PiArICBp ZiAodHl0eS0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6VHlwZUtpbmQ6OkZOREVGKQ0KPj4gKyAg ICB7DQo+PiArICAgICAgY29uc3QgVHlUeTo6Rm5UeXBlICpmbiA9IHN0YXRpY19jYXN0PGNv bnN0IFR5VHk6OkZuVHlwZSAqPiAodHl0eSk7DQo+PiArICAgICAgaXNfdmFyYWRpYyA9IGZu LT5pc192YXJhZGljICgpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBzaXplX3QgcmVxdWly ZWRfbnVtX2FyZ3M7DQo+PiArICBpZiAodHl0eS0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6VHlw ZUtpbmQ6OkZOREVGKQ0KPj4gKyAgICB7DQo+PiArICAgICAgY29uc3QgVHlUeTo6Rm5UeXBl ICpmbiA9IHN0YXRpY19jYXN0PGNvbnN0IFR5VHk6OkZuVHlwZSAqPiAodHl0eSk7DQo+PiAr ICAgICAgcmVxdWlyZWRfbnVtX2FyZ3MgPSBmbi0+bnVtX3BhcmFtcyAoKTsNCj4+ICsgICAg fQ0KPj4gKyAgZWxzZQ0KPj4gKyAgICB7DQo+PiArICAgICAgY29uc3QgVHlUeTo6Rm5QdHIg KmZuID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlUeTo6Rm5QdHIgKj4gKHR5dHkpOw0KPj4gKyAg ICAgIHJlcXVpcmVkX251bV9hcmdzID0gZm4tPm51bV9wYXJhbXMgKCk7DQo+PiArICAgIH0N Cj4+ICsNCj4+ICsgIHN0ZDo6dmVjdG9yPHRyZWU+IGFyZ3M7DQo+PiArICBmb3IgKHNpemVf dCBpID0gMDsgaSA8IGV4cHIuZ2V0X2FyZ3VtZW50cyAoKS5zaXplICgpOyBpKyspDQo+PiAr ICAgIHsNCj4+ICsgICAgICBhdXRvICZhcmd1bWVudCA9IGV4cHIuZ2V0X2FyZ3VtZW50cyAo KS5hdCAoaSk7DQo+PiArICAgICAgYXV0byBydmFsdWUgPSBDb21waWxlRXhwcjo6Q29tcGls ZSAoYXJndW1lbnQuZ2V0ICgpLCBjdHgpOw0KPj4gKw0KPj4gKyAgICAgIGlmIChpc192YXJh ZGljICYmIGkgPj0gcmVxdWlyZWRfbnVtX2FyZ3MpDQo+PiArICAgICAgIHsNCj4+ICsgICAg ICAgICBhcmdzLnB1c2hfYmFjayAocnZhbHVlKTsNCj4+ICsgICAgICAgICBjb250aW51ZTsN Cj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIC8vIGFzc2lnbm1lbnRzIGFyZSBjb2Vy Y2lvbiBzaXRlcyBzbyBsZXRzIGNvbnZlcnQgdGhlIHJ2YWx1ZSBpZg0KPj4gKyAgICAgIC8v IG5lY2Vzc2FyeQ0KPj4gKyAgICAgIGJvb2wgb2s7DQo+PiArICAgICAgVHlUeTo6QmFzZVR5 cGUgKmV4cGVjdGVkID0gbnVsbHB0cjsNCj4+ICsgICAgICBvayA9IGdldF9wYXJhbWV0ZXJf dHl0eV9hdF9pbmRleCAodHl0eSwgaSwgJmV4cGVjdGVkKTsNCj4+ICsgICAgICBydXN0X2Fz c2VydCAob2spOw0KPj4gKw0KPj4gKyAgICAgIFR5VHk6OkJhc2VUeXBlICphY3R1YWwgPSBu dWxscHRyOw0KPj4gKyAgICAgIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBl ICgNCj4+ICsgICAgICAgYXJndW1lbnQtPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCks ICZhY3R1YWwpOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICAg ICAgLy8gY29lcmNlIGl0IGlmIHJlcXVpcmVkDQo+PiArICAgICAgTG9jYXRpb24gbHZhbHVl X2xvY3VzDQo+PiArICAgICAgID0gY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9sb2Nh dGlvbiAoZXhwZWN0ZWQtPmdldF90eV9yZWYgKCkpOw0KPj4gKyAgICAgIExvY2F0aW9uIHJ2 YWx1ZV9sb2N1cyA9IGFyZ3VtZW50LT5nZXRfbG9jdXMgKCk7DQo+PiArICAgICAgcnZhbHVl ID0gY29lcmNpb25fc2l0ZSAoYXJndW1lbnQtPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQg KCksIHJ2YWx1ZSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCwg ZXhwZWN0ZWQsIGx2YWx1ZV9sb2N1cywgcnZhbHVlX2xvY3VzKTsNCj4+ICsNCj4+ICsgICAg ICAvLyBhZGQgaXQgdG8gdGhlIGxpc3QNCj4+ICsgICAgICBhcmdzLnB1c2hfYmFjayAocnZh bHVlKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gbXVzdCBiZSBhIGNhbGwgdG8gYSBm dW5jdGlvbg0KPj4gKyAgYXV0byBmbl9hZGRyZXNzID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUg KGV4cHIuZ2V0X2ZuZXhwciAoKSwgY3R4KTsNCj4+ICsgIHRyYW5zbGF0ZWQgPSBjdHgtPmdl dF9iYWNrZW5kICgpLT5jYWxsX2V4cHJlc3Npb24gKGZuX2FkZHJlc3MsIGFyZ3MsIG51bGxw dHIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4g K0NvbXBpbGVFeHByOjp2aXNpdCAoSElSOjpNZXRob2RDYWxsRXhwciAmZXhwcikNCj4+ICt7 DQo+PiArICAvLyBtZXRob2QgcmVjZWl2ZXINCj4+ICsgIHRyZWUgc2VsZiA9IENvbXBpbGVF eHByOjpDb21waWxlIChleHByLmdldF9yZWNlaXZlciAoKS5nZXQgKCksIGN0eCk7DQo+PiAr DQo+PiArICAvLyBsb29rdXAgdGhlIHJlc29sdmVkIG5hbWUNCj4+ICsgIE5vZGVJZCByZXNv bHZlZF9ub2RlX2lkID0gVU5LTk9XTl9OT0RFSUQ7DQo+PiArICBpZiAoIWN0eC0+Z2V0X3Jl c29sdmVyICgpLT5sb29rdXBfcmVzb2x2ZWRfbmFtZSAoDQo+PiArICAgICAgIGV4cHIuZ2V0 X21hcHBpbmdzICgpLmdldF9ub2RlaWQgKCksICZyZXNvbHZlZF9ub2RlX2lkKSkNCj4+ICsg ICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIuZ2V0X2xvY3VzICgpLCAiZmFp bGVkIHRvIGxvb2t1cCByZXNvbHZlZCBNZXRob2RDYWxsIik7DQo+PiArICAgICAgcmV0dXJu Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyByZXZlcnNlIGxvb2t1cA0KPj4gKyAgSGly SWQgcmVmOw0KPj4gKyAgaWYgKCFjdHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX25vZGVf dG9faGlyIChyZXNvbHZlZF9ub2RlX2lkLCAmcmVmKSkNCj4+ICsgICAgew0KPj4gKyAgICAg IHJ1c3RfZmF0YWxfZXJyb3IgKGV4cHIuZ2V0X2xvY3VzICgpLCAicmV2ZXJzZSBsb29rdXAg ZmFpbHVyZSIpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAg Ly8gbG9va3VwIHRoZSBleHBlY3RlZCBmdW5jdGlvbiB0eXBlDQo+PiArICBUeVR5OjpCYXNl VHlwZSAqbG9va3VwX2ZudHlwZSA9IG51bGxwdHI7DQo+PiArICBib29sIG9rID0gY3R4LT5n ZXRfdHljdHggKCktPmxvb2t1cF90eXBlICgNCj4+ICsgICAgZXhwci5nZXRfbWV0aG9kX25h bWUgKCkuZ2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAoKSwgJmxvb2t1cF9mbnR5cGUpOw0K Pj4gKyAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChsb29rdXBfZm50 eXBlLT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6Rk5ERUYpOw0KPj4gKyAgVHlU eTo6Rm5UeXBlICpmbnR5cGUgPSBzdGF0aWNfY2FzdDxUeVR5OjpGblR5cGUgKj4gKGxvb2t1 cF9mbnR5cGUpOw0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnJlY2VpdmVyID0gbnVs bHB0cjsNCj4+ICsgIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF9yZWNlaXZlciAo ZXhwci5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNlaXZlcik7DQo+PiArICBydXN0X2Fz c2VydCAob2spOw0KPj4gKw0KPj4gKyAgYm9vbCBpc19keW5fZGlzcGF0Y2gNCj4+ICsgICAg PSByZWNlaXZlci0+Z2V0X3Jvb3QgKCktPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5k OjpEWU5BTUlDOw0KPj4gKyAgYm9vbCBpc19nZW5lcmljX3JlY2VpdmVyID0gcmVjZWl2ZXIt PmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpQQVJBTTsNCj4+ICsgIGlmIChpc19n ZW5lcmljX3JlY2VpdmVyKQ0KPj4gKyAgICB7DQo+PiArICAgICAgVHlUeTo6UGFyYW1UeXBl ICpwID0gc3RhdGljX2Nhc3Q8VHlUeTo6UGFyYW1UeXBlICo+IChyZWNlaXZlcik7DQo+PiAr ICAgICAgcmVjZWl2ZXIgPSBwLT5yZXNvbHZlICgpOw0KPj4gKyAgICB9DQo+PiArDQo+PiAr ICB0cmVlIGZuX2V4cHIgPSBlcnJvcl9tYXJrX25vZGU7DQo+PiArICBpZiAoaXNfZHluX2Rp c3BhdGNoKQ0KPj4gKyAgICB7DQo+PiArICAgICAgY29uc3QgVHlUeTo6RHluYW1pY09iamVj dFR5cGUgKmR5bg0KPj4gKyAgICAgICA9IHN0YXRpY19jYXN0PGNvbnN0IFR5VHk6OkR5bmFt aWNPYmplY3RUeXBlICo+IChyZWNlaXZlci0+Z2V0X3Jvb3QgKCkpOw0KPj4gKw0KPj4gKyAg ICAgIHN0ZDo6dmVjdG9yPEhJUjo6RXhwciAqPiBhcmd1bWVudHM7DQo+PiArICAgICAgZm9y IChhdXRvICZhcmcgOiBleHByLmdldF9hcmd1bWVudHMgKCkpDQo+PiArICAgICAgIGFyZ3Vt ZW50cy5wdXNoX2JhY2sgKGFyZy5nZXQgKCkpOw0KPj4gKw0KPj4gKyAgICAgIGZuX2V4cHIN Cj4+ICsgICAgICAgPSBnZXRfZm5fYWRkcl9mcm9tX2R5biAoZHluLCByZWNlaXZlciwgZm50 eXBlLCBzZWxmLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArICAgICAgc2VsZiA9IGdldF9y ZWNlaXZlcl9mcm9tX2R5biAoZHluLCByZWNlaXZlciwgZm50eXBlLCBzZWxmLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5nZXRfbG9jdXMgKCkpOw0K Pj4gKyAgICB9DQo+PiArICBlbHNlDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBsb29rdXAg Y29tcGlsZWQgZnVuY3Rpb25zIHNpbmNlIGl0IG1heSBoYXZlIGFscmVhZHkgYmVlbiBjb21w aWxlZA0KPj4gKyAgICAgIEhJUjo6UGF0aEV4cHJTZWdtZW50IG1ldGhvZF9uYW1lID0gZXhw ci5nZXRfbWV0aG9kX25hbWUgKCk7DQo+PiArICAgICAgSElSOjpQYXRoSWRlbnRTZWdtZW50 IHNlZ21lbnRfbmFtZSA9IG1ldGhvZF9uYW1lLmdldF9zZWdtZW50ICgpOw0KPj4gKyAgICAg IGZuX2V4cHINCj4+ICsgICAgICAgPSByZXNvbHZlX21ldGhvZF9hZGRyZXNzIChmbnR5cGUs IHJlZiwgcmVjZWl2ZXIsIHNlZ21lbnRfbmFtZSwNCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBleHByLmdldF9tYXBwaW5ncyAoKSwgZXhwci5nZXRfbG9jdXMgKCkp Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBsb29rdXAgdGhlIGF1dG9kZXJlZiBtYXBw aW5ncw0KPj4gKyAgSGlySWQgYXV0b2RlcmVmX21hcHBpbmdzX2lkDQo+PiArICAgID0gZXhw ci5nZXRfcmVjZWl2ZXIgKCktPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCk7DQo+PiAr ICBzdGQ6OnZlY3RvcjxSZXNvbHZlcjo6QWRqdXN0bWVudD4gKmFkanVzdG1lbnRzID0gbnVs bHB0cjsNCj4+ICsgIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF9hdXRvZGVyZWZf bWFwcGluZ3MgKGF1dG9kZXJlZl9tYXBwaW5nc19pZCwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkanVzdG1lbnRzKTsNCj4+ ICsgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICAvLyBhcHBseSBhZGp1c3RtZW50 cyBmb3IgdGhlIGZuIGNhbGwNCj4+ICsgIHNlbGYgPSByZXNvbHZlX2FkanVzdGVtZW50cyAo KmFkanVzdG1lbnRzLCBzZWxmLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGV4cHIuZ2V0X3JlY2VpdmVyICgpLT5nZXRfbG9jdXMgKCkpOw0KPj4gKw0KPj4gKyAgc3Rk Ojp2ZWN0b3I8dHJlZT4gYXJnczsNCj4+ICsgIGFyZ3MucHVzaF9iYWNrIChzZWxmKTsgLy8g YWRqdXN0ZWQgc2VsZg0KPj4gKw0KPj4gKyAgLy8gbm9ybWFsIGFyZ3MNCj4+ICsgIGZvciAo c2l6ZV90IGkgPSAwOyBpIDwgZXhwci5nZXRfYXJndW1lbnRzICgpLnNpemUgKCk7IGkrKykN Cj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gJmFyZ3VtZW50ID0gZXhwci5nZXRfYXJndW1l bnRzICgpLmF0IChpKTsNCj4+ICsgICAgICBhdXRvIHJ2YWx1ZSA9IENvbXBpbGVFeHByOjpD b21waWxlIChhcmd1bWVudC5nZXQgKCksIGN0eCk7DQo+PiArDQo+PiArICAgICAgLy8gYXNz aWdubWVudHMgYXJlIGNvZXJjaW9uIHNpdGVzIHNvIGxldHMgY29udmVydCB0aGUgcnZhbHVl IGlmDQo+PiArICAgICAgLy8gbmVjZXNzYXJ5LCBvZmZzZXQgZnJvbSB0aGUgYWxyZWFkeSBh ZGp1c3RlZCBpbXBsaWNpdCBzZWxmDQo+PiArICAgICAgYm9vbCBvazsNCj4+ICsgICAgICBU eVR5OjpCYXNlVHlwZSAqZXhwZWN0ZWQgPSBmbnR5cGUtPnBhcmFtX2F0IChpICsgMSkuc2Vj b25kOw0KPj4gKw0KPj4gKyAgICAgIFR5VHk6OkJhc2VUeXBlICphY3R1YWwgPSBudWxscHRy Ow0KPj4gKyAgICAgIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlICgNCj4+ ICsgICAgICAgYXJndW1lbnQtPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZhY3R1 YWwpOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICAgICAgLy8g Y29lcmNlIGl0IGlmIHJlcXVpcmVkDQo+PiArICAgICAgTG9jYXRpb24gbHZhbHVlX2xvY3Vz DQo+PiArICAgICAgID0gY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9sb2NhdGlvbiAo ZXhwZWN0ZWQtPmdldF90eV9yZWYgKCkpOw0KPj4gKyAgICAgIExvY2F0aW9uIHJ2YWx1ZV9s b2N1cyA9IGFyZ3VtZW50LT5nZXRfbG9jdXMgKCk7DQo+PiArICAgICAgcnZhbHVlID0gY29l cmNpb25fc2l0ZSAoYXJndW1lbnQtPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksIHJ2 YWx1ZSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCwgZXhwZWN0 ZWQsIGx2YWx1ZV9sb2N1cywgcnZhbHVlX2xvY3VzKTsNCj4+ICsNCj4+ICsgICAgICAvLyBh ZGQgaXQgdG8gdGhlIGxpc3QNCj4+ICsgICAgICBhcmdzLnB1c2hfYmFjayAocnZhbHVlKTsN Cj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgdHJhbnNsYXRlZCA9IGN0eC0+Z2V0X2JhY2tlbmQg KCktPmNhbGxfZXhwcmVzc2lvbiAoZm5fZXhwciwgYXJncywgbnVsbHB0ciwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5n ZXRfbG9jdXMgKCkpOw0KPj4gK30NCj4+ICsNCj4+ICt0cmVlDQo+PiArQ29tcGlsZUV4cHI6 OmdldF9mbl9hZGRyX2Zyb21fZHluIChjb25zdCBUeVR5OjpEeW5hbWljT2JqZWN0VHlwZSAq ZHluLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeVR5OjpCYXNl VHlwZSAqcmVjZWl2ZXIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFR5VHk6OkZuVHlwZSAqZm50eXBlLCB0cmVlIHJlY2VpdmVyX3JlZiwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gZXhwcl9sb2N1cykNCj4+ICt7 DQo+PiArICBzaXplX3Qgb2ZmcyA9IDA7DQo+PiArICBjb25zdCBSZXNvbHZlcjo6VHJhaXRJ dGVtUmVmZXJlbmNlICpyZWYgPSBudWxscHRyOw0KPj4gKyAgZm9yIChhdXRvICZib3VuZCA6 IGR5bi0+Z2V0X29iamVjdF9pdGVtcyAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGNvbnN0 IFJlc29sdmVyOjpUcmFpdEl0ZW1SZWZlcmVuY2UgKml0ZW0gPSBib3VuZC5maXJzdDsNCj4+ ICsgICAgICBhdXRvIHQgPSBpdGVtLT5nZXRfdHl0eSAoKTsNCj4+ICsgICAgICBydXN0X2Fz c2VydCAodC0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6VHlwZUtpbmQ6OkZOREVGKTsNCj4+ICsg ICAgICBhdXRvIGZ0ID0gc3RhdGljX2Nhc3Q8VHlUeTo6Rm5UeXBlICo+ICh0KTsNCj4+ICsN Cj4+ICsgICAgICBpZiAoZnQtPmdldF9pZCAoKSA9PSBmbnR5cGUtPmdldF9pZCAoKSkNCj4+ ICsgICAgICAgew0KPj4gKyAgICAgICAgIHJlZiA9IGl0ZW07DQo+PiArICAgICAgICAgYnJl YWs7DQo+PiArICAgICAgIH0NCj4+ICsgICAgICBvZmZzKys7DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIGlmIChyZWYgPT0gbnVsbHB0cikNCj4+ICsgICAgcmV0dXJuIGVycm9yX21hcmtf bm9kZTsNCj4+ICsNCj4+ICsgIC8vIGdldCBhbnkgaW5kaXJlY3Rpb24gc29ydGVkIG91dA0K Pj4gKyAgaWYgKHJlY2VpdmVyLT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6UkVG KQ0KPj4gKyAgICB7DQo+PiArICAgICAgdHJlZSBpbmRpcmVjdCA9IGluZGlyZWN0X2V4cHJl c3Npb24gKHJlY2VpdmVyX3JlZiwgZXhwcl9sb2N1cyk7DQo+PiArICAgICAgcmVjZWl2ZXJf cmVmID0gaW5kaXJlY3Q7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIGNhc3QgaXQgdG8g dGhlIGNvcnJlY3QgZm50eXBlDQo+PiArICB0cmVlIGV4cGVjdGVkX2ZudHlwZSA9IFR5VHlS ZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCBmbnR5cGUsIHRydWUpOw0KPj4gKyAgdHJl ZSBpZHggPSBidWlsZF9pbnRfY3N0IChzaXplX3R5cGVfbm9kZSwgb2Zmcyk7DQo+PiArDQo+ PiArICB0cmVlIHZ0YWJsZV9wdHINCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5z dHJ1Y3RfZmllbGRfZXhwcmVzc2lvbiAocmVjZWl2ZXJfcmVmLCAxLA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfbG9jdXMp Ow0KPj4gKyAgdHJlZSB2dGFibGVfYXJyYXlfYWNjZXNzID0gYnVpbGQ0X2xvYyAoZXhwcl9s b2N1cy5nY2NfbG9jYXRpb24gKCksIEFSUkFZX1JFRiwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgVFJFRV9UWVBFIChUUkVFX1RZUEUgKHZ0YWJsZV9w dHIpKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRh YmxlX3B0ciwgaWR4LCBOVUxMX1RSRUUsIE5VTExfVFJFRSk7DQo+PiArDQo+PiArICB0cmVl IHZjYWxsDQo+PiArICAgID0gYnVpbGQzX2xvYyAoZXhwcl9sb2N1cy5nY2NfbG9jYXRpb24g KCksIE9CSl9UWVBFX1JFRiwgZXhwZWN0ZWRfZm50eXBlLA0KPj4gKyAgICAgICAgICAgICAg ICAgdnRhYmxlX2FycmF5X2FjY2VzcywgcmVjZWl2ZXJfcmVmLCBpZHgpOw0KPj4gKw0KPj4g KyAgcmV0dXJuIHZjYWxsOw0KPj4gK30NCj4+ICsNCj4+ICt0cmVlDQo+PiArQ29tcGlsZUV4 cHI6OmdldF9yZWNlaXZlcl9mcm9tX2R5biAoY29uc3QgVHlUeTo6RHluYW1pY09iamVjdFR5 cGUgKmR5biwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5VHk6 OkJhc2VUeXBlICpyZWNlaXZlciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFR5VHk6OkZuVHlwZSAqZm50eXBlLCB0cmVlIHJlY2VpdmVyX3JlZiwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uIGV4cHJfbG9jdXMp DQo+PiArew0KPj4gKyAgLy8gZ2V0IGFueSBpbmRpcmVjdGlvbiBzb3J0ZWQgb3V0DQo+PiAr ICBpZiAocmVjZWl2ZXItPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpSRUYpDQo+ PiArICAgIHsNCj4+ICsgICAgICB0cmVlIGluZGlyZWN0ID0gaW5kaXJlY3RfZXhwcmVzc2lv biAocmVjZWl2ZXJfcmVmLCBleHByX2xvY3VzKTsNCj4+ICsgICAgICByZWNlaXZlcl9yZWYg PSBpbmRpcmVjdDsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gYWNjZXNzIHRoZSBvZmZz ICsgMSBmb3IgdGhlIGZucHRyIGFuZCBvZmZzPTAgZm9yIHRoZSByZWNpZXZlciBvYmoNCj4+ ICsgIHJldHVybiBjdHgtPmdldF9iYWNrZW5kICgpLT5zdHJ1Y3RfZmllbGRfZXhwcmVzc2lv biAocmVjZWl2ZXJfcmVmLCAwLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfbG9jdXMpOw0KPj4gK30NCj4+ICsNCj4+ ICt0cmVlDQo+PiArQ29tcGlsZUV4cHI6OnJlc29sdmVfbWV0aG9kX2FkZHJlc3MgKFR5VHk6 OkZuVHlwZSAqZm50eXBlLCBIaXJJZCByZWYsDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgVHlUeTo6QmFzZVR5cGUgKnJlY2VpdmVyLA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJUjo6UGF0aElkZW50U2VnbWVudCAmc2Vn bWVudCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXNp czo6Tm9kZU1hcHBpbmcgZXhwcl9tYXBwaW5ncywNCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBMb2NhdGlvbiBleHByX2xvY3VzKQ0KPj4gK3sNCj4+ICsgIC8v IGxvb2t1cCBjb21waWxlZCBmdW5jdGlvbnMgc2luY2UgaXQgbWF5IGhhdmUgYWxyZWFkeSBi ZWVuIGNvbXBpbGVkDQo+PiArICB0cmVlIGZuID0gTlVMTF9UUkVFOw0KPj4gKyAgaWYgKGN0 eC0+bG9va3VwX2Z1bmN0aW9uX2RlY2wgKGZudHlwZS0+Z2V0X3R5X3JlZiAoKSwgJmZuKSkN Cj4+ICsgICAgew0KPj4gKyAgICAgIHJldHVybiBhZGRyZXNzX2V4cHJlc3Npb24gKGZuLCBl eHByX2xvY3VzKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gTm93IHdlIGNhbiB0cnkg YW5kIHJlc29sdmUgdGhlIGFkZHJlc3Mgc2luY2UgdGhpcyBtaWdodCBiZSBhIGZvcndhcmQN Cj4+ICsgIC8vIGRlY2xhcmVkIGZ1bmN0aW9uLCBnZW5lcmljIGZ1bmN0aW9uIHdoaWNoIGhh cyBub3QgYmUgY29tcGlsZWQgeWV0IG9yDQo+PiArICAvLyBpdHMgYW4gbm90IHlldCB0cmFp dCBib3VuZCBmdW5jdGlvbg0KPj4gKyAgSElSOjpJbXBsSXRlbSAqcmVzb2x2ZWRfaXRlbQ0K Pj4gKyAgICA9IGN0eC0+Z2V0X21hcHBpbmdzICgpLT5sb29rdXBfaGlyX2ltcGxpdGVtIChy ZWYsIG51bGxwdHIpOw0KPj4gKyAgaWYgKHJlc29sdmVkX2l0ZW0gIT0gbnVsbHB0cikNCj4+ ICsgICAgew0KPj4gKyAgICAgIGlmICghZm50eXBlLT5oYXNfc3Vic2l0aXRpb25zX2RlZmlu ZWQgKCkpDQo+PiArICAgICAgIHJldHVybiBDb21waWxlSW5oZXJlbnRJbXBsSXRlbTo6Q29t cGlsZSAocmVzb2x2ZWRfaXRlbSwgY3R4KTsNCj4+ICsNCj4+ICsgICAgICByZXR1cm4gQ29t cGlsZUluaGVyZW50SW1wbEl0ZW06OkNvbXBpbGUgKHJlc29sdmVkX2l0ZW0sIGN0eCwgZm50 eXBlKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gaXQgbWlnaHQgYmUgcmVzb2x2ZWQg dG8gYSB0cmFpdCBpdGVtDQo+PiArICBISVI6OlRyYWl0SXRlbSAqdHJhaXRfaXRlbQ0KPj4g KyAgICA9IGN0eC0+Z2V0X21hcHBpbmdzICgpLT5sb29rdXBfaGlyX3RyYWl0X2l0ZW0gKHJl Zik7DQo+PiArICBISVI6OlRyYWl0ICp0cmFpdCA9IGN0eC0+Z2V0X21hcHBpbmdzICgpLT5s b29rdXBfdHJhaXRfaXRlbV9tYXBwaW5nICgNCj4+ICsgICAgdHJhaXRfaXRlbS0+Z2V0X21h cHBpbmdzICgpLmdldF9oaXJpZCAoKSk7DQo+PiArDQo+PiArICBSZXNvbHZlcjo6VHJhaXRS ZWZlcmVuY2UgKnRyYWl0X3JlZg0KPj4gKyAgICA9ICZSZXNvbHZlcjo6VHJhaXRSZWZlcmVu Y2U6OmVycm9yX25vZGUgKCk7DQo+PiArICBib29sIG9rID0gY3R4LT5nZXRfdHljdHggKCkt Pmxvb2t1cF90cmFpdF9yZWZlcmVuY2UgKA0KPj4gKyAgICB0cmFpdC0+Z2V0X21hcHBpbmdz ICgpLmdldF9kZWZpZCAoKSwgJnRyYWl0X3JlZik7DQo+PiArICBydXN0X2Fzc2VydCAob2sp Ow0KPj4gKw0KPj4gKyAgLy8gdGhlIHR5cGUgcmVzb2x2ZXIgY2FuIG9ubHkgcmVzb2x2ZSB0 eXBlIGJvdW5kcyB0byB0aGVpciB0cmFpdA0KPj4gKyAgLy8gaXRlbSBzbyBpdHMgdXAgdG8g dXMgdG8gZmlndXJlIG91dCBpZiB0aGlzIHBhdGggc2hvdWxkIHJlc29sdmUNCj4+ICsgIC8v IHRvIGFuIHRyYWl0LWltcGwtYmxvY2staXRlbSBvciBpZiBpdCBjYW4gYmUgZGVmYXVsdGVk IHRvIHRoZQ0KPj4gKyAgLy8gdHJhaXQtaW1wbC1pdGVtJ3MgZGVmaW5pdGlvbg0KPj4gKw0K Pj4gKyAgYXV0byByb290ID0gcmVjZWl2ZXItPmdldF9yb290ICgpOw0KPj4gKyAgc3RkOjp2 ZWN0b3I8UmVzb2x2ZXI6OlBhdGhQcm9iZUNhbmRpZGF0ZT4gY2FuZGlkYXRlcw0KPj4gKyAg ICA9IFJlc29sdmVyOjpQYXRoUHJvYmVUeXBlOjpQcm9iZSAocm9vdCwgc2VnbWVudCwgdHJ1 ZSAvKiBwcm9iZV9pbXBscyAqLywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZmFsc2UgLyogcHJvYmVfYm91bmRzICovLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlnbm9yZV9tYW5kYXRvcnlfdHJhaXRf aXRlbXMgKi8pOw0KPj4gKyAgaWYgKGNhbmRpZGF0ZXMuc2l6ZSAoKSA9PSAwKQ0KPj4gKyAg ICB7DQo+PiArICAgICAgLy8gdGhpcyBtZWFucyB3ZSBhcmUgZGVmYXVsdGluZyBiYWNrIHRv IHRoZSB0cmFpdF9pdGVtIGlmDQo+PiArICAgICAgLy8gcG9zc2libGUNCj4+ICsgICAgICBS ZXNvbHZlcjo6VHJhaXRJdGVtUmVmZXJlbmNlICp0cmFpdF9pdGVtX3JlZiA9IG51bGxwdHI7 DQo+PiArICAgICAgYm9vbCBvayA9IHRyYWl0X3JlZi0+bG9va3VwX2hpcl90cmFpdF9pdGVt ICgqdHJhaXRfaXRlbSwgJnRyYWl0X2l0ZW1fcmVmKTsNCj4+ICsgICAgICBydXN0X2Fzc2Vy dCAob2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kDQo+ PiArICAgICAgcnVzdF9hc3NlcnQgKHRyYWl0X2l0ZW1fcmVmLT5pc19vcHRpb25hbCAoKSk7 IC8vIGhhcyBkZWZpbml0aW9uDQo+PiArDQo+PiArICAgICAgLy8gRklYTUUgT3B0aW9uYWwg bWVhbnMgaXQgaGFzIGEgZGVmaW5pdGlvbiBhbmQgYW4gYXNzb2NpYXRlZA0KPj4gKyAgICAg IC8vIGJsb2NrIHdoaWNoIGNhbiBiZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIGlmIGl0 IGRvZXMgbm90DQo+PiArICAgICAgLy8gY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbiB3ZSBz aG91bGQgYWN0dWFsbHkgcmV0dXJuDQo+PiArICAgICAgLy8gZXJyb3JfbWFya19ub2RlDQo+ PiArDQo+PiArICAgICAgcmV0dXJuIENvbXBpbGVUcmFpdEl0ZW06OkNvbXBpbGUgKHRyYWl0 X2l0ZW1fcmVmLT5nZXRfaGlyX3RyYWl0X2l0ZW0gKCksDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY3R4LCBmbnR5cGUsIHRydWUsIGV4cHJfbG9jdXMp Ow0KPj4gKyAgICB9DQo+PiArICBlbHNlDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBGSVhN RSB0aGlzIHdpbGwgYmUgYSBjYXNlIHRvIHJldHVybiBlcnJvcl9tYXJrX25vZGUsIHRoZXJl IGlzDQo+PiArICAgICAgLy8gYW4gZXJyb3Igc2NlbmFyaW8gd2hlcmUgYSBUcmFpdCBGb28g aGFzIGEgbWV0aG9kIEJhciwgYnV0IHRoaXMNCj4+ICsgICAgICAvLyByZWNlaXZlciBkb2Vz IG5vdCBpbXBsZW1lbnQgdGhpcyB0cmFpdCBvciBoYXMgYW4gaW5jb21wYXRpYmxlDQo+PiAr ICAgICAgLy8gaW1wbGVtZW50YXRpb24gYW5kIHdlIHNob3VsZCBqdXN0IHJldHVybiBlcnJv cl9tYXJrX25vZGUNCj4+ICsNCj4+ICsgICAgICBydXN0X2Fzc2VydCAoY2FuZGlkYXRlcy5z aXplICgpID09IDEpOw0KPj4gKyAgICAgIGF1dG8gJmNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXMu YXQgKDApOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChjYW5kaWRhdGUuaXNfaW1wbF9jYW5k aWRhdGUgKCkpOw0KPj4gKyAgICAgIHJ1c3RfYXNzZXJ0IChjYW5kaWRhdGUudHktPmdldF9r aW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpGTkRFRik7DQo+PiArICAgICAgVHlUeTo6Rm5U eXBlICpjYW5kaWRhdGVfY2FsbCA9IHN0YXRpY19jYXN0PFR5VHk6OkZuVHlwZSAqPiAoY2Fu ZGlkYXRlLnR5KTsNCj4+ICsNCj4+ICsgICAgICBISVI6OkltcGxJdGVtICppbXBsX2l0ZW0g PSBjYW5kaWRhdGUuaXRlbS5pbXBsLmltcGxfaXRlbTsNCj4+ICsgICAgICBpZiAoIWNhbmRp ZGF0ZV9jYWxsLT5oYXNfc3Vic2l0aXRpb25zX2RlZmluZWQgKCkpDQo+PiArICAgICAgIHJl dHVybiBDb21waWxlSW5oZXJlbnRJbXBsSXRlbTo6Q29tcGlsZSAoaW1wbF9pdGVtLCBjdHgp Ow0KPj4gKw0KPj4gKyAgICAgIFR5VHk6OkJhc2VUeXBlICptb25vbW9ycGhpemVkID0gY2Fu ZGlkYXRlX2NhbGw7DQo+PiArICAgICAgaWYgKGNhbmRpZGF0ZV9jYWxsLT5uZWVkc19nZW5l cmljX3N1YnN0aXR1dGlvbnMgKCkpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBUeVR5 OjpCYXNlVHlwZSAqaW5mZXJfaW1wbF9jYWxsDQo+PiArICAgICAgICAgICA9IGNhbmRpZGF0 ZV9jYWxsLT5pbmZlcl9zdWJzdGl0aW9ucyAoZXhwcl9sb2N1cyk7DQo+PiArICAgICAgICAg bW9ub21vcnBoaXplZCA9IGluZmVyX2ltcGxfY2FsbC0+dW5pZnkgKGZudHlwZSk7DQo+PiAr ICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICByZXR1cm4gQ29tcGlsZUluaGVyZW50SW1wbEl0 ZW06OkNvbXBpbGUgKGltcGxfaXRlbSwgY3R4LCBtb25vbW9ycGhpemVkKTsNCj4+ICsgICAg fQ0KPj4gK30NCj4+ICsNCj4+ICt0cmVlDQo+PiArQ29tcGlsZUV4cHI6OnJlc29sdmVfb3Bl cmF0b3Jfb3ZlcmxvYWQgKA0KPj4gKyAgQW5hbHlzaXM6OlJ1c3RMYW5nSXRlbTo6SXRlbVR5 cGUgbGFuZ19pdGVtX3R5cGUsIEhJUjo6T3BlcmF0b3JFeHByTWV0YSBleHByLA0KPj4gKyAg dHJlZSBsaHMsIHRyZWUgcmhzLCBISVI6OkV4cHIgKmxoc19leHByLCBISVI6OkV4cHIgKnJo c19leHByKQ0KPj4gK3sNCj4+ICsgIFR5VHk6OkZuVHlwZSAqZm50eXBlOw0KPj4gKyAgYm9v bCBpc19vcF9vdmVybG9hZCA9IGN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfb3BlcmF0b3Jf b3ZlcmxvYWQgKA0KPj4gKyAgICBleHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCks ICZmbnR5cGUpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKGlzX29wX292ZXJsb2FkKTsNCj4+ICsN Cj4+ICsgIC8vIGxvb2t1cCB0aGUgcmVzb2x2ZWQgbmFtZQ0KPj4gKyAgTm9kZUlkIHJlc29s dmVkX25vZGVfaWQgPSBVTktOT1dOX05PREVJRDsNCj4+ICsgIGJvb2wgb2sgPSBjdHgtPmdl dF9yZXNvbHZlciAoKS0+bG9va3VwX3Jlc29sdmVkX25hbWUgKA0KPj4gKyAgICBleHByLmdl dF9tYXBwaW5ncyAoKS5nZXRfbm9kZWlkICgpLCAmcmVzb2x2ZWRfbm9kZV9pZCk7DQo+PiAr ICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgLy8gcmV2ZXJzZSBsb29rdXANCj4+ ICsgIEhpcklkIHJlZjsNCj4+ICsgIG9rID0gY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1 cF9ub2RlX3RvX2hpciAocmVzb2x2ZWRfbm9kZV9pZCwgJnJlZik7DQo+PiArICBydXN0X2Fz c2VydCAob2spOw0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnJlY2VpdmVyID0gbnVs bHB0cjsNCj4+ICsgIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF9yZWNlaXZlciAo ZXhwci5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNlaXZlcik7DQo+PiArICBydXN0X2Fz c2VydCAob2spOw0KPj4gKw0KPj4gKyAgYm9vbCBpc19nZW5lcmljX3JlY2VpdmVyID0gcmVj ZWl2ZXItPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpQQVJBTTsNCj4+ICsgIGlm IChpc19nZW5lcmljX3JlY2VpdmVyKQ0KPj4gKyAgICB7DQo+PiArICAgICAgVHlUeTo6UGFy YW1UeXBlICpwID0gc3RhdGljX2Nhc3Q8VHlUeTo6UGFyYW1UeXBlICo+IChyZWNlaXZlcik7 DQo+PiArICAgICAgcmVjZWl2ZXIgPSBwLT5yZXNvbHZlICgpOw0KPj4gKyAgICB9DQo+PiAr DQo+PiArICAvLyBsb29rdXAgY29tcGlsZWQgZnVuY3Rpb25zIHNpbmNlIGl0IG1heSBoYXZl IGFscmVhZHkgYmVlbiBjb21waWxlZA0KPj4gKyAgSElSOjpQYXRoSWRlbnRTZWdtZW50IHNl Z21lbnRfbmFtZSAoDQo+PiArICAgIEFuYWx5c2lzOjpSdXN0TGFuZ0l0ZW06OlRvU3RyaW5n IChsYW5nX2l0ZW1fdHlwZSkpOw0KPj4gKyAgdHJlZSBmbl9leHByDQo+PiArICAgID0gcmVz b2x2ZV9tZXRob2RfYWRkcmVzcyAoZm50eXBlLCByZWYsIHJlY2VpdmVyLCBzZWdtZW50X25h bWUsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdldF9tYXBwaW5n cyAoKSwgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKw0KPj4gKyAgLy8gbG9va3VwIHRoZSBh dXRvZGVyZWYgbWFwcGluZ3MNCj4+ICsgIHN0ZDo6dmVjdG9yPFJlc29sdmVyOjpBZGp1c3Rt ZW50PiAqYWRqdXN0bWVudHMgPSBudWxscHRyOw0KPj4gKyAgb2sgPSBjdHgtPmdldF90eWN0 eCAoKS0+bG9va3VwX2F1dG9kZXJlZl9tYXBwaW5ncyAoDQo+PiArICAgIGV4cHIuZ2V0X2x2 YWx1ZV9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZhZGp1c3RtZW50cyk7DQo+PiArICBy dXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgLy8gYXBwbHkgYWRqdXN0bWVudHMgZm9y IHRoZSBmbiBjYWxsDQo+PiArICB0cmVlIHNlbGYgPSByZXNvbHZlX2FkanVzdGVtZW50cyAo KmFkanVzdG1lbnRzLCBsaHMsIGxoc19leHByLT5nZXRfbG9jdXMgKCkpOw0KPj4gKw0KPj4g KyAgc3RkOjp2ZWN0b3I8dHJlZT4gYXJnczsNCj4+ICsgIGFyZ3MucHVzaF9iYWNrIChzZWxm KTsgLy8gYWRqdXN0ZWQgc2VsZg0KPj4gKyAgaWYgKHJocyAhPSBudWxscHRyKSAgIC8vIGNh biBiZSBudWxsIGZvciBuZWdhdGlvbl9leHByICh1bmFyeSBvbmVzKQ0KPj4gKyAgICBhcmdz LnB1c2hfYmFjayAocmhzKTsNCj4+ICsNCj4+ICsgIHJldHVybiBjdHgtPmdldF9iYWNrZW5k ICgpLT5jYWxsX2V4cHJlc3Npb24gKGZuX2V4cHIsIGFyZ3MsIG51bGxwdHIsDQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2xv Y3VzICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdHJlZQ0KPj4gK0NvbXBpbGVFeHByOjpjb21w aWxlX2Jvb2xfbGl0ZXJhbCAoY29uc3QgSElSOjpMaXRlcmFsRXhwciAmZXhwciwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlUeTo6QmFzZVR5cGUg KnR5dHkpDQo+PiArew0KPj4gKyAgcnVzdF9hc3NlcnQgKGV4cHIuZ2V0X2xpdF90eXBlICgp ID09IEhJUjo6TGl0ZXJhbDo6Qk9PTCk7DQo+PiArDQo+PiArICBjb25zdCBhdXRvIGxpdGVy YWxfdmFsdWUgPSBleHByLmdldF9saXRlcmFsICgpOw0KPj4gKyAgYm9vbCBidmFsID0gbGl0 ZXJhbF92YWx1ZS5hc19zdHJpbmcgKCkuY29tcGFyZSAoInRydWUiKSA9PSAwOw0KPj4gKyAg cmV0dXJuIGN0eC0+Z2V0X2JhY2tlbmQgKCktPmJvb2xlYW5fY29uc3RhbnRfZXhwcmVzc2lv biAoYnZhbCk7DQo+PiArfQ0KPj4gKw0KPj4gK3RyZWUNCj4+ICtDb21waWxlRXhwcjo6Y29t cGlsZV9pbnRlZ2VyX2xpdGVyYWwgKGNvbnN0IEhJUjo6TGl0ZXJhbEV4cHIgJmV4cHIsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5VHk6OkJh c2VUeXBlICp0eXR5KQ0KPj4gK3sNCj4+ICsgIHJ1c3RfYXNzZXJ0IChleHByLmdldF9saXRf dHlwZSAoKSA9PSBISVI6OkxpdGVyYWw6OklOVCk7DQo+PiArICBjb25zdCBhdXRvIGxpdGVy YWxfdmFsdWUgPSBleHByLmdldF9saXRlcmFsICgpOw0KPj4gKw0KPj4gKyAgdHJlZSB0eXBl ID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIHR5dHkpOw0KPj4gKw0KPj4g KyAgbXB6X3QgaXZhbDsNCj4+ICsgIGlmIChtcHpfaW5pdF9zZXRfc3RyIChpdmFsLCBsaXRl cmFsX3ZhbHVlLmFzX3N0cmluZyAoKS5jX3N0ciAoKSwgMTApICE9IDApDQo+PiArICAgIHsN Cj4+ICsgICAgICBydXN0X2Vycm9yX2F0IChleHByLmdldF9sb2N1cyAoKSwgImJhZCBudW1i ZXIgaW4gbGl0ZXJhbCIpOw0KPj4gKyAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQo+ PiArICAgIH0NCj4+ICsNCj4+ICsgIG1wel90IHR5cGVfbWluOw0KPj4gKyAgbXB6X3QgdHlw ZV9tYXg7DQo+PiArICBtcHpfaW5pdCAodHlwZV9taW4pOw0KPj4gKyAgbXB6X2luaXQgKHR5 cGVfbWF4KTsNCj4+ICsgIGdldF90eXBlX3N0YXRpY19ib3VuZHMgKHR5cGUsIHR5cGVfbWlu LCB0eXBlX21heCk7DQo+PiArDQo+PiArICBpZiAobXB6X2NtcCAoaXZhbCwgdHlwZV9taW4p IDwgMCB8fCBtcHpfY21wIChpdmFsLCB0eXBlX21heCkgPiAwKQ0KPj4gKyAgICB7DQo+PiAr ICAgICAgcnVzdF9lcnJvcl9hdCAoZXhwci5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAg ICAgICAgICAgICAiaW50ZWdlciBvdmVyZmxvd3MgdGhlIHJlc3BlY3RpdmUgdHlwZSAlPCVz JT4iLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgdHl0eS0+Z2V0X25hbWUgKCkuY19zdHIg KCkpOw0KPj4gKyAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQo+PiArICAgIH0NCj4+ ICsgIHJldHVybiBkb3VibGVfaW50X3RvX3RyZWUgKHR5cGUsIG1wel9nZXRfZG91YmxlX2lu dCAodHlwZSwgaXZhbCwgdHJ1ZSkpOw0KPiANCj4gSW5zdGVhZCBvZiBkb3VibGVfaW50X3Rv X3RyZWUgeW91IG1heWJlIHdhbnQgdGhlIG1vcmUgbW9kZXJuDQo+IHdpZGVfaW50X3RvX3Ry ZWUgKHR5cGUsIHdpOjpmcm9tX21weiAoLi4uKSkgc2luY2UgZG91YmxlLWludC5oIGlzIHN1 cHBvc2VkDQo+IHRvIGRpZSAob25seSBmaXhlZC1wb2ludCBzdHVmZiB1c2VzIGl0KS4NCj4g DQo+IEkgdGhpbmsgeW91IGxlYWsgbXB6X3QgaGVyZSwgeW91IG5lZWQgdG8gY2FsbCBtcHpf Y2xlYXIgb24gYWxsIG1wel90IHR5cGVkDQo+IHZhcnMgd2hlbiBkb25lLg0KPiANCj4+ICt9 DQo+PiArDQo+PiArdHJlZQ0KPj4gK0NvbXBpbGVFeHByOjpjb21waWxlX2Zsb2F0X2xpdGVy YWwgKGNvbnN0IEhJUjo6TGl0ZXJhbEV4cHIgJmV4cHIsDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBUeVR5OjpCYXNlVHlwZSAqdHl0eSkNCj4+ICt7 DQo+PiArICBydXN0X2Fzc2VydCAoZXhwci5nZXRfbGl0X3R5cGUgKCkgPT0gSElSOjpMaXRl cmFsOjpGTE9BVCk7DQo+PiArICBjb25zdCBhdXRvIGxpdGVyYWxfdmFsdWUgPSBleHByLmdl dF9saXRlcmFsICgpOw0KPj4gKw0KPj4gKyAgbXBmcl90IGZ2YWw7DQo+PiArICBpZiAobXBm cl9pbml0X3NldF9zdHIgKGZ2YWwsIGxpdGVyYWxfdmFsdWUuYXNfc3RyaW5nICgpLmNfc3Ry ICgpLCAxMCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICBNUEZSX1JORE4pDQo+PiAr ICAgICAgIT0gMCkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3RfZXJyb3JfYXQgKGV4cHIu Z2V0X2xvY3VzICgpLCAiYmFkIG51bWJlciBpbiBsaXRlcmFsIik7DQo+PiArICAgICAgcmV0 dXJuIGVycm9yX21hcmtfbm9kZTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgdHJlZSB0eXBl ID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIHR5dHkpOw0KPj4gKw0KPj4g KyAgLy8gdGFrZW4gZnJvbToNCj4+ICsgIC8vIHNlZSBnby9nb2Zyb250ZW5kL2V4cHJlc3Np b25zLmNjOmNoZWNrX2Zsb2F0X3R5cGUNCj4+ICsgIG1wZnJfZXhwX3QgZXhwID0gbXBmcl9n ZXRfZXhwIChmdmFsKTsNCj4+ICsgIGJvb2wgcmVhbF92YWx1ZV9vdmVyZmxvdyA9IGV4cCA+ IFRZUEVfUFJFQ0lTSU9OICh0eXBlKTsNCj4+ICsNCj4+ICsgIFJFQUxfVkFMVUVfVFlQRSBy MTsNCj4+ICsgIHJlYWxfZnJvbV9tcGZyICgmcjEsIGZ2YWwsIHR5cGUsIEdNUF9STkROKTsN Cj4+ICsgIFJFQUxfVkFMVUVfVFlQRSByMjsNCj4+ICsgIHJlYWxfY29udmVydCAoJnIyLCBU WVBFX01PREUgKHR5cGUpLCAmcjEpOw0KPj4gKw0KPj4gKyAgdHJlZSByZWFsX3ZhbHVlID0g YnVpbGRfcmVhbCAodHlwZSwgcjIpOw0KPj4gKyAgaWYgKFRSRUVfT1ZFUkZMT1cgKHJlYWxf dmFsdWUpIHx8IHJlYWxfdmFsdWVfb3ZlcmZsb3cpDQo+PiArICAgIHsNCj4+ICsgICAgICBy dXN0X2Vycm9yX2F0IChleHByLmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICJkZWNpbWFsIG92ZXJmbG93cyB0aGUgcmVzcGVjdGl2ZSB0eXBlICU8JXMlPiIsDQo+ PiArICAgICAgICAgICAgICAgICAgICB0eXR5LT5nZXRfbmFtZSAoKS5jX3N0ciAoKSk7DQo+ PiArICAgICAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgcmV0dXJuIHJlYWxfdmFsdWU7DQo+IA0KPiBhZ2FpbiB5b3UgcHJvYmFibHkgbGVhayBt ZW1vcnkgb2YgJ2V4cCcNCj4gDQo+PiArfQ0KPj4gKw0KPj4gK3RyZWUNCj4+ICtDb21waWxl RXhwcjo6Y29tcGlsZV9jaGFyX2xpdGVyYWwgKGNvbnN0IEhJUjo6TGl0ZXJhbEV4cHIgJmV4 cHIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5VHk6 OkJhc2VUeXBlICp0eXR5KQ0KPj4gK3sNCj4+ICsgIHJ1c3RfYXNzZXJ0IChleHByLmdldF9s aXRfdHlwZSAoKSA9PSBISVI6OkxpdGVyYWw6OkNIQVIpOw0KPj4gKyAgY29uc3QgYXV0byBs aXRlcmFsX3ZhbHVlID0gZXhwci5nZXRfbGl0ZXJhbCAoKTsNCj4+ICsNCj4+ICsgIC8vIEZJ WE1FIG5lZWRzIHdjaGFyX3QNCj4+ICsgIGNoYXIgYyA9IGxpdGVyYWxfdmFsdWUuYXNfc3Ry aW5nICgpLmNfc3RyICgpWzBdOw0KPj4gKyAgcmV0dXJuIGN0eC0+Z2V0X2JhY2tlbmQgKCkt PndjaGFyX2NvbnN0YW50X2V4cHJlc3Npb24gKGMpOw0KPj4gK30NCj4+ICsNCj4+ICt0cmVl DQo+PiArQ29tcGlsZUV4cHI6OmNvbXBpbGVfYnl0ZV9saXRlcmFsIChjb25zdCBISVI6Okxp dGVyYWxFeHByICZleHByLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBUeVR5OjpCYXNlVHlwZSAqdHl0eSkNCj4+ICt7DQo+PiArICBydXN0X2Fzc2Vy dCAoZXhwci5nZXRfbGl0X3R5cGUgKCkgPT0gSElSOjpMaXRlcmFsOjpCWVRFKTsNCj4+ICsg IGNvbnN0IGF1dG8gbGl0ZXJhbF92YWx1ZSA9IGV4cHIuZ2V0X2xpdGVyYWwgKCk7DQo+PiAr DQo+PiArICB0cmVlIHR5cGUgPSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwg dHl0eSk7DQo+PiArICBjaGFyIGMgPSBsaXRlcmFsX3ZhbHVlLmFzX3N0cmluZyAoKS5jX3N0 ciAoKVswXTsNCj4+ICsgIHJldHVybiBidWlsZF9pbnRfY3N0ICh0eXBlLCBjKTsNCj4+ICt9 DQo+PiArDQo+PiArdHJlZQ0KPj4gK0NvbXBpbGVFeHByOjpjb21waWxlX3N0cmluZ19saXRl cmFsIChjb25zdCBISVI6OkxpdGVyYWxFeHByICZleHByLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5VHk6OkJhc2VUeXBlICp0eXR5KQ0KPj4g K3sNCj4+ICsgIHRyZWUgZmF0X3BvaW50ZXIgPSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBp bGUgKGN0eCwgdHl0eSk7DQo+PiArDQo+PiArICBydXN0X2Fzc2VydCAoZXhwci5nZXRfbGl0 X3R5cGUgKCkgPT0gSElSOjpMaXRlcmFsOjpTVFJJTkcpOw0KPj4gKyAgY29uc3QgYXV0byBs aXRlcmFsX3ZhbHVlID0gZXhwci5nZXRfbGl0ZXJhbCAoKTsNCj4+ICsNCj4+ICsgIGF1dG8g YmFzZSA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnN0cmluZ19jb25zdGFudF9leHByZXNzaW9u ICgNCj4+ICsgICAgbGl0ZXJhbF92YWx1ZS5hc19zdHJpbmcgKCkpOw0KPj4gKyAgdHJlZSBk YXRhID0gYWRkcmVzc19leHByZXNzaW9uIChiYXNlLCBleHByLmdldF9sb2N1cyAoKSk7DQo+ PiArDQo+PiArICBUeVR5OjpCYXNlVHlwZSAqdXNpemUgPSBudWxscHRyOw0KPj4gKyAgYm9v bCBvayA9IGN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfYnVpbHRpbiAoInVzaXplIiwgJnVz aXplKTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArICB0cmVlIHR5cGUgPSBUeVR5 UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgdXNpemUpOw0KPj4gKw0KPj4gKyAgbXB6 X3QgaXZhbDsNCj4+ICsgIG1wel9pbml0X3NldF91aSAoaXZhbCwgbGl0ZXJhbF92YWx1ZS5h c19zdHJpbmcgKCkuc2l6ZSAoKSk7DQo+PiArICB0cmVlIHNpemUgPSBkb3VibGVfaW50X3Rv X3RyZWUgKHR5cGUsIG1wel9nZXRfZG91YmxlX2ludCAodHlwZSwgaXZhbCwgdHJ1ZSkpOw0K PiANCj4gU2luY2Ugc2l6ZSgpIGlzIGxpa2VseSBhdCBtb3N0IHVpbnQ2NF90IGEgc2ltcGxl IGJ1aWxkX2ludF9jc3R1ICh0eXBlLCBzaXplKCkpDQo+IG1pZ2h0IHN1ZmZpY2UsIHdpdGhv dXQgdGhlIHJvdW5kLXRyaXAgdGhyb3VnaCBtcHpfdCBhbmQgZG91YmxlLWludD8NCj4gDQo+ PiArDQo+PiArICByZXR1cm4gY3R4LT5nZXRfYmFja2VuZCAoKS0+Y29uc3RydWN0b3JfZXhw cmVzc2lvbiAoZmF0X3BvaW50ZXIsIGZhbHNlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2RhdGEsIHNpemV9LCAtMSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdHJlZQ0KPj4gK0NvbXBp bGVFeHByOjpjb21waWxlX2J5dGVfc3RyaW5nX2xpdGVyYWwgKGNvbnN0IEhJUjo6TGl0ZXJh bEV4cHIgJmV4cHIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBUeVR5OjpCYXNlVHlwZSAqdHl0eSkNCj4+ICt7DQo+PiArICBydXN0X2Fz c2VydCAoZXhwci5nZXRfbGl0X3R5cGUgKCkgPT0gSElSOjpMaXRlcmFsOjpCWVRFX1NUUklO Ryk7DQo+PiArDQo+PiArICAvLyB0aGUgdHlwZSBoZXJlIGlzICZbdHk7IGNhcGFjaXR5XQ0K Pj4gKyAgcnVzdF9hc3NlcnQgKHR5dHktPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5k OjpSRUYpOw0KPj4gKyAgY29uc3QgYXV0byByZWZfdHl0eSA9IHN0YXRpY19jYXN0PGNvbnN0 IFR5VHk6OlJlZmVyZW5jZVR5cGUgKj4gKHR5dHkpOw0KPj4gKyAgYXV0byBiYXNlX3R5dHkg PSByZWZfdHl0eS0+Z2V0X2Jhc2UgKCk7DQo+PiArICBydXN0X2Fzc2VydCAoYmFzZV90eXR5 LT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6QVJSQVkpOw0KPj4gKyAgYXV0byBh cnJheV90eXR5ID0gc3RhdGljX2Nhc3Q8VHlUeTo6QXJyYXlUeXBlICo+IChiYXNlX3R5dHkp Ow0KPj4gKw0KPj4gKyAgc3RkOjpzdHJpbmcgdmFsdWVfc3RyID0gZXhwci5nZXRfbGl0ZXJh bCAoKS5hc19zdHJpbmcgKCk7DQo+PiArICBzdGQ6OnZlY3Rvcjx0cmVlPiB2YWxzOw0KPj4g KyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgbG9uZz4gaW5kZXhlczsNCj4+ICsgIGZvciAoc2l6 ZV90IGkgPSAwOyBpIDwgdmFsdWVfc3RyLnNpemUgKCk7IGkrKykNCj4+ICsgICAgew0KPj4g KyAgICAgIGNoYXIgYiA9IHZhbHVlX3N0ci5hdCAoaSk7DQo+PiArICAgICAgdHJlZSBiYiA9 IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmNoYXJfY29uc3RhbnRfZXhwcmVzc2lvbiAoYik7DQo+ PiArICAgICAgdmFscy5wdXNoX2JhY2sgKGJiKTsNCj4+ICsgICAgICBpbmRleGVzLnB1c2hf YmFjayAoaSk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyZWUgYXJyYXlfdHlwZSA9IFR5 VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCBhcnJheV90eXR5KTsNCj4+ICsgIHRy ZWUgY29uc3RydWN0ZWQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5hcnJheV9j b25zdHJ1Y3Rvcl9leHByZXNzaW9uIChhcnJheV90eXBlLCBpbmRleGVzLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFs cywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ICsgIHJldHVybiBhZGRy ZXNzX2V4cHJlc3Npb24gKGNvbnN0cnVjdGVkLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiAr fQ0KPj4gKw0KPj4gK3RyZWUNCj4+ICtDb21waWxlRXhwcjo6dHlwZV9jYXN0X2V4cHJlc3Np b24gKHRyZWUgdHlwZV90b19jYXN0X3RvLCB0cmVlIGV4cHJfdHJlZSwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gbG9jYXRpb24pDQo+PiArew0K Pj4gKyAgaWYgKHR5cGVfdG9fY2FzdF90byA9PSBlcnJvcl9tYXJrX25vZGUgfHwgZXhwcl90 cmVlID09IGVycm9yX21hcmtfbm9kZQ0KPj4gKyAgICAgIHx8IFRSRUVfVFlQRSAoZXhwcl90 cmVlKSA9PSBlcnJvcl9tYXJrX25vZGUpDQo+PiArICAgIHJldHVybiBlcnJvcl9tYXJrX25v ZGU7DQo+PiArDQo+PiArICBpZiAoY3R4LT5nZXRfYmFja2VuZCAoKS0+dHlwZV9zaXplICh0 eXBlX3RvX2Nhc3RfdG8pID09IDANCj4+ICsgICAgICB8fCBUUkVFX1RZUEUgKGV4cHJfdHJl ZSkgPT0gdm9pZF90eXBlX25vZGUpDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBEbyBub3Qg Y29udmVydCB6ZXJvLXNpemVkIHR5cGVzLg0KPj4gKyAgICAgIHJldHVybiBleHByX3RyZWU7 DQo+PiArICAgIH0NCj4+ICsgIGVsc2UgaWYgKFRSRUVfQ09ERSAodHlwZV90b19jYXN0X3Rv KSA9PSBJTlRFR0VSX1RZUEUpDQo+PiArICAgIHsNCj4+ICsgICAgICB0cmVlIGNhc3QgPSBm b2xkIChjb252ZXJ0X3RvX2ludGVnZXIgKHR5cGVfdG9fY2FzdF90bywgZXhwcl90cmVlKSk7 DQo+IA0KPiBJIHRoaW5rIGFsbCB0aGUgY29udmVydF90b18qIGZ1bmN0aW9ucyBmb2xkIHRo ZSByZXN1bHQgYWxyZWFkeQ0KPiANCj4+ICsgICAgICAvLyBGSVhNRSBjaGVjayBmb3IgVFJF RV9PVkVSRkxPVz8NCj4+ICsgICAgICByZXR1cm4gY2FzdDsNCj4+ICsgICAgfQ0KPj4gKyAg ZWxzZSBpZiAoVFJFRV9DT0RFICh0eXBlX3RvX2Nhc3RfdG8pID09IFJFQUxfVFlQRSkNCj4+ ICsgICAgew0KPj4gKyAgICAgIHRyZWUgY2FzdCA9IGZvbGQgKGNvbnZlcnRfdG9fcmVhbCAo dHlwZV90b19jYXN0X3RvLCBleHByX3RyZWUpKTsNCj4+ICsgICAgICAvLyBGSVhNRQ0KPj4g KyAgICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgdHJlZSBpcyBNQVgg dmFsIGFuZCB0aHVzbHkgc2F0dXJhdGUgaXQNCj4+ICsgICAgICAvLyB0byBpbmYuIHdlIGNh biBnZXQgdGhlIGJvdW5kcyBhbmQgY2hlY2sgdGhlIHZhbHVlIGlmIGl0cyA+PSBvciA8PSB0 bw0KPj4gKyAgICAgIC8vIHRoZSBtaW4gYW5kIG1heCBib3VuZHMNCj4+ICsgICAgICAvLw0K Pj4gKyAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9SdXN0LUdDQy9nY2Nycy9pc3N1ZXMv NjM1DQo+PiArICAgICAgcmV0dXJuIGNhc3Q7DQo+PiArICAgIH0NCj4+ICsgIGVsc2UgaWYg KFRSRUVfQ09ERSAodHlwZV90b19jYXN0X3RvKSA9PSBDT01QTEVYX1RZUEUpDQo+PiArICAg IHsNCj4+ICsgICAgICByZXR1cm4gZm9sZCAoY29udmVydF90b19jb21wbGV4ICh0eXBlX3Rv X2Nhc3RfdG8sIGV4cHJfdHJlZSkpOw0KPj4gKyAgICB9DQo+PiArICBlbHNlIGlmIChUUkVF X0NPREUgKHR5cGVfdG9fY2FzdF90bykgPT0gUE9JTlRFUl9UWVBFDQo+PiArICAgICAgICAg ICYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChleHByX3RyZWUpKSA9PSBJTlRFR0VSX1RZUEUp DQo+PiArICAgIHsNCj4+ICsgICAgICByZXR1cm4gZm9sZCAoY29udmVydF90b19wb2ludGVy ICh0eXBlX3RvX2Nhc3RfdG8sIGV4cHJfdHJlZSkpOw0KPj4gKyAgICB9DQo+PiArICBlbHNl IGlmIChUUkVFX0NPREUgKHR5cGVfdG9fY2FzdF90bykgPT0gUkVDT1JEX1RZUEUNCj4+ICsg ICAgICAgICAgfHwgVFJFRV9DT0RFICh0eXBlX3RvX2Nhc3RfdG8pID09IEFSUkFZX1RZUEUp DQo+PiArICAgIHsNCj4+ICsgICAgICByZXR1cm4gZm9sZF9idWlsZDFfbG9jIChsb2NhdGlv bi5nY2NfbG9jYXRpb24gKCksIFZJRVdfQ09OVkVSVF9FWFBSLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdHlwZV90b19jYXN0X3RvLCBleHByX3RyZWUpOw0KPj4gKyAg ICB9DQo+PiArICBlbHNlIGlmIChUUkVFX0NPREUgKHR5cGVfdG9fY2FzdF90bykgPT0gUE9J TlRFUl9UWVBFDQo+PiArICAgICAgICAgICYmIFNMSUNFX1RZUEVfUCAoVFJFRV9UWVBFIChl eHByX3RyZWUpKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8vIHJldHVybmluZyBhIHJhdyBj YXN0IHVzaW5nIE5PUF9FWFBSIHNlZW1zIHRvIHJlc3V0IGluIGFuIElDRToNCj4+ICsgICAg ICAvLw0KPj4gKyAgICAgIC8vIEFuYWx5emluZyBjb21waWxhdGlvbiB1bml0DQo+PiArICAg ICAgLy8gUGVyZm9ybWluZyBpbnRlcnByb2NlZHVyYWwgb3B0aW1pemF0aW9ucw0KPj4gKyAg ICAgIC8vICA8KmZyZWVfbGFuZ19kYXRhPiB7aGVhcCAyNjQ0a30gPHZpc2liaWxpdHk+IHto ZWFwIDI2NDRrfQ0KPj4gKyAgICAgIC8vICA8YnVpbGRfc3NhX3Bhc3Nlcz4ge2hlYXAgMjY0 NGt9IDxvcHRfbG9jYWxfcGFzc2VzPiB7aGVhcCAyNjQ0a31kdXJpbmcNCj4+ICsgICAgICAv LyAgR0lNUExFIHBhc3M6IGNkZGNlDQo+PiArICAgICAgLy8gSW4gZnVuY3Rpb24g4oCYKlQ6 OmFzX3B0cjxpMzI+4oCZOg0KPj4gKyAgICAgIC8vIHJ1c3QxOiBpbnRlcm5hbCBjb21waWxl ciBlcnJvcjogaW4gcHJvcGFnYXRlX25lY2Vzc2l0eSwgYXQNCj4+ICsgICAgICAvLyB0cmVl LXNzYS1kY2UuY2M6OTg0IDB4MWQ1YjQzZSBwcm9wYWdhdGVfbmVjZXNzaXR5DQo+PiArICAg ICAgLy8gICAgICAgICAuLi8uLi9nY2Nycy9nY2MvdHJlZS1zc2EtZGNlLmNjOjk4NA0KPj4g KyAgICAgIC8vIDB4MWQ1ZTE4MCBwZXJmb3JtX3RyZWVfc3NhX2RjZQ0KPj4gKyAgICAgIC8v ICAgICAgICAgLi4vLi4vZ2NjcnMvZ2NjL3RyZWUtc3NhLWRjZS5jYzoxODc2DQo+PiArICAg ICAgLy8gMHgxZDVlMmM4IHRyZWVfc3NhX2NkX2RjZQ0KPj4gKyAgICAgIC8vICAgICAgICAg Li4vLi4vZ2NjcnMvZ2NjL3RyZWUtc3NhLWRjZS5jYzoxOTIwDQo+PiArICAgICAgLy8gMHgx ZDVlNDlhIGV4ZWN1dGUNCj4+ICsgICAgICAvLyAgICAgICAgIC4uLy4uL2djY3JzL2djYy90 cmVlLXNzYS1kY2UuY2M6MTk5Mg0KPj4gKw0KPj4gKyAgICAgIC8vIHRoaXMgaXMgcmV0dXJu aW5nIHRoZSBkaXJlY3QgcmF3IHBvaW50ZXIgb2YgdGhlIHNsaWNlIGFuIGFzc3VtZXMgYSB2 ZXJ5DQo+PiArICAgICAgLy8gc3BlY2lmaWMgbGF5b3V0DQo+PiArICAgICAgcmV0dXJuIGN0 eC0+Z2V0X2JhY2tlbmQgKCktPnN0cnVjdF9maWVsZF9leHByZXNzaW9uIChleHByX3RyZWUs IDAsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxvY2F0aW9uKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJu IGZvbGRfY29udmVydF9sb2MgKGxvY2F0aW9uLmdjY19sb2NhdGlvbiAoKSwgdHlwZV90b19j YXN0X3RvLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90cmVlKTsNCj4+ ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVFeHByOjp2aXNpdCAoSElSOjpBcnJh eUV4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnR5dHkgPSBudWxs cHRyOw0KPj4gKyAgaWYgKCFjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKGV4cHIu Z2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICZ0eXR5KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHJ1c3Rf ZmF0YWxfZXJyb3IgKGV4cHIuZ2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgImRpZCBub3QgcmVzb2x2ZSB0eXBlIGZvciB0aGlzIGFycmF5IGV4cHIiKTsNCj4+ ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyZWUgYXJyYXlfdHlw ZSA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCB0eXR5KTsNCj4+ICsgIGlm IChUUkVFX0NPREUgKGFycmF5X3R5cGUpICE9IEFSUkFZX1RZUEUpDQo+PiArICAgIHsNCj4+ ICsgICAgICB0cmFuc2xhdGVkID0gZXJyb3JfbWFya19ub2RlOw0KPj4gKyAgICAgIHJldHVy bjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcnVzdF9hc3NlcnQgKHR5dHktPmdldF9raW5k ICgpID09IFR5VHk6OlR5cGVLaW5kOjpBUlJBWSk7DQo+PiArICBjb25zdCBUeVR5OjpBcnJh eVR5cGUgJmFycmF5X3R5dHkNCj4+ICsgICAgPSBzdGF0aWNfY2FzdDxjb25zdCBUeVR5OjpB cnJheVR5cGUgJj4gKCp0eXR5KTsNCj4+ICsNCj4+ICsgIEhJUjo6QXJyYXlFbGVtcyAmZWxl bWVudHMgPSAqZXhwci5nZXRfaW50ZXJuYWxfZWxlbWVudHMgKCk7DQo+PiArICBzd2l0Y2gg KGVsZW1lbnRzLmdldF9hcnJheV9leHByX3R5cGUgKCkpDQo+PiArICAgIHsNCj4+ICsgICAg ICBjYXNlIEhJUjo6QXJyYXlFbGVtczo6QXJyYXlFeHByVHlwZTo6VkFMVUVTOiB7DQo+PiAr ICAgICAgIEhJUjo6QXJyYXlFbGVtc1ZhbHVlcyAmZWxlbXMNCj4+ICsgICAgICAgICA9IHN0 YXRpY19jYXN0PEhJUjo6QXJyYXlFbGVtc1ZhbHVlcyAmPiAoZWxlbWVudHMpOw0KPj4gKyAg ICAgICB0cmFuc2xhdGVkDQo+PiArICAgICAgICAgPSBhcnJheV92YWx1ZV9leHByIChleHBy LmdldF9sb2N1cyAoKSwgYXJyYXlfdHl0eSwgYXJyYXlfdHlwZSwgZWxlbXMpOw0KPj4gKyAg ICAgIH0NCj4+ICsgICAgICByZXR1cm47DQo+PiArDQo+PiArICAgIGNhc2UgSElSOjpBcnJh eUVsZW1zOjpBcnJheUV4cHJUeXBlOjpDT1BJRUQ6DQo+PiArICAgICAgSElSOjpBcnJheUVs ZW1zQ29waWVkICZlbGVtcw0KPj4gKyAgICAgICA9IHN0YXRpY19jYXN0PEhJUjo6QXJyYXlF bGVtc0NvcGllZCAmPiAoZWxlbWVudHMpOw0KPj4gKyAgICAgIHRyYW5zbGF0ZWQNCj4+ICsg ICAgICAgPSBhcnJheV9jb3BpZWRfZXhwciAoZXhwci5nZXRfbG9jdXMgKCksIGFycmF5X3R5 dHksIGFycmF5X3R5cGUsIGVsZW1zKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICt0 cmVlDQo+PiArQ29tcGlsZUV4cHI6OmFycmF5X3ZhbHVlX2V4cHIgKExvY2F0aW9uIGV4cHJf bG9jdXMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlUeTo6 QXJyYXlUeXBlICZhcnJheV90eXR5LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHRyZWUgYXJyYXlfdHlwZSwgSElSOjpBcnJheUVsZW1zVmFsdWVzICZlbGVtcykNCj4+ ICt7DQo+PiArICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBsb25nPiBpbmRleGVzOw0KPj4gKyAg c3RkOjp2ZWN0b3I8dHJlZT4gY29uc3RydWN0b3I7DQo+PiArICBzaXplX3QgaSA9IDA7DQo+ PiArICBmb3IgKGF1dG8gJmVsZW0gOiBlbGVtcy5nZXRfdmFsdWVzICgpKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgdHJlZSB0cmFuc2xhdGVkX2V4cHIgPSBDb21waWxlRXhwcjo6Q29tcGls ZSAoZWxlbS5nZXQgKCksIGN0eCk7DQo+PiArICAgICAgY29uc3RydWN0b3IucHVzaF9iYWNr ICh0cmFuc2xhdGVkX2V4cHIpOw0KPj4gKyAgICAgIGluZGV4ZXMucHVzaF9iYWNrIChpKysp Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICByZXR1cm4gY3R4LT5nZXRfYmFja2VuZCAoKS0+ YXJyYXlfY29uc3RydWN0b3JfZXhwcmVzc2lvbiAoYXJyYXlfdHlwZSwgaW5kZXhlcywNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0cnVjdG9yLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9sb2N1cyk7DQo+PiArfQ0KPj4g Kw0KPj4gK3RyZWUNCj4+ICtDb21waWxlRXhwcjo6YXJyYXlfY29waWVkX2V4cHIgKExvY2F0 aW9uIGV4cHJfbG9jdXMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IFR5VHk6OkFycmF5VHlwZSAmYXJyYXlfdHl0eSwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdHJlZSBhcnJheV90eXBlLCBISVI6OkFycmF5RWxlbXNDb3BpZWQg JmVsZW1zKQ0KPj4gK3sNCj4+ICsgIC8vICBzZWUgZ2NjL2NwL3R5cGVjazIuY2M6MTM2OS0x NDAxDQo+PiArICBnY2NfYXNzZXJ0IChUUkVFX0NPREUgKGFycmF5X3R5cGUpID09IEFSUkFZ X1RZUEUpOw0KPj4gKyAgdHJlZSBkb21haW4gPSBUWVBFX0RPTUFJTiAoYXJyYXlfdHlwZSk7 DQo+PiArICBpZiAoIWRvbWFpbikNCj4+ICsgICAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsN Cj4+ICsNCj4+ICsgIGlmICghVFJFRV9DT05TVEFOVCAoVFlQRV9NQVhfVkFMVUUgKGRvbWFp bikpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgcnVzdF9lcnJvcl9hdCAoZXhwcl9sb2N1cywg Im5vbiBjb25zdCBjYXBhY2l0eSBkb21haW4gJXFUIiwgYXJyYXlfdHlwZSk7DQo+PiArICAg ICAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgdHJl ZSBjYXBhY2l0eV9leHByID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKGVsZW1zLmdldF9udW1f Y29waWVzX2V4cHIgKCksIGN0eCk7DQo+PiArICBpZiAoIVRSRUVfQ09OU1RBTlQgKGNhcGFj aXR5X2V4cHIpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgcnVzdF9lcnJvcl9hdCAoZXhwcl9s b2N1cywgIm5vbiBjb25zdCBudW0gY29waWVzICVxVCIsIGFycmF5X3R5cGUpOw0KPj4gKyAg ICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8v IGdldCB0aGUgY29tcGlsZWQgdmFsdWUNCj4+ICsgIHRyZWUgdHJhbnNsYXRlZF9leHByID0g Q29tcGlsZUV4cHI6OkNvbXBpbGUgKGVsZW1zLmdldF9lbGVtX3RvX2NvcHkgKCksIGN0eCk7 DQo+PiArDQo+PiArICB0cmVlIG1heF9kb21haW4gPSBUWVBFX01BWF9WQUxVRSAoZG9tYWlu KTsNCj4+ICsgIHRyZWUgbWluX2RvbWFpbiA9IFRZUEVfTUlOX1ZBTFVFIChkb21haW4pOw0K Pj4gKw0KPj4gKyAgYXV0byBtYXggPSB3aTo6dG9fb2Zmc2V0IChtYXhfZG9tYWluKTsNCj4+ ICsgIGF1dG8gbWluID0gd2k6OnRvX29mZnNldCAobWluX2RvbWFpbik7DQo+IA0KPiBBcyBz YWlkIGluIHRoZSBvdGhlciByZXZpZXcgVFJFRV9DT05TVEFOVCBpc24ndCBlbm91Z2ggdG8g ZW5zdXJlIHRoaXMgd29ya3MNCj4gDQo+PiArICBhdXRvIHByZWNpc2lvbiA9IFRZUEVfUFJF Q0lTSU9OIChUUkVFX1RZUEUgKGRvbWFpbikpOw0KPj4gKyAgYXV0byBzaWduID0gVFlQRV9T SUdOIChUUkVFX1RZUEUgKGRvbWFpbikpOw0KPj4gKyAgdW5zaWduZWQgSE9TVF9XSURFX0lO VCBsZW4NCj4+ICsgICAgPSB3aTo6ZXh0IChtYXggLSBtaW4gKyAxLCBwcmVjaXNpb24sIHNp Z24pLnRvX3Vod2kgKCk7DQo+PiArDQo+PiArICAvLyBJbiBhIGNvbnN0IGNvbnRleHQgd2Ug bXVzdCBpbml0aWFsaXplIHRoZSBlbnRpcmUgYXJyYXksIHdoaWNoIGVudGFpbHMNCj4+ICsg IC8vIGFsbG9jYXRpbmcgZm9yIGVhY2ggZWxlbWVudC4gSWYgdGhlIHVzZXIgd2FudHMgYSBo dWdlIGFycmF5LCB3ZSB3aWxsIE9PTQ0KPj4gKyAgLy8gYW5kIGRpZSBob3JyaWJseS4NCj4+ ICsgIGlmIChjdHgtPmNvbnN0X2NvbnRleHRfcCAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAg IHNpemVfdCBpZHggPSAwOw0KPj4gKyAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGxvbmc+ IGluZGV4ZXM7DQo+PiArICAgICAgc3RkOjp2ZWN0b3I8dHJlZT4gY29uc3RydWN0b3I7DQo+ PiArICAgICAgZm9yICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGkgPSAwOyBpIDwgbGVuOyBp KyspDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICBjb25zdHJ1Y3Rvci5wdXNoX2JhY2sg KHRyYW5zbGF0ZWRfZXhwcik7DQo+PiArICAgICAgICAgaW5kZXhlcy5wdXNoX2JhY2sgKGlk eCsrKTsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIHJldHVybiBjdHgtPmdldF9i YWNrZW5kICgpLT5hcnJheV9jb25zdHJ1Y3Rvcl9leHByZXNzaW9uIChhcnJheV90eXBlLA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGluZGV4ZXMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IsDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZXhwcl9sb2N1cyk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGVsc2UNCj4+ ICsgICAgew0KPj4gKyAgICAgIC8vIENyZWF0ZSBhIG5ldyBibG9jayBzY29wZSBpbiB3aGlj aCB0byBpbml0aWFsaXplIHRoZSBhcnJheQ0KPj4gKyAgICAgIHRyZWUgZm5kZWNsID0gTlVM TF9UUkVFOw0KPj4gKyAgICAgIGlmIChjdHgtPmluX2ZuICgpKQ0KPj4gKyAgICAgICBmbmRl Y2wgPSBjdHgtPnBlZWtfZm4gKCkuZm5kZWNsOw0KPj4gKw0KPj4gKyAgICAgIHN0ZDo6dmVj dG9yPEJ2YXJpYWJsZSAqPiBsb2NhbHM7DQo+PiArICAgICAgdHJlZSBlbmNsb3Npbmdfc2Nv cGUgPSBjdHgtPnBlZWtfZW5jbG9zaW5nX3Njb3BlICgpOw0KPj4gKyAgICAgIHRyZWUgaW5p dF9ibG9jaw0KPj4gKyAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmJsb2NrIChmbmRl Y2wsIGVuY2xvc2luZ19zY29wZSwgbG9jYWxzLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBleHByX2xvY3VzLCBleHByX2xvY3VzKTsNCj4+ICsgICAgICBj dHgtPnB1c2hfYmxvY2sgKGluaXRfYmxvY2spOw0KPj4gKw0KPj4gKyAgICAgIHRyZWUgdG1w Ow0KPj4gKyAgICAgIHRyZWUgc3RtdHMNCj4+ICsgICAgICAgPSBjdHgtPmdldF9iYWNrZW5k ICgpLT5hcnJheV9pbml0aWFsaXplciAoZm5kZWNsLCBpbml0X2Jsb2NrLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV90eXBl LCBjYXBhY2l0eV9leHByLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkX2V4cHIsICZ0bXAsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfbG9jdXMpOw0K Pj4gKyAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAoc3RtdHMpOw0KPj4gKw0KPj4gKyAgICAg IHRyZWUgYmxvY2sgPSBjdHgtPnBvcF9ibG9jayAoKTsNCj4+ICsNCj4+ICsgICAgICAvLyBU aGUgcmVzdWx0IGlzIGEgY29tcG91bmQgZXhwcmVzc2lvbiB3aGljaCBjcmVhdGVzIGEgdGVt cG9yYXJ5IGFycmF5LA0KPj4gKyAgICAgIC8vIGluaXRpYWxpemVzIGFsbCB0aGUgZWxlbWVu dHMgaW4gYSBsb29wLCBhbmQgdGhlbiB5ZWlsZHMgdGhlIGFycmF5Lg0KPj4gKyAgICAgIHJl dHVybiBjdHgtPmdldF9iYWNrZW5kICgpLT5jb21wb3VuZF9leHByZXNzaW9uIChibG9jaywg dG1wLCBleHByX2xvY3VzKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICt0cmVlDQo+ PiArSElSQ29tcGlsZUJhc2U6OnJlc29sdmVfYWRqdXN0ZW1lbnRzICgNCj4+ICsgIHN0ZDo6 dmVjdG9yPFJlc29sdmVyOjpBZGp1c3RtZW50PiAmYWRqdXN0bWVudHMsIHRyZWUgZXhwcmVz c2lvbiwNCj4+ICsgIExvY2F0aW9uIGxvY3VzKQ0KPj4gK3sNCj4+ICsgIHRyZWUgZSA9IGV4 cHJlc3Npb247DQo+PiArICBmb3IgKGF1dG8gJmFkanVzdG1lbnQgOiBhZGp1c3RtZW50cykN Cj4+ICsgICAgew0KPj4gKyAgICAgIHN3aXRjaCAoYWRqdXN0bWVudC5nZXRfdHlwZSAoKSkN Cj4+ICsgICAgICAgew0KPj4gKyAgICAgICBjYXNlIFJlc29sdmVyOjpBZGp1c3RtZW50OjpB ZGp1c3RtZW50VHlwZTo6RVJST1I6DQo+PiArICAgICAgICAgcmV0dXJuIGVycm9yX21hcmtf bm9kZTsNCj4+ICsNCj4+ICsgICAgICAgY2FzZSBSZXNvbHZlcjo6QWRqdXN0bWVudDo6QWRq dXN0bWVudFR5cGU6OklNTV9SRUY6DQo+PiArICAgICAgICAgY2FzZSBSZXNvbHZlcjo6QWRq dXN0bWVudDo6QWRqdXN0bWVudFR5cGU6Ok1VVF9SRUY6IHsNCj4+ICsgICAgICAgICAgIGlm ICghU0xJQ0VfVFlQRV9QIChUUkVFX1RZUEUgKGUpKSkNCj4+ICsgICAgICAgICAgICAgew0K Pj4gKyAgICAgICAgICAgICAgIGUgPSBhZGRyZXNzX2V4cHJlc3Npb24gKGUsIGxvY3VzKTsN Cj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAgICAgICBicmVh azsNCj4+ICsNCj4+ICsgICAgICAgY2FzZSBSZXNvbHZlcjo6QWRqdXN0bWVudDo6QWRqdXN0 bWVudFR5cGU6OkRFUkVGOg0KPj4gKyAgICAgICBjYXNlIFJlc29sdmVyOjpBZGp1c3RtZW50 OjpBZGp1c3RtZW50VHlwZTo6REVSRUZfTVVUOg0KPj4gKyAgICAgICAgIGUgPSByZXNvbHZl X2RlcmVmX2FkanVzdG1lbnQgKGFkanVzdG1lbnQsIGUsIGxvY3VzKTsNCj4+ICsgICAgICAg ICBicmVhazsNCj4+ICsNCj4+ICsgICAgICAgY2FzZSBSZXNvbHZlcjo6QWRqdXN0bWVudDo6 QWRqdXN0bWVudFR5cGU6OklORElSRUNUSU9OOg0KPj4gKyAgICAgICAgIGUgPSByZXNvbHZl X2luZGlyZWN0aW9uX2FkanVzdG1lbnQgKGFkanVzdG1lbnQsIGUsIGxvY3VzKTsNCj4+ICsg ICAgICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgICAgY2FzZSBSZXNvbHZlcjo6QWRqdXN0 bWVudDo6QWRqdXN0bWVudFR5cGU6OlVOU0laRToNCj4+ICsgICAgICAgICBlID0gcmVzb2x2 ZV91bnNpemVkX2FkanVzdG1lbnQgKGFkanVzdG1lbnQsIGUsIGxvY3VzKTsNCj4+ICsgICAg ICAgICBicmVhazsNCj4+ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiArDQo+PiArICByZXR1 cm4gZTsNCj4+ICt9DQo+PiArDQo+PiArdHJlZQ0KPj4gK0hJUkNvbXBpbGVCYXNlOjpyZXNv bHZlX2RlcmVmX2FkanVzdG1lbnQgKFJlc29sdmVyOjpBZGp1c3RtZW50ICZhZGp1c3RtZW50 LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSBl eHByZXNzaW9uLCBMb2NhdGlvbiBsb2N1cykNCj4+ICt7DQo+PiArICBydXN0X2Fzc2VydCAo YWRqdXN0bWVudC5pc19kZXJlZl9hZGp1c3RtZW50ICgpDQo+PiArICAgICAgICAgICAgICB8 fCBhZGp1c3RtZW50LmlzX2RlcmVmX211dF9hZGp1c3RtZW50ICgpKTsNCj4+ICsgIHJ1c3Rf YXNzZXJ0IChhZGp1c3RtZW50Lmhhc19vcGVyYXRvcl9vdmVybG9hZCAoKSk7DQo+PiArDQo+ PiArICBUeVR5OjpGblR5cGUgKmxvb2t1cCA9IGFkanVzdG1lbnQuZ2V0X2RlcmVmX29wZXJh dG9yX2ZuICgpOw0KPj4gKyAgSElSOjpJbXBsSXRlbSAqcmVzb2x2ZWRfaXRlbSA9IGFkanVz dG1lbnQuZ2V0X2RlcmVmX2hpcl9pdGVtICgpOw0KPj4gKw0KPj4gKyAgdHJlZSBmbl9hZGRy ZXNzID0gZXJyb3JfbWFya19ub2RlOw0KPj4gKyAgaWYgKCFsb29rdXAtPmhhc19zdWJzaXRp dGlvbnNfZGVmaW5lZCAoKSkNCj4+ICsgICAgZm5fYWRkcmVzcyA9IENvbXBpbGVJbmhlcmVu dEltcGxJdGVtOjpDb21waWxlIChyZXNvbHZlZF9pdGVtLCBjdHgsIG51bGxwdHIsDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVl LCBsb2N1cyk7DQo+PiArICBlbHNlDQo+PiArICAgIGZuX2FkZHJlc3MgPSBDb21waWxlSW5o ZXJlbnRJbXBsSXRlbTo6Q29tcGlsZSAocmVzb2x2ZWRfaXRlbSwgY3R4LCBsb29rdXAsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 cnVlLCBsb2N1cyk7DQo+PiArDQo+PiArICAvLyBkb2VzIGl0IG5lZWQgYSByZWZlcmVuY2Ug dG8gY2FsbA0KPj4gKyAgdHJlZSBhZGp1c3RlZF9hcmd1bWVudCA9IGV4cHJlc3Npb247DQo+ PiArICBib29sIG5lZWRzX2JvcnJvdyA9IGFkanVzdG1lbnQuZ2V0X2RlcmVmX2FkanVzdG1l bnRfdHlwZSAoKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgICE9IFJlc29sdmVyOjpBZGp1 c3RtZW50OjpBZGp1c3RtZW50VHlwZTo6RVJST1I7DQo+PiArICBpZiAobmVlZHNfYm9ycm93 KQ0KPj4gKyAgICB7DQo+PiArICAgICAgYWRqdXN0ZWRfYXJndW1lbnQgPSBhZGRyZXNzX2V4 cHJlc3Npb24gKGV4cHJlc3Npb24sIGxvY3VzKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAg Ly8gbWFrZSB0aGUgY2FsbA0KPj4gKyAgcmV0dXJuIGN0eC0+Z2V0X2JhY2tlbmQgKCktPmNh bGxfZXhwcmVzc2lvbiAoZm5fYWRkcmVzcywge2FkanVzdGVkX2FyZ3VtZW50fSwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwg bG9jdXMpOw0KPj4gK30NCj4+ICsNCj4+ICt0cmVlDQo+PiArSElSQ29tcGlsZUJhc2U6OnJl c29sdmVfaW5kaXJlY3Rpb25fYWRqdXN0bWVudCAoDQo+PiArICBSZXNvbHZlcjo6QWRqdXN0 bWVudCAmYWRqdXN0bWVudCwgdHJlZSBleHByZXNzaW9uLCBMb2NhdGlvbiBsb2N1cykNCj4+ ICt7DQo+PiArICByZXR1cm4gaW5kaXJlY3RfZXhwcmVzc2lvbiAoZXhwcmVzc2lvbiwgbG9j dXMpOw0KPj4gK30NCj4+ICsNCj4+ICt0cmVlDQo+PiArSElSQ29tcGlsZUJhc2U6OnJlc29s dmVfdW5zaXplZF9hZGp1c3RtZW50IChSZXNvbHZlcjo6QWRqdXN0bWVudCAmYWRqdXN0bWVu dCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJl ZSBleHByZXNzaW9uLCBMb2NhdGlvbiBsb2N1cykNCj4+ICt7DQo+PiArICBib29sIGV4cGVj dF9zbGljZQ0KPj4gKyAgICA9IGFkanVzdG1lbnQuZ2V0X2V4cGVjdGVkICgpLT5nZXRfa2lu ZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6U0xJQ0U7DQo+PiArICBib29sIGV4cGVjdF9keW4N Cj4+ICsgICAgPSBhZGp1c3RtZW50LmdldF9leHBlY3RlZCAoKS0+Z2V0X2tpbmQgKCkgPT0g VHlUeTo6VHlwZUtpbmQ6OkRZTkFNSUM7DQo+PiArDQo+PiArICAvLyBhc3N1bWVzIHRoaXMg aXMgYW4gYXJyYXkNCj4+ICsgIHRyZWUgZXhwcl90eXBlID0gVFJFRV9UWVBFIChleHByZXNz aW9uKTsNCj4+ICsgIGlmIChleHBlY3Rfc2xpY2UpDQo+PiArICAgIHsNCj4+ICsgICAgICBy dXN0X2Fzc2VydCAoVFJFRV9DT0RFIChleHByX3R5cGUpID09IEFSUkFZX1RZUEUpOw0KPj4g KyAgICAgIHJldHVybiByZXNvbHZlX3Vuc2l6ZWRfc2xpY2VfYWRqdXN0bWVudCAoYWRqdXN0 bWVudCwgZXhwcmVzc2lvbiwgbG9jdXMpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBydXN0 X2Fzc2VydCAoZXhwZWN0X2R5bik7DQo+PiArICByZXR1cm4gcmVzb2x2ZV91bnNpemVkX2R5 bl9hZGp1c3RtZW50IChhZGp1c3RtZW50LCBleHByZXNzaW9uLCBsb2N1cyk7DQo+PiArfQ0K Pj4gKw0KPj4gK3RyZWUNCj4+ICtISVJDb21waWxlQmFzZTo6cmVzb2x2ZV91bnNpemVkX3Ns aWNlX2FkanVzdG1lbnQgKA0KPj4gKyAgUmVzb2x2ZXI6OkFkanVzdG1lbnQgJmFkanVzdG1l bnQsIHRyZWUgZXhwcmVzc2lvbiwgTG9jYXRpb24gbG9jdXMpDQo+PiArew0KPj4gKyAgLy8g YXNzdW1lcyB0aGlzIGlzIGFuIGFycmF5DQo+PiArICB0cmVlIGV4cHJfdHlwZSA9IFRSRUVf VFlQRSAoZXhwcmVzc2lvbik7DQo+PiArICBydXN0X2Fzc2VydCAoVFJFRV9DT0RFIChleHBy X3R5cGUpID09IEFSUkFZX1RZUEUpOw0KPj4gKw0KPj4gKyAgLy8gdGFrZXMgYW4gYXJyYXkg YW5kIHJldHVybnMgYSBmYXQtcG9pbnRlciBzbyB0aGlzIGJlY29tZXMgYSBjb25zdHJ1Y3Rv cg0KPj4gKyAgLy8gZXhwcmVzc2lvbg0KPj4gKyAgcnVzdF9hc3NlcnQgKGFkanVzdG1lbnQu Z2V0X2V4cGVjdGVkICgpLT5nZXRfa2luZCAoKQ0KPj4gKyAgICAgICAgICAgICAgPT0gVHlU eTo6VHlwZUtpbmQ6OlNMSUNFKTsNCj4+ICsgIHRyZWUgZmF0X3BvaW50ZXINCj4+ICsgICAg PSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgYWRqdXN0bWVudC5nZXRfZXhw ZWN0ZWQgKCkpOw0KPj4gKw0KPj4gKyAgLy8gbWFrZSBhIGNvbnN0cnVjdG9yIGZvciB0aGlz DQo+PiArICB0cmVlIGRhdGEgPSBhZGRyZXNzX2V4cHJlc3Npb24gKGV4cHJlc3Npb24sIGxv Y3VzKTsNCj4+ICsNCj4+ICsgIC8vIGZldGNoIHRoZSBzaXplIGZyb20gdGhlIGRvbWFpbg0K Pj4gKyAgdHJlZSBkb21haW4gPSBUWVBFX0RPTUFJTiAoZXhwcl90eXBlKTsNCj4+ICsgIHVu c2lnbmVkIEhPU1RfV0lERV9JTlQgYXJyYXlfc2l6ZQ0KPj4gKyAgICA9IHdpOjpleHQgKHdp Ojp0b19vZmZzZXQgKFRZUEVfTUFYX1ZBTFVFIChkb21haW4pKQ0KPj4gKyAgICAgICAgICAg ICAgICAtIHdpOjp0b19vZmZzZXQgKFRZUEVfTUlOX1ZBTFVFIChkb21haW4pKSArIDEsDQo+ PiArICAgICAgICAgICAgICBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChkb21haW4pKSwN Cj4+ICsgICAgICAgICAgICAgIFRZUEVfU0lHTiAoVFJFRV9UWVBFIChkb21haW4pKSkNCj4+ ICsgICAgICAgLnRvX3Vod2kgKCk7DQo+IA0KPiBzZWUgdGhhdCBvdGhlciByZXZpZXcNCj4g DQo+PiArICB0cmVlIHNpemUgPSBidWlsZF9pbnRfY3N0IChzaXplX3R5cGVfbm9kZSwgYXJy YXlfc2l6ZSk7DQo+IA0KPiBidWlsZF9pbnRfY3N0dQ0KPiANCj4+ICsNCj4+ICsgIHJldHVy biBjdHgtPmdldF9iYWNrZW5kICgpLT5jb25zdHJ1Y3Rvcl9leHByZXNzaW9uIChmYXRfcG9p bnRlciwgZmFsc2UsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB7ZGF0YSwgc2l6ZX0sIC0xLCBsb2N1cyk7DQo+PiArfQ0KPj4g Kw0KPj4gK3RyZWUNCj4+ICtISVJDb21waWxlQmFzZTo6cmVzb2x2ZV91bnNpemVkX2R5bl9h ZGp1c3RtZW50ICgNCj4+ICsgIFJlc29sdmVyOjpBZGp1c3RtZW50ICZhZGp1c3RtZW50LCB0 cmVlIGV4cHJlc3Npb24sIExvY2F0aW9uIGxvY3VzKQ0KPj4gK3sNCj4+ICsgIHRyZWUgcnZh bHVlID0gZXhwcmVzc2lvbjsNCj4+ICsgIExvY2F0aW9uIHJ2YWx1ZV9sb2N1cyA9IGxvY3Vz Ow0KPj4gKw0KPj4gKyAgY29uc3QgVHlUeTo6QmFzZVR5cGUgKmFjdHVhbCA9IGFkanVzdG1l bnQuZ2V0X2FjdHVhbCAoKTsNCj4+ICsgIGNvbnN0IFR5VHk6OkJhc2VUeXBlICpleHBlY3Rl ZCA9IGFkanVzdG1lbnQuZ2V0X2V4cGVjdGVkICgpOw0KPj4gKw0KPj4gKyAgY29uc3QgVHlU eTo6RHluYW1pY09iamVjdFR5cGUgKmR5bg0KPj4gKyAgICA9IHN0YXRpY19jYXN0PGNvbnN0 IFR5VHk6OkR5bmFtaWNPYmplY3RUeXBlICo+IChleHBlY3RlZCk7DQo+PiArDQo+PiArICBy dXN0X2RlYnVnICgicmVzb2x2ZV91bnNpemVkX2R5bl9hZGp1c3RtZW50IGFjdHVhbD17JXN9 IGR5bj17JXN9IiwNCj4+ICsgICAgICAgICAgICAgYWN0dWFsLT5kZWJ1Z19zdHIgKCkuY19z dHIgKCksIGR5bi0+ZGVidWdfc3RyICgpLmNfc3RyICgpKTsNCj4+ICsNCj4+ICsgIHJldHVy biBjb2VyY2VfdG9fZHluX29iamVjdCAocnZhbHVlLCBhY3R1YWwsIGR5biwgcnZhbHVlX2xv Y3VzKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVFeHByOjp2aXNpdCAo SElSOjpSYW5nZUZyb21Ub0V4cHIgJmV4cHIpDQo+PiArew0KPj4gKyAgdHJlZSBmcm9tID0g Q29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4cHIuZ2V0X2Zyb21fZXhwciAoKS5nZXQgKCksIGN0 eCk7DQo+PiArICB0cmVlIHRvID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4cHIuZ2V0X3Rv X2V4cHIgKCkuZ2V0ICgpLCBjdHgpOw0KPj4gKyAgaWYgKGZyb20gPT0gZXJyb3JfbWFya19u b2RlIHx8IHRvID09IGVycm9yX21hcmtfbm9kZSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHRy YW5zbGF0ZWQgPSBlcnJvcl9tYXJrX25vZGU7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAg ICB9DQo+PiArDQo+PiArICBUeVR5OjpCYXNlVHlwZSAqdHl0eSA9IG51bGxwdHI7DQo+PiAr ICBib29sIG9rDQo+PiArICAgID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlIChl eHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZ0eXR5KTsNCj4+ICsgIHJ1c3Rf YXNzZXJ0IChvayk7DQo+PiArDQo+PiArICB0cmVlIGFkdCA9IFR5VHlSZXNvbHZlQ29tcGls ZTo6Y29tcGlsZSAoY3R4LCB0eXR5KTsNCj4+ICsNCj4+ICsgIC8vIG1ha2UgdGhlIGNvbnN0 cnVjdG9yDQo+PiArICB0cmFuc2xhdGVkDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2VuZCAo KS0+Y29uc3RydWN0b3JfZXhwcmVzc2lvbiAoYWR0LCBmYWxzZSwge2Zyb20sIHRvfSwgLTEs DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21w aWxlRXhwcjo6dmlzaXQgKEhJUjo6UmFuZ2VGcm9tRXhwciAmZXhwcikNCj4+ICt7DQo+PiAr ICB0cmVlIGZyb20gPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfZnJvbV9leHBy ICgpLmdldCAoKSwgY3R4KTsNCj4+ICsgIGlmIChmcm9tID09IGVycm9yX21hcmtfbm9kZSkN Cj4+ICsgICAgew0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBlcnJvcl9tYXJrX25vZGU7DQo+ PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBUeVR5OjpCYXNlVHlw ZSAqdHl0eSA9IG51bGxwdHI7DQo+PiArICBib29sIG9rDQo+PiArICAgID0gY3R4LT5nZXRf dHljdHggKCktPmxvb2t1cF90eXBlIChleHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQg KCksICZ0eXR5KTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICB0cmVl IGFkdCA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCB0eXR5KTsNCj4+ICsN Cj4+ICsgIC8vIG1ha2UgdGhlIGNvbnN0cnVjdG9yDQo+PiArICB0cmFuc2xhdGVkDQo+PiAr ICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+Y29uc3RydWN0b3JfZXhwcmVzc2lvbiAoYWR0 LCBmYWxzZSwge2Zyb219LCAtMSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsNCj4+ICt9DQo+PiAr DQo+PiArdm9pZA0KPj4gK0NvbXBpbGVFeHByOjp2aXNpdCAoSElSOjpSYW5nZVRvRXhwciAm ZXhwcikNCj4+ICt7DQo+PiArICB0cmVlIHRvID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKGV4 cHIuZ2V0X3RvX2V4cHIgKCkuZ2V0ICgpLCBjdHgpOw0KPj4gKyAgaWYgKHRvID09IGVycm9y X21hcmtfbm9kZSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBlcnJvcl9t YXJrX25vZGU7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBU eVR5OjpCYXNlVHlwZSAqdHl0eSA9IG51bGxwdHI7DQo+PiArICBib29sIG9rDQo+PiArICAg ID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlIChleHByLmdldF9tYXBwaW5ncyAo KS5nZXRfaGlyaWQgKCksICZ0eXR5KTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiAr DQo+PiArICB0cmVlIGFkdCA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCB0 eXR5KTsNCj4+ICsNCj4+ICsgIC8vIG1ha2UgdGhlIGNvbnN0cnVjdG9yDQo+PiArICB0cmFu c2xhdGVkDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+Y29uc3RydWN0b3JfZXhw cmVzc2lvbiAoYWR0LCBmYWxzZSwge3RvfSwgLTEsDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdldF9sb2N1cyAoKSk7DQo+ PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6UmFu Z2VGdWxsRXhwciAmZXhwcikNCj4+ICt7DQo+PiArICBUeVR5OjpCYXNlVHlwZSAqdHl0eSA9 IG51bGxwdHI7DQo+PiArICBib29sIG9rDQo+PiArICAgID0gY3R4LT5nZXRfdHljdHggKCkt Pmxvb2t1cF90eXBlIChleHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZ0eXR5 KTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICB0cmVlIGFkdCA9IFR5 VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCB0eXR5KTsNCj4+ICsgIHRyYW5zbGF0 ZWQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5jb25zdHJ1Y3Rvcl9leHByZXNzaW9uIChhZHQs IGZhbHNlLCB7fSwgLTEsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArfQ0K Pj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRXhwcjo6dmlzaXQgKEhJUjo6UmFuZ2VGcm9t VG9JbmNsRXhwciAmZXhwcikNCj4+ICt7DQo+PiArICB0cmVlIGZyb20gPSBDb21waWxlRXhw cjo6Q29tcGlsZSAoZXhwci5nZXRfZnJvbV9leHByICgpLmdldCAoKSwgY3R4KTsNCj4+ICsg IHRyZWUgdG8gPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZXhwci5nZXRfdG9fZXhwciAoKS5n ZXQgKCksIGN0eCk7DQo+PiArICBpZiAoZnJvbSA9PSBlcnJvcl9tYXJrX25vZGUgfHwgdG8g PT0gZXJyb3JfbWFya19ub2RlKQ0KPj4gKyAgICB7DQo+PiArICAgICAgdHJhbnNsYXRlZCA9 IGVycm9yX21hcmtfbm9kZTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsN Cj4+ICsgIFR5VHk6OkJhc2VUeXBlICp0eXR5ID0gbnVsbHB0cjsNCj4+ICsgIGJvb2wgb2sN Cj4+ICsgICAgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKGV4cHIuZ2V0X21h cHBpbmdzICgpLmdldF9oaXJpZCAoKSwgJnR5dHkpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKG9r KTsNCj4+ICsNCj4+ICsgIHRyZWUgYWR0ID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxl IChjdHgsIHR5dHkpOw0KPj4gKw0KPj4gKyAgLy8gbWFrZSB0aGUgY29uc3RydWN0b3INCj4+ ICsgIHRyYW5zbGF0ZWQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5jb25zdHJ1 Y3Rvcl9leHByZXNzaW9uIChhZHQsIGZhbHNlLCB7ZnJvbSwgdG99LCAtMSwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0 X2xvY3VzICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVFeHByOjp2 aXNpdCAoSElSOjpBcnJheUluZGV4RXhwciAmZXhwcikNCj4+ICt7DQo+PiArICB0cmVlIGFy cmF5X3JlZmVyZW5jZSA9IENvbXBpbGVFeHByOjpDb21waWxlIChleHByLmdldF9hcnJheV9l eHByICgpLCBjdHgpOw0KPj4gKyAgdHJlZSBpbmRleCA9IENvbXBpbGVFeHByOjpDb21waWxl IChleHByLmdldF9pbmRleF9leHByICgpLCBjdHgpOw0KPj4gKw0KPj4gKyAgLy8gdGhpcyBt aWdodCBiZSBhbiBjb3JlOjpvcHM6OmluZGV4IGxhbmcgaXRlbSBzaXR1YXRpb24NCj4+ICsg IFR5VHk6OkZuVHlwZSAqZm50eXBlOw0KPj4gKyAgYm9vbCBpc19vcF9vdmVybG9hZCA9IGN0 eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfb3BlcmF0b3Jfb3ZlcmxvYWQgKA0KPj4gKyAgICBl eHByLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZmbnR5cGUpOw0KPj4gKyAgaWYg KGlzX29wX292ZXJsb2FkKQ0KPj4gKyAgICB7DQo+PiArICAgICAgYXV0byBsYW5nX2l0ZW1f dHlwZSA9IEFuYWx5c2lzOjpSdXN0TGFuZ0l0ZW06Okl0ZW1UeXBlOjpJTkRFWDsNCj4+ICsg ICAgICB0cmVlIG9wZXJhdG9yX292ZXJsb2FkX2NhbGwNCj4+ICsgICAgICAgPSByZXNvbHZl X29wZXJhdG9yX292ZXJsb2FkIChsYW5nX2l0ZW1fdHlwZSwgZXhwciwgYXJyYXlfcmVmZXJl bmNlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBl eHByLmdldF9hcnJheV9leHByICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGV4cHIuZ2V0X2luZGV4X2V4cHIgKCkpOw0KPj4gKw0KPj4gKyAgICAgIHRy ZWUgYWN0dWFsX3R5cGUgPSBUUkVFX1RZUEUgKG9wZXJhdG9yX292ZXJsb2FkX2NhbGwpOw0K Pj4gKyAgICAgIGJvb2wgY2FuX2luZGlyZWN0ID0gVFlQRV9QVFJfUCAoYWN0dWFsX3R5cGUp IHx8IFRZUEVfUkVGX1AgKGFjdHVhbF90eXBlKTsNCj4+ICsgICAgICBpZiAoIWNhbl9pbmRp cmVjdCkNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8NCj4+ ICsgICAgICAgICB0cmFuc2xhdGVkID0gb3BlcmF0b3Jfb3ZlcmxvYWRfY2FsbDsNCj4+ICsg ICAgICAgICByZXR1cm47DQo+PiArICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAvLyBydXN0 IGRlcmVmIGFsd2F5cyByZXR1cm5zIGEgcmVmZXJlbmNlIGZyb20gdGhpcyBvdmVybG9hZCB0 aGVuIHdlIGNhbg0KPj4gKyAgICAgIC8vIGFjdHVhbGx5IGRvIHRoZSBpbmRpcmVjdGlvbg0K Pj4gKyAgICAgIHRyYW5zbGF0ZWQNCj4+ICsgICAgICAgPSBpbmRpcmVjdF9leHByZXNzaW9u IChvcGVyYXRvcl9vdmVybG9hZF9jYWxsLCBleHByLmdldF9sb2N1cyAoKSk7DQo+PiArICAg ICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBsZXRzIGNoZWNrIGlmIHRo ZSBhcnJheSBpcyBhIHJlZmVyZW5jZSB0eXBlIHRoZW4gd2UgY2FuIGFkZCBhbg0KPj4gKyAg Ly8gaW5kaXJlY3Rpb24gaWYgcmVxdWlyZWQNCj4+ICsgIFR5VHk6OkJhc2VUeXBlICphcnJh eV9leHByX3R5ID0gbnVsbHB0cjsNCj4+ICsgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAo KS0+bG9va3VwX3R5cGUgKA0KPj4gKyAgICBleHByLmdldF9hcnJheV9leHByICgpLT5nZXRf bWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLCAmYXJyYXlfZXhwcl90eSk7DQo+PiArICBydXN0 X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgLy8gZG8gd2UgbmVlZCB0byBhZGQgYW4gaW5k aXJlY3QgcmVmZXJlbmNlDQo+PiArICBpZiAoYXJyYXlfZXhwcl90eS0+Z2V0X2tpbmQgKCkg PT0gVHlUeTo6VHlwZUtpbmQ6OlJFRikNCj4+ICsgICAgew0KPj4gKyAgICAgIGFycmF5X3Jl ZmVyZW5jZQ0KPj4gKyAgICAgICA9IGluZGlyZWN0X2V4cHJlc3Npb24gKGFycmF5X3JlZmVy ZW5jZSwgZXhwci5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICB0cmFu c2xhdGVkDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+YXJyYXlfaW5kZXhfZXhw cmVzc2lvbiAoYXJyYXlfcmVmZXJlbmNlLCBpbmRleCwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X2xvY3VzICgpKTsN Cj4+ICt9DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFt ZXNwYWNlIFJ1c3QNCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29t cGlsZS1leHByLmggYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1leHByLmgNCj4+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uNGMxZjk1YWRl MjkNCj4+IC0tLSAvZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1j b21waWxlLWV4cHIuaA0KPj4gQEAgLTAsMCArMSwxNDggQEANCj4+ICsvLyBDb3B5cmlnaHQg KEMpIDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQg dW5kZXINCj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+ PiArLy8gdmVyc2lvbi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8g V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO VEFCSUxJVFkgb3INCj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBk ZXRhaWxzLg0KPj4gKw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBH Q0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDov L3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+PiArDQo+PiArI2lmbmRlZiBSVVNUX0NPTVBJ TEVfRVhQUg0KPj4gKyNkZWZpbmUgUlVTVF9DT01QSUxFX0VYUFINCj4+ICsNCj4+ICsjaW5j bHVkZSAicnVzdC1jb21waWxlLWJhc2UuaCINCj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7 DQo+PiArbmFtZXNwYWNlIENvbXBpbGUgew0KPj4gKw0KPj4gK2NsYXNzIENvbXBpbGVFeHBy IDogcHJpdmF0ZSBISVJDb21waWxlQmFzZSwgcHJvdGVjdGVkIEhJUjo6SElSRXhwcmVzc2lv blZpc2l0b3INCj4+ICt7DQo+PiArcHVibGljOg0KPj4gKyAgc3RhdGljIHRyZWUgQ29tcGls ZSAoSElSOjpFeHByICpleHByLCBDb250ZXh0ICpjdHgpOw0KPj4gKw0KPj4gKyAgdm9pZCB2 aXNpdCAoSElSOjpUdXBsZUluZGV4RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChISVI6OlR1cGxlRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZp c2l0IChISVI6OlJldHVybkV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoSElSOjpDYWxsRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChI SVI6Ok1ldGhvZENhbGxFeHByICZleHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6TGl0ZXJhbEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpBc3NpZ25tZW50RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0 IChISVI6OkNvbXBvdW5kQXNzaWdubWVudEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpBcnJheUluZGV4RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OkFycmF5RXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2 b2lkIHZpc2l0IChISVI6OkFyaXRobWV0aWNPckxvZ2ljYWxFeHByICZleHByKSBvdmVycmlk ZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6Q29tcGFyaXNvbkV4cHIgJmV4cHIpIG92ZXJy aWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpMYXp5Qm9vbGVhbkV4cHIgJmV4cHIpIG92 ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpOZWdhdGlvbkV4cHIgJmV4cHIpIG92 ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpUeXBlQ2FzdEV4cHIgJmV4cHIpIG92 ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpJZkV4cHIgJmV4cHIpIG92ZXJyaWRl Ow0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpJZkV4cHJDb25zZXFJZiAmZXhwcikgb3ZlcnJp ZGU7DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklmRXhwckNvbnNlcUVsc2UgJmV4cHIpIG92 ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpCbG9ja0V4cHIgJmV4cHIpIG92ZXJy aWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpVbnNhZmVCbG9ja0V4cHIgJmV4cHIpIG92 ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpTdHJ1Y3RFeHByU3RydWN0ICZzdHJ1 Y3RfZXhwcikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlN0cnVjdEV4cHJT dHJ1Y3RGaWVsZHMgJnN0cnVjdF9leHByKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6R3JvdXBlZEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpGaWVsZEFjY2Vzc0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoSElSOjpRdWFsaWZpZWRQYXRoSW5FeHByZXNzaW9uICZleHByKSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6UGF0aEluRXhwcmVzc2lvbiAmZXhwcikgb3ZlcnJpZGU7 DQo+PiArICB2b2lkIHZpc2l0IChISVI6Okxvb3BFeHByICZleHByKSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6V2hpbGVMb29wRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+ PiArICB2b2lkIHZpc2l0IChISVI6OkJyZWFrRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OkNvbnRpbnVlRXhwciAmZXhwcikgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OkJvcnJvd0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpEZXJlZmVyZW5jZUV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4g KyAgdm9pZCB2aXNpdCAoSElSOjpNYXRjaEV4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpSYW5nZUZyb21Ub0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4g KyAgdm9pZCB2aXNpdCAoSElSOjpSYW5nZUZyb21FeHByICZleHByKSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFuZ2VUb0V4cHIgJmV4cHIpIG92ZXJyaWRlOw0KPj4g KyAgdm9pZCB2aXNpdCAoSElSOjpSYW5nZUZ1bGxFeHByICZleHByKSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFuZ2VGcm9tVG9JbmNsRXhwciAmZXhwcikgb3ZlcnJp ZGU7DQo+PiArDQo+PiArICAvLyBFbXB0eSB2aXNpdCBmb3IgdW51c2VkIEV4cHJlc3Npb24g SElSIG5vZGVzLg0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpDbG9zdXJlRXhwcklubmVyICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkNsb3N1cmVFeHBySW5uZXJU eXBlZCAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpTdHJ1Y3RFeHBy RmllbGRJZGVudGlmaWVyICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6 OlN0cnVjdEV4cHJGaWVsZElkZW50aWZpZXJWYWx1ZSAmKSBvdmVycmlkZSB7fQ0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpTdHJ1Y3RFeHByRmllbGRJbmRleFZhbHVlICYpIG92ZXJyaWRl IHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkVycm9yUHJvcGFnYXRpb25FeHByICYpIG92 ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlJhbmdlVG9JbmNsRXhwciAmKSBv dmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpXaGlsZUxldExvb3BFeHByICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkZvckxvb3BFeHByICYpIG92 ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklmRXhwckNvbnNlcUlmTGV0ICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklmTGV0RXhwciAmKSBvdmVy cmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpJZkxldEV4cHJDb25zZXFFbHNlICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklmTGV0RXhwckNvbnNlcUlm ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklmTGV0RXhwckNvbnNl cUlmTGV0ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkF3YWl0RXhw ciAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpBc3luY0Jsb2NrRXhw ciAmKSBvdmVycmlkZSB7fQ0KPj4gKw0KPj4gK3Byb3RlY3RlZDoNCj4+ICsgIHRyZWUgZ2V0 X2ZuX2FkZHJfZnJvbV9keW4gKGNvbnN0IFR5VHk6OkR5bmFtaWNPYmplY3RUeXBlICpkeW4s DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5VHk6OkJhc2VUeXBlICpyZWNl aXZlciwgVHlUeTo6Rm5UeXBlICpmbnR5cGUsDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHRyZWUgcmVjZWl2ZXJfcmVmLCBMb2NhdGlvbiBleHByX2xvY3VzKTsNCj4+ICsN Cj4+ICsgIHRyZWUgZ2V0X3JlY2VpdmVyX2Zyb21fZHluIChjb25zdCBUeVR5OjpEeW5hbWlj T2JqZWN0VHlwZSAqZHluLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlU eTo6QmFzZVR5cGUgKnJlY2VpdmVyLCBUeVR5OjpGblR5cGUgKmZudHlwZSwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUgcmVjZWl2ZXJfcmVmLCBMb2NhdGlvbiBl eHByX2xvY3VzKTsNCj4+ICsNCj4+ICsgIHRyZWUgcmVzb2x2ZV9tZXRob2RfYWRkcmVzcyAo VHlUeTo6Rm5UeXBlICpmbnR5cGUsIEhpcklkIHJlZiwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBUeVR5OjpCYXNlVHlwZSAqcmVjZWl2ZXIsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgSElSOjpQYXRoSWRlbnRTZWdtZW50ICZzZWdtZW50LA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWx5c2lzOjpOb2RlTWFwcGlu ZyBleHByX21hcHBpbmdzLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExv Y2F0aW9uIGV4cHJfbG9jdXMpOw0KPj4gKw0KPj4gKyAgdHJlZQ0KPj4gKyAgcmVzb2x2ZV9v cGVyYXRvcl9vdmVybG9hZCAoQW5hbHlzaXM6OlJ1c3RMYW5nSXRlbTo6SXRlbVR5cGUgbGFu Z19pdGVtX3R5cGUsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJUjo6T3Bl cmF0b3JFeHByTWV0YSBleHByLCB0cmVlIGxocywgdHJlZSByaHMsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEhJUjo6RXhwciAqbGhzX2V4cHIsIEhJUjo6RXhwciAqcmhz X2V4cHIpOw0KPj4gKw0KPj4gKyAgdHJlZSBjb21waWxlX2Jvb2xfbGl0ZXJhbCAoY29uc3Qg SElSOjpMaXRlcmFsRXhwciAmZXhwciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgVHlUeTo6QmFzZVR5cGUgKnR5dHkpOw0KPj4gKw0KPj4gKyAgdHJlZSBjb21w aWxlX2ludGVnZXJfbGl0ZXJhbCAoY29uc3QgSElSOjpMaXRlcmFsRXhwciAmZXhwciwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlUeTo6QmFzZVR5cGUg KnR5dHkpOw0KPj4gKw0KPj4gKyAgdHJlZSBjb21waWxlX2Zsb2F0X2xpdGVyYWwgKGNvbnN0 IEhJUjo6TGl0ZXJhbEV4cHIgJmV4cHIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBUeVR5OjpCYXNlVHlwZSAqdHl0eSk7DQo+PiArDQo+PiArICB0cmVlIGNv bXBpbGVfY2hhcl9saXRlcmFsIChjb25zdCBISVI6OkxpdGVyYWxFeHByICZleHByLA0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUeVR5OjpCYXNlVHlwZSAqdHl0 eSk7DQo+PiArDQo+PiArICB0cmVlIGNvbXBpbGVfYnl0ZV9saXRlcmFsIChjb25zdCBISVI6 OkxpdGVyYWxFeHByICZleHByLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCBUeVR5OjpCYXNlVHlwZSAqdHl0eSk7DQo+PiArDQo+PiArICB0cmVlIGNvbXBpbGVf c3RyaW5nX2xpdGVyYWwgKGNvbnN0IEhJUjo6TGl0ZXJhbEV4cHIgJmV4cHIsDQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlUeTo6QmFzZVR5cGUgKnR5dHkp Ow0KPj4gKw0KPj4gKyAgdHJlZSBjb21waWxlX2J5dGVfc3RyaW5nX2xpdGVyYWwgKGNvbnN0 IEhJUjo6TGl0ZXJhbEV4cHIgJmV4cHIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCBUeVR5OjpCYXNlVHlwZSAqdHl0eSk7DQo+PiArDQo+PiArICB0 cmVlIHR5cGVfY2FzdF9leHByZXNzaW9uICh0cmVlIHR5cGVfdG9fY2FzdF90bywgdHJlZSBl eHByLCBMb2NhdGlvbiBsb2N1cyk7DQo+PiArDQo+PiArICB0cmVlIGFycmF5X3ZhbHVlX2V4 cHIgKExvY2F0aW9uIGV4cHJfbG9jdXMsIGNvbnN0IFR5VHk6OkFycmF5VHlwZSAmYXJyYXlf dHl0eSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICB0cmVlIGFycmF5X3R5cGUsIEhJ Ujo6QXJyYXlFbGVtc1ZhbHVlcyAmZWxlbXMpOw0KPj4gKw0KPj4gKyAgdHJlZSBhcnJheV9j b3BpZWRfZXhwciAoTG9jYXRpb24gZXhwcl9sb2N1cywNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgVHlUeTo6QXJyYXlUeXBlICZhcnJheV90eXR5LCB0cmVlIGFycmF5 X3R5cGUsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIEhJUjo6QXJyYXlFbGVtc0Nv cGllZCAmZWxlbXMpOw0KPj4gKw0KPj4gK3ByaXZhdGU6DQo+PiArICBDb21waWxlRXhwciAo Q29udGV4dCAqY3R4KTsNCj4+ICsNCj4+ICsgIHRyZWUgdHJhbnNsYXRlZDsNCj4+ICt9Ow0K Pj4gKw0KPj4gK30gLy8gbmFtZXNwYWNlIENvbXBpbGUNCj4+ICt9IC8vIG5hbWVzcGFjZSBS dXN0DQo+PiArDQo+PiArI2VuZGlmIC8vIFJVU1RfQ09NUElMRV9FWFBSDQo+PiBkaWZmIC0t Z2l0IGEvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtZXh0ZXJuLmggYi9nY2MvcnVz dC9iYWNrZW5kL3J1c3QtY29tcGlsZS1leHRlcm4uaA0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi40NWE1MDdlMDNiZQ0KPj4gLS0tIC9kZXYvbnVs bA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtZXh0ZXJuLmgNCj4+ IEBAIC0wLDAgKzEsMTcyIEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhpcyBmaWxlIGlz IHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiArLy8gdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZlcnNpb24uDQo+ PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+PiAr Ly8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ICsNCj4+ ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUg Q09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNl bnNlcy8+Lg0KPj4gKw0KPj4gKyNpZm5kZWYgUlVTVF9DT01QSUxFX0VYVEVSTl9JVEVNDQo+ PiArI2RlZmluZSBSVVNUX0NPTVBJTEVfRVhURVJOX0lURU0NCj4+ICsNCj4+ICsjaW5jbHVk ZSAicnVzdC1jb21waWxlLWJhc2UuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWlu dHJpbnNpYy5oIg0KPj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2Ug Q29tcGlsZSB7DQo+PiArDQo+PiArY2xhc3MgQ29tcGlsZUV4dGVybkl0ZW0gOiBwdWJsaWMg SElSQ29tcGlsZUJhc2UsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBI SVI6OkhJUkV4dGVybmFsSXRlbVZpc2l0b3INCj4+ICt7DQo+PiArcHVibGljOg0KPj4gKyAg c3RhdGljIHRyZWUgY29tcGlsZSAoSElSOjpFeHRlcm5hbEl0ZW0gKml0ZW0sIENvbnRleHQg KmN0eCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgVHlUeTo6QmFzZVR5cGUgKmNvbmNy ZXRlID0gbnVsbHB0ciwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19xdWVy eV9tb2RlID0gZmFsc2UsDQo+PiArICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uIHJl Zl9sb2N1cyA9IExvY2F0aW9uICgpKQ0KPj4gKyAgew0KPj4gKyAgICBDb21waWxlRXh0ZXJu SXRlbSBjb21waWxlciAoY3R4LCBjb25jcmV0ZSwgcmVmX2xvY3VzKTsNCj4+ICsgICAgaXRl bS0+YWNjZXB0X3ZpcyAoY29tcGlsZXIpOw0KPj4gKw0KPj4gKyAgICBpZiAoaXNfcXVlcnlf bW9kZSAmJiBjb21waWxlci5yZWZlcmVuY2UgPT0gZXJyb3JfbWFya19ub2RlKQ0KPj4gKyAg ICAgIHJ1c3RfaW50ZXJuYWxfZXJyb3JfYXQgKHJlZl9sb2N1cywgImZhaWxlZCB0byBjb21w aWxlIGV4dGVybiBpdGVtOiAlcyIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpdGVtLT5hc19zdHJpbmcgKCkuY19zdHIgKCkpOw0KPj4gKw0KPj4gKyAgICByZXR1cm4g Y29tcGlsZXIucmVmZXJlbmNlOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpFeHRlcm5hbFN0YXRpY0l0ZW0gJml0ZW0pIG92ZXJyaWRlDQo+PiArICB7DQo+PiAr ICAgIC8vIGNoZWNrIGlmIGl0cyBhbHJlYWR5IGJlZW4gY29tcGlsZWQNCj4+ICsgICAgQnZh cmlhYmxlICpsb29rdXAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5lcnJvcl92YXJpYWJsZSAo KTsNCj4+ICsgICAgaWYgKGN0eC0+bG9va3VwX3Zhcl9kZWNsIChpdGVtLmdldF9tYXBwaW5n cyAoKS5nZXRfaGlyaWQgKCksICZsb29rdXApKQ0KPj4gKyAgICAgIHsNCj4+ICsgICAgICAg cmVmZXJlbmNlID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+dmFyX2V4cHJlc3Npb24gKGxvb2t1 cCwgcmVmX2xvY3VzKTsNCj4+ICsgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgIH0NCj4+ICsN Cj4+ICsgICAgVHlUeTo6QmFzZVR5cGUgKnJlc29sdmVkX3R5cGUgPSBudWxscHRyOw0KPj4g KyAgICBib29sIG9rID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlIChpdGVtLmdl dF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVkX3R5cGUpOw0KPj4gKyAgICBydXN0 X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gaXRlbS5n ZXRfaXRlbV9uYW1lICgpOw0KPj4gKyAgICAvLyBGSVhNRSB0aGlzIGlzIGFzc3VtaW5nIEMg QUJJDQo+PiArICAgIHN0ZDo6c3RyaW5nIGFzbV9uYW1lID0gbmFtZTsNCj4+ICsNCj4+ICsg ICAgdHJlZSB0eXBlID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIHJlc29s dmVkX3R5cGUpOw0KPj4gKyAgICBib29sIGlzX2V4dGVybmFsID0gdHJ1ZTsNCj4+ICsgICAg Ym9vbCBpc19oaWRkZW4gPSBmYWxzZTsNCj4+ICsgICAgYm9vbCBpbl91bmlxdWVfc2VjdGlv biA9IGZhbHNlOw0KPj4gKw0KPj4gKyAgICBCdmFyaWFibGUgKnN0YXRpY19nbG9iYWwNCj4+ ICsgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmdsb2JhbF92YXJpYWJsZSAobmFtZSwg YXNtX25hbWUsIHR5cGUsIGlzX2V4dGVybmFsLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2hpZGRlbiwgaW5fdW5pcXVlX3NlY3Rpb24s DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRl bS5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICBjdHgtPmluc2VydF92YXJfZGVjbCAoaXRlbS5n ZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLCBzdGF0aWNfZ2xvYmFsKTsNCj4+ICsgICAg Y3R4LT5wdXNoX3ZhciAoc3RhdGljX2dsb2JhbCk7DQo+PiArDQo+PiArICAgIHJlZmVyZW5j ZSA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnZhcl9leHByZXNzaW9uIChzdGF0aWNfZ2xvYmFs LCByZWZfbG9jdXMpOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpF eHRlcm5hbEZ1bmN0aW9uSXRlbSAmZnVuY3Rpb24pIG92ZXJyaWRlDQo+PiArICB7DQo+PiAr ICAgIFR5VHk6OkJhc2VUeXBlICpmbnR5cGVfdHl0eTsNCj4+ICsgICAgaWYgKCFjdHgtPmdl dF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKGZ1bmN0aW9uLmdldF9tYXBwaW5ncyAoKS5nZXRf aGlyaWQgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZmbnR5cGVfdHl0eSkpDQo+PiArICAgICAgew0KPj4gKyAgICAgICBydXN0X2ZhdGFsX2Vy cm9yIChmdW5jdGlvbi5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICJmYWlsZWQgdG8gbG9va3VwIGZ1bmN0aW9uIHR5cGUiKTsNCj4+ICsgICAgICAgcmV0 dXJuOw0KPj4gKyAgICAgIH0NCj4+ICsNCj4+ICsgICAgcnVzdF9hc3NlcnQgKGZudHlwZV90 eXR5LT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6Rk5ERUYpOw0KPj4gKyAgICBU eVR5OjpGblR5cGUgKmZudHlwZSA9IHN0YXRpY19jYXN0PFR5VHk6OkZuVHlwZSAqPiAoZm50 eXBlX3R5dHkpOw0KPj4gKyAgICBpZiAoZm50eXBlLT5oYXNfc3Vic2l0aXRpb25zX2RlZmlu ZWQgKCkpDQo+PiArICAgICAgew0KPj4gKyAgICAgICAvLyB3ZSBjYW50IGRvIGFueXRoaW5n IGZvciB0aGlzIG9ubHkgd2hlbiBpdCBpcyB1c2VkIGFuZCBhIGNvbmNyZXRlIHR5cGUNCj4+ ICsgICAgICAgLy8gaXMgZ2l2ZW4NCj4+ICsgICAgICAgaWYgKGNvbmNyZXRlID09IG51bGxw dHIpDQo+PiArICAgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgICBlbHNlDQo+PiArICAgICAg ICAgew0KPj4gKyAgICAgICAgICAgcnVzdF9hc3NlcnQgKGNvbmNyZXRlLT5nZXRfa2luZCAo KSA9PSBUeVR5OjpUeXBlS2luZDo6Rk5ERUYpOw0KPj4gKyAgICAgICAgICAgZm50eXBlID0g c3RhdGljX2Nhc3Q8VHlUeTo6Rm5UeXBlICo+IChjb25jcmV0ZSk7DQo+PiArICAgICAgICAg fQ0KPj4gKyAgICAgIH0NCj4+ICsNCj4+ICsgICAgLy8gaXRlbXMgY2FuIGJlIGZvcndhcmQg Y29tcGlsZWQgd2hpY2ggbWVhbnMgd2UgbWF5IG5vdCBuZWVkIHRvIGludm9rZSB0aGlzDQo+ PiArICAgIC8vIGNvZGUuIFdlIG1pZ2h0IGFsc28gaGF2ZSBhbHJlYWR5IGNvbXBpbGVkIHRo aXMgZ2VuZXJpYyBmdW5jdGlvbiBhcyB3ZWxsLg0KPj4gKyAgICB0cmVlIGxvb2t1cCA9IE5V TExfVFJFRTsNCj4+ICsgICAgaWYgKGN0eC0+bG9va3VwX2Z1bmN0aW9uX2RlY2wgKGZudHlw ZS0+Z2V0X3R5X3JlZiAoKSwgJmxvb2t1cCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZm50eXBlLT5nZXRfaWQgKCksIGZudHlwZSkpDQo+PiArICAgICAgew0K Pj4gKyAgICAgICByZWZlcmVuY2UgPSBhZGRyZXNzX2V4cHJlc3Npb24gKGxvb2t1cCwgcmVm X2xvY3VzKTsNCj4+ICsgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgIH0NCj4+ICsNCj4+ICsg ICAgaWYgKGZudHlwZS0+aGFzX3N1YnNpdGl0aW9uc19kZWZpbmVkICgpKQ0KPj4gKyAgICAg IHsNCj4+ICsgICAgICAgLy8gb3ZlcnJpZGUgdGhlIEhpciBMb29rdXBzIGZvciB0aGUgc3Vi c3RpdHVpb25zIGluIHRoaXMgY29udGV4dA0KPj4gKyAgICAgICBmbnR5cGUtPm92ZXJyaWRl X2NvbnRleHQgKCk7DQo+PiArICAgICAgfQ0KPj4gKw0KPj4gKyAgICBpZiAoZm50eXBlLT5n ZXRfYWJpICgpID09IEFCSTo6SU5UUklOU0lDKQ0KPj4gKyAgICAgIHsNCj4+ICsgICAgICAg SW50cmluc2ljcyBjb21waWxlIChjdHgpOw0KPj4gKyAgICAgICB0cmVlIGZuZGVjbCA9IGNv bXBpbGUuY29tcGlsZSAoZm50eXBlKTsNCj4+ICsgICAgICAgY3R4LT5pbnNlcnRfZnVuY3Rp b25fZGVjbCAoZm50eXBlLCBmbmRlY2wpOw0KPj4gKyAgICAgICByZXR1cm47DQo+PiArICAg ICAgfQ0KPj4gKw0KPj4gKyAgICB0cmVlIGNvbXBpbGVkX2ZuX3R5cGUgPSBUeVR5UmVzb2x2 ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgZm50eXBlKTsNCj4+ICsgICAgc3RkOjpzdHJpbmcg aXJfc3ltYm9sX25hbWUgPSBmdW5jdGlvbi5nZXRfaXRlbV9uYW1lICgpOw0KPj4gKyAgICBz dGQ6OnN0cmluZyBhc21fbmFtZSA9IGZ1bmN0aW9uLmdldF9pdGVtX25hbWUgKCk7DQo+PiAr ICAgIGlmIChmbnR5cGUtPmdldF9hYmkgKCkgPT0gQUJJOjpSVVNUKQ0KPj4gKyAgICAgIHsN Cj4+ICsgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGdldCB0aGUgY2Fub25pY2FsIHBhdGgg b2YgaXQgYW5kIG1hbmdsZSBpdA0KPj4gKyAgICAgICBjb25zdCBSZXNvbHZlcjo6Q2Fub25p Y2FsUGF0aCAqY2Fub25pY2FsX3BhdGggPSBudWxscHRyOw0KPj4gKyAgICAgICBib29sIG9r ID0gY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9jYW5vbmljYWxfcGF0aCAoDQo+PiAr ICAgICAgICAgZnVuY3Rpb24uZ2V0X21hcHBpbmdzICgpLmdldF9ub2RlaWQgKCksICZjYW5v bmljYWxfcGF0aCk7DQo+PiArICAgICAgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiAr ICAgICAgIGlyX3N5bWJvbF9uYW1lID0gY2Fub25pY2FsX3BhdGgtPmdldCAoKSArIGZudHlw ZS0+c3Vic3RfYXNfc3RyaW5nICgpOw0KPj4gKyAgICAgICBhc21fbmFtZSA9IGN0eC0+bWFu Z2xlX2l0ZW0gKGZudHlwZSwgKmNhbm9uaWNhbF9wYXRoKTsNCj4+ICsgICAgICB9DQo+PiAr DQo+PiArICAgIGNvbnN0IHVuc2lnbmVkIGludCBmbGFncyA9IEJhY2tlbmQ6OmZ1bmN0aW9u X2lzX2RlY2xhcmF0aW9uOw0KPj4gKyAgICB0cmVlIGZuZGVjbA0KPj4gKyAgICAgID0gY3R4 LT5nZXRfYmFja2VuZCAoKS0+ZnVuY3Rpb24gKGNvbXBpbGVkX2ZuX3R5cGUsIGlyX3N5bWJv bF9uYW1lLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNt X25hbWUsIGZsYWdzLCBmdW5jdGlvbi5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICBUUkVFX1BV QkxJQyAoZm5kZWNsKSA9IDE7DQo+PiArICAgIHNldHVwX2FiaV9vcHRpb25zIChmbmRlY2ws IGZudHlwZS0+Z2V0X2FiaSAoKSk7DQo+PiArDQo+PiArICAgIGN0eC0+aW5zZXJ0X2Z1bmN0 aW9uX2RlY2wgKGZudHlwZSwgZm5kZWNsKTsNCj4+ICsNCj4+ICsgICAgcmVmZXJlbmNlID0g YWRkcmVzc19leHByZXNzaW9uIChmbmRlY2wsIHJlZl9sb2N1cyk7DQo+PiArICB9DQo+PiAr DQo+PiArcHJpdmF0ZToNCj4+ICsgIENvbXBpbGVFeHRlcm5JdGVtIChDb250ZXh0ICpjdHgs IFR5VHk6OkJhc2VUeXBlICpjb25jcmV0ZSwgTG9jYXRpb24gcmVmX2xvY3VzKQ0KPj4gKyAg ICA6IEhJUkNvbXBpbGVCYXNlIChjdHgpLCBjb25jcmV0ZSAoY29uY3JldGUpLCByZWZlcmVu Y2UgKGVycm9yX21hcmtfbm9kZSksDQo+PiArICAgICAgcmVmX2xvY3VzIChyZWZfbG9jdXMp DQo+PiArICB7fQ0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKmNvbmNyZXRlOw0KPj4g KyAgdHJlZSByZWZlcmVuY2U7DQo+PiArICBMb2NhdGlvbiByZWZfbG9jdXM7DQo+PiArfTsN Cj4+ICsNCj4+ICt9IC8vIG5hbWVzcGFjZSBDb21waWxlDQo+PiArfSAvLyBuYW1lc3BhY2Ug UnVzdA0KPj4gKw0KPj4gKyNlbmRpZiAvLyBSVVNUX0NPTVBJTEVfRVhURVJOX0lURU0NCj4+ IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1mbnBhcmFtLmNj IGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtZm5wYXJhbS5jYw0KPj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi4zZjBlYzgyYjYyNQ0KPj4g LS0tIC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUt Zm5wYXJhbS5jYw0KPj4gQEAgLTAsMCArMSwxMjEgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMp IDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsv LyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5k ZXINCj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247 IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiAr Ly8gdmVyc2lvbi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFC SUxJVFkgb3INCj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRh aWxzLg0KPj4gKw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7 IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+PiArDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGls ZS1mbnBhcmFtLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1wYXR0ZXJuLmgiDQo+ PiArDQo+PiArI2luY2x1ZGUgImdpbXBsZS1leHByLmgiDQo+PiArDQo+PiArbmFtZXNwYWNl IFJ1c3Qgew0KPj4gK25hbWVzcGFjZSBDb21waWxlIHsNCj4+ICsNCj4+ICtDb21waWxlRm5Q YXJhbTo6Q29tcGlsZUZuUGFyYW0gKENvbnRleHQgKmN0eCwgdHJlZSBmbmRlY2wsIHRyZWUg ZGVjbF90eXBlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlv biBsb2N1cykNCj4+ICsgIDogSElSQ29tcGlsZUJhc2UgKGN0eCksIGZuZGVjbCAoZm5kZWNs KSwgZGVjbF90eXBlIChkZWNsX3R5cGUpLCBsb2N1cyAobG9jdXMpLA0KPj4gKyAgICBjb21w aWxlZF9wYXJhbSAoY3R4LT5nZXRfYmFja2VuZCAoKS0+ZXJyb3JfdmFyaWFibGUgKCkpDQo+ PiAre30NCj4+ICsNCj4+ICtCdmFyaWFibGUgKg0KPj4gK0NvbXBpbGVGblBhcmFtOjpjb21w aWxlIChDb250ZXh0ICpjdHgsIHRyZWUgZm5kZWNsLCBISVI6OkZ1bmN0aW9uUGFyYW0gKnBh cmFtLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUgZGVjbF90eXBlLCBMb2Nh dGlvbiBsb2N1cykNCj4+ICt7DQo+PiArICBDb21waWxlRm5QYXJhbSBjb21waWxlciAoY3R4 LCBmbmRlY2wsIGRlY2xfdHlwZSwgbG9jdXMpOw0KPj4gKyAgcGFyYW0tPmdldF9wYXJhbV9u YW1lICgpLT5hY2NlcHRfdmlzIChjb21waWxlcik7DQo+PiArICByZXR1cm4gY29tcGlsZXIu Y29tcGlsZWRfcGFyYW07DQo+PiArfQ0KPj4gKw0KPj4gK0J2YXJpYWJsZSAqDQo+PiArQ29t cGlsZUZuUGFyYW06OmNvbXBpbGUgKENvbnRleHQgKmN0eCwgdHJlZSBmbmRlY2wsIEhJUjo6 UGF0dGVybiAqcGFyYW0sDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSBkZWNs X3R5cGUsIExvY2F0aW9uIGxvY3VzKQ0KPj4gK3sNCj4+ICsgIENvbXBpbGVGblBhcmFtIGNv bXBpbGVyIChjdHgsIGZuZGVjbCwgZGVjbF90eXBlLCBsb2N1cyk7DQo+PiArICBwYXJhbS0+ YWNjZXB0X3ZpcyAoY29tcGlsZXIpOw0KPj4gKyAgcmV0dXJuIGNvbXBpbGVyLmNvbXBpbGVk X3BhcmFtOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUZuUGFyYW06OnZp c2l0IChISVI6OklkZW50aWZpZXJQYXR0ZXJuICZwYXR0ZXJuKQ0KPj4gK3sNCj4+ICsgIGlm ICghcGF0dGVybi5pc19tdXQgKCkpDQo+PiArICAgIGRlY2xfdHlwZSA9IGN0eC0+Z2V0X2Jh Y2tlbmQgKCktPmltbXV0YWJsZV90eXBlIChkZWNsX3R5cGUpOw0KPj4gKw0KPj4gKyAgY29t cGlsZWRfcGFyYW0NCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5wYXJhbWV0ZXJf dmFyaWFibGUgKGZuZGVjbCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGF0dGVybi5nZXRfaWRlbnRpZmllciAoKSwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbF90eXBlLCBsb2N1 cyk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRm5QYXJhbTo6dmlzaXQg KEhJUjo6V2lsZGNhcmRQYXR0ZXJuICZwYXR0ZXJuKQ0KPj4gK3sNCj4+ICsgIGRlY2xfdHlw ZSA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmltbXV0YWJsZV90eXBlIChkZWNsX3R5cGUpOw0K Pj4gKw0KPj4gKyAgY29tcGlsZWRfcGFyYW0NCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5k ICgpLT5wYXJhbWV0ZXJfdmFyaWFibGUgKGZuZGVjbCwgIl8iLCBkZWNsX3R5cGUsIGxvY3Vz KTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVGblBhcmFtOjp2aXNpdCAo SElSOjpTdHJ1Y3RQYXR0ZXJuICZwYXR0ZXJuKQ0KPj4gK3sNCj4+ICsgIC8vIGdlbmVyYXRl IHRoZSBhbm9uIHBhcmFtDQo+PiArICB0cmVlIHRtcF9pZGVudCA9IGNyZWF0ZV90bXBfdmFy X25hbWUgKCJSU1RQUk0iKTsNCj4+ICsgIHN0ZDo6c3RyaW5nIGNwcF9zdHJfaWRlbnRpZmll ciA9IHN0ZDo6c3RyaW5nIChJREVOVElGSUVSX1BPSU5URVIgKHRtcF9pZGVudCkpOw0KPj4g Kw0KPj4gKyAgZGVjbF90eXBlID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+aW1tdXRhYmxlX3R5 cGUgKGRlY2xfdHlwZSk7DQo+PiArICBjb21waWxlZF9wYXJhbQ0KPj4gKyAgICA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPnBhcmFtZXRlcl92YXJpYWJsZSAoZm5kZWNsLCBjcHBfc3RyX2lk ZW50aWZpZXIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGRlY2xfdHlwZSwgbG9jdXMpOw0KPj4gKw0KPj4gKyAgLy8gc2V0dXAgdGhlIHBh dHRlcm4gYmluZGluZ3MNCj4+ICsgIHRyZWUgYW5vbl9wYXJhbSA9IGN0eC0+Z2V0X2JhY2tl bmQgKCktPnZhcl9leHByZXNzaW9uIChjb21waWxlZF9wYXJhbSwgbG9jdXMpOw0KPj4gKyAg Q29tcGlsZVBhdHRlcm5CaW5kaW5nczo6Q29tcGlsZSAoJnBhdHRlcm4sIGFub25fcGFyYW0s IGN0eCk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlRm5QYXJhbTo6dmlz aXQgKEhJUjo6VHVwbGVTdHJ1Y3RQYXR0ZXJuICZwYXR0ZXJuKQ0KPj4gK3sNCj4+ICsgIC8v IGdlbmVyYXRlIHRoZSBhbm9uIHBhcmFtDQo+PiArICB0cmVlIHRtcF9pZGVudCA9IGNyZWF0 ZV90bXBfdmFyX25hbWUgKCJSU1RQUk0iKTsNCj4+ICsgIHN0ZDo6c3RyaW5nIGNwcF9zdHJf aWRlbnRpZmllciA9IHN0ZDo6c3RyaW5nIChJREVOVElGSUVSX1BPSU5URVIgKHRtcF9pZGVu dCkpOw0KPj4gKw0KPj4gKyAgZGVjbF90eXBlID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+aW1t dXRhYmxlX3R5cGUgKGRlY2xfdHlwZSk7DQo+PiArICBjb21waWxlZF9wYXJhbQ0KPj4gKyAg ICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnBhcmFtZXRlcl92YXJpYWJsZSAoZm5kZWNsLCBj cHBfc3RyX2lkZW50aWZpZXIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRlY2xfdHlwZSwgbG9jdXMpOw0KPj4gKw0KPj4gKyAgLy8gc2V0 dXAgdGhlIHBhdHRlcm4gYmluZGluZ3MNCj4+ICsgIHRyZWUgYW5vbl9wYXJhbSA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPnZhcl9leHByZXNzaW9uIChjb21waWxlZF9wYXJhbSwgbG9jdXMp Ow0KPj4gKyAgQ29tcGlsZVBhdHRlcm5CaW5kaW5nczo6Q29tcGlsZSAoJnBhdHRlcm4sIGFu b25fcGFyYW0sIGN0eCk7DQo+PiArfQ0KPj4gKw0KPj4gK0J2YXJpYWJsZSAqDQo+PiArQ29t cGlsZVNlbGZQYXJhbTo6Y29tcGlsZSAoQ29udGV4dCAqY3R4LCB0cmVlIGZuZGVjbCwgSElS OjpTZWxmUGFyYW0gJnNlbGYsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVl IGRlY2xfdHlwZSwgTG9jYXRpb24gbG9jdXMpDQo+PiArew0KPj4gKyAgYm9vbCBpc19pbW11 dGFibGUNCj4+ICsgICAgPSBzZWxmLmdldF9zZWxmX2tpbmQgKCkgPT0gSElSOjpTZWxmUGFy YW06OkltcGxpY2l0U2VsZktpbmQ6OklNTQ0KPj4gKyAgICAgIHx8IHNlbGYuZ2V0X3NlbGZf a2luZCAoKSA9PSBISVI6OlNlbGZQYXJhbTo6SW1wbGljaXRTZWxmS2luZDo6SU1NX1JFRjsN Cj4+ICsgIGlmIChpc19pbW11dGFibGUpDQo+PiArICAgIGRlY2xfdHlwZSA9IGN0eC0+Z2V0 X2JhY2tlbmQgKCktPmltbXV0YWJsZV90eXBlIChkZWNsX3R5cGUpOw0KPj4gKw0KPj4gKyAg cmV0dXJuIGN0eC0+Z2V0X2JhY2tlbmQgKCktPnBhcmFtZXRlcl92YXJpYWJsZSAoZm5kZWNs LCAic2VsZiIsIGRlY2xfdHlwZSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbG9jdXMpOw0KPj4gK30NCj4+ICsNCj4+ICt9IC8vIG5h bWVzcGFjZSBDb21waWxlDQo+PiArfSAvLyBuYW1lc3BhY2UgUnVzdA0KPj4gZGlmZiAtLWdp dCBhL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWZucGFyYW0uaCBiL2djYy9ydXN0 L2JhY2tlbmQvcnVzdC1jb21waWxlLWZucGFyYW0uaA0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi4wZGJiZDk5ZWYwOA0KPj4gLS0tIC9kZXYvbnVs bA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtZm5wYXJhbS5oDQo+ PiBAQCAtMCwwICsxLDcwIEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhpcyBmaWxlIGlz IHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiArLy8gdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZlcnNpb24uDQo+ PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+PiAr Ly8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ICsNCj4+ ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUg Q09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNl bnNlcy8+Lg0KPj4gKw0KPj4gKyNpZm5kZWYgUlVTVF9DT01QSUxFX0ZOUEFSQU0NCj4+ICsj ZGVmaW5lIFJVU1RfQ09NUElMRV9GTlBBUkFNDQo+PiArDQo+PiArI2luY2x1ZGUgInJ1c3Qt Y29tcGlsZS1iYXNlLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4gK25hbWVz cGFjZSBDb21waWxlIHsNCj4+ICsNCj4+ICtjbGFzcyBDb21waWxlRm5QYXJhbSA6IHByaXZh dGUgSElSQ29tcGlsZUJhc2UsIHByb3RlY3RlZCBISVI6OkhJUlBhdHRlcm5WaXNpdG9yDQo+ PiArew0KPj4gK3B1YmxpYzoNCj4+ICsgIHN0YXRpYyBCdmFyaWFibGUgKmNvbXBpbGUgKENv bnRleHQgKmN0eCwgdHJlZSBmbmRlY2wsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEhJUjo6RnVuY3Rpb25QYXJhbSAqcGFyYW0sIHRyZWUgZGVjbF90eXBlLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiBsb2N1cyk7DQo+PiArICBzdGF0 aWMgQnZhcmlhYmxlICpjb21waWxlIChDb250ZXh0ICpjdHgsIHRyZWUgZm5kZWNsLCBISVI6 OlBhdHRlcm4gKnBhcmFtLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVl IGRlY2xfdHlwZSwgTG9jYXRpb24gbG9jdXMpOw0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpJZGVudGlmaWVyUGF0dGVybiAmcGF0dGVybikgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChISVI6OldpbGRjYXJkUGF0dGVybiAmcGF0dGVybikgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChISVI6OlN0cnVjdFBhdHRlcm4gJikgb3ZlcnJpZGU7DQo+PiArICB2 b2lkIHZpc2l0IChISVI6OlR1cGxlU3RydWN0UGF0dGVybiAmKSBvdmVycmlkZTsNCj4+ICsN Cj4+ICsgIC8vIEVtcHR5IHZpc2l0IGZvciB1bnVzZWQgUGF0dGVybiBISVIgbm9kZXMuDQo+ PiArICB2b2lkIHZpc2l0IChISVI6Okdyb3VwZWRQYXR0ZXJuICYpIG92ZXJyaWRlIHt9DQo+ PiArICB2b2lkIHZpc2l0IChISVI6OkxpdGVyYWxQYXR0ZXJuICYpIG92ZXJyaWRlIHt9DQo+ PiArICB2b2lkIHZpc2l0IChISVI6OlBhdGhJbkV4cHJlc3Npb24gJikgb3ZlcnJpZGUge30N Cj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UXVhbGlmaWVkUGF0aEluRXhwcmVzc2lvbiAmKSBv dmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpSYW5nZVBhdHRlcm4gJikgb3Zl cnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmVmZXJlbmNlUGF0dGVybiAmKSBv dmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpTbGljZVBhdHRlcm4gJikgb3Zl cnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6VHVwbGVQYXR0ZXJuICYpIG92ZXJy aWRlIHt9DQo+PiArDQo+PiArcHJpdmF0ZToNCj4+ICsgIENvbXBpbGVGblBhcmFtIChDb250 ZXh0ICpjdHgsIHRyZWUgZm5kZWNsLCB0cmVlIGRlY2xfdHlwZSwgTG9jYXRpb24gbG9jdXMp Ow0KPj4gKw0KPj4gKyAgdHJlZSBmbmRlY2w7DQo+PiArICB0cmVlIGRlY2xfdHlwZTsNCj4+ ICsgIExvY2F0aW9uIGxvY3VzOw0KPj4gKyAgQnZhcmlhYmxlICpjb21waWxlZF9wYXJhbTsN Cj4+ICt9Ow0KPj4gKw0KPj4gK2NsYXNzIENvbXBpbGVTZWxmUGFyYW0gOiBwcml2YXRlIEhJ UkNvbXBpbGVCYXNlDQo+PiArew0KPj4gK3B1YmxpYzoNCj4+ICsgIHN0YXRpYyBCdmFyaWFi bGUgKmNvbXBpbGUgKENvbnRleHQgKmN0eCwgdHJlZSBmbmRlY2wsIEhJUjo6U2VsZlBhcmFt ICZzZWxmLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlIGRlY2xfdHlw ZSwgTG9jYXRpb24gbG9jdXMpOw0KPj4gK307DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2Ug Q29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+ICsNCj4+ICsjZW5kaWYgLy8g UlVTVF9DT01QSUxFX0ZOUEFSQU0NCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5k L3J1c3QtY29tcGlsZS1pbXBsaXRlbS5jYyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21w aWxlLWltcGxpdGVtLmNjDQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4gaW5kZXggMDAw MDAwMDAwMDAuLmQwZjcwYTcwMjI4DQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9nY2Mv cnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1pbXBsaXRlbS5jYw0KPj4gQEAgLTAsMCArMSwx MDEgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0Mu DQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+ICsvLyB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0K Pj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiArLy8gdmVyc2lvbi4NCj4+ICsNCj4+ICsvLyBH Q0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwg YnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCj4+ICsvLyBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxzLg0KPj4gKw0KPj4gKy8vIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElm IG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+PiAr DQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1pbXBsaXRlbS5oIg0KPj4gKyNpbmNsdWRl ICJydXN0LWNvbXBpbGUtZXhwci5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtZm5w YXJhbS5oIg0KPj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2UgQ29t cGlsZSB7DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVUcmFpdEl0ZW06OnZpc2l0IChI SVI6OlRyYWl0SXRlbUNvbnN0ICZjb25zdGFudCkNCj4+ICt7DQo+PiArICBydXN0X2Fzc2Vy dCAoY29uY3JldGUgIT0gbnVsbHB0cik7DQo+PiArICBUeVR5OjpCYXNlVHlwZSAqcmVzb2x2 ZWRfdHlwZSA9IGNvbmNyZXRlOw0KPj4gKw0KPj4gKyAgY29uc3QgUmVzb2x2ZXI6OkNhbm9u aWNhbFBhdGggKmNhbm9uaWNhbF9wYXRoID0gbnVsbHB0cjsNCj4+ICsgIGJvb2wgb2sgPSBj dHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX2Nhbm9uaWNhbF9wYXRoICgNCj4+ICsgICAg Y29uc3RhbnQuZ2V0X21hcHBpbmdzICgpLmdldF9ub2RlaWQgKCksICZjYW5vbmljYWxfcGF0 aCk7DQo+PiArICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgSElSOjpFeHByICpj b25zdF92YWx1ZV9leHByID0gY29uc3RhbnQuZ2V0X2V4cHIgKCkuZ2V0ICgpOw0KPj4gKyAg dHJlZSBjb25zdF9leHByDQo+PiArICAgID0gY29tcGlsZV9jb25zdGFudF9pdGVtIChjdHgs IHJlc29sdmVkX3R5cGUsIGNhbm9uaWNhbF9wYXRoLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25zdF92YWx1ZV9leHByLCBjb25zdGFudC5nZXRfbG9jdXMgKCkpOw0K Pj4gKyAgY3R4LT5wdXNoX2NvbnN0IChjb25zdF9leHByKTsNCj4+ICsgIGN0eC0+aW5zZXJ0 X2NvbnN0X2RlY2wgKGNvbnN0YW50LmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksIGNv bnN0X2V4cHIpOw0KPj4gKw0KPj4gKyAgcmVmZXJlbmNlID0gY29uc3RfZXhwcjsNCj4+ICt9 DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVUcmFpdEl0ZW06OnZpc2l0IChISVI6OlRy YWl0SXRlbUZ1bmMgJmZ1bmMpDQo+PiArew0KPj4gKyAgcnVzdF9hc3NlcnQgKGZ1bmMuaGFz X2Jsb2NrX2RlZmluZWQgKCkpOw0KPj4gKw0KPj4gKyAgcnVzdF9hc3NlcnQgKGNvbmNyZXRl LT5nZXRfa2luZCAoKSA9PSBUeVR5OjpUeXBlS2luZDo6Rk5ERUYpOw0KPj4gKyAgVHlUeTo6 Rm5UeXBlICpmbnR5cGUgPSBzdGF0aWNfY2FzdDxUeVR5OjpGblR5cGUgKj4gKGNvbmNyZXRl KTsNCj4+ICsgIGZudHlwZS0+bW9ub21vcnBoaXplICgpOw0KPj4gKw0KPj4gKyAgLy8gaXRl bXMgY2FuIGJlIGZvcndhcmQgY29tcGlsZWQgd2hpY2ggbWVhbnMgd2UgbWF5IG5vdCBuZWVk IHRvIGludm9rZSB0aGlzDQo+PiArICAvLyBjb2RlLiBXZSBtaWdodCBhbHNvIGhhdmUgYWxy ZWFkeSBjb21waWxlZCB0aGlzIGdlbmVyaWMgZnVuY3Rpb24gYXMgd2VsbC4NCj4+ICsgIHRy ZWUgbG9va3VwID0gTlVMTF9UUkVFOw0KPj4gKyAgaWYgKGN0eC0+bG9va3VwX2Z1bmN0aW9u X2RlY2wgKGZudHlwZS0+Z2V0X3R5X3JlZiAoKSwgJmxvb2t1cCwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZudHlwZS0+Z2V0X2lkICgpLCBmbnR5cGUpKQ0KPj4g KyAgICB7DQo+PiArICAgICAgLy8gaGFzIHRoaXMgYmVlbiBhZGRlZCB0byB0aGUgbGlzdCB0 aGVuIGl0IG11c3QgYmUgZmluaXNoZWQNCj4+ICsgICAgICBpZiAoY3R4LT5mdW5jdGlvbl9j b21wbGV0ZWQgKGxvb2t1cCkpDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAgICB0cmVlIGR1 bW15ID0gTlVMTF9UUkVFOw0KPj4gKyAgICAgICAgIGlmICghY3R4LT5sb29rdXBfZnVuY3Rp b25fZGVjbCAoZm50eXBlLT5nZXRfdHlfcmVmICgpLCAmZHVtbXkpKQ0KPj4gKyAgICAgICAg ICAgew0KPj4gKyAgICAgICAgICAgICBjdHgtPmluc2VydF9mdW5jdGlvbl9kZWNsIChmbnR5 cGUsIGxvb2t1cCk7DQo+PiArICAgICAgICAgICB9DQo+PiArDQo+PiArICAgICAgICAgcmVm ZXJlbmNlID0gYWRkcmVzc19leHByZXNzaW9uIChsb29rdXAsIHJlZl9sb2N1cyk7DQo+PiAr ICAgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgICB9DQo+PiArICAgIH0NCj4+ICsNCj4+ICsg IGlmIChmbnR5cGUtPmhhc19zdWJzaXRpdGlvbnNfZGVmaW5lZCAoKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIC8vIG92ZXJyaWRlIHRoZSBIaXIgTG9va3VwcyBmb3IgdGhlIHN1YnN0aXR1 aW9ucyBpbiB0aGlzIGNvbnRleHQNCj4+ICsgICAgICBmbnR5cGUtPm92ZXJyaWRlX2NvbnRl eHQgKCk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGNvbnN0IFJlc29sdmVyOjpDYW5vbmlj YWxQYXRoICpjYW5vbmljYWxfcGF0aCA9IG51bGxwdHI7DQo+PiArICBib29sIG9rID0gY3R4 LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9jYW5vbmljYWxfcGF0aCAoDQo+PiArICAgIGZ1 bmMuZ2V0X21hcHBpbmdzICgpLmdldF9ub2RlaWQgKCksICZjYW5vbmljYWxfcGF0aCk7DQo+ PiArICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgLy8gRklYTUU6IEhvdyBkbyB3 ZSBnZXQgdGhlIHByb3BlciB2aXNpYmlsaXR5IGhlcmU/DQo+PiArICBhdXRvIHZpcyA9IEhJ Ujo6VmlzaWJpbGl0eSAoSElSOjpWaXNpYmlsaXR5OjpWaXNUeXBlOjpQVUJMSUMpOw0KPj4g KyAgSElSOjpUcmFpdEZ1bmN0aW9uRGVjbCAmZnVuY3Rpb24gPSBmdW5jLmdldF9kZWNsICgp Ow0KPj4gKyAgdHJlZSBmbmRlY2wNCj4+ICsgICAgPSBjb21waWxlX2Z1bmN0aW9uIChjdHgs IGZ1bmN0aW9uLmdldF9mdW5jdGlvbl9uYW1lICgpLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgZnVuY3Rpb24uZ2V0X3NlbGYgKCksIGZ1bmN0aW9uLmdldF9mdW5jdGlvbl9wYXJh bXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi5nZXRfcXVhbGlm aWVycyAoKSwgdmlzLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5nZXRfb3V0 ZXJfYXR0cnMgKCksIGZ1bmMuZ2V0X2xvY3VzICgpLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgZnVuYy5nZXRfYmxvY2tfZXhwciAoKS5nZXQgKCksIGNhbm9uaWNhbF9wYXRoLCBm bnR5cGUsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi5oYXNfcmV0dXJu X3R5cGUgKCkpOw0KPj4gKyAgcmVmZXJlbmNlID0gYWRkcmVzc19leHByZXNzaW9uIChmbmRl Y2wsIHJlZl9sb2N1cyk7DQo+PiArfQ0KPj4gKw0KPj4gK30gLy8gbmFtZXNwYWNlIENvbXBp bGUNCj4+ICt9IC8vIG5hbWVzcGFjZSBSdXN0DQo+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3Qv YmFja2VuZC9ydXN0LWNvbXBpbGUtaW1wbGl0ZW0uaCBiL2djYy9ydXN0L2JhY2tlbmQvcnVz dC1jb21waWxlLWltcGxpdGVtLmgNCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRl eCAwMDAwMDAwMDAwMC4uYWM5NDc4YWYxNTANCj4+IC0tLSAvZGV2L251bGwNCj4+ICsrKyBi L2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWltcGxpdGVtLmgNCj4+IEBAIC0wLDAg KzEsOTEgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBH Q0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+ICsvLyB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiArLy8gdmVyc2lvbi4NCj4+ICsNCj4+ICsv LyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg aW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCj4+ICsvLyBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxzLg0KPj4gKw0KPj4gKy8vIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4g IElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+ PiArDQo+PiArI2lmbmRlZiBSVVNUX0NPTVBJTEVfSU1QTElURU1fSA0KPj4gKyNkZWZpbmUg UlVTVF9DT01QSUxFX0lNUExJVEVNX0gNCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1jb21w aWxlLWl0ZW0uaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWV4cHIuaCINCj4+ICsj aW5jbHVkZSAicnVzdC1jb21waWxlLWZucGFyYW0uaCINCj4+ICsNCj4+ICtuYW1lc3BhY2Ug UnVzdCB7DQo+PiArbmFtZXNwYWNlIENvbXBpbGUgew0KPj4gKw0KPj4gKy8vIHRoaXMgaXMg YSBwcm94eSBmb3IgSElSOjpJbXBsSXRlbSdzIGJhY2sgdG8gdXNlIHRoZSBub3JtZWwgSElS OjpJdGVtIHBhdGgNCj4+ICtjbGFzcyBDb21waWxlSW5oZXJlbnRJbXBsSXRlbSA6IHB1Ymxp YyBDb21waWxlSXRlbQ0KPj4gK3sNCj4+ICtwdWJsaWM6DQo+PiArICBzdGF0aWMgdHJlZSBD b21waWxlIChISVI6OkltcGxJdGVtICppdGVtLCBDb250ZXh0ICpjdHgsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgIFR5VHk6OkJhc2VUeXBlICpjb25jcmV0ZSA9IG51bGxwdHIsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcXVlcnlfbW9kZSA9IGZhbHNlLA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiByZWZfbG9jdXMgPSBMb2NhdGlv biAoKSkNCj4+ICsgIHsNCj4+ICsgICAgQ29tcGlsZUluaGVyZW50SW1wbEl0ZW0gY29tcGls ZXIgKGN0eCwgY29uY3JldGUsIHJlZl9sb2N1cyk7DQo+PiArICAgIGl0ZW0tPmFjY2VwdF92 aXMgKGNvbXBpbGVyKTsNCj4+ICsNCj4+ICsgICAgaWYgKGlzX3F1ZXJ5X21vZGUgJiYgY29t cGlsZXIucmVmZXJlbmNlID09IGVycm9yX21hcmtfbm9kZSkNCj4+ICsgICAgICBydXN0X2lu dGVybmFsX2Vycm9yX2F0IChyZWZfbG9jdXMsICJmYWlsZWQgdG8gY29tcGlsZSBpbXBsIGl0 ZW06ICVzIiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPmFzX3N0 cmluZyAoKS5jX3N0ciAoKSk7DQo+PiArDQo+PiArICAgIHJldHVybiBjb21waWxlci5yZWZl cmVuY2U7DQo+PiArICB9DQo+PiArDQo+PiArcHJpdmF0ZToNCj4+ICsgIENvbXBpbGVJbmhl cmVudEltcGxJdGVtIChDb250ZXh0ICpjdHgsIFR5VHk6OkJhc2VUeXBlICpjb25jcmV0ZSwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uIHJlZl9sb2N1cykNCj4+ ICsgICAgOiBDb21waWxlSXRlbSAoY3R4LCBjb25jcmV0ZSwgcmVmX2xvY3VzKQ0KPj4gKyAg e30NCj4+ICt9Ow0KPj4gKw0KPj4gK2NsYXNzIENvbXBpbGVUcmFpdEl0ZW0gOiBwdWJsaWMg SElSQ29tcGlsZUJhc2UsIHB1YmxpYyBISVI6OkhJUlRyYWl0SXRlbVZpc2l0b3INCj4+ICt7 DQo+PiArcHVibGljOg0KPj4gKyAgc3RhdGljIHRyZWUgQ29tcGlsZSAoSElSOjpUcmFpdEl0 ZW0gKml0ZW0sIENvbnRleHQgKmN0eCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgVHlU eTo6QmFzZVR5cGUgKmNvbmNyZXRlLCBib29sIGlzX3F1ZXJ5X21vZGUgPSBmYWxzZSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gcmVmX2xvY3VzID0gTG9jYXRpb24g KCkpDQo+PiArICB7DQo+PiArICAgIENvbXBpbGVUcmFpdEl0ZW0gY29tcGlsZXIgKGN0eCwg Y29uY3JldGUsIHJlZl9sb2N1cyk7DQo+PiArICAgIGl0ZW0tPmFjY2VwdF92aXMgKGNvbXBp bGVyKTsNCj4+ICsNCj4+ICsgICAgaWYgKGlzX3F1ZXJ5X21vZGUgJiYgY29tcGlsZXIucmVm ZXJlbmNlID09IGVycm9yX21hcmtfbm9kZSkNCj4+ICsgICAgICBydXN0X2ludGVybmFsX2Vy cm9yX2F0IChyZWZfbG9jdXMsICJmYWlsZWQgdG8gY29tcGlsZSB0cmFpdCBpdGVtOiAlcyIs DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5hc19zdHJpbmcgKCku Y19zdHIgKCkpOw0KPj4gKw0KPj4gKyAgICByZXR1cm4gY29tcGlsZXIucmVmZXJlbmNlOw0K Pj4gKyAgfQ0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpUcmFpdEl0ZW1Db25zdCAm Y29uc3RhbnQpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpUcmFpdEl0ZW1G dW5jICZmdW5jKSBvdmVycmlkZTsNCj4+ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6VHJh aXRJdGVtVHlwZSAmdHlwKSBvdmVycmlkZSB7fQ0KPj4gKw0KPj4gK3ByaXZhdGU6DQo+PiAr ICBDb21waWxlVHJhaXRJdGVtIChDb250ZXh0ICpjdHgsIFR5VHk6OkJhc2VUeXBlICpjb25j cmV0ZSwgTG9jYXRpb24gcmVmX2xvY3VzKQ0KPj4gKyAgICA6IEhJUkNvbXBpbGVCYXNlIChj dHgpLCBjb25jcmV0ZSAoY29uY3JldGUpLCByZWZlcmVuY2UgKGVycm9yX21hcmtfbm9kZSks DQo+PiArICAgICAgcmVmX2xvY3VzIChyZWZfbG9jdXMpDQo+PiArICB7fQ0KPj4gKw0KPj4g KyAgVHlUeTo6QmFzZVR5cGUgKmNvbmNyZXRlOw0KPj4gKyAgdHJlZSByZWZlcmVuY2U7DQo+ PiArICBMb2NhdGlvbiByZWZfbG9jdXM7DQo+PiArfTsNCj4+ICsNCj4+ICt9IC8vIG5hbWVz cGFjZSBDb21waWxlDQo+PiArfSAvLyBuYW1lc3BhY2UgUnVzdA0KPj4gKw0KPj4gKyNlbmRp ZiAvLyBSVVNUX0NPTVBJTEVfSU1QTElURU1fSA0KPj4gZGlmZiAtLWdpdCBhL2djYy9ydXN0 L2JhY2tlbmQvcnVzdC1jb21waWxlLWludHJpbnNpYy5jYyBiL2djYy9ydXN0L2JhY2tlbmQv cnVzdC1jb21waWxlLWludHJpbnNpYy5jYw0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+ IGluZGV4IDAwMDAwMDAwMDAwLi42MTA4NGI5MGYzMw0KPj4gLS0tIC9kZXYvbnVsbA0KPj4g KysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtaW50cmluc2ljLmNjDQo+PiBA QCAtMCwwICsxLDUxNSBAQA0KPj4gKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KPj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiAr Ly8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsvLyB2ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBp cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQg V0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFpbHMuDQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UN Cj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90 IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWludHJpbnNpYy5oIg0KPj4gKyNpbmNsdWRlICJm b2xkLWNvbnN0LmgiDQo+PiArI2luY2x1ZGUgImxhbmdob29rcy5oIg0KPj4gKyNpbmNsdWRl ICJydXN0LWNvbXBpbGUtY29udGV4dC5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUt dHlwZS5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtZm5wYXJhbS5oIg0KPj4gKyNp bmNsdWRlICJydXN0LWJ1aWx0aW5zLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtZGlhZ25vc3Rp Y3MuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1sb2NhdGlvbi5oIg0KPj4gKyNpbmNsdWRlICJy dXN0LXRyZWUuaCINCj4+ICsjaW5jbHVkZSAidHJlZS1jb3JlLmgiDQo+PiArI2luY2x1ZGUg InByaW50LXRyZWUuaCINCj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArbmFtZXNw YWNlIENvbXBpbGUgew0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+PiArb2Zmc2V0X2hhbmRs ZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUpOw0KPj4gK3N0YXRpYyB0 cmVlDQo+PiArc2l6ZW9mX2hhbmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpm bnR5cGUpOw0KPj4gK3N0YXRpYyB0cmVlDQo+PiArdHJhbnNtdXRlX2hhbmRsZXIgKENvbnRl eHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUpOw0KPj4gK3N0YXRpYyB0cmVlDQo+PiAr cm90YXRlX2hhbmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUsIHRy ZWVfY29kZSBvcCk7DQo+PiArc3RhdGljIHRyZWUNCj4+ICt3cmFwcGluZ19vcF9oYW5kbGVy IChDb250ZXh0ICpjdHgsIFR5VHk6OkZuVHlwZSAqZm50eXBlLCB0cmVlX2NvZGUgb3ApOw0K Pj4gK3N0YXRpYyB0cmVlDQo+PiArY29weV9ub25vdmVybGFwcGluZ19oYW5kbGVyIChDb250 ZXh0ICpjdHgsIFR5VHk6OkZuVHlwZSAqZm50eXBlKTsNCj4+ICsNCj4+ICtzdGF0aWMgaW5s aW5lIHRyZWUNCj4+ICtyb3RhdGVfbGVmdF9oYW5kbGVyIChDb250ZXh0ICpjdHgsIFR5VHk6 OkZuVHlwZSAqZm50eXBlKQ0KPj4gK3sNCj4+ICsgIHJldHVybiByb3RhdGVfaGFuZGxlciAo Y3R4LCBmbnR5cGUsIExST1RBVEVfRVhQUik7DQo+PiArfQ0KPj4gK3N0YXRpYyBpbmxpbmUg dHJlZQ0KPj4gK3JvdGF0ZV9yaWdodF9oYW5kbGVyIChDb250ZXh0ICpjdHgsIFR5VHk6OkZu VHlwZSAqZm50eXBlKQ0KPj4gK3sNCj4+ICsgIHJldHVybiByb3RhdGVfaGFuZGxlciAoY3R4 LCBmbnR5cGUsIFJST1RBVEVfRVhQUik7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyBpbmxp bmUgdHJlZQ0KPj4gK3dyYXBwaW5nX2FkZF9oYW5kbGVyIChDb250ZXh0ICpjdHgsIFR5VHk6 OkZuVHlwZSAqZm50eXBlKQ0KPj4gK3sNCj4+ICsgIHJldHVybiB3cmFwcGluZ19vcF9oYW5k bGVyIChjdHgsIGZudHlwZSwgUExVU19FWFBSKTsNCj4+ICt9DQo+PiArc3RhdGljIGlubGlu ZSB0cmVlDQo+PiArd3JhcHBpbmdfc3ViX2hhbmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6 Rm5UeXBlICpmbnR5cGUpDQo+PiArew0KPj4gKyAgcmV0dXJuIHdyYXBwaW5nX29wX2hhbmRs ZXIgKGN0eCwgZm50eXBlLCBNSU5VU19FWFBSKTsNCj4+ICt9DQo+PiArc3RhdGljIGlubGlu ZSB0cmVlDQo+PiArd3JhcHBpbmdfbXVsX2hhbmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6 Rm5UeXBlICpmbnR5cGUpDQo+PiArew0KPj4gKyAgcmV0dXJuIHdyYXBwaW5nX29wX2hhbmRs ZXIgKGN0eCwgZm50eXBlLCBNVUxUX0VYUFIpOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0aWMg Y29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsDQo+PiArICAgICAgICAgICAgICAgICAgICAg c3RkOjpmdW5jdGlvbjx0cmVlIChDb250ZXh0ICosIFR5VHk6OkZuVHlwZSAqKT4+DQo+PiAr ICBnZW5lcmljX2ludHJpbnNpY3MgPSB7eyJvZmZzZXQiLCAmb2Zmc2V0X2hhbmRsZXJ9LA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgeyJzaXplX29mIiwgJnNpemVvZl9oYW5kbGVy fSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIHsidHJhbnNtdXRlIiwgJnRyYW5zbXV0 ZV9oYW5kbGVyfSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIHsicm90YXRlX2xlZnQi LCAmcm90YXRlX2xlZnRfaGFuZGxlcn0sDQo+PiArICAgICAgICAgICAgICAgICAgICAgICB7 InJvdGF0ZV9yaWdodCIsICZyb3RhdGVfcmlnaHRfaGFuZGxlcn0sDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICB7IndyYXBwaW5nX2FkZCIsICZ3cmFwcGluZ19hZGRfaGFuZGxlcn0s DQo+PiArICAgICAgICAgICAgICAgICAgICAgICB7IndyYXBwaW5nX3N1YiIsICZ3cmFwcGlu Z19zdWJfaGFuZGxlcn0sDQo+PiArICAgICAgICAgICAgICAgICAgICAgICB7IndyYXBwaW5n X211bCIsICZ3cmFwcGluZ19tdWxfaGFuZGxlcn0sDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICB7ImNvcHlfbm9ub3ZlcmxhcHBpbmciLCAmY29weV9ub25vdmVybGFwcGluZ19oYW5k bGVyfX07DQo+PiArDQo+PiArSW50cmluc2ljczo6SW50cmluc2ljcyAoQ29udGV4dCAqY3R4 KSA6IGN0eCAoY3R4KSB7fQ0KPj4gKw0KPj4gK3RyZWUNCj4+ICtJbnRyaW5zaWNzOjpjb21w aWxlIChUeVR5OjpGblR5cGUgKmZudHlwZSkNCj4+ICt7DQo+PiArICBydXN0X2Fzc2VydCAo Zm50eXBlLT5nZXRfYWJpICgpID09IEFCSTo6SU5UUklOU0lDKTsNCj4+ICsNCj4+ICsgIHRy ZWUgYnVpbHRpbiA9IGVycm9yX21hcmtfbm9kZTsNCj4+ICsgIEJ1aWx0aW5zQ29udGV4dCAm YnVpbHRpbl9jdHggPSBCdWlsdGluc0NvbnRleHQ6OmdldCAoKTsNCj4+ICsgIGlmIChidWls dGluX2N0eC5sb29rdXBfc2ltcGxlX2J1aWx0aW4gKGZudHlwZS0+Z2V0X2lkZW50aWZpZXIg KCksICZidWlsdGluKSkNCj4+ICsgICAgcmV0dXJuIGJ1aWx0aW47DQo+PiArDQo+PiArICAv LyBpcyBpdCBhbiBnZW5lcmljIGJ1aWx0aW4/DQo+PiArICBhdXRvIGl0ID0gZ2VuZXJpY19p bnRyaW5zaWNzLmZpbmQgKGZudHlwZS0+Z2V0X2lkZW50aWZpZXIgKCkpOw0KPj4gKyAgaWYg KGl0ICE9IGdlbmVyaWNfaW50cmluc2ljcy5lbmQgKCkpDQo+PiArICAgIHJldHVybiBpdC0+ c2Vjb25kIChjdHgsIGZudHlwZSk7DQo+PiArDQo+PiArICBMb2NhdGlvbiBsb2N1cyA9IGN0 eC0+Z2V0X21hcHBpbmdzICgpLT5sb29rdXBfbG9jYXRpb24gKGZudHlwZS0+Z2V0X3JlZiAo KSk7DQo+PiArICBydXN0X2Vycm9yX2F0IChsb2N1cywgInVua25vd24gYnVpbHRpbiBpbnRy aW5zaWM6ICVzIiwNCj4+ICsgICAgICAgICAgICAgICAgZm50eXBlLT5nZXRfaWRlbnRpZmll ciAoKS5jX3N0ciAoKSk7DQo+PiArDQo+PiArICByZXR1cm4gZXJyb3JfbWFya19ub2RlOw0K Pj4gK30NCj4+ICsNCj4+ICsvKioNCj4+ICsgKiBJdGVtcyBjYW4gYmUgZm9yd2FyZCBjb21w aWxlZCB3aGljaCBtZWFucyB3ZSBtYXkgbm90IG5lZWQgdG8gaW52b2tlIHRoaXMNCj4+ICsg KiBjb2RlLiBXZSBtaWdodCBhbHNvIGhhdmUgYWxyZWFkeSBjb21waWxlZCB0aGlzIGdlbmVy aWMgZnVuY3Rpb24gYXMgd2VsbC4NCj4+ICsgKi8NCj4+ICtzdGF0aWMgYm9vbA0KPj4gK2No ZWNrX2Zvcl9jYWNoZWRfaW50cmluc2ljIChDb250ZXh0ICpjdHgsIFR5VHk6OkZuVHlwZSAq Zm50eXBlLCB0cmVlICpsb29rdXApDQo+PiArew0KPj4gKyAgaWYgKGN0eC0+bG9va3VwX2Z1 bmN0aW9uX2RlY2wgKGZudHlwZS0+Z2V0X3R5X3JlZiAoKSwgbG9va3VwLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm50eXBlLT5nZXRfaWQgKCksIGZudHlwZSkp DQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBIYXMgdGhpcyBiZWVuIGFkZGVkIHRvIHRoZSBs aXN0PyBUaGVuIGl0IG11c3QgYmUgZmluaXNoZWQNCj4+ICsgICAgICBpZiAoY3R4LT5mdW5j dGlvbl9jb21wbGV0ZWQgKCpsb29rdXApKQ0KPj4gKyAgICAgICB7DQo+PiArICAgICAgICAg dHJlZSBkdW1teSA9IE5VTExfVFJFRTsNCj4+ICsgICAgICAgICBpZiAoIWN0eC0+bG9va3Vw X2Z1bmN0aW9uX2RlY2wgKGZudHlwZS0+Z2V0X3R5X3JlZiAoKSwgJmR1bW15KSkNCj4+ICsg ICAgICAgICAgIGN0eC0+aW5zZXJ0X2Z1bmN0aW9uX2RlY2wgKGZudHlwZSwgKmxvb2t1cCk7 DQo+PiArICAgICAgICAgcmV0dXJuIHRydWU7DQo+PiArICAgICAgIH0NCj4+ICsgICAgfQ0K Pj4gKw0KPj4gKyAgcmV0dXJuIGZhbHNlOw0KPj4gK30NCj4+ICsNCj4+ICsvKioNCj4+ICsg KiBNYXliZSBvdmVycmlkZSB0aGUgSGlyIExvb2t1cHMgZm9yIHRoZSBzdWJzdGl0dWlvbnMg aW4gdGhpcyBjb250ZXh0DQo+PiArICovDQo+PiArc3RhdGljIHZvaWQNCj4+ICttYXliZV9v dmVycmlkZV9jdHggKFR5VHk6OkZuVHlwZSAqZm50eXBlKQ0KPj4gK3sNCj4+ICsgIGlmIChm bnR5cGUtPmhhc19zdWJzaXRpdGlvbnNfZGVmaW5lZCAoKSkNCj4+ICsgICAgZm50eXBlLT5v dmVycmlkZV9jb250ZXh0ICgpOw0KPj4gK30NCj4+ICsNCj4+ICsvKioNCj4+ICsgKiBDb21w aWxlIGFuZCBzZXR1cCBhIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycw0KPj4gKyAqLw0KPj4gK3N0 YXRpYyB2b2lkDQo+PiArY29tcGlsZV9mbl9wYXJhbXMgKENvbnRleHQgKmN0eCwgVHlUeTo6 Rm5UeXBlICpmbnR5cGUsIHRyZWUgZm5kZWNsLA0KPj4gKyAgICAgICAgICAgICAgICAgIHN0 ZDo6dmVjdG9yPEJ2YXJpYWJsZSAqPiAqY29tcGlsZWRfcGFyYW1fdmFyaWFibGVzLA0KPj4g KyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHRyZWVfbm9kZSAqPiAqY29tcGlsZWRf cGFyYW1fdHlwZXMgPSBudWxscHRyKQ0KPj4gK3sNCj4+ICsgIGZvciAoYXV0byAmcGFybSA6 IGZudHlwZS0+Z2V0X3BhcmFtcyAoKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gJnJl ZmVyZW5jZWRfcGFyYW0gPSBwYXJtLmZpcnN0Ow0KPj4gKyAgICAgIGF1dG8gJnBhcmFtX3R5 dHkgPSBwYXJtLnNlY29uZDsNCj4+ICsgICAgICBhdXRvIGNvbXBpbGVkX3BhcmFtX3R5cGUg PSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgcGFyYW1fdHl0eSk7DQo+PiAr DQo+PiArICAgICAgTG9jYXRpb24gcGFyYW1fbG9jdXMgPSByZWZlcmVuY2VkX3BhcmFtLT5n ZXRfbG9jdXMgKCk7DQo+PiArICAgICAgQnZhcmlhYmxlICpjb21waWxlZF9wYXJhbV92YXIN Cj4+ICsgICAgICAgPSBDb21waWxlRm5QYXJhbTo6Y29tcGlsZSAoY3R4LCBmbmRlY2wsIHJl ZmVyZW5jZWRfcGFyYW0sDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbXBpbGVkX3BhcmFtX3R5cGUsIHBhcmFtX2xvY3VzKTsNCj4+ICsNCj4+ICsgICAgICBj b21waWxlZF9wYXJhbV92YXJpYWJsZXMtPnB1c2hfYmFjayAoY29tcGlsZWRfcGFyYW1fdmFy KTsNCj4+ICsgICAgICBpZiAoY29tcGlsZWRfcGFyYW1fdHlwZXMpDQo+PiArICAgICAgIGNv bXBpbGVkX3BhcmFtX3R5cGVzLT5wdXNoX2JhY2sgKGNvbXBpbGVkX3BhcmFtX3R5cGUpOw0K Pj4gKyAgICB9DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+PiArY29tcGlsZV9p bnRyaW5zaWNfZnVuY3Rpb24gKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUp DQo+PiArew0KPj4gKyAgbWF5YmVfb3ZlcnJpZGVfY3R4IChmbnR5cGUpOw0KPj4gKw0KPj4g KyAgY29uc3QgUmVzb2x2ZXI6OkNhbm9uaWNhbFBhdGggJmNhbm9uaWNhbF9wYXRoID0gZm50 eXBlLT5nZXRfaWRlbnQgKCkucGF0aDsNCj4+ICsNCj4+ICsgIHRyZWUgY29tcGlsZWRfZm5f dHlwZSA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCBmbnR5cGUpOw0KPj4g KyAgc3RkOjpzdHJpbmcgaXJfc3ltYm9sX25hbWUNCj4+ICsgICAgPSBjYW5vbmljYWxfcGF0 aC5nZXQgKCkgKyBmbnR5cGUtPnN1YnN0X2FzX3N0cmluZyAoKTsNCj4+ICsgIHN0ZDo6c3Ry aW5nIGFzbV9uYW1lID0gY3R4LT5tYW5nbGVfaXRlbSAoZm50eXBlLCBjYW5vbmljYWxfcGF0 aCk7DQo+PiArDQo+PiArICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOw0KPj4gKyAgdHJlZSBm bmRlY2wNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5mdW5jdGlvbiAoY29tcGls ZWRfZm5fdHlwZSwgaXJfc3ltYm9sX25hbWUsIGFzbV9uYW1lLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBmbnR5cGUtPmdldF9pZGVudCAoKS5s b2N1cyk7DQo+PiArDQo+PiArICBUUkVFX1BVQkxJQyAoZm5kZWNsKSA9IDA7DQo+PiArICBU UkVFX1JFQURPTkxZIChmbmRlY2wpID0gMTsNCj4+ICsgIERFQ0xfQVJUSUZJQ0lBTCAoZm5k ZWNsKSA9IDE7DQo+PiArICBERUNMX0VYVEVSTkFMIChmbmRlY2wpID0gMDsNCj4+ICsgIERF Q0xfREVDTEFSRURfSU5MSU5FX1AgKGZuZGVjbCkgPSAxOw0KPj4gKw0KPj4gKyAgcmV0dXJu IGZuZGVjbDsNCj4+ICt9DQo+PiArDQo+PiArc3RhdGljIHZvaWQNCj4+ICtlbnRlcl9pbnRy aW5zaWNfYmxvY2sgKENvbnRleHQgKmN0eCwgdHJlZSBmbmRlY2wpDQo+PiArew0KPj4gKyAg dHJlZSBlbmNsb3Npbmdfc2NvcGUgPSBOVUxMX1RSRUU7DQo+PiArICBMb2NhdGlvbiBzdGFy dF9sb2NhdGlvbiA9IExvY2F0aW9uICgpOw0KPj4gKyAgTG9jYXRpb24gZW5kX2xvY2F0aW9u ID0gTG9jYXRpb24gKCk7DQo+PiArDQo+PiArICBhdXRvIGJsb2NrID0gY3R4LT5nZXRfYmFj a2VuZCAoKS0+YmxvY2sgKGZuZGVjbCwgZW5jbG9zaW5nX3Njb3BlLCB7fSwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9sb2NhdGlvbiwg ZW5kX2xvY2F0aW9uKTsNCj4+ICsNCj4+ICsgIGN0eC0+cHVzaF9ibG9jayAoYmxvY2spOw0K Pj4gK30NCj4+ICsNCj4+ICtzdGF0aWMgdm9pZA0KPj4gK2ZpbmFsaXplX2ludHJpbnNpY19i bG9jayAoQ29udGV4dCAqY3R4LCB0cmVlIGZuZGVjbCkNCj4+ICt7DQo+PiArICB0cmVlIGJp bmRfdHJlZSA9IGN0eC0+cG9wX2Jsb2NrICgpOw0KPj4gKw0KPj4gKyAgZ2NjX2Fzc2VydCAo VFJFRV9DT0RFIChiaW5kX3RyZWUpID09IEJJTkRfRVhQUik7DQo+PiArDQo+PiArICBERUNM X1NBVkVEX1RSRUUgKGZuZGVjbCkgPSBiaW5kX3RyZWU7DQo+PiArDQo+PiArICBjdHgtPnB1 c2hfZnVuY3Rpb24gKGZuZGVjbCk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+ PiArb2Zmc2V0X2hhbmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUp DQo+PiArew0KPj4gKyAgLy8gb2Zmc2V0IGludHJpbnNpYyBoYXMgdHdvIHBhcmFtcyBkc3Qg cG9pbnRlciBhbmQgb2Zmc2V0IGlzaXplDQo+PiArICBydXN0X2Fzc2VydCAoZm50eXBlLT5n ZXRfcGFyYW1zICgpLnNpemUgKCkgPT0gMik7DQo+PiArDQo+PiArICBhdXRvIGZuZGVjbCA9 IGNvbXBpbGVfaW50cmluc2ljX2Z1bmN0aW9uIChjdHgsIGZudHlwZSk7DQo+PiArDQo+PiAr ICBzdGQ6OnZlY3RvcjxCdmFyaWFibGUgKj4gcGFyYW1fdmFyczsNCj4+ICsgIGNvbXBpbGVf Zm5fcGFyYW1zIChjdHgsIGZudHlwZSwgZm5kZWNsLCAmcGFyYW1fdmFycyk7DQo+PiArDQo+ PiArICBhdXRvICZkc3RfcGFyYW0gPSBwYXJhbV92YXJzLmF0ICgwKTsNCj4+ICsgIGF1dG8g JnNpemVfcGFyYW0gPSBwYXJhbV92YXJzLmF0ICgxKTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChw YXJhbV92YXJzLnNpemUgKCkgPT0gMik7DQo+PiArICBpZiAoIWN0eC0+Z2V0X2JhY2tlbmQg KCktPmZ1bmN0aW9uX3NldF9wYXJhbWV0ZXJzIChmbmRlY2wsIHBhcmFtX3ZhcnMpKQ0KPj4g KyAgICByZXR1cm4gZXJyb3JfbWFya19ub2RlOw0KPj4gKw0KPj4gKyAgZW50ZXJfaW50cmlu c2ljX2Jsb2NrIChjdHgsIGZuZGVjbCk7DQo+PiArDQo+PiArICAvLyBCVUlMVElOIG9mZnNl dCBGTiBCT0RZIEJFR0lODQo+PiArICB0cmVlIGRzdCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCkt PnZhcl9leHByZXNzaW9uIChkc3RfcGFyYW0sIExvY2F0aW9uICgpKTsNCj4+ICsgIHRyZWUg c2l6ZSA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnZhcl9leHByZXNzaW9uIChzaXplX3BhcmFt LCBMb2NhdGlvbiAoKSk7DQo+PiArICB0cmVlIHBvaW50ZXJfb2Zmc2V0X2V4cHINCj4+ICsg ICAgPSBwb2ludGVyX29mZnNldF9leHByZXNzaW9uIChkc3QsIHNpemUsIEJVSUxUSU5TX0xP Q0FUSU9OKTsNCj4+ICsgIGF1dG8gcmV0dXJuX3N0YXRlbWVudA0KPj4gKyAgICA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPnJldHVybl9zdGF0ZW1lbnQgKGZuZGVjbCwge3BvaW50ZXJfb2Zm c2V0X2V4cHJ9LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgTG9jYXRpb24gKCkpOw0KPj4gKyAgY3R4LT5hZGRfc3RhdGVtZW50IChyZXR1cm5f c3RhdGVtZW50KTsNCj4+ICsgIC8vIEJVSUxUSU4gb2Zmc2V0IEZOIEJPRFkgRU5EDQo+PiAr DQo+PiArICBmaW5hbGl6ZV9pbnRyaW5zaWNfYmxvY2sgKGN0eCwgZm5kZWNsKTsNCj4+ICsN Cj4+ICsgIHJldHVybiBmbmRlY2w7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+ PiArc2l6ZW9mX2hhbmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUp DQo+PiArew0KPj4gKyAgLy8gc2l6ZV9vZiBoYXMgX3plcm9fIHBhcmFtZXRlcnMgaXRzIHBh cmFtZXRlciBpcyB0aGUgZ2VuZXJpYyBvbmUNCj4+ICsgIHJ1c3RfYXNzZXJ0IChmbnR5cGUt PmdldF9wYXJhbXMgKCkuc2l6ZSAoKSA9PSAwKTsNCj4+ICsNCj4+ICsgIHRyZWUgbG9va3Vw ID0gTlVMTF9UUkVFOw0KPj4gKyAgaWYgKGNoZWNrX2Zvcl9jYWNoZWRfaW50cmluc2ljIChj dHgsIGZudHlwZSwgJmxvb2t1cCkpDQo+PiArICAgIHJldHVybiBsb29rdXA7DQo+PiArDQo+ PiArICBhdXRvIGZuZGVjbCA9IGNvbXBpbGVfaW50cmluc2ljX2Z1bmN0aW9uIChjdHgsIGZu dHlwZSk7DQo+PiArDQo+PiArICAvLyBnZXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBl IHRyZWUgZm4gc2l6ZV9vZjxUPigpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKGZudHlwZS0+Z2V0 X251bV9zdWJzdGl0dXRpb25zICgpID09IDEpOw0KPj4gKyAgYXV0byAmcGFyYW1fbWFwcGlu ZyA9IGZudHlwZS0+Z2V0X3N1YnN0cyAoKS5hdCAoMCk7DQo+PiArICBjb25zdCBUeVR5OjpQ YXJhbVR5cGUgKnBhcmFtX3R5dHkgPSBwYXJhbV9tYXBwaW5nLmdldF9wYXJhbV90eSAoKTsN Cj4+ICsgIFR5VHk6OkJhc2VUeXBlICpyZXNvbHZlZF90eXR5ID0gcGFyYW1fdHl0eS0+cmVz b2x2ZSAoKTsNCj4+ICsgIHRyZWUgdGVtcGxhdGVfcGFyYW1ldGVyX3R5cGUNCj4+ICsgICAg PSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgcmVzb2x2ZWRfdHl0eSk7DQo+ PiArDQo+PiArICBlbnRlcl9pbnRyaW5zaWNfYmxvY2sgKGN0eCwgZm5kZWNsKTsNCj4+ICsN Cj4+ICsgIC8vIEJVSUxUSU4gc2l6ZV9vZiBGTiBCT0RZIEJFR0lODQo+PiArICB0cmVlIHNp emVfZXhwciA9IFRZUEVfU0laRV9VTklUICh0ZW1wbGF0ZV9wYXJhbWV0ZXJfdHlwZSk7DQo+ PiArICBhdXRvIHJldHVybl9zdGF0ZW1lbnQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5k ICgpLT5yZXR1cm5fc3RhdGVtZW50IChmbmRlY2wsIHtzaXplX2V4cHJ9LCBMb2NhdGlvbiAo KSk7DQo+PiArICBjdHgtPmFkZF9zdGF0ZW1lbnQgKHJldHVybl9zdGF0ZW1lbnQpOw0KPj4g KyAgLy8gQlVJTFRJTiBzaXplX29mIEZOIEJPRFkgRU5EDQo+PiArDQo+PiArICBmaW5hbGl6 ZV9pbnRyaW5zaWNfYmxvY2sgKGN0eCwgZm5kZWNsKTsNCj4+ICsNCj4+ICsgIHJldHVybiBm bmRlY2w7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+PiArdHJhbnNtdXRlX2hh bmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUpDQo+PiArew0KPj4g KyAgLy8gdHJhbnNtdXRlIGludHJpbnNpYyBoYXMgb25lIHBhcmFtZXRlcg0KPj4gKyAgcnVz dF9hc3NlcnQgKGZudHlwZS0+Z2V0X3BhcmFtcyAoKS5zaXplICgpID09IDEpOw0KPj4gKw0K Pj4gKyAgdHJlZSBsb29rdXAgPSBOVUxMX1RSRUU7DQo+PiArICBpZiAoY2hlY2tfZm9yX2Nh Y2hlZF9pbnRyaW5zaWMgKGN0eCwgZm50eXBlLCAmbG9va3VwKSkNCj4+ICsgICAgcmV0dXJu IGxvb2t1cDsNCj4+ICsNCj4+ICsgIGF1dG8gZm5kZWNsID0gY29tcGlsZV9pbnRyaW5zaWNf ZnVuY3Rpb24gKGN0eCwgZm50eXBlKTsNCj4+ICsNCj4+ICsgIHN0ZDo6dmVjdG9yPEJ2YXJp YWJsZSAqPiBwYXJhbV92YXJzOw0KPj4gKyAgc3RkOjp2ZWN0b3I8dHJlZV9ub2RlICo+IGNv bXBpbGVkX3R5cGVzOw0KPj4gKyAgY29tcGlsZV9mbl9wYXJhbXMgKGN0eCwgZm50eXBlLCBm bmRlY2wsICZwYXJhbV92YXJzLCAmY29tcGlsZWRfdHlwZXMpOw0KPj4gKw0KPj4gKyAgaWYg KCFjdHgtPmdldF9iYWNrZW5kICgpLT5mdW5jdGlvbl9zZXRfcGFyYW1ldGVycyAoZm5kZWNs LCBwYXJhbV92YXJzKSkNCj4+ICsgICAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsNCj4+ICsN Cj4+ICsgIC8vIHBhcmFtIHRvIGNvbnZlcnQNCj4+ICsgIEJ2YXJpYWJsZSAqY29udmVydF9t ZV9wYXJhbSA9IHBhcmFtX3ZhcnMuYXQgKDApOw0KPj4gKyAgdHJlZSBjb252ZXJ0X21lX2V4 cHINCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT52YXJfZXhwcmVzc2lvbiAoY29u dmVydF9tZV9wYXJhbSwgTG9jYXRpb24gKCkpOw0KPj4gKw0KPj4gKyAgLy8gY2hlY2sgZm9y IHRyYW5zbXV0ZSBwcmUtY29uZGl0aW9ucw0KPj4gKyAgdHJlZSB0YXJnZXRfdHlwZV9leHBy ID0gVFJFRV9UWVBFIChERUNMX1JFU1VMVCAoZm5kZWNsKSk7DQo+PiArICB0cmVlIHNvdXJj ZV90eXBlX2V4cHIgPSBjb21waWxlZF90eXBlcy5hdCAoMCk7DQo+PiArICB0cmVlIHRhcmdl dF9zaXplX2V4cHIgPSBUWVBFX1NJWkUgKHRhcmdldF90eXBlX2V4cHIpOw0KPj4gKyAgdHJl ZSBzb3VyY2Vfc2l6ZV9leHByID0gVFlQRV9TSVpFIChzb3VyY2VfdHlwZV9leHByKTsNCj4+ ICsgIC8vIGZvciBzb21lIHJlYXNvbiwgdW5pdCB0eXBlcyBhbmQgb3RoZXIgemVyby1zaXpl ZCB0eXBlcyByZXR1cm4gTlVMTCBmb3IgdGhlDQo+PiArICAvLyBzaXplIGV4cHJlc3Npb25z DQo+PiArICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHRhcmdldF9zaXplDQo+PiArICAgID0g dGFyZ2V0X3NpemVfZXhwciA/IFRSRUVfSU5UX0NTVF9MT1cgKHRhcmdldF9zaXplX2V4cHIp IDogMDsNCj4+ICsgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgc291cmNlX3NpemUNCj4+ICsg ICAgPSBzb3VyY2Vfc2l6ZV9leHByID8gVFJFRV9JTlRfQ1NUX0xPVyAoc291cmNlX3NpemVf ZXhwcikgOiAwOw0KPj4gKw0KPj4gKyAgLy8gc2l6ZSBjaGVjayBmb3IgY29uY3JldGUgdHlw ZXMNCj4+ICsgIC8vIFRPRE8obGl1c2h1eXUpOiBjaGVjayBhbGlnbm1lbnQgZm9yIHBvaW50 ZXJzOyBjaGVjayBmb3IgZGVwZW5kZW50bHktc2l6ZWQNCj4+ICsgIC8vIHR5cGVzDQo+PiAr ICBpZiAodGFyZ2V0X3NpemUgIT0gc291cmNlX3NpemUpDQo+PiArICAgIHsNCj4+ICsgICAg ICBydXN0X2Vycm9yX2F0IChmbnR5cGUtPmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICJjYW5ub3QgdHJhbnNtdXRlIGJldHdlZW4gdHlwZXMgb2YgZGlmZmVyZW50 IHNpemVzLCBvciAiDQo+PiArICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW50bHktc2l6 ZWQgdHlwZXMiKTsNCj4+ICsgICAgICBydXN0X2luZm9ybSAoZm50eXBlLT5nZXRfaWRlbnQg KCkubG9jdXMsICJzb3VyY2UgdHlwZTogJXFzICglbHUgYml0cykiLA0KPj4gKyAgICAgICAg ICAgICAgICAgIGZudHlwZS0+Z2V0X3BhcmFtcyAoKS5hdCAoMCkuc2Vjb25kLT5hc19zdHJp bmcgKCkuY19zdHIgKCksDQo+PiArICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcp IHNvdXJjZV9zaXplKTsNCj4+ICsgICAgICBydXN0X2luZm9ybSAoZm50eXBlLT5nZXRfaWRl bnQgKCkubG9jdXMsICJ0YXJnZXQgdHlwZTogJXFzICglbHUgYml0cykiLA0KPj4gKyAgICAg ICAgICAgICAgICAgIGZudHlwZS0+Z2V0X3JldHVybl90eXBlICgpLT5hc19zdHJpbmcgKCku Y19zdHIgKCksDQo+PiArICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRhcmdl dF9zaXplKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgZW50ZXJfaW50cmluc2ljX2Jsb2Nr IChjdHgsIGZuZGVjbCk7DQo+PiArDQo+PiArICAvLyBCVUlMVElOIHRyYW5zbXV0ZSBGTiBC T0RZIEJFR0lODQo+PiArDQo+PiArICAvLyBSZXR1cm4gKigob3JpZ190eXBlKikmZGVjbCkg ICovDQo+PiArDQo+PiArICB0cmVlIHQNCj4+ICsgICAgPSBidWlsZF9mb2xkX2FkZHJfZXhw cl9sb2MgKExvY2F0aW9uICgpLmdjY19sb2NhdGlvbiAoKSwgY29udmVydF9tZV9leHByKTsN Cj4+ICsgIHQgPSBmb2xkX2J1aWxkMV9sb2MgKExvY2F0aW9uICgpLmdjY19sb2NhdGlvbiAo KSwgTk9QX0VYUFIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX3BvaW50ZXJf dHlwZSAodGFyZ2V0X3R5cGVfZXhwciksIHQpOw0KPj4gKyAgdHJlZSByZXN1bHRfZXhwcg0K Pj4gKyAgICA9IGJ1aWxkX2ZvbGRfaW5kaXJlY3RfcmVmX2xvYyAoTG9jYXRpb24gKCkuZ2Nj X2xvY2F0aW9uICgpLCB0KTsNCj4+ICsNCj4+ICsgIGF1dG8gcmV0dXJuX3N0YXRlbWVudA0K Pj4gKyAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnJldHVybl9zdGF0ZW1lbnQgKGZuZGVj bCwge3Jlc3VsdF9leHByfSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIExvY2F0aW9uICgpKTsNCj4+ICsgIGN0eC0+YWRkX3N0YXRlbWVudCAo cmV0dXJuX3N0YXRlbWVudCk7DQo+PiArICAvLyBCVUlMVElOIHRyYW5zbXV0ZSBGTiBCT0RZ IEVORA0KPj4gKw0KPj4gKyAgZmluYWxpemVfaW50cmluc2ljX2Jsb2NrIChjdHgsIGZuZGVj bCk7DQo+PiArDQo+PiArICByZXR1cm4gZm5kZWNsOw0KPj4gK30NCj4+ICsNCj4+ICtzdGF0 aWMgdHJlZQ0KPj4gK3JvdGF0ZV9oYW5kbGVyIChDb250ZXh0ICpjdHgsIFR5VHk6OkZuVHlw ZSAqZm50eXBlLCB0cmVlX2NvZGUgb3ApDQo+PiArew0KPj4gKyAgLy8gcm90YXRlIGludHJp bnNpYyBoYXMgdHdvIHBhcmFtZXRlcg0KPj4gKyAgcnVzdF9hc3NlcnQgKGZudHlwZS0+Z2V0 X3BhcmFtcyAoKS5zaXplICgpID09IDIpOw0KPj4gKw0KPj4gKyAgdHJlZSBsb29rdXAgPSBO VUxMX1RSRUU7DQo+PiArICBpZiAoY2hlY2tfZm9yX2NhY2hlZF9pbnRyaW5zaWMgKGN0eCwg Zm50eXBlLCAmbG9va3VwKSkNCj4+ICsgICAgcmV0dXJuIGxvb2t1cDsNCj4+ICsNCj4+ICsg IGF1dG8gZm5kZWNsID0gY29tcGlsZV9pbnRyaW5zaWNfZnVuY3Rpb24gKGN0eCwgZm50eXBl KTsNCj4+ICsNCj4+ICsgIC8vIHNldHVwIHRoZSBwYXJhbXMNCj4+ICsgIHN0ZDo6dmVjdG9y PEJ2YXJpYWJsZSAqPiBwYXJhbV92YXJzOw0KPj4gKyAgY29tcGlsZV9mbl9wYXJhbXMgKGN0 eCwgZm50eXBlLCBmbmRlY2wsICZwYXJhbV92YXJzKTsNCj4+ICsNCj4+ICsgIGF1dG8gJnhf cGFyYW0gPSBwYXJhbV92YXJzLmF0ICgwKTsNCj4+ICsgIGF1dG8gJnlfcGFyYW0gPSBwYXJh bV92YXJzLmF0ICgxKTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChwYXJhbV92YXJzLnNpemUgKCkg PT0gMik7DQo+PiArICBpZiAoIWN0eC0+Z2V0X2JhY2tlbmQgKCktPmZ1bmN0aW9uX3NldF9w YXJhbWV0ZXJzIChmbmRlY2wsIHBhcmFtX3ZhcnMpKQ0KPj4gKyAgICByZXR1cm4gZXJyb3Jf bWFya19ub2RlOw0KPj4gKw0KPj4gKyAgZW50ZXJfaW50cmluc2ljX2Jsb2NrIChjdHgsIGZu ZGVjbCk7DQo+PiArDQo+PiArICAvLyBCVUlMVElOIHJvdGF0ZSBGTiBCT0RZIEJFR0lODQo+ PiArICB0cmVlIHggPSBjdHgtPmdldF9iYWNrZW5kICgpLT52YXJfZXhwcmVzc2lvbiAoeF9w YXJhbSwgTG9jYXRpb24gKCkpOw0KPj4gKyAgdHJlZSB5ID0gY3R4LT5nZXRfYmFja2VuZCAo KS0+dmFyX2V4cHJlc3Npb24gKHlfcGFyYW0sIExvY2F0aW9uICgpKTsNCj4+ICsgIHRyZWUg cm90YXRlX2V4cHINCj4+ICsgICAgPSBmb2xkX2J1aWxkMl9sb2MgKEJVSUxUSU5TX0xPQ0FU SU9OLCBvcCwgVFJFRV9UWVBFICh4KSwgeCwgeSk7DQo+PiArICBhdXRvIHJldHVybl9zdGF0 ZW1lbnQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5yZXR1cm5fc3RhdGVtZW50 IChmbmRlY2wsIHtyb3RhdGVfZXhwcn0sDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiAoKSk7DQo+PiArICBjdHgtPmFkZF9zdGF0 ZW1lbnQgKHJldHVybl9zdGF0ZW1lbnQpOw0KPj4gKyAgLy8gQlVJTFRJTiByb3RhdGUgRk4g Qk9EWSBFTkQNCj4+ICsNCj4+ICsgIGZpbmFsaXplX2ludHJpbnNpY19ibG9jayAoY3R4LCBm bmRlY2wpOw0KPj4gKw0KPj4gKyAgcmV0dXJuIGZuZGVjbDsNCj4+ICt9DQo+PiArDQo+PiAr LyoqDQo+PiArICogcHViIGZuIHdyYXBwaW5nX3thZGQsIHN1YiwgbXVsfTxUPihsaHM6IFQs IHJoczogVCkgLT4gVDsNCj4+ICsgKi8NCj4+ICtzdGF0aWMgdHJlZQ0KPj4gK3dyYXBwaW5n X29wX2hhbmRsZXIgKENvbnRleHQgKmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUsIHRyZWVf Y29kZSBvcCkNCj4+ICt7DQo+PiArICAvLyB3cmFwcGluZ188b3A+IGludHJpbnNpY3MgaGF2 ZSB0d28gcGFyYW1ldGVyDQo+PiArICBydXN0X2Fzc2VydCAoZm50eXBlLT5nZXRfcGFyYW1z ICgpLnNpemUgKCkgPT0gMik7DQo+PiArDQo+PiArICB0cmVlIGxvb2t1cCA9IE5VTExfVFJF RTsNCj4+ICsgIGlmIChjaGVja19mb3JfY2FjaGVkX2ludHJpbnNpYyAoY3R4LCBmbnR5cGUs ICZsb29rdXApKQ0KPj4gKyAgICByZXR1cm4gbG9va3VwOw0KPj4gKw0KPj4gKyAgYXV0byBm bmRlY2wgPSBjb21waWxlX2ludHJpbnNpY19mdW5jdGlvbiAoY3R4LCBmbnR5cGUpOw0KPj4g Kw0KPj4gKyAgLy8gc2V0dXAgdGhlIHBhcmFtcw0KPj4gKyAgc3RkOjp2ZWN0b3I8QnZhcmlh YmxlICo+IHBhcmFtX3ZhcnM7DQo+PiArICBjb21waWxlX2ZuX3BhcmFtcyAoY3R4LCBmbnR5 cGUsIGZuZGVjbCwgJnBhcmFtX3ZhcnMpOw0KPj4gKw0KPj4gKyAgYXV0byAmbGhzX3BhcmFt ID0gcGFyYW1fdmFycy5hdCAoMCk7DQo+PiArICBhdXRvICZyaHNfcGFyYW0gPSBwYXJhbV92 YXJzLmF0ICgxKTsNCj4+ICsNCj4+ICsgIGlmICghY3R4LT5nZXRfYmFja2VuZCAoKS0+ZnVu Y3Rpb25fc2V0X3BhcmFtZXRlcnMgKGZuZGVjbCwgcGFyYW1fdmFycykpDQo+PiArICAgIHJl dHVybiBlcnJvcl9tYXJrX25vZGU7DQo+PiArDQo+PiArICBlbnRlcl9pbnRyaW5zaWNfYmxv Y2sgKGN0eCwgZm5kZWNsKTsNCj4+ICsNCj4+ICsgIC8vIEJVSUxUSU4gd3JhcHBpbmdfPG9w PiBGTiBCT0RZIEJFR0lODQo+PiArICBhdXRvIGxocyA9IGN0eC0+Z2V0X2JhY2tlbmQgKCkt PnZhcl9leHByZXNzaW9uIChsaHNfcGFyYW0sIExvY2F0aW9uICgpKTsNCj4+ICsgIGF1dG8g cmhzID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+dmFyX2V4cHJlc3Npb24gKHJoc19wYXJhbSwg TG9jYXRpb24gKCkpOw0KPj4gKw0KPj4gKyAgLy8gT3BlcmF0aW9ucyBhcmUgYWx3YXlzIHdy YXBwaW5nIGluIFJ1c3QsIGFzIHdlIGhhdmUgLWZ3cmFwdiBlbmFibGVkIGJ5DQo+PiArICAv LyBkZWZhdWx0LiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgd3JhcHBpbmdfe2FkZCwgc3Vi LCBtdWx9IGFuZCBhIHJlZ3VsYXINCj4+ICsgIC8vIGFyaXRobWV0aWMgb3BlcmF0aW9uIGlz IHRoYXQgdGhlc2UgaW50cmluc2ljcyBkbyBub3QgcGFuaWMgLSB0aGV5IGFsd2F5cw0KPj4g KyAgLy8gY2Fycnkgb3Zlci4NCj4+ICsgIGF1dG8gd3JhcF9leHByID0gYnVpbGQyIChvcCwg VFJFRV9UWVBFIChsaHMpLCBsaHMsIHJocyk7DQo+PiArDQo+PiArICBhdXRvIHJldHVybl9z dGF0ZW1lbnQNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5yZXR1cm5fc3RhdGVt ZW50IChmbmRlY2wsIHt3cmFwX2V4cHJ9LCBMb2NhdGlvbiAoKSk7DQo+PiArICBjdHgtPmFk ZF9zdGF0ZW1lbnQgKHJldHVybl9zdGF0ZW1lbnQpOw0KPj4gKyAgLy8gQlVJTFRJTiB3cmFw cGluZ188b3A+IEZOIEJPRFkgRU5EDQo+PiArDQo+PiArICBmaW5hbGl6ZV9pbnRyaW5zaWNf YmxvY2sgKGN0eCwgZm5kZWNsKTsNCj4+ICsNCj4+ICsgIHJldHVybiBmbmRlY2w7DQo+PiAr fQ0KPj4gKw0KPj4gKy8qKg0KPj4gKyAqIGZuIGNvcHlfbm9ub3ZlcmxhcHBpbmc8VD4oc3Jj OiAqY29uc3QgVCwgZHN0OiAqbXV0IFQsIGNvdW50OiB1c2l6ZSk7DQo+PiArICovDQo+PiAr c3RhdGljIHRyZWUNCj4+ICtjb3B5X25vbm92ZXJsYXBwaW5nX2hhbmRsZXIgKENvbnRleHQg KmN0eCwgVHlUeTo6Rm5UeXBlICpmbnR5cGUpDQo+PiArew0KPj4gKyAgcnVzdF9hc3NlcnQg KGZudHlwZS0+Z2V0X3BhcmFtcyAoKS5zaXplICgpID09IDMpOw0KPj4gKyAgcnVzdF9hc3Nl cnQgKGZudHlwZS0+Z2V0X251bV9zdWJzdGl0dXRpb25zICgpID09IDEpOw0KPj4gKw0KPj4g KyAgdHJlZSBsb29rdXAgPSBOVUxMX1RSRUU7DQo+PiArICBpZiAoY2hlY2tfZm9yX2NhY2hl ZF9pbnRyaW5zaWMgKGN0eCwgZm50eXBlLCAmbG9va3VwKSkNCj4+ICsgICAgcmV0dXJuIGxv b2t1cDsNCj4+ICsNCj4+ICsgIGF1dG8gZm5kZWNsID0gY29tcGlsZV9pbnRyaW5zaWNfZnVu Y3Rpb24gKGN0eCwgZm50eXBlKTsNCj4+ICsNCj4+ICsgIC8vIE1vc3QgaW50cmluc2ljIGZ1 bmN0aW9ucyBhcmUgcHVyZSAtIG5vdCBgY29weV9ub25vdmVybGFwcGluZ2ANCj4+ICsgIFRS RUVfUkVBRE9OTFkgKGZuZGVjbCkgPSAwOw0KPj4gKyAgVFJFRV9TSURFX0VGRkVDVFMgKGZu ZGVjbCkgPSAxOw0KPj4gKw0KPj4gKyAgLy8gc2V0dXAgdGhlIHBhcmFtcw0KPj4gKyAgc3Rk Ojp2ZWN0b3I8QnZhcmlhYmxlICo+IHBhcmFtX3ZhcnM7DQo+PiArICBjb21waWxlX2ZuX3Bh cmFtcyAoY3R4LCBmbnR5cGUsIGZuZGVjbCwgJnBhcmFtX3ZhcnMpOw0KPj4gKw0KPj4gKyAg aWYgKCFjdHgtPmdldF9iYWNrZW5kICgpLT5mdW5jdGlvbl9zZXRfcGFyYW1ldGVycyAoZm5k ZWNsLCBwYXJhbV92YXJzKSkNCj4+ICsgICAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsNCj4+ ICsNCj4+ICsgIGVudGVyX2ludHJpbnNpY19ibG9jayAoY3R4LCBmbmRlY2wpOw0KPj4gKw0K Pj4gKyAgLy8gQlVJTFRJTiBjb3B5X25vbm92ZXJsYXBwaW5nIEJPRFkgQkVHSU4NCj4+ICsN Cj4+ICsgIGF1dG8gc3JjID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+dmFyX2V4cHJlc3Npb24g KHBhcmFtX3ZhcnNbMF0sIExvY2F0aW9uICgpKTsNCj4+ICsgIGF1dG8gZHN0ID0gY3R4LT5n ZXRfYmFja2VuZCAoKS0+dmFyX2V4cHJlc3Npb24gKHBhcmFtX3ZhcnNbMV0sIExvY2F0aW9u ICgpKTsNCj4+ICsgIGF1dG8gY291bnQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT52YXJfZXhw cmVzc2lvbiAocGFyYW1fdmFyc1syXSwgTG9jYXRpb24gKCkpOw0KPj4gKw0KPj4gKyAgLy8g V2Ugd2FudCB0byBjcmVhdGUgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQNCj4+ICsgIC8vIG1l bWNweShkc3QsIHNyYywgc2l6ZV9vZjo6PFQ+KCkpOw0KPj4gKyAgLy8gc28NCj4+ICsgIC8v IG1lbWNweShkc3QsIHNyYywgc2l6ZV9leHByKTsNCj4+ICsNCj4+ICsgIGF1dG8gKnJlc29s dmVkX3R5ID0gZm50eXBlLT5nZXRfc3Vic3RzICgpLmF0ICgwKS5nZXRfcGFyYW1fdHkgKCkt PnJlc29sdmUgKCk7DQo+PiArICBhdXRvIHBhcmFtX3R5cGUgPSBUeVR5UmVzb2x2ZUNvbXBp bGU6OmNvbXBpbGUgKGN0eCwgcmVzb2x2ZWRfdHkpOw0KPj4gKw0KPj4gKyAgdHJlZSBzaXpl X2V4cHINCj4+ICsgICAgPSBidWlsZDIgKE1VTFRfRVhQUiwgc2l6ZV90eXBlX25vZGUsIFRZ UEVfU0laRV9VTklUIChwYXJhbV90eXBlKSwgY291bnQpOw0KPj4gKw0KPj4gKyAgdHJlZSBt ZW1jcHlfcmF3ID0gbnVsbHB0cjsNCj4+ICsgIEJ1aWx0aW5zQ29udGV4dDo6Z2V0ICgpLmxv b2t1cF9zaW1wbGVfYnVpbHRpbiAoIm1lbWNweSIsICZtZW1jcHlfcmF3KTsNCj4+ICsgIHJ1 c3RfYXNzZXJ0IChtZW1jcHlfcmF3KTsNCj4+ICsgIGF1dG8gbWVtY3B5DQo+PiArICAgID0g YnVpbGRfZm9sZF9hZGRyX2V4cHJfbG9jIChMb2NhdGlvbiAoKS5nY2NfbG9jYXRpb24gKCks IG1lbWNweV9yYXcpOw0KPj4gKw0KPj4gKyAgYXV0byBjb3B5X2NhbGwNCj4+ICsgICAgPSBj dHgtPmdldF9iYWNrZW5kICgpLT5jYWxsX2V4cHJlc3Npb24gKG1lbWNweSwge2RzdCwgc3Jj LCBzaXplX2V4cHJ9LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBudWxscHRyLCBMb2NhdGlvbiAoKSk7DQo+PiArDQo+PiArICBjdHgtPmFkZF9z dGF0ZW1lbnQgKGNvcHlfY2FsbCk7DQo+PiArDQo+PiArICAvLyBCVUlMVElOIGNvcHlfbm9u b3ZlcmxhcHBpbmcgQk9EWSBFTkQNCj4+ICsNCj4+ICsgIGZpbmFsaXplX2ludHJpbnNpY19i bG9jayAoY3R4LCBmbmRlY2wpOw0KPj4gKw0KPj4gKyAgcmV0dXJuIGZuZGVjbDsNCj4+ICt9 DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNl IFJ1c3QNCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1p bnRyaW5zaWMuaCBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWludHJpbnNpYy5o DQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLmRjZWIw ODY0ZmQ0DQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9iYWNrZW5kL3J1 c3QtY29tcGlsZS1pbnRyaW5zaWMuaA0KPj4gQEAgLTAsMCArMSw0MCBAQA0KPj4gKy8vIFRo aXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0K Pj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsvLyB2 ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJSQU5U WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElU WSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFpbHMu DQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2Vl IHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3Lmdu dS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaWZuZGVmIFJVU1RfQ09NUElMRV9JTlRS SU5TSUMNCj4+ICsjZGVmaW5lIFJVU1RfQ09NUElMRV9JTlRSSU5TSUMNCj4+ICsNCj4+ICsj aW5jbHVkZSAicnVzdC1jb21waWxlLWNvbnRleHQuaCINCj4+ICsjaW5jbHVkZSAibGFuZ2hv b2tzLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4gK25hbWVzcGFjZSBDb21w aWxlIHsNCj4+ICsNCj4+ICtjbGFzcyBJbnRyaW5zaWNzDQo+PiArew0KPj4gK3B1YmxpYzoN Cj4+ICsgIEludHJpbnNpY3MgKENvbnRleHQgKmN0eCk7DQo+PiArDQo+PiArICB0cmVlIGNv bXBpbGUgKFR5VHk6OkZuVHlwZSAqZm50eXBlKTsNCj4+ICsNCj4+ICtwcml2YXRlOg0KPj4g KyAgQ29udGV4dCAqY3R4Ow0KPj4gK307DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgQ29t cGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+ICsNCj4+ICsjZW5kaWYgLy8gUlVT VF9DT01QSUxFX0lOVFJJTlNJQw0KPj4gZGlmZiAtLWdpdCBhL2djYy9ydXN0L2JhY2tlbmQv cnVzdC1jb21waWxlLWl0ZW0uY2MgYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1p dGVtLmNjDQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAu LmNlYmE1MWMyZDI3DQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9iYWNr ZW5kL3J1c3QtY29tcGlsZS1pdGVtLmNjDQo+PiBAQCAtMCwwICsxLDIwNiBAQA0KPj4gKy8v IENvcHlyaWdodCAoQykgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j Lg0KPj4gKw0KPj4gKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsv LyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeSBpdCB1bmRlcg0KPj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXINCj4+ICsvLyB2ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBB TlkNCj4+ICsvLyBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mIE1FUkNIQU5UQUJJTElUWSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8v IGZvciBtb3JlIGRldGFpbHMuDQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBh bG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4g Ky8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaW5jbHVk ZSAicnVzdC1jb21waWxlLWl0ZW0uaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWlt cGxpdGVtLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1leHByLmgiDQo+PiArI2lu Y2x1ZGUgInJ1c3QtY29tcGlsZS1leHRlcm4uaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb25z dGV4cHIuaCINCj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArbmFtZXNwYWNlIENv bXBpbGUgew0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlSXRlbTo6dmlzaXQgKEhJUjo6 U3RhdGljSXRlbSAmdmFyKQ0KPj4gK3sNCj4+ICsgIC8vIGhhdmUgd2UgYWxyZWFkeSBjb21w aWxlZCB0aGlzPw0KPj4gKyAgQnZhcmlhYmxlICpzdGF0aWNfZGVjbF9yZWYgPSBudWxscHRy Ow0KPj4gKyAgaWYgKGN0eC0+bG9va3VwX3Zhcl9kZWNsICh2YXIuZ2V0X21hcHBpbmdzICgp LmdldF9oaXJpZCAoKSwgJnN0YXRpY19kZWNsX3JlZikpDQo+PiArICAgIHsNCj4+ICsgICAg ICByZWZlcmVuY2UNCj4+ICsgICAgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT52YXJfZXhw cmVzc2lvbiAoc3RhdGljX2RlY2xfcmVmLCByZWZfbG9jdXMpOw0KPj4gKyAgICAgIHJldHVy bjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnJlc29sdmVkX3R5 cGUgPSBudWxscHRyOw0KPj4gKyAgYm9vbCBvayA9IGN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29r dXBfdHlwZSAodmFyLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlZF90eXBlKTsN Cj4+ICsgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICB0cmVlIHR5cGUgPSBUeVR5 UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgcmVzb2x2ZWRfdHlwZSk7DQo+PiArICB0 cmVlIHZhbHVlID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKHZhci5nZXRfZXhwciAoKSwgY3R4 KTsNCj4+ICsNCj4+ICsgIGNvbnN0IFJlc29sdmVyOjpDYW5vbmljYWxQYXRoICpjYW5vbmlj YWxfcGF0aCA9IG51bGxwdHI7DQo+PiArICBvayA9IGN0eC0+Z2V0X21hcHBpbmdzICgpLT5s b29rdXBfY2Fub25pY2FsX3BhdGggKA0KPj4gKyAgICB2YXIuZ2V0X21hcHBpbmdzICgpLmdl dF9ub2RlaWQgKCksICZjYW5vbmljYWxfcGF0aCk7DQo+PiArICBydXN0X2Fzc2VydCAob2sp Ow0KPj4gKw0KPj4gKyAgc3RkOjpzdHJpbmcgbmFtZSA9IGNhbm9uaWNhbF9wYXRoLT5nZXQg KCk7DQo+PiArICBzdGQ6OnN0cmluZyBhc21fbmFtZSA9IGN0eC0+bWFuZ2xlX2l0ZW0gKHJl c29sdmVkX3R5cGUsICpjYW5vbmljYWxfcGF0aCk7DQo+PiArDQo+PiArICBib29sIGlzX2V4 dGVybmFsID0gZmFsc2U7DQo+PiArICBib29sIGlzX2hpZGRlbiA9IGZhbHNlOw0KPj4gKyAg Ym9vbCBpbl91bmlxdWVfc2VjdGlvbiA9IHRydWU7DQo+PiArDQo+PiArICBCdmFyaWFibGUg KnN0YXRpY19nbG9iYWwNCj4+ICsgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5nbG9iYWxf dmFyaWFibGUgKG5hbWUsIGFzbV9uYW1lLCB0eXBlLCBpc19leHRlcm5hbCwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaGlkZGVuLCBpbl91 bmlxdWVfc2VjdGlvbiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdmFyLmdldF9sb2N1cyAoKSk7DQo+PiArICBjdHgtPmdldF9iYWNrZW5kICgp LT5nbG9iYWxfdmFyaWFibGVfc2V0X2luaXQgKHN0YXRpY19nbG9iYWwsIHZhbHVlKTsNCj4+ ICsNCj4+ICsgIGN0eC0+aW5zZXJ0X3Zhcl9kZWNsICh2YXIuZ2V0X21hcHBpbmdzICgpLmdl dF9oaXJpZCAoKSwgc3RhdGljX2dsb2JhbCk7DQo+PiArICBjdHgtPnB1c2hfdmFyIChzdGF0 aWNfZ2xvYmFsKTsNCj4+ICsNCj4+ICsgIHJlZmVyZW5jZSA9IGN0eC0+Z2V0X2JhY2tlbmQg KCktPnZhcl9leHByZXNzaW9uIChzdGF0aWNfZ2xvYmFsLCByZWZfbG9jdXMpOw0KPj4gK30N Cj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUl0ZW06OnZpc2l0IChISVI6OkNvbnN0YW50 SXRlbSAmY29uc3RhbnQpDQo+PiArew0KPj4gKyAgaWYgKGN0eC0+bG9va3VwX2NvbnN0X2Rl Y2wgKGNvbnN0YW50LmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAmcmVmZXJlbmNlKSkNCj4+ICsgICAgcmV0dXJuOw0K Pj4gKw0KPj4gKyAgLy8gcmVzb2x2ZSB0aGUgdHlwZQ0KPj4gKyAgVHlUeTo6QmFzZVR5cGUg KnJlc29sdmVkX3R5cGUgPSBudWxscHRyOw0KPj4gKyAgYm9vbCBvaw0KPj4gKyAgICA9IGN0 eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAoY29uc3RhbnQuZ2V0X21hcHBpbmdzICgp LmdldF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJnJlc29sdmVkX3R5cGUpOw0KPj4gKyAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ ICsgIC8vIGNhbm9uaWNhbCBwYXRoDQo+PiArICBjb25zdCBSZXNvbHZlcjo6Q2Fub25pY2Fs UGF0aCAqY2Fub25pY2FsX3BhdGggPSBudWxscHRyOw0KPj4gKyAgb2sgPSBjdHgtPmdldF9t YXBwaW5ncyAoKS0+bG9va3VwX2Nhbm9uaWNhbF9wYXRoICgNCj4+ICsgICAgY29uc3RhbnQu Z2V0X21hcHBpbmdzICgpLmdldF9ub2RlaWQgKCksICZjYW5vbmljYWxfcGF0aCk7DQo+PiAr ICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgSElSOjpFeHByICpjb25zdF92YWx1 ZV9leHByID0gY29uc3RhbnQuZ2V0X2V4cHIgKCk7DQo+PiArICBjdHgtPnB1c2hfY29uc3Rf Y29udGV4dCAoKTsNCj4+ICsgIHRyZWUgY29uc3RfZXhwcg0KPj4gKyAgICA9IGNvbXBpbGVf Y29uc3RhbnRfaXRlbSAoY3R4LCByZXNvbHZlZF90eXBlLCBjYW5vbmljYWxfcGF0aCwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdmFsdWVfZXhwciwgY29uc3Rh bnQuZ2V0X2xvY3VzICgpKTsNCj4+ICsgIGN0eC0+cG9wX2NvbnN0X2NvbnRleHQgKCk7DQo+ PiArDQo+PiArICBjdHgtPnB1c2hfY29uc3QgKGNvbnN0X2V4cHIpOw0KPj4gKyAgY3R4LT5p bnNlcnRfY29uc3RfZGVjbCAoY29uc3RhbnQuZ2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAo KSwgY29uc3RfZXhwcik7DQo+PiArICByZWZlcmVuY2UgPSBjb25zdF9leHByOw0KPj4gK30N Cj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUl0ZW06OnZpc2l0IChISVI6OkZ1bmN0aW9u ICZmdW5jdGlvbikNCj4+ICt7DQo+PiArICBUeVR5OjpCYXNlVHlwZSAqZm50eXBlX3R5dHk7 DQo+PiArICBpZiAoIWN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAoZnVuY3Rpb24u Z2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICZmbnR5cGVfdHl0eSkpDQo+PiArICAgIHsNCj4+ICsgICAg ICBydXN0X2ZhdGFsX2Vycm9yIChmdW5jdGlvbi5nZXRfbG9jdXMgKCksDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGxvb2t1cCBmdW5jdGlvbiB0eXBlIik7DQo+ PiArICAgICAgcmV0dXJuOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICBydXN0X2Fzc2VydCAo Zm50eXBlX3R5dHktPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpGTkRFRik7DQo+ PiArICBUeVR5OjpGblR5cGUgKmZudHlwZSA9IHN0YXRpY19jYXN0PFR5VHk6OkZuVHlwZSAq PiAoZm50eXBlX3R5dHkpOw0KPj4gKyAgaWYgKGZudHlwZS0+aGFzX3N1YnNpdGl0aW9uc19k ZWZpbmVkICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgLy8gd2UgY2FudCBkbyBhbnl0aGlu ZyBmb3IgdGhpcyBvbmx5IHdoZW4gaXQgaXMgdXNlZCBhbmQgYSBjb25jcmV0ZSB0eXBlDQo+ PiArICAgICAgLy8gaXMgZ2l2ZW4NCj4+ICsgICAgICBpZiAoY29uY3JldGUgPT0gbnVsbHB0 cikNCj4+ICsgICAgICAgcmV0dXJuOw0KPj4gKyAgICAgIGVsc2UNCj4+ICsgICAgICAgew0K Pj4gKyAgICAgICAgIHJ1c3RfYXNzZXJ0IChjb25jcmV0ZS0+Z2V0X2tpbmQgKCkgPT0gVHlU eTo6VHlwZUtpbmQ6OkZOREVGKTsNCj4+ICsgICAgICAgICBmbnR5cGUgPSBzdGF0aWNfY2Fz dDxUeVR5OjpGblR5cGUgKj4gKGNvbmNyZXRlKTsNCj4+ICsgICAgICAgICBmbnR5cGUtPm1v bm9tb3JwaGl6ZSAoKTsNCj4+ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiArDQo+PiArICAv LyBpdGVtcyBjYW4gYmUgZm9yd2FyZCBjb21waWxlZCB3aGljaCBtZWFucyB3ZSBtYXkgbm90 IG5lZWQgdG8gaW52b2tlIHRoaXMNCj4+ICsgIC8vIGNvZGUuIFdlIG1pZ2h0IGFsc28gaGF2 ZSBhbHJlYWR5IGNvbXBpbGVkIHRoaXMgZ2VuZXJpYyBmdW5jdGlvbiBhcyB3ZWxsLg0KPj4g KyAgdHJlZSBsb29rdXAgPSBOVUxMX1RSRUU7DQo+PiArICBpZiAoY3R4LT5sb29rdXBfZnVu Y3Rpb25fZGVjbCAoZm50eXBlLT5nZXRfdHlfcmVmICgpLCAmbG9va3VwLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm50eXBlLT5nZXRfaWQgKCksIGZudHlwZSkp DQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBoYXMgdGhpcyBiZWVuIGFkZGVkIHRvIHRoZSBs aXN0IHRoZW4gaXQgbXVzdCBiZSBmaW5pc2hlZA0KPj4gKyAgICAgIGlmIChjdHgtPmZ1bmN0 aW9uX2NvbXBsZXRlZCAobG9va3VwKSkNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAgIHRy ZWUgZHVtbXkgPSBOVUxMX1RSRUU7DQo+PiArICAgICAgICAgaWYgKCFjdHgtPmxvb2t1cF9m dW5jdGlvbl9kZWNsIChmbnR5cGUtPmdldF90eV9yZWYgKCksICZkdW1teSkpDQo+PiArICAg ICAgICAgICB7DQo+PiArICAgICAgICAgICAgIGN0eC0+aW5zZXJ0X2Z1bmN0aW9uX2RlY2wg KGZudHlwZSwgbG9va3VwKTsNCj4+ICsgICAgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAg ICByZWZlcmVuY2UgPSBhZGRyZXNzX2V4cHJlc3Npb24gKGxvb2t1cCwgcmVmX2xvY3VzKTsN Cj4+ICsgICAgICAgICByZXR1cm47DQo+PiArICAgICAgIH0NCj4+ICsgICAgfQ0KPj4gKw0K Pj4gKyAgaWYgKGZudHlwZS0+aGFzX3N1YnNpdGl0aW9uc19kZWZpbmVkICgpKQ0KPj4gKyAg ICB7DQo+PiArICAgICAgLy8gb3ZlcnJpZGUgdGhlIEhpciBMb29rdXBzIGZvciB0aGUgc3Vi c3RpdHVpb25zIGluIHRoaXMgY29udGV4dA0KPj4gKyAgICAgIGZudHlwZS0+b3ZlcnJpZGVf Y29udGV4dCAoKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgY29uc3QgUmVzb2x2ZXI6OkNh bm9uaWNhbFBhdGggKmNhbm9uaWNhbF9wYXRoID0gbnVsbHB0cjsNCj4+ICsgIGJvb2wgb2sg PSBjdHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX2Nhbm9uaWNhbF9wYXRoICgNCj4+ICsg ICAgZnVuY3Rpb24uZ2V0X21hcHBpbmdzICgpLmdldF9ub2RlaWQgKCksICZjYW5vbmljYWxf cGF0aCk7DQo+PiArICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgdHJlZSBmbmRl Y2wNCj4+ICsgICAgPSBjb21waWxlX2Z1bmN0aW9uIChjdHgsIGZ1bmN0aW9uLmdldF9mdW5j dGlvbl9uYW1lICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uZ2V0 X3NlbGZfcGFyYW0gKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi5n ZXRfZnVuY3Rpb25fcGFyYW1zICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgZnVu Y3Rpb24uZ2V0X3F1YWxpZmllcnMgKCksIGZ1bmN0aW9uLmdldF92aXNpYmlsaXR5ICgpLA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uZ2V0X291dGVyX2F0dHJzICgp LCBmdW5jdGlvbi5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICBm dW5jdGlvbi5nZXRfZGVmaW5pdGlvbiAoKS5nZXQgKCksIGNhbm9uaWNhbF9wYXRoLA0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAgZm50eXBlLCBmdW5jdGlvbi5oYXNfZnVuY3Rpb25f cmV0dXJuX3R5cGUgKCkpOw0KPj4gKyAgcmVmZXJlbmNlID0gYWRkcmVzc19leHByZXNzaW9u IChmbmRlY2wsIHJlZl9sb2N1cyk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21w aWxlSXRlbTo6dmlzaXQgKEhJUjo6SW1wbEJsb2NrICZpbXBsX2Jsb2NrKQ0KPj4gK3sNCj4+ ICsgIFR5VHk6OkJhc2VUeXBlICpzZWxmX2xvb2t1cCA9IG51bGxwdHI7DQo+PiArICBpZiAo IWN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAoDQo+PiArICAgICAgIGltcGxfYmxv Y2suZ2V0X3R5cGUgKCktPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZzZWxmX2xv b2t1cCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBydXN0X2Vycm9yX2F0IChpbXBsX2Jsb2Nr LmdldF9sb2N1cyAoKSwgImZhaWxlZCB0byByZXNvbHZlIHR5cGUgb2YgaW1wbCIpOw0KPj4g KyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgZm9yIChhdXRvICZpbXBs X2l0ZW0gOiBpbXBsX2Jsb2NrLmdldF9pbXBsX2l0ZW1zICgpKQ0KPj4gKyAgICBDb21waWxl SW5oZXJlbnRJbXBsSXRlbTo6Q29tcGlsZSAoaW1wbF9pdGVtLmdldCAoKSwgY3R4KTsNCj4+ ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVJdGVtOjp2aXNpdCAoSElSOjpFeHRl cm5CbG9jayAmZXh0ZXJuX2Jsb2NrKQ0KPj4gK3sNCj4+ICsgIGZvciAoYXV0byAmaXRlbSA6 IGV4dGVybl9ibG9jay5nZXRfZXh0ZXJuX2l0ZW1zICgpKQ0KPj4gKyAgICB7DQo+PiArICAg ICAgQ29tcGlsZUV4dGVybkl0ZW06OmNvbXBpbGUgKGl0ZW0uZ2V0ICgpLCBjdHgsIGNvbmNy ZXRlKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZUl0 ZW06OnZpc2l0IChISVI6Ok1vZHVsZSAmbW9kdWxlKQ0KPj4gK3sNCj4+ICsgIGZvciAoYXV0 byAmaXRlbSA6IG1vZHVsZS5nZXRfaXRlbXMgKCkpDQo+PiArICAgIENvbXBpbGVJdGVtOjpj b21waWxlIChpdGVtLmdldCAoKSwgY3R4KTsNCj4+ICt9DQo+PiArDQo+PiArfSAvLyBuYW1l c3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+IGRpZmYgLS1naXQg YS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1pdGVtLmggYi9nY2MvcnVzdC9iYWNr ZW5kL3J1c3QtY29tcGlsZS1pdGVtLmgNCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBp bmRleCAwMDAwMDAwMDAwMC4uM2MxMmYxMDQwZmMNCj4+IC0tLSAvZGV2L251bGwNCj4+ICsr KyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLWl0ZW0uaA0KPj4gQEAgLTAsMCAr MSw4OCBAQA0KPj4gKy8vIENvcHlyaWdodCAoQykgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLg0KPj4gKw0KPj4gKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdD Qy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KPj4gKy8vIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl DQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsvLyB2ZXJzaW9uLg0KPj4gKw0KPj4gKy8v IEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcg0KPj4gKy8vIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFpbHMuDQo+PiArDQo+PiArLy8gWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAg SWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+ ICsNCj4+ICsjaWZuZGVmIFJVU1RfQ09NUElMRV9JVEVNDQo+PiArI2RlZmluZSBSVVNUX0NP TVBJTEVfSVRFTQ0KPj4gKw0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtYmFzZS5oIg0K Pj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2UgQ29tcGlsZSB7DQo+ PiArDQo+PiArY2xhc3MgQ29tcGlsZUl0ZW0gOiBwcml2YXRlIEhJUkNvbXBpbGVCYXNlLCBw cm90ZWN0ZWQgSElSOjpISVJTdG10VmlzaXRvcg0KPj4gK3sNCj4+ICtwcm90ZWN0ZWQ6DQo+ PiArcHVibGljOg0KPj4gKyAgc3RhdGljIHRyZWUgY29tcGlsZSAoSElSOjpJdGVtICppdGVt LCBDb250ZXh0ICpjdHgsDQo+PiArICAgICAgICAgICAgICAgICAgICAgIFR5VHk6OkJhc2VU eXBlICpjb25jcmV0ZSA9IG51bGxwdHIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgIGJv b2wgaXNfcXVlcnlfbW9kZSA9IGZhbHNlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICBM b2NhdGlvbiByZWZfbG9jdXMgPSBMb2NhdGlvbiAoKSkNCj4+ICsgIHsNCj4+ICsgICAgQ29t cGlsZUl0ZW0gY29tcGlsZXIgKGN0eCwgY29uY3JldGUsIHJlZl9sb2N1cyk7DQo+PiArICAg IGl0ZW0tPmFjY2VwdF92aXMgKGNvbXBpbGVyKTsNCj4+ICsNCj4+ICsgICAgaWYgKGlzX3F1 ZXJ5X21vZGUgJiYgY29tcGlsZXIucmVmZXJlbmNlID09IGVycm9yX21hcmtfbm9kZSkNCj4+ ICsgICAgICBydXN0X2ludGVybmFsX2Vycm9yX2F0IChyZWZfbG9jdXMsICJmYWlsZWQgdG8g Y29tcGlsZSBpdGVtOiAlcyIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp dGVtLT5hc19zdHJpbmcgKCkuY19zdHIgKCkpOw0KPj4gKw0KPj4gKyAgICByZXR1cm4gY29t cGlsZXIucmVmZXJlbmNlOw0KPj4gKyAgfQ0KPj4gKw0KPj4gKyAgdm9pZCB2aXNpdCAoSElS OjpTdGF0aWNJdGVtICZ2YXIpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpD b25zdGFudEl0ZW0gJmNvbnN0YW50KSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJ Ujo6RnVuY3Rpb24gJmZ1bmN0aW9uKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJ Ujo6SW1wbEJsb2NrICZpbXBsX2Jsb2NrKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6RXh0ZXJuQmxvY2sgJmV4dGVybl9ibG9jaykgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChISVI6Ok1vZHVsZSAmbW9kdWxlKSBvdmVycmlkZTsNCj4+ICsNCj4+ICsgIC8v IEVtcHR5IHZpc2l0IGZvciB1bnVzZWQgU3RtdCBISVIgbm9kZXMuDQo+PiArICB2b2lkIHZp c2l0IChISVI6OlR1cGxlU3RydWN0ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0 IChISVI6OkVudW1JdGVtICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6 OkVudW1JdGVtVHVwbGUgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 RW51bUl0ZW1TdHJ1Y3QgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 RW51bUl0ZW1EaXNjcmltaW5hbnQgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6VHlwZVBhdGhTZWdtZW50RnVuY3Rpb24gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZv aWQgdmlzaXQgKEhJUjo6VHlwZVBhdGggJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlz aXQgKEhJUjo6UXVhbGlmaWVkUGF0aEluVHlwZSAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9p ZCB2aXNpdCAoSElSOjpFeHRlcm5DcmF0ZSAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2 aXNpdCAoSElSOjpVc2VEZWNsYXJhdGlvbiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2 aXNpdCAoSElSOjpUeXBlQWxpYXMgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6U3RydWN0U3RydWN0ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChI SVI6OkVudW0gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6VW5pb24g Jikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6VHJhaXQgJikgb3ZlcnJp ZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6RW1wdHlTdG10ICYpIG92ZXJyaWRlIHt9 DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkxldFN0bXQgJikgb3ZlcnJpZGUge30NCj4+ICsg IHZvaWQgdmlzaXQgKEhJUjo6RXhwclN0bXRXaXRob3V0QmxvY2sgJikgb3ZlcnJpZGUge30N Cj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6RXhwclN0bXRXaXRoQmxvY2sgJikgb3ZlcnJpZGUg e30NCj4+ICsNCj4+ICtwcm90ZWN0ZWQ6DQo+PiArICBDb21waWxlSXRlbSAoQ29udGV4dCAq Y3R4LCBUeVR5OjpCYXNlVHlwZSAqY29uY3JldGUsIExvY2F0aW9uIHJlZl9sb2N1cykNCj4+ ICsgICAgOiBISVJDb21waWxlQmFzZSAoY3R4KSwgY29uY3JldGUgKGNvbmNyZXRlKSwgcmVm ZXJlbmNlIChlcnJvcl9tYXJrX25vZGUpLA0KPj4gKyAgICAgIHJlZl9sb2N1cyAocmVmX2xv Y3VzKQ0KPj4gKyAge30NCj4+ICsNCj4+ICsgIFR5VHk6OkJhc2VUeXBlICpjb25jcmV0ZTsN Cj4+ICsgIHRyZWUgcmVmZXJlbmNlOw0KPj4gKyAgTG9jYXRpb24gcmVmX2xvY3VzOw0KPj4g K307DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNw YWNlIFJ1c3QNCj4+ICsNCj4+ICsjZW5kaWYgLy8gUlVTVF9DT01QSUxFX0lURU0NCj4+IGRp ZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1wYXR0ZXJuLmNjIGIv Z2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtcGF0dGVybi5jYw0KPj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi4xZDhlZGExYTU3Nw0KPj4gLS0t IC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtcGF0 dGVybi5jYw0KPj4gQEAgLTAsMCArMSwzMzMgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIw MjAtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsvLyBU aGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIN Cj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiArLy8g dmVyc2lvbi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJ VFkgb3INCj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxz Lg0KPj4gKw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNl ZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5n bnUub3JnL2xpY2Vuc2VzLz4uDQo+PiArDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1w YXR0ZXJuLmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1leHByLmgiDQo+PiArI2lu Y2x1ZGUgInJ1c3QtY29tcGlsZS1yZXNvbHZlLXBhdGguaCINCj4+ICsjaW5jbHVkZSAicnVz dC1jb25zdGV4cHIuaCINCj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArbmFtZXNw YWNlIENvbXBpbGUgew0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlUGF0dGVybkNhc2VM YWJlbEV4cHI6OnZpc2l0IChISVI6OlBhdGhJbkV4cHJlc3Npb24gJnBhdHRlcm4pDQo+PiAr ew0KPj4gKyAgLy8gbG9va3VwIHRoZSB0eXBlDQo+PiArICBUeVR5OjpCYXNlVHlwZSAqbG9v a3VwID0gbnVsbHB0cjsNCj4+ICsgIGJvb2wgb2sNCj4+ICsgICAgPSBjdHgtPmdldF90eWN0 eCAoKS0+bG9va3VwX3R5cGUgKHBhdHRlcm4uZ2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAo KSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvb2t1cCk7 DQo+PiArICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgLy8gdGhpcyBtdXN0IGJl IGFuIGVudW0NCj4+ICsgIHJ1c3RfYXNzZXJ0IChsb29rdXAtPmdldF9raW5kICgpID09IFR5 VHk6OlR5cGVLaW5kOjpBRFQpOw0KPj4gKyAgVHlUeTo6QURUVHlwZSAqYWR0ID0gc3RhdGlj X2Nhc3Q8VHlUeTo6QURUVHlwZSAqPiAobG9va3VwKTsNCj4+ICsgIHJ1c3RfYXNzZXJ0IChh ZHQtPmlzX2VudW0gKCkpOw0KPj4gKw0KPj4gKyAgLy8gbG9va3VwIHRoZSB2YXJpYW50DQo+ PiArICBIaXJJZCB2YXJpYW50X2lkOw0KPj4gKyAgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+ bG9va3VwX3ZhcmlhbnRfZGVmaW5pdGlvbiAoDQo+PiArICAgIHBhdHRlcm4uZ2V0X21hcHBp bmdzICgpLmdldF9oaXJpZCAoKSwgJnZhcmlhbnRfaWQpOw0KPj4gKyAgcnVzdF9hc3NlcnQg KG9rKTsNCj4+ICsNCj4+ICsgIFR5VHk6OlZhcmlhbnREZWYgKnZhcmlhbnQgPSBudWxscHRy Ow0KPj4gKyAgb2sgPSBhZHQtPmxvb2t1cF92YXJpYW50X2J5X2lkICh2YXJpYW50X2lkLCAm dmFyaWFudCk7DQo+PiArICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgSElSOjpF eHByICpkaXNjcmltX2V4cHIgPSB2YXJpYW50LT5nZXRfZGlzY3JpbWluYW50ICgpOw0KPj4g KyAgdHJlZSBkaXNjcmltX2V4cHJfbm9kZSA9IENvbXBpbGVFeHByOjpDb21waWxlIChkaXNj cmltX2V4cHIsIGN0eCk7DQo+PiArICB0cmVlIGZvbGRlZF9kaXNjcmltX2V4cHIgPSBmb2xk X2V4cHIgKGRpc2NyaW1fZXhwcl9ub2RlKTsNCj4+ICsgIHRyZWUgY2FzZV9sb3cgPSBmb2xk ZWRfZGlzY3JpbV9leHByOw0KPj4gKw0KPj4gKyAgY2FzZV9sYWJlbF9leHByDQo+PiArICAg ID0gYnVpbGRfY2FzZV9sYWJlbCAoY2FzZV9sb3csIE5VTExfVFJFRSwgYXNzb2NpYXRlZF9j YXNlX2xhYmVsKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVQYXR0ZXJu Q2FzZUxhYmVsRXhwcjo6dmlzaXQgKEhJUjo6U3RydWN0UGF0dGVybiAmcGF0dGVybikNCj4+ ICt7DQo+PiArICBDb21waWxlUGF0dGVybkNhc2VMYWJlbEV4cHI6OnZpc2l0IChwYXR0ZXJu LmdldF9wYXRoICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVQYXR0 ZXJuQ2FzZUxhYmVsRXhwcjo6dmlzaXQgKEhJUjo6VHVwbGVTdHJ1Y3RQYXR0ZXJuICZwYXR0 ZXJuKQ0KPj4gK3sNCj4+ICsgIENvbXBpbGVQYXR0ZXJuQ2FzZUxhYmVsRXhwcjo6dmlzaXQg KHBhdHRlcm4uZ2V0X3BhdGggKCkpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29t cGlsZVBhdHRlcm5DYXNlTGFiZWxFeHByOjp2aXNpdCAoSElSOjpXaWxkY2FyZFBhdHRlcm4g JnBhdHRlcm4pDQo+PiArew0KPj4gKyAgLy8gb3BlcmFuZCAwIGJlaW5nIE5VTExfVFJFRSBz aWduaWZpZXMgdGhpcyBpcyB0aGUgZGVmYXVsdCBjYXNlIGxhYmVsIHNlZToNCj4+ICsgIC8v IHRyZWUuZGVmIGZvciBkb2N1bWVudGF0aW9uIGZvciBDQVNFX0xBQkVMX0VYUFINCj4+ICsg IGNhc2VfbGFiZWxfZXhwcg0KPj4gKyAgICA9IGJ1aWxkX2Nhc2VfbGFiZWwgKE5VTExfVFJF RSwgTlVMTF9UUkVFLCBhc3NvY2lhdGVkX2Nhc2VfbGFiZWwpOw0KPj4gK30NCj4+ICsNCj4+ ICt2b2lkDQo+PiArQ29tcGlsZVBhdHRlcm5DYXNlTGFiZWxFeHByOjp2aXNpdCAoSElSOjpM aXRlcmFsUGF0dGVybiAmcGF0dGVybikNCj4+ICt7DQo+PiArICAvLyBDb21waWxlIHRoZSBs aXRlcmFsDQo+PiArICBISVI6OkxpdGVyYWxFeHByICpsaXRleHByDQo+PiArICAgID0gbmV3 IEhJUjo6TGl0ZXJhbEV4cHIgKHBhdHRlcm4uZ2V0X3BhdHRlcm5fbWFwcGluZ3MgKCksDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5nZXRfbGl0ZXJhbCAoKSwg cGF0dGVybi5nZXRfbG9jdXMgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RkOjp2ZWN0b3I8QVNUOjpBdHRyaWJ1dGU+ICgpKTsNCj4+ICsNCj4+ICsgIC8vIE5vdGU6 IEZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBjdXJyZW50bHkgYWNjZXB0ZWQgYnV0IHdp bGwgbGlrZWx5IGJlDQo+PiArICAvLyBmb3JiaWRkZW4gaW4gTGl0ZXJhbFBhdHRlcm5zIGlu IGEgZnV0dXJlIHZlcnNpb24gb2YgUnVzdC4NCj4+ICsgIC8vIFNlZTogaHR0cHM6Ly9naXRo dWIuY29tL3J1c3QtbGFuZy9ydXN0L2lzc3Vlcy80MTYyMA0KPj4gKyAgLy8gRm9yIG5vdywg d2UgY2Fubm90IGNvbXBpbGUgdGhlbSBhbnl3YXkgYXMgQ0FTRV9MQUJFTF9FWFBSIGRvZXMg bm90IHN1cHBvcnQNCj4+ICsgIC8vIGZsb2F0aW5nIHBvaW50IHR5cGVzLg0KPj4gKyAgaWYg KHBhdHRlcm4uZ2V0X2xpdGVyYWwgKCkuZ2V0X2xpdF90eXBlICgpID09IEhJUjo6TGl0ZXJh bDo6TGl0VHlwZTo6RkxPQVQpDQo+PiArICAgIHsNCj4+ICsgICAgICBydXN0X3NvcnJ5X2F0 IChwYXR0ZXJuLmdldF9sb2N1cyAoKSwgImZsb2F0aW5nLXBvaW50IGxpdGVyYWwgaW4gcGF0 dGVybiIpOw0KPj4gKyAgICB9DQo+PiArDQo+PiArICB0cmVlIGxpdCA9IENvbXBpbGVFeHBy OjpDb21waWxlIChsaXRleHByLCBjdHgpOw0KPj4gKw0KPj4gKyAgY2FzZV9sYWJlbF9leHBy ID0gYnVpbGRfY2FzZV9sYWJlbCAobGl0LCBOVUxMX1RSRUUsIGFzc29jaWF0ZWRfY2FzZV9s YWJlbCk7DQo+PiArfQ0KPj4gKw0KPj4gK3N0YXRpYyB0cmVlDQo+PiArY29tcGlsZV9yYW5n ZV9wYXR0ZXJuX2JvdW5kIChISVI6OlJhbmdlUGF0dGVybkJvdW5kICpib3VuZCwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbHlzaXM6Ok5vZGVNYXBwaW5nIG1hcHBp bmdzLCBMb2NhdGlvbiBsb2N1cywNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg Q29udGV4dCAqY3R4KQ0KPj4gK3sNCj4+ICsgIHRyZWUgcmVzdWx0ID0gTlVMTF9UUkVFOw0K Pj4gKyAgc3dpdGNoIChib3VuZC0+Z2V0X2JvdW5kX3R5cGUgKCkpDQo+PiArICAgIHsNCj4+ ICsgICAgICBjYXNlIEhJUjo6UmFuZ2VQYXR0ZXJuQm91bmQ6OlJhbmdlUGF0dGVybkJvdW5k VHlwZTo6TElURVJBTDogew0KPj4gKyAgICAgICBISVI6OlJhbmdlUGF0dGVybkJvdW5kTGl0 ZXJhbCAmcmVmDQo+PiArICAgICAgICAgPSAqc3RhdGljX2Nhc3Q8SElSOjpSYW5nZVBhdHRl cm5Cb3VuZExpdGVyYWwgKj4gKGJvdW5kKTsNCj4+ICsNCj4+ICsgICAgICAgSElSOjpMaXRl cmFsRXhwciAqbGl0ZXhwcg0KPj4gKyAgICAgICAgID0gbmV3IEhJUjo6TGl0ZXJhbEV4cHIg KG1hcHBpbmdzLCByZWYuZ2V0X2xpdGVyYWwgKCksIGxvY3VzLA0KPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFTVDo6QXR0cmlidXRlPiAoKSk7 DQo+PiArDQo+PiArICAgICAgIHJlc3VsdCA9IENvbXBpbGVFeHByOjpDb21waWxlIChsaXRl eHByLCBjdHgpOw0KPj4gKyAgICAgIH0NCj4+ICsgICAgICBicmVhazsNCj4+ICsNCj4+ICsg ICAgICBjYXNlIEhJUjo6UmFuZ2VQYXR0ZXJuQm91bmQ6OlJhbmdlUGF0dGVybkJvdW5kVHlw ZTo6UEFUSDogew0KPj4gKyAgICAgICBISVI6OlJhbmdlUGF0dGVybkJvdW5kUGF0aCAmcmVm DQo+PiArICAgICAgICAgPSAqc3RhdGljX2Nhc3Q8SElSOjpSYW5nZVBhdHRlcm5Cb3VuZFBh dGggKj4gKGJvdW5kKTsNCj4+ICsNCj4+ICsgICAgICAgcmVzdWx0ID0gUmVzb2x2ZVBhdGhS ZWY6OkNvbXBpbGUgKHJlZi5nZXRfcGF0aCAoKSwgY3R4KTsNCj4+ICsNCj4+ICsgICAgICAg Ly8gSWYgdGhlIHBhdGggcmVzb2x2ZXMgdG8gYSBjb25zdCBleHByZXNzaW9uLCBmb2xkIGl0 Lg0KPj4gKyAgICAgICByZXN1bHQgPSBmb2xkX2V4cHIgKHJlc3VsdCk7DQo+PiArICAgICAg fQ0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICAgIGNhc2UgSElSOjpSYW5nZVBh dHRlcm5Cb3VuZDo6UmFuZ2VQYXR0ZXJuQm91bmRUeXBlOjpRVUFMUEFUSDogew0KPj4gKyAg ICAgICBISVI6OlJhbmdlUGF0dGVybkJvdW5kUXVhbFBhdGggJnJlZg0KPj4gKyAgICAgICAg ID0gKnN0YXRpY19jYXN0PEhJUjo6UmFuZ2VQYXR0ZXJuQm91bmRRdWFsUGF0aCAqPiAoYm91 bmQpOw0KPj4gKw0KPj4gKyAgICAgICByZXN1bHQgPSBSZXNvbHZlUGF0aFJlZjo6Q29tcGls ZSAocmVmLmdldF9xdWFsaWZpZWRfcGF0aCAoKSwgY3R4KTsNCj4+ICsNCj4+ICsgICAgICAg Ly8gSWYgdGhlIHBhdGggcmVzb2x2ZXMgdG8gYSBjb25zdCBleHByZXNzaW9uLCBmb2xkIGl0 Lg0KPj4gKyAgICAgICByZXN1bHQgPSBmb2xkX2V4cHIgKHJlc3VsdCk7DQo+PiArICAgICAg fQ0KPj4gKyAgICB9DQo+PiArDQo+PiArICByZXR1cm4gcmVzdWx0Ow0KPj4gK30NCj4+ICsN Cj4+ICt2b2lkDQo+PiArQ29tcGlsZVBhdHRlcm5DYXNlTGFiZWxFeHByOjp2aXNpdCAoSElS OjpSYW5nZVBhdHRlcm4gJnBhdHRlcm4pDQo+PiArew0KPj4gKyAgdHJlZSB1cHBlciA9IGNv bXBpbGVfcmFuZ2VfcGF0dGVybl9ib3VuZCAocGF0dGVybi5nZXRfdXBwZXJfYm91bmQgKCku Z2V0ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwYXR0ZXJuLmdldF9wYXR0ZXJuX21hcHBpbmdzICgpLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmdldF9sb2N1cyAoKSwgY3R4 KTsNCj4+ICsgIHRyZWUgbG93ZXIgPSBjb21waWxlX3JhbmdlX3BhdHRlcm5fYm91bmQgKHBh dHRlcm4uZ2V0X2xvd2VyX2JvdW5kICgpLmdldCAoKSwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5nZXRfcGF0dGVybl9tYXBwaW5n cyAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cGF0dGVybi5nZXRfbG9jdXMgKCksIGN0eCk7DQo+PiArDQo+PiArICBjYXNlX2xhYmVsX2V4 cHIgPSBidWlsZF9jYXNlX2xhYmVsIChsb3dlciwgdXBwZXIsIGFzc29jaWF0ZWRfY2FzZV9s YWJlbCk7DQo+PiArfQ0KPj4gKw0KPj4gKy8vIHNldHVwIHRoZSBiaW5kaW5ncw0KPj4gKw0K Pj4gK3ZvaWQNCj4+ICtDb21waWxlUGF0dGVybkJpbmRpbmdzOjp2aXNpdCAoSElSOjpUdXBs ZVN0cnVjdFBhdHRlcm4gJnBhdHRlcm4pDQo+PiArew0KPj4gKyAgLy8gbG9va3VwIHRoZSB0 eXBlDQo+PiArICBUeVR5OjpCYXNlVHlwZSAqbG9va3VwID0gbnVsbHB0cjsNCj4+ICsgIGJv b2wgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKA0KPj4gKyAgICBwYXR0 ZXJuLmdldF9wYXRoICgpLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZsb29rdXAp Ow0KPj4gKyAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ICsgIC8vIHRoaXMgbXVzdCBi ZSBhbiBlbnVtDQo+PiArICBydXN0X2Fzc2VydCAobG9va3VwLT5nZXRfa2luZCAoKSA9PSBU eVR5OjpUeXBlS2luZDo6QURUKTsNCj4+ICsgIFR5VHk6OkFEVFR5cGUgKmFkdCA9IHN0YXRp Y19jYXN0PFR5VHk6OkFEVFR5cGUgKj4gKGxvb2t1cCk7DQo+PiArICBydXN0X2Fzc2VydCAo YWR0LT5udW1iZXJfb2ZfdmFyaWFudHMgKCkgPiAwKTsNCj4+ICsNCj4+ICsgIGludCB2YXJp YW50X2luZGV4ID0gMDsNCj4+ICsgIFR5VHk6OlZhcmlhbnREZWYgKnZhcmlhbnQgPSBhZHQt PmdldF92YXJpYW50cyAoKS5hdCAoMCk7DQo+PiArICBpZiAoYWR0LT5pc19lbnVtICgpKQ0K Pj4gKyAgICB7DQo+PiArICAgICAgSGlySWQgdmFyaWFudF9pZCA9IFVOS05PV05fSElSSUQ7 DQo+PiArICAgICAgYm9vbCBvayA9IGN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdmFyaWFu dF9kZWZpbml0aW9uICgNCj4+ICsgICAgICAgcGF0dGVybi5nZXRfcGF0aCAoKS5nZXRfbWFw cGluZ3MgKCkuZ2V0X2hpcmlkICgpLCAmdmFyaWFudF9pZCk7DQo+PiArICAgICAgcnVzdF9h c3NlcnQgKG9rKTsNCj4+ICsNCj4+ICsgICAgICBvayA9IGFkdC0+bG9va3VwX3ZhcmlhbnRf YnlfaWQgKHZhcmlhbnRfaWQsICZ2YXJpYW50LCAmdmFyaWFudF9pbmRleCk7DQo+PiArICAg ICAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcnVzdF9hc3Nl cnQgKHZhcmlhbnQtPmdldF92YXJpYW50X3R5cGUgKCkNCj4+ICsgICAgICAgICAgICAgID09 IFR5VHk6OlZhcmlhbnREZWY6OlZhcmlhbnRUeXBlOjpUVVBMRSk7DQo+PiArDQo+PiArICBz dGQ6OnVuaXF1ZV9wdHI8SElSOjpUdXBsZVN0cnVjdEl0ZW1zPiAmaXRlbXMgPSBwYXR0ZXJu LmdldF9pdGVtcyAoKTsNCj4+ICsgIHN3aXRjaCAoaXRlbXMtPmdldF9pdGVtX3R5cGUgKCkp DQo+PiArICAgIHsNCj4+ICsgICAgICBjYXNlIEhJUjo6VHVwbGVTdHJ1Y3RJdGVtczo6UkFO R0U6IHsNCj4+ICsgICAgICAgLy8gVE9ETw0KPj4gKyAgICAgICBnY2NfdW5yZWFjaGFibGUg KCk7DQo+PiArICAgICAgfQ0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0KPj4gKyAgICAgIGNh c2UgSElSOjpUdXBsZVN0cnVjdEl0ZW1zOjpOT19SQU5HRTogew0KPj4gKyAgICAgICBISVI6 OlR1cGxlU3RydWN0SXRlbXNOb1JhbmdlICZpdGVtc19ub19yYW5nZQ0KPj4gKyAgICAgICAg ID0gc3RhdGljX2Nhc3Q8SElSOjpUdXBsZVN0cnVjdEl0ZW1zTm9SYW5nZSAmPiAoKml0ZW1z LmdldCAoKSk7DQo+PiArDQo+PiArICAgICAgIHJ1c3RfYXNzZXJ0IChpdGVtc19ub19yYW5n ZS5nZXRfcGF0dGVybnMgKCkuc2l6ZSAoKQ0KPj4gKyAgICAgICAgICAgICAgICAgICAgPT0g dmFyaWFudC0+bnVtX2ZpZWxkcyAoKSk7DQo+PiArDQo+PiArICAgICAgIGlmIChhZHQtPmlz X2VudW0gKCkpDQo+PiArICAgICAgICAgew0KPj4gKyAgICAgICAgICAgLy8gd2UgYXJlIG9m ZnNldHRpbmcgYnkgKyAxIGhlcmUgc2luY2UgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSByZWNv cmQNCj4+ICsgICAgICAgICAgIC8vIGlzIGFsd2F5cyB0aGUgZGlzY3JpbWluYXRvcg0KPj4g KyAgICAgICAgICAgc2l6ZV90IHR1cGxlX2ZpZWxkX2luZGV4ID0gMTsNCj4+ICsgICAgICAg ICAgIGZvciAoYXV0byAmcGF0dGVybiA6IGl0ZW1zX25vX3JhbmdlLmdldF9wYXR0ZXJucyAo KSkNCj4+ICsgICAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAgICAgIHRyZWUgdmFyaWFu dF9hY2Nlc3Nvcg0KPj4gKyAgICAgICAgICAgICAgICAgPSBjdHgtPmdldF9iYWNrZW5kICgp LT5zdHJ1Y3RfZmllbGRfZXhwcmVzc2lvbiAoDQo+PiArICAgICAgICAgICAgICAgICAgIG1h dGNoX3NjcnV0aW5lZV9leHByLCB2YXJpYW50X2luZGV4LCBwYXR0ZXJuLT5nZXRfbG9jdXMg KCkpOw0KPj4gKw0KPj4gKyAgICAgICAgICAgICAgIHRyZWUgYmluZGluZyA9IGN0eC0+Z2V0 X2JhY2tlbmQgKCktPnN0cnVjdF9maWVsZF9leHByZXNzaW9uICgNCj4+ICsgICAgICAgICAg ICAgICAgIHZhcmlhbnRfYWNjZXNzb3IsIHR1cGxlX2ZpZWxkX2luZGV4KyssIHBhdHRlcm4t PmdldF9sb2N1cyAoKSk7DQo+PiArDQo+PiArICAgICAgICAgICAgICAgY3R4LT5pbnNlcnRf cGF0dGVybl9iaW5kaW5nICgNCj4+ICsgICAgICAgICAgICAgICAgIHBhdHRlcm4tPmdldF9w YXR0ZXJuX21hcHBpbmdzICgpLmdldF9oaXJpZCAoKSwgYmluZGluZyk7DQo+PiArICAgICAg ICAgICAgIH0NCj4+ICsgICAgICAgICB9DQo+PiArICAgICAgIGVsc2UNCj4+ICsgICAgICAg ICB7DQo+PiArICAgICAgICAgICBzaXplX3QgdHVwbGVfZmllbGRfaW5kZXggPSAwOw0KPj4g KyAgICAgICAgICAgZm9yIChhdXRvICZwYXR0ZXJuIDogaXRlbXNfbm9fcmFuZ2UuZ2V0X3Bh dHRlcm5zICgpKQ0KPj4gKyAgICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgdHJl ZSB2YXJpYW50X2FjY2Vzc29yID0gbWF0Y2hfc2NydXRpbmVlX2V4cHI7DQo+PiArDQo+PiAr ICAgICAgICAgICAgICAgdHJlZSBiaW5kaW5nID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+c3Ry dWN0X2ZpZWxkX2V4cHJlc3Npb24gKA0KPj4gKyAgICAgICAgICAgICAgICAgdmFyaWFudF9h Y2Nlc3NvciwgdHVwbGVfZmllbGRfaW5kZXgrKywgcGF0dGVybi0+Z2V0X2xvY3VzICgpKTsN Cj4+ICsNCj4+ICsgICAgICAgICAgICAgICBjdHgtPmluc2VydF9wYXR0ZXJuX2JpbmRpbmcg KA0KPj4gKyAgICAgICAgICAgICAgICAgcGF0dGVybi0+Z2V0X3BhdHRlcm5fbWFwcGluZ3Mg KCkuZ2V0X2hpcmlkICgpLCBiaW5kaW5nKTsNCj4+ICsgICAgICAgICAgICAgfQ0KPj4gKyAg ICAgICAgIH0NCj4+ICsgICAgICB9DQo+PiArICAgICAgYnJlYWs7DQo+PiArICAgIH0NCj4+ ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBpbGVQYXR0ZXJuQmluZGluZ3M6OnZpc2l0 IChISVI6OlN0cnVjdFBhdHRlcm4gJnBhdHRlcm4pDQo+PiArew0KPj4gKyAgLy8gbG9va3Vw IHRoZSB0eXBlDQo+PiArICBUeVR5OjpCYXNlVHlwZSAqbG9va3VwID0gbnVsbHB0cjsNCj4+ ICsgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKA0KPj4gKyAg ICBwYXR0ZXJuLmdldF9wYXRoICgpLmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZs b29rdXApOw0KPj4gKyAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ICsgIC8vIHRoaXMg bXVzdCBiZSBhbiBlbnVtDQo+PiArICBydXN0X2Fzc2VydCAobG9va3VwLT5nZXRfa2luZCAo KSA9PSBUeVR5OjpUeXBlS2luZDo6QURUKTsNCj4+ICsgIFR5VHk6OkFEVFR5cGUgKmFkdCA9 IHN0YXRpY19jYXN0PFR5VHk6OkFEVFR5cGUgKj4gKGxvb2t1cCk7DQo+PiArICBydXN0X2Fz c2VydCAoYWR0LT5udW1iZXJfb2ZfdmFyaWFudHMgKCkgPiAwKTsNCj4+ICsNCj4+ICsgIGlu dCB2YXJpYW50X2luZGV4ID0gMDsNCj4+ICsgIFR5VHk6OlZhcmlhbnREZWYgKnZhcmlhbnQg PSBhZHQtPmdldF92YXJpYW50cyAoKS5hdCAoMCk7DQo+PiArICBpZiAoYWR0LT5pc19lbnVt ICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgSGlySWQgdmFyaWFudF9pZCA9IFVOS05PV05f SElSSUQ7DQo+PiArICAgICAgYm9vbCBvayA9IGN0eC0+Z2V0X3R5Y3R4ICgpLT5sb29rdXBf dmFyaWFudF9kZWZpbml0aW9uICgNCj4+ICsgICAgICAgcGF0dGVybi5nZXRfcGF0aCAoKS5n ZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLCAmdmFyaWFudF9pZCk7DQo+PiArICAgICAg cnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ICsgICAgICBvayA9IGFkdC0+bG9va3VwX3Zh cmlhbnRfYnlfaWQgKHZhcmlhbnRfaWQsICZ2YXJpYW50LCAmdmFyaWFudF9pbmRleCk7DQo+ PiArICAgICAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgcnVz dF9hc3NlcnQgKHZhcmlhbnQtPmdldF92YXJpYW50X3R5cGUgKCkNCj4+ICsgICAgICAgICAg ICAgID09IFR5VHk6OlZhcmlhbnREZWY6OlZhcmlhbnRUeXBlOjpTVFJVQ1QpOw0KPj4gKw0K Pj4gKyAgYXV0byAmc3RydWN0X3BhdHRlcm5fZWxlbXMgPSBwYXR0ZXJuLmdldF9zdHJ1Y3Rf cGF0dGVybl9lbGVtcyAoKTsNCj4+ICsgIGZvciAoYXV0byAmZmllbGQgOiBzdHJ1Y3RfcGF0 dGVybl9lbGVtcy5nZXRfc3RydWN0X3BhdHRlcm5fZmllbGRzICgpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgc3dpdGNoIChmaWVsZC0+Z2V0X2l0ZW1fdHlwZSAoKSkNCj4+ICsgICAgICAg ew0KPj4gKyAgICAgICAgIGNhc2UgSElSOjpTdHJ1Y3RQYXR0ZXJuRmllbGQ6Okl0ZW1UeXBl OjpUVVBMRV9QQVQ6IHsNCj4+ICsgICAgICAgICAgIC8vIFRPRE8NCj4+ICsgICAgICAgICAg IGdjY191bnJlYWNoYWJsZSAoKTsNCj4+ICsgICAgICAgICB9DQo+PiArICAgICAgICAgYnJl YWs7DQo+PiArDQo+PiArICAgICAgICAgY2FzZSBISVI6OlN0cnVjdFBhdHRlcm5GaWVsZDo6 SXRlbVR5cGU6OklERU5UX1BBVDogew0KPj4gKyAgICAgICAgICAgLy8gVE9ETw0KPj4gKyAg ICAgICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOw0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAg ICAgICBicmVhazsNCj4+ICsNCj4+ICsgICAgICAgICBjYXNlIEhJUjo6U3RydWN0UGF0dGVy bkZpZWxkOjpJdGVtVHlwZTo6SURFTlQ6IHsNCj4+ICsgICAgICAgICAgIEhJUjo6U3RydWN0 UGF0dGVybkZpZWxkSWRlbnQgJmlkZW50DQo+PiArICAgICAgICAgICAgID0gc3RhdGljX2Nh c3Q8SElSOjpTdHJ1Y3RQYXR0ZXJuRmllbGRJZGVudCAmPiAoKmZpZWxkLmdldCAoKSk7DQo+ PiArDQo+PiArICAgICAgICAgICBzaXplX3Qgb2ZmcyA9IDA7DQo+PiArICAgICAgICAgICBv aw0KPj4gKyAgICAgICAgICAgICA9IHZhcmlhbnQtPmxvb2t1cF9maWVsZCAoaWRlbnQuZ2V0 X2lkZW50aWZpZXIgKCksIG51bGxwdHIsICZvZmZzKTsNCj4+ICsgICAgICAgICAgIHJ1c3Rf YXNzZXJ0IChvayk7DQo+PiArDQo+PiArICAgICAgICAgICB0cmVlIGJpbmRpbmcgPSBlcnJv cl9tYXJrX25vZGU7DQo+PiArICAgICAgICAgICBpZiAoYWR0LT5pc19lbnVtICgpKQ0KPj4g KyAgICAgICAgICAgICB7DQo+PiArICAgICAgICAgICAgICAgdHJlZSB2YXJpYW50X2FjY2Vz c29yDQo+PiArICAgICAgICAgICAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnN0cnVj dF9maWVsZF9leHByZXNzaW9uICgNCj4+ICsgICAgICAgICAgICAgICAgICAgbWF0Y2hfc2Ny dXRpbmVlX2V4cHIsIHZhcmlhbnRfaW5kZXgsIGlkZW50LmdldF9sb2N1cyAoKSk7DQo+PiAr DQo+PiArICAgICAgICAgICAgICAgLy8gd2UgYXJlIG9mZnNldHRpbmcgYnkgKyAxIGhlcmUg c2luY2UgdGhlIGZpcnN0IGZpZWxkIGluIHRoZQ0KPj4gKyAgICAgICAgICAgICAgIC8vIHJl Y29yZCBpcyBhbHdheXMgdGhlIGRpc2NyaW1pbmF0b3INCj4+ICsgICAgICAgICAgICAgICBi aW5kaW5nID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+c3RydWN0X2ZpZWxkX2V4cHJlc3Npb24g KA0KPj4gKyAgICAgICAgICAgICAgICAgdmFyaWFudF9hY2Nlc3Nvciwgb2ZmcyArIDEsIGlk ZW50LmdldF9sb2N1cyAoKSk7DQo+PiArICAgICAgICAgICAgIH0NCj4+ICsgICAgICAgICAg IGVsc2UNCj4+ICsgICAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAgICAgIHRyZWUgdmFy aWFudF9hY2Nlc3NvciA9IG1hdGNoX3NjcnV0aW5lZV9leHByOw0KPj4gKyAgICAgICAgICAg ICAgIGJpbmRpbmcgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5zdHJ1Y3RfZmllbGRfZXhwcmVz c2lvbiAoDQo+PiArICAgICAgICAgICAgICAgICB2YXJpYW50X2FjY2Vzc29yLCBvZmZzLCBp ZGVudC5nZXRfbG9jdXMgKCkpOw0KPj4gKyAgICAgICAgICAgICB9DQo+PiArDQo+PiArICAg ICAgICAgICBjdHgtPmluc2VydF9wYXR0ZXJuX2JpbmRpbmcgKGlkZW50LmdldF9tYXBwaW5n cyAoKS5nZXRfaGlyaWQgKCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGJpbmRpbmcpOw0KPj4gKyAgICAgICAgIH0NCj4+ICsgICAgICAgICBicmVh azsNCj4+ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiArfQ0KPj4gKw0KPj4gK30gLy8gbmFt ZXNwYWNlIENvbXBpbGUNCj4+ICt9IC8vIG5hbWVzcGFjZSBSdXN0DQo+PiBkaWZmIC0tZ2l0 IGEvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtcGF0dGVybi5oIGIvZ2NjL3J1c3Qv YmFja2VuZC9ydXN0LWNvbXBpbGUtcGF0dGVybi5oDQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0 NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLjBlYjVkNjEyNDliDQo+PiAtLS0gL2Rldi9udWxs DQo+PiArKysgYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1wYXR0ZXJuLmgNCj4+ IEBAIC0wLDAgKzEsOTUgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMiBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsvLyBUaGlzIGZpbGUgaXMg cGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+ICsvLyB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiArLy8gdmVyc2lvbi4NCj4+ ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCj4+ICsv LyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxzLg0KPj4gKw0KPj4g Ky8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBD T1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uDQo+PiArDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1iYXNlLmgiDQo+PiAr DQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4gK25hbWVzcGFjZSBDb21waWxlIHsNCj4+ICsN Cj4+ICtjbGFzcyBDb21waWxlUGF0dGVybkNhc2VMYWJlbEV4cHIgOiBwdWJsaWMgSElSQ29t cGlsZUJhc2UsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJs aWMgSElSOjpISVJQYXR0ZXJuVmlzaXRvcg0KPj4gK3sNCj4+ICtwdWJsaWM6DQo+PiArICBz dGF0aWMgdHJlZSBDb21waWxlIChISVI6OlBhdHRlcm4gKnBhdHRlcm4sIHRyZWUgYXNzb2Np YXRlZF9jYXNlX2xhYmVsLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0ICpj dHgpDQo+PiArICB7DQo+PiArICAgIENvbXBpbGVQYXR0ZXJuQ2FzZUxhYmVsRXhwciBjb21w aWxlciAoY3R4LCBhc3NvY2lhdGVkX2Nhc2VfbGFiZWwpOw0KPj4gKyAgICBwYXR0ZXJuLT5h Y2NlcHRfdmlzIChjb21waWxlcik7DQo+PiArICAgIHJldHVybiBjb21waWxlci5jYXNlX2xh YmVsX2V4cHI7DQo+PiArICB9DQo+PiArDQo+PiArICB2b2lkIHZpc2l0IChISVI6OlBhdGhJ bkV4cHJlc3Npb24gJnBhdHRlcm4pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElS OjpTdHJ1Y3RQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6VHVwbGVTdHJ1Y3RQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsNCj4+ICsgIHZv aWQgdmlzaXQgKEhJUjo6V2lsZGNhcmRQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKEhJUjo6UmFuZ2VQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZTsN Cj4+ICsNCj4+ICsgIC8vIEVtcHR5IHZpc2l0IGZvciB1bnVzZWQgUGF0dGVybiBISVIgbm9k ZXMuDQo+PiArICB2b2lkIHZpc2l0IChISVI6Okdyb3VwZWRQYXR0ZXJuICYpIG92ZXJyaWRl IHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklkZW50aWZpZXJQYXR0ZXJuICYpIG92ZXJy aWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkxpdGVyYWxQYXR0ZXJuICYpIG92ZXJy aWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpRdWFsaWZpZWRQYXRoSW5FeHByZXNzaW9u ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlJlZmVyZW5jZVBhdHRl cm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6U2xpY2VQYXR0ZXJu ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlR1cGxlUGF0dGVybiAm KSBvdmVycmlkZSB7fQ0KPj4gKw0KPj4gKyAgQ29tcGlsZVBhdHRlcm5DYXNlTGFiZWxFeHBy IChDb250ZXh0ICpjdHgsIHRyZWUgYXNzb2NpYXRlZF9jYXNlX2xhYmVsKQ0KPj4gKyAgICA6 IEhJUkNvbXBpbGVCYXNlIChjdHgpLCBjYXNlX2xhYmVsX2V4cHIgKGVycm9yX21hcmtfbm9k ZSksDQo+PiArICAgICAgYXNzb2NpYXRlZF9jYXNlX2xhYmVsIChhc3NvY2lhdGVkX2Nhc2Vf bGFiZWwpDQo+PiArICB7fQ0KPj4gKw0KPj4gKyAgdHJlZSBjYXNlX2xhYmVsX2V4cHI7DQo+ PiArICB0cmVlIGFzc29jaWF0ZWRfY2FzZV9sYWJlbDsNCj4+ICt9Ow0KPj4gKw0KPj4gK2Ns YXNzIENvbXBpbGVQYXR0ZXJuQmluZGluZ3MgOiBwdWJsaWMgSElSQ29tcGlsZUJhc2UsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEhJUjo6SElSUGF0dGVy blZpc2l0b3INCj4+ICt7DQo+PiArcHVibGljOg0KPj4gKyAgc3RhdGljIHZvaWQgQ29tcGls ZSAoSElSOjpQYXR0ZXJuICpwYXR0ZXJuLCB0cmVlIG1hdGNoX3NjcnV0aW5lZV9leHByLA0K Pj4gKyAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0ICpjdHgpDQo+PiArICB7DQo+PiAr ICAgIENvbXBpbGVQYXR0ZXJuQmluZGluZ3MgY29tcGlsZXIgKGN0eCwgbWF0Y2hfc2NydXRp bmVlX2V4cHIpOw0KPj4gKyAgICBwYXR0ZXJuLT5hY2NlcHRfdmlzIChjb21waWxlcik7DQo+ PiArICB9DQo+PiArDQo+PiArICB2b2lkIHZpc2l0IChISVI6OlN0cnVjdFBhdHRlcm4gJnBh dHRlcm4pIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpUdXBsZVN0cnVjdFBh dHRlcm4gJnBhdHRlcm4pIG92ZXJyaWRlOw0KPj4gKw0KPj4gKyAgLy8gRW1wdHkgdmlzaXQg Zm9yIHVudXNlZCBQYXR0ZXJuIEhJUiBub2Rlcy4NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 R3JvdXBlZFBhdHRlcm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 SWRlbnRpZmllclBhdHRlcm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJ Ujo6TGl0ZXJhbFBhdHRlcm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJ Ujo6UGF0aEluRXhwcmVzc2lvbiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpRdWFsaWZpZWRQYXRoSW5FeHByZXNzaW9uICYpIG92ZXJyaWRlIHt9DQo+PiArICB2 b2lkIHZpc2l0IChISVI6OlJhbmdlUGF0dGVybiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9p ZCB2aXNpdCAoSElSOjpSZWZlcmVuY2VQYXR0ZXJuICYpIG92ZXJyaWRlIHt9DQo+PiArICB2 b2lkIHZpc2l0IChISVI6OlNsaWNlUGF0dGVybiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9p ZCB2aXNpdCAoSElSOjpUdXBsZVBhdHRlcm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQg dmlzaXQgKEhJUjo6V2lsZGNhcmRQYXR0ZXJuICYpIG92ZXJyaWRlIHt9DQo+PiArDQo+PiAr cHJvdGVjdGVkOg0KPj4gKyAgQ29tcGlsZVBhdHRlcm5CaW5kaW5ncyAoQ29udGV4dCAqY3R4 LCB0cmVlIG1hdGNoX3NjcnV0aW5lZV9leHByKQ0KPj4gKyAgICA6IEhJUkNvbXBpbGVCYXNl IChjdHgpLCBtYXRjaF9zY3J1dGluZWVfZXhwciAobWF0Y2hfc2NydXRpbmVlX2V4cHIpDQo+ PiArICB7fQ0KPj4gKw0KPj4gKyAgdHJlZSBtYXRjaF9zY3J1dGluZWVfZXhwcjsNCj4+ICt9 Ow0KPj4gKw0KPj4gK30gLy8gbmFtZXNwYWNlIENvbXBpbGUNCj4+ICt9IC8vIG5hbWVzcGFj ZSBSdXN0DQo+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUt cmVzb2x2ZS1wYXRoLmNjIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtcmVzb2x2 ZS1wYXRoLmNjDQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAw MDAuLjRmYjNkNTQwMjU3DQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9i YWNrZW5kL3J1c3QtY29tcGlsZS1yZXNvbHZlLXBhdGguY2MNCj4+IEBAIC0wLDAgKzEsMzAx IEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0K Pj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZlcnNpb24uDQo+PiArDQo+PiArLy8gR0ND IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1 dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+PiArLy8gRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBu b3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0K Pj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtcmVzb2x2ZS1wYXRoLmgiDQo+PiArI2luY2x1 ZGUgInJ1c3QtY29tcGlsZS1pbnRyaW5zaWMuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb21w aWxlLWl0ZW0uaCINCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWltcGxpdGVtLmgiDQo+ PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1leHByLmgiDQo+PiArI2luY2x1ZGUgInJ1c3Qt aGlyLXRyYWl0LXJlc29sdmUuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1oaXItcGF0aC1wcm9i ZS5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtZXh0ZXJuLmgiDQo+PiArI2luY2x1 ZGUgInJ1c3QtY29uc3RleHByLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4g K25hbWVzcGFjZSBDb21waWxlIHsNCj4+ICsNCj4+ICt2b2lkDQo+PiArUmVzb2x2ZVBhdGhS ZWY6OnZpc2l0IChISVI6OlF1YWxpZmllZFBhdGhJbkV4cHJlc3Npb24gJmV4cHIpDQo+PiAr ew0KPj4gKyAgcmVzb2x2ZWQgPSByZXNvbHZlIChleHByLmdldF9maW5hbF9zZWdtZW50ICgp LmdldF9zZWdtZW50ICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgIGV4cHIuZ2V0X21h cHBpbmdzICgpLCBleHByLmdldF9sb2N1cyAoKSwgdHJ1ZSk7DQo+PiArfQ0KPj4gKw0KPj4g K3ZvaWQNCj4+ICtSZXNvbHZlUGF0aFJlZjo6dmlzaXQgKEhJUjo6UGF0aEluRXhwcmVzc2lv biAmZXhwcikNCj4+ICt7DQo+PiArICByZXNvbHZlZCA9IHJlc29sdmUgKGV4cHIuZ2V0X2Zp bmFsX3NlZ21lbnQgKCkuZ2V0X3NlZ21lbnQgKCksDQo+PiArICAgICAgICAgICAgICAgICAg ICAgZXhwci5nZXRfbWFwcGluZ3MgKCksIGV4cHIuZ2V0X2xvY3VzICgpLCBmYWxzZSk7DQo+ PiArfQ0KPj4gKw0KPj4gK3RyZWUNCj4+ICtSZXNvbHZlUGF0aFJlZjo6cmVzb2x2ZSAoY29u c3QgSElSOjpQYXRoSWRlbnRTZWdtZW50ICZmaW5hbF9zZWdtZW50LA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IEFuYWx5c2lzOjpOb2RlTWFwcGluZyAmbWFwcGluZ3Ms DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gZXhwcl9sb2N1cywgYm9v bCBpc19xdWFsaWZpZWRfcGF0aCkNCj4+ICt7DQo+PiArICBUeVR5OjpCYXNlVHlwZSAqbG9v a3VwID0gbnVsbHB0cjsNCj4+ICsgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9v a3VwX3R5cGUgKG1hcHBpbmdzLmdldF9oaXJpZCAoKSwgJmxvb2t1cCk7DQo+PiArICBydXN0 X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgLy8gbmVlZCB0byBsb29rIHVwIHRoZSByZWZl cmVuY2UgZm9yIHRoaXMgaWRlbnRpZmllcg0KPj4gKyAgTm9kZUlkIHJlZl9ub2RlX2lkID0g VU5LTk9XTl9OT0RFSUQ7DQo+PiArICBpZiAoIWN0eC0+Z2V0X3Jlc29sdmVyICgpLT5sb29r dXBfcmVzb2x2ZWRfbmFtZSAobWFwcGluZ3MuZ2V0X25vZGVpZCAoKSwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZfbm9kZV9p ZCkpDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyB0aGlzIGNhbiBmYWlsIGJlY2F1c2UgaXQg bWlnaHQgYmUgYSBDb25zdHJ1Y3RvciBmb3Igc29tZXRoaW5nDQo+PiArICAgICAgLy8gaW4g dGhhdCBjYXNlIHRoZSBjYWxsZXIgc2hvdWxkIGF0dGVtcHQgUmVzb2x2ZVBhdGhUeXBlOjpD b21waWxlDQo+PiArDQo+PiArICAgICAgLy8gaXQgbWlnaHQgYmUgYW4gZW51bSBkYXRhLWxl c3MgZW51bSB2YXJpYW50DQo+PiArICAgICAgaWYgKGxvb2t1cC0+Z2V0X2tpbmQgKCkgIT0g VHlUeTo6VHlwZUtpbmQ6OkFEVCkNCj4+ICsgICAgICAgcmV0dXJuIGVycm9yX21hcmtfbm9k ZTsNCj4+ICsNCj4+ICsgICAgICBUeVR5OjpBRFRUeXBlICphZHQgPSBzdGF0aWNfY2FzdDxU eVR5OjpBRFRUeXBlICo+IChsb29rdXApOw0KPj4gKw0KPj4gKyAgICAgIC8vIGl0IG1pZ2h0 IGJlIGEgdW5pdC1zdHJ1Y3QNCj4+ICsgICAgICBpZiAoYWR0LT5pc191bml0ICgpKQ0KPj4g KyAgICAgICB7DQo+PiArICAgICAgICAgcmV0dXJuIGN0eC0+Z2V0X2JhY2tlbmQgKCktPnVu aXRfZXhwcmVzc2lvbiAoKTsNCj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIGlmICgh YWR0LT5pc19lbnVtICgpKQ0KPj4gKyAgICAgICByZXR1cm4gZXJyb3JfbWFya19ub2RlOw0K Pj4gKw0KPj4gKyAgICAgIEhpcklkIHZhcmlhbnRfaWQ7DQo+PiArICAgICAgaWYgKCFjdHgt PmdldF90eWN0eCAoKS0+bG9va3VwX3ZhcmlhbnRfZGVmaW5pdGlvbiAobWFwcGluZ3MuZ2V0 X2hpcmlkICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJnZhcmlhbnRfaWQpKQ0KPj4gKyAgICAgICByZXR1cm4gZXJy b3JfbWFya19ub2RlOw0KPj4gKw0KPj4gKyAgICAgIGludCB1bmlvbl9kaXNyaW1pbmF0b3Ig PSAtMTsNCj4+ICsgICAgICBUeVR5OjpWYXJpYW50RGVmICp2YXJpYW50ID0gbnVsbHB0cjsN Cj4+ICsgICAgICBpZiAoIWFkdC0+bG9va3VwX3ZhcmlhbnRfYnlfaWQgKHZhcmlhbnRfaWQs ICZ2YXJpYW50LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm dW5pb25fZGlzcmltaW5hdG9yKSkNCj4+ICsgICAgICAgcmV0dXJuIGVycm9yX21hcmtfbm9k ZTsNCj4+ICsNCj4+ICsgICAgICAvLyB0aGlzIGNhbiBvbmx5IGJlIGZvciBkaXNjcmltaW5h bnQgdmFyaWFudHMgdGhlIG90aGVycyBhcmUgYnVpbHQgdXANCj4+ICsgICAgICAvLyB1c2lu ZyBjYWxsLWV4cHIgb3Igc3RydWN0LWluaXQNCj4+ICsgICAgICBydXN0X2Fzc2VydCAodmFy aWFudC0+Z2V0X3ZhcmlhbnRfdHlwZSAoKQ0KPj4gKyAgICAgICAgICAgICAgICAgID09IFR5 VHk6OlZhcmlhbnREZWY6OlZhcmlhbnRUeXBlOjpOVU0pOw0KPj4gKw0KPj4gKyAgICAgIC8v IHdlIG5lZWQgdGhlIGFjdHVhbCBnY2MgdHlwZQ0KPj4gKyAgICAgIHRyZWUgY29tcGlsZWRf YWR0X3R5cGUgPSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgYWR0KTsNCj4+ ICsNCj4+ICsgICAgICAvLyBtYWtlIHRoZSBjdG9yIGZvciB0aGUgdW5pb24NCj4+ICsgICAg ICBISVI6OkV4cHIgKmRpc2NyaW1fZXhwciA9IHZhcmlhbnQtPmdldF9kaXNjcmltaW5hbnQg KCk7DQo+PiArICAgICAgdHJlZSBkaXNjcmltX2V4cHJfbm9kZSA9IENvbXBpbGVFeHByOjpD b21waWxlIChkaXNjcmltX2V4cHIsIGN0eCk7DQo+PiArICAgICAgdHJlZSBmb2xkZWRfZGlz Y3JpbV9leHByID0gZm9sZF9leHByIChkaXNjcmltX2V4cHJfbm9kZSk7DQo+PiArICAgICAg dHJlZSBxdWFsaWZpZXIgPSBmb2xkZWRfZGlzY3JpbV9leHByOw0KPj4gKw0KPj4gKyAgICAg IHJldHVybiBjdHgtPmdldF9iYWNrZW5kICgpLT5jb25zdHJ1Y3Rvcl9leHByZXNzaW9uIChj b21waWxlZF9hZHRfdHlwZSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB7cXVhbGlmaWVyfSwNCj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1 bmlvbl9kaXNyaW1pbmF0b3IsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9sb2N1cyk7DQo+PiArICAgIH0NCj4+ ICsNCj4+ICsgIEhpcklkIHJlZjsNCj4+ICsgIGlmICghY3R4LT5nZXRfbWFwcGluZ3MgKCkt Pmxvb2t1cF9ub2RlX3RvX2hpciAocmVmX25vZGVfaWQsICZyZWYpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgcnVzdF9lcnJvcl9hdCAoZXhwcl9sb2N1cywgInJldmVyc2UgY2FsbCBwYXRo IGxvb2t1cCBmYWlsdXJlIik7DQo+PiArICAgICAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsN Cj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gbWlnaHQgYmUgYSBjb25zdGFudA0KPj4gKyAg dHJlZSBjb25zdGFudF9leHByOw0KPj4gKyAgaWYgKGN0eC0+bG9va3VwX2NvbnN0X2RlY2wg KHJlZiwgJmNvbnN0YW50X2V4cHIpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgVFJFRV9VU0VE IChjb25zdGFudF9leHByKSA9IDE7DQo+PiArICAgICAgcmV0dXJuIGNvbnN0YW50X2V4cHI7 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIC8vIHRoaXMgbWlnaHQgYmUgYSB2YXJpYWJsZSBy ZWZlcmVuY2Ugb3IgYSBmdW5jdGlvbiByZWZlcmVuY2UNCj4+ICsgIEJ2YXJpYWJsZSAqdmFy ID0gbnVsbHB0cjsNCj4+ICsgIGlmIChjdHgtPmxvb2t1cF92YXJfZGVjbCAocmVmLCAmdmFy KSkNCj4+ICsgICAgew0KPj4gKyAgICAgIC8vIFRSRUVfVVNFRCBpcyBzZXR1cCBpbiB0aGUg Z2NjIGFic3RyYWN0aW9uIGhlcmUNCj4+ICsgICAgICByZXR1cm4gY3R4LT5nZXRfYmFja2Vu ZCAoKS0+dmFyX2V4cHJlc3Npb24gKHZhciwgZXhwcl9sb2N1cyk7DQo+PiArICAgIH0NCj4+ ICsNCj4+ICsgIC8vIG1pZ2h0IGJlIGEgbWF0Y2ggcGF0dGVybiBiaW5kaW5nDQo+PiArICB0 cmVlIGJpbmRpbmcgPSBlcnJvcl9tYXJrX25vZGU7DQo+PiArICBpZiAoY3R4LT5sb29rdXBf cGF0dGVybl9iaW5kaW5nIChyZWYsICZiaW5kaW5nKSkNCj4+ICsgICAgew0KPj4gKyAgICAg IFRSRUVfVVNFRCAoYmluZGluZykgPSAxOw0KPj4gKyAgICAgIHJldHVybiBiaW5kaW5nOw0K Pj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBpdCBtaWdodCBiZSBhIGZ1bmN0aW9uIGNhbGwN Cj4+ICsgIGlmIChsb29rdXAtPmdldF9raW5kICgpID09IFR5VHk6OlR5cGVLaW5kOjpGTkRF RikNCj4+ICsgICAgew0KPj4gKyAgICAgIFR5VHk6OkZuVHlwZSAqZm50eXBlID0gc3RhdGlj X2Nhc3Q8VHlUeTo6Rm5UeXBlICo+IChsb29rdXApOw0KPj4gKyAgICAgIHRyZWUgZm4gPSBO VUxMX1RSRUU7DQo+PiArICAgICAgaWYgKGN0eC0+bG9va3VwX2Z1bmN0aW9uX2RlY2wgKGZu dHlwZS0+Z2V0X3R5X3JlZiAoKSwgJmZuKSkNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAg IFRSRUVfVVNFRCAoZm4pID0gMTsNCj4+ICsgICAgICAgICByZXR1cm4gYWRkcmVzc19leHBy ZXNzaW9uIChmbiwgZXhwcl9sb2N1cyk7DQo+PiArICAgICAgIH0NCj4+ICsgICAgICBlbHNl IGlmIChmbnR5cGUtPmdldF9hYmkgKCkgPT0gQUJJOjpJTlRSSU5TSUMpDQo+PiArICAgICAg IHsNCj4+ICsgICAgICAgICBJbnRyaW5zaWNzIGNvbXBpbGUgKGN0eCk7DQo+PiArICAgICAg ICAgZm4gPSBjb21waWxlLmNvbXBpbGUgKGZudHlwZSk7DQo+PiArICAgICAgICAgVFJFRV9V U0VEIChmbikgPSAxOw0KPj4gKyAgICAgICAgIHJldHVybiBhZGRyZXNzX2V4cHJlc3Npb24g KGZuLCBleHByX2xvY3VzKTsNCj4+ICsgICAgICAgfQ0KPj4gKyAgICB9DQo+PiArDQo+PiAr ICAvLyBsZXQgdGhlIHF1ZXJ5IHN5c3RlbSBmaWd1cmUgaXQgb3V0DQo+PiArICB0cmVlIHJl c29sdmVkX2l0ZW0gPSBxdWVyeV9jb21waWxlIChyZWYsIGxvb2t1cCwgZmluYWxfc2VnbWVu dCwgbWFwcGluZ3MsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGV4cHJfbG9jdXMsIGlzX3F1YWxpZmllZF9wYXRoKTsNCj4+ICsgIGlmIChyZXNvbHZlZF9p dGVtICE9IGVycm9yX21hcmtfbm9kZSkNCj4+ICsgICAgew0KPj4gKyAgICAgIFRSRUVfVVNF RCAocmVzb2x2ZWRfaXRlbSkgPSAxOw0KPj4gKyAgICB9DQo+PiArICByZXR1cm4gcmVzb2x2 ZWRfaXRlbTsNCj4+ICt9DQo+PiArDQo+PiArdHJlZQ0KPj4gK0hJUkNvbXBpbGVCYXNlOjpx dWVyeV9jb21waWxlIChIaXJJZCByZWYsIFR5VHk6OkJhc2VUeXBlICpsb29rdXAsDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSElSOjpQYXRoSWRlbnRTZWdt ZW50ICZmaW5hbF9zZWdtZW50LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IEFuYWx5c2lzOjpOb2RlTWFwcGluZyAmbWFwcGluZ3MsDQo+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gZXhwcl9sb2N1cywgYm9vbCBpc19xdWFs aWZpZWRfcGF0aCkNCj4+ICt7DQo+PiArICBISVI6Okl0ZW0gKnJlc29sdmVkX2l0ZW0gPSBj dHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX2hpcl9pdGVtIChyZWYpOw0KPj4gKyAgSGly SWQgcGFyZW50X2Jsb2NrOw0KPj4gKyAgSElSOjpFeHRlcm5hbEl0ZW0gKnJlc29sdmVkX2V4 dGVybl9pdGVtDQo+PiArICAgID0gY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9oaXJf ZXh0ZXJuX2l0ZW0gKHJlZiwgJnBhcmVudF9ibG9jayk7DQo+PiArICBib29sIGlzX2hpcl9p dGVtID0gcmVzb2x2ZWRfaXRlbSAhPSBudWxscHRyOw0KPj4gKyAgYm9vbCBpc19oaXJfZXh0 ZXJuX2l0ZW0gPSByZXNvbHZlZF9leHRlcm5faXRlbSAhPSBudWxscHRyOw0KPj4gKyAgaWYg KGlzX2hpcl9pdGVtKQ0KPj4gKyAgICB7DQo+PiArICAgICAgaWYgKCFsb29rdXAtPmhhc19z dWJzaXRpdGlvbnNfZGVmaW5lZCAoKSkNCj4+ICsgICAgICAgcmV0dXJuIENvbXBpbGVJdGVt Ojpjb21waWxlIChyZXNvbHZlZF9pdGVtLCBjdHgsIG51bGxwdHIsIHRydWUsDQo+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9sb2N1cyk7DQo+PiArICAg ICAgZWxzZQ0KPj4gKyAgICAgICByZXR1cm4gQ29tcGlsZUl0ZW06OmNvbXBpbGUgKHJlc29s dmVkX2l0ZW0sIGN0eCwgbG9va3VwLCB0cnVlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGV4cHJfbG9jdXMpOw0KPj4gKyAgICB9DQo+PiArICBlbHNlIGlm IChpc19oaXJfZXh0ZXJuX2l0ZW0pDQo+PiArICAgIHsNCj4+ICsgICAgICBpZiAoIWxvb2t1 cC0+aGFzX3N1YnNpdGl0aW9uc19kZWZpbmVkICgpKQ0KPj4gKyAgICAgICByZXR1cm4gQ29t cGlsZUV4dGVybkl0ZW06OmNvbXBpbGUgKHJlc29sdmVkX2V4dGVybl9pdGVtLCBjdHgsIG51 bGxwdHIsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dHJ1ZSwgZXhwcl9sb2N1cyk7DQo+PiArICAgICAgZWxzZQ0KPj4gKyAgICAgICByZXR1cm4g Q29tcGlsZUV4dGVybkl0ZW06OmNvbXBpbGUgKHJlc29sdmVkX2V4dGVybl9pdGVtLCBjdHgs IGxvb2t1cCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB0cnVlLCBleHByX2xvY3VzKTsNCj4+ICsgICAgfQ0KPj4gKyAgZWxzZQ0KPj4gKyAgICB7 DQo+PiArICAgICAgSGlySWQgcGFyZW50X2ltcGxfaWQgPSBVTktOT1dOX0hJUklEOw0KPj4g KyAgICAgIEhJUjo6SW1wbEl0ZW0gKnJlc29sdmVkX2l0ZW0NCj4+ICsgICAgICAgPSBjdHgt PmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX2hpcl9pbXBsaXRlbSAocmVmLCAmcGFyZW50X2lt cGxfaWQpOw0KPj4gKyAgICAgIGJvb2wgaXNfaW1wbF9pdGVtID0gcmVzb2x2ZWRfaXRlbSAh PSBudWxscHRyOw0KPj4gKyAgICAgIGlmIChpc19pbXBsX2l0ZW0pDQo+PiArICAgICAgIHsN Cj4+ICsgICAgICAgICBydXN0X2Fzc2VydCAocGFyZW50X2ltcGxfaWQgIT0gVU5LTk9XTl9I SVJJRCk7DQo+PiArICAgICAgICAgSElSOjpJdGVtICppbXBsX3JlZg0KPj4gKyAgICAgICAg ICAgPSBjdHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX2hpcl9pdGVtIChwYXJlbnRfaW1w bF9pZCk7DQo+PiArICAgICAgICAgcnVzdF9hc3NlcnQgKGltcGxfcmVmICE9IG51bGxwdHIp Ow0KPj4gKyAgICAgICAgIEhJUjo6SW1wbEJsb2NrICppbXBsID0gc3RhdGljX2Nhc3Q8SElS OjpJbXBsQmxvY2sgKj4gKGltcGxfcmVmKTsNCj4+ICsNCj4+ICsgICAgICAgICBUeVR5OjpC YXNlVHlwZSAqc2VsZiA9IG51bGxwdHI7DQo+PiArICAgICAgICAgYm9vbCBvayA9IGN0eC0+ Z2V0X3R5Y3R4ICgpLT5sb29rdXBfdHlwZSAoDQo+PiArICAgICAgICAgICBpbXBsLT5nZXRf dHlwZSAoKS0+Z2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAoKSwgJnNlbGYpOw0KPj4gKyAg ICAgICAgIHJ1c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICAgICAgICAgaWYgKCFsb29r dXAtPmhhc19zdWJzaXRpdGlvbnNfZGVmaW5lZCAoKSkNCj4+ICsgICAgICAgICAgIHJldHVy biBDb21waWxlSW5oZXJlbnRJbXBsSXRlbTo6Q29tcGlsZSAocmVzb2x2ZWRfaXRlbSwgY3R4 LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBudWxscHRyLCB0cnVlLCBleHByX2xvY3VzKTsNCj4+ICsgICAgICAgICBlbHNlDQo+ PiArICAgICAgICAgICByZXR1cm4gQ29tcGlsZUluaGVyZW50SW1wbEl0ZW06OkNvbXBpbGUg KHJlc29sdmVkX2l0ZW0sIGN0eCwgbG9va3VwLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBleHByX2xvY3VzKTsNCj4+ ICsgICAgICAgfQ0KPj4gKyAgICAgIGVsc2UNCj4+ICsgICAgICAgew0KPj4gKyAgICAgICAg IC8vIGl0IG1pZ2h0IGJlIHJlc29sdmVkIHRvIGEgdHJhaXQgaXRlbQ0KPj4gKyAgICAgICAg IEhJUjo6VHJhaXRJdGVtICp0cmFpdF9pdGVtDQo+PiArICAgICAgICAgICA9IGN0eC0+Z2V0 X21hcHBpbmdzICgpLT5sb29rdXBfaGlyX3RyYWl0X2l0ZW0gKHJlZik7DQo+PiArICAgICAg ICAgSElSOjpUcmFpdCAqdHJhaXQgPSBjdHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX3Ry YWl0X2l0ZW1fbWFwcGluZyAoDQo+PiArICAgICAgICAgICB0cmFpdF9pdGVtLT5nZXRfbWFw cGluZ3MgKCkuZ2V0X2hpcmlkICgpKTsNCj4+ICsNCj4+ICsgICAgICAgICBSZXNvbHZlcjo6 VHJhaXRSZWZlcmVuY2UgKnRyYWl0X3JlZg0KPj4gKyAgICAgICAgICAgPSAmUmVzb2x2ZXI6 OlRyYWl0UmVmZXJlbmNlOjplcnJvcl9ub2RlICgpOw0KPj4gKyAgICAgICAgIGJvb2wgb2sg PSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX3RyYWl0X3JlZmVyZW5jZSAoDQo+PiArICAg ICAgICAgICB0cmFpdC0+Z2V0X21hcHBpbmdzICgpLmdldF9kZWZpZCAoKSwgJnRyYWl0X3Jl Zik7DQo+PiArICAgICAgICAgcnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsNCj4+ICsgICAgICAg ICBUeVR5OjpCYXNlVHlwZSAqcmVjZWl2ZXIgPSBudWxscHRyOw0KPj4gKyAgICAgICAgIG9r ID0gY3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF9yZWNlaXZlciAobWFwcGluZ3MuZ2V0X2hp cmlkICgpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgJnJlY2VpdmVyKTsNCj4+ICsgICAgICAgICBydXN0X2Fzc2VydCAob2spOw0K Pj4gKw0KPj4gKyAgICAgICAgIGlmIChyZWNlaXZlci0+Z2V0X2tpbmQgKCkgPT0gVHlUeTo6 VHlwZUtpbmQ6OlBBUkFNKQ0KPj4gKyAgICAgICAgICAgew0KPj4gKyAgICAgICAgICAgICBU eVR5OjpQYXJhbVR5cGUgKnAgPSBzdGF0aWNfY2FzdDxUeVR5OjpQYXJhbVR5cGUgKj4gKHJl Y2VpdmVyKTsNCj4+ICsgICAgICAgICAgICAgcmVjZWl2ZXIgPSBwLT5yZXNvbHZlICgpOw0K Pj4gKyAgICAgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgICAgIC8vIHRoZSB0eXBlIHJlc29s dmVyIGNhbiBvbmx5IHJlc29sdmUgdHlwZSBib3VuZHMgdG8gdGhlaXIgdHJhaXQNCj4+ICsg ICAgICAgICAvLyBpdGVtIHNvIGl0cyB1cCB0byB1cyB0byBmaWd1cmUgb3V0IGlmIHRoaXMg cGF0aCBzaG91bGQgcmVzb2x2ZQ0KPj4gKyAgICAgICAgIC8vIHRvIGFuIHRyYWl0LWltcGwt YmxvY2staXRlbSBvciBpZiBpdCBjYW4gYmUgZGVmYXVsdGVkIHRvIHRoZQ0KPj4gKyAgICAg ICAgIC8vIHRyYWl0LWltcGwtaXRlbSdzIGRlZmluaXRpb24NCj4+ICsgICAgICAgICBzdGQ6 OnZlY3RvcjxSZXNvbHZlcjo6UGF0aFByb2JlQ2FuZGlkYXRlPiBjYW5kaWRhdGVzDQo+PiAr ICAgICAgICAgICA9IFJlc29sdmVyOjpQYXRoUHJvYmVJbXBsVHJhaXQ6OlByb2JlIChyZWNl aXZlciwgZmluYWxfc2VnbWVudCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRyYWl0X3JlZik7DQo+PiArICAgICAgICAgaWYgKGNh bmRpZGF0ZXMuc2l6ZSAoKSA9PSAwKQ0KPj4gKyAgICAgICAgICAgew0KPj4gKyAgICAgICAg ICAgICAvLyB0aGlzIG1lYW5zIHdlIGFyZSBkZWZhdWx0aW5nIGJhY2sgdG8gdGhlIHRyYWl0 X2l0ZW0gaWYNCj4+ICsgICAgICAgICAgICAgLy8gcG9zc2libGUNCj4+ICsgICAgICAgICAg ICAgUmVzb2x2ZXI6OlRyYWl0SXRlbVJlZmVyZW5jZSAqdHJhaXRfaXRlbV9yZWYgPSBudWxs cHRyOw0KPj4gKyAgICAgICAgICAgICBib29sIG9rID0gdHJhaXRfcmVmLT5sb29rdXBfaGly X3RyYWl0X2l0ZW0gKCp0cmFpdF9pdGVtLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFpdF9pdGVtX3JlZik7DQo+ PiArICAgICAgICAgICAgIHJ1c3RfYXNzZXJ0IChvayk7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAvLyBmb3VuZA0KPj4gKyAgICAgICAgICAgICBydXN0X2Fzc2VydCAodHJhaXRf aXRlbV9yZWYtPmlzX29wdGlvbmFsICgpKTsgLy8gaGFzIGRlZmluaXRpb24NCj4+ICsNCj4+ ICsgICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVUcmFpdEl0ZW06OkNvbXBpbGUgKA0KPj4g KyAgICAgICAgICAgICAgIHRyYWl0X2l0ZW1fcmVmLT5nZXRfaGlyX3RyYWl0X2l0ZW0gKCks IGN0eCwgbG9va3VwLCB0cnVlLA0KPj4gKyAgICAgICAgICAgICAgIGV4cHJfbG9jdXMpOw0K Pj4gKyAgICAgICAgICAgfQ0KPj4gKyAgICAgICAgIGVsc2UNCj4+ICsgICAgICAgICAgIHsN Cj4+ICsgICAgICAgICAgICAgUmVzb2x2ZXI6OlBhdGhQcm9iZUNhbmRpZGF0ZSAmY2FuZGlk YXRlID0gY2FuZGlkYXRlcy5hdCAoMCk7DQo+PiArICAgICAgICAgICAgIHJ1c3RfYXNzZXJ0 IChjYW5kaWRhdGUuaXNfaW1wbF9jYW5kaWRhdGUgKCkpOw0KPj4gKw0KPj4gKyAgICAgICAg ICAgICBISVI6OkltcGxCbG9jayAqaW1wbCA9IGNhbmRpZGF0ZS5pdGVtLmltcGwucGFyZW50 Ow0KPj4gKyAgICAgICAgICAgICBISVI6OkltcGxJdGVtICppbXBsX2l0ZW0gPSBjYW5kaWRh dGUuaXRlbS5pbXBsLmltcGxfaXRlbTsNCj4+ICsNCj4+ICsgICAgICAgICAgICAgVHlUeTo6 QmFzZVR5cGUgKnNlbGYgPSBudWxscHRyOw0KPj4gKyAgICAgICAgICAgICBib29sIG9rID0g Y3R4LT5nZXRfdHljdHggKCktPmxvb2t1cF90eXBlICgNCj4+ICsgICAgICAgICAgICAgICBp bXBsLT5nZXRfdHlwZSAoKS0+Z2V0X21hcHBpbmdzICgpLmdldF9oaXJpZCAoKSwgJnNlbGYp Ow0KPj4gKyAgICAgICAgICAgICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgICAg ICAgICAgICBpZiAoIWxvb2t1cC0+aGFzX3N1YnNpdGl0aW9uc19kZWZpbmVkICgpKQ0KPj4g KyAgICAgICAgICAgICAgIHJldHVybiBDb21waWxlSW5oZXJlbnRJbXBsSXRlbTo6Q29tcGls ZSAoaW1wbF9pdGVtLCBjdHgsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB0cnVlLA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9s b2N1cyk7DQo+PiArICAgICAgICAgICAgIGVsc2UNCj4+ICsgICAgICAgICAgICAgICByZXR1 cm4gQ29tcGlsZUluaGVyZW50SW1wbEl0ZW06OkNvbXBpbGUgKGltcGxfaXRlbSwgY3R4LCBs b29rdXAsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB0cnVlLCBleHByX2xvY3VzKTsNCj4+ICsNCj4+ICsgICAgICAgICAg ICAgbG9va3VwLT5zZXRfdHlfcmVmIChpbXBsX2l0ZW0tPmdldF9pbXBsX21hcHBpbmdzICgp LmdldF9oaXJpZCAoKSk7DQo+PiArICAgICAgICAgICB9DQo+PiArICAgICAgIH0NCj4+ICsg ICAgfQ0KPj4gKw0KPj4gKyAgcmV0dXJuIGVycm9yX21hcmtfbm9kZTsNCj4+ICt9DQo+PiAr DQo+PiArfSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QN Cj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1yZXNvbHZl LXBhdGguaCBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLXJlc29sdmUtcGF0aC5o DQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLmYwMzYw YmRjNzM5DQo+PiAtLS0gL2Rldi9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9iYWNrZW5kL3J1 c3QtY29tcGlsZS1yZXNvbHZlLXBhdGguaA0KPj4gQEAgLTAsMCArMSw3MyBAQA0KPj4gKy8v IENvcHlyaWdodCAoQykgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j Lg0KPj4gKw0KPj4gKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsv LyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeSBpdCB1bmRlcg0KPj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXINCj4+ICsvLyB2ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBB TlkNCj4+ICsvLyBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mIE1FUkNIQU5UQUJJTElUWSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8v IGZvciBtb3JlIGRldGFpbHMuDQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBh bG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4g Ky8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaWZuZGVm IFJVU1RfQ09NUElMRV9SRVNPTFZFX1BBVEgNCj4+ICsjZGVmaW5lIFJVU1RfQ09NUElMRV9S RVNPTFZFX1BBVEgNCj4+ICsNCj4+ICsjaW5jbHVkZSAicnVzdC1jb21waWxlLWJhc2UuaCIN Cj4+ICsNCj4+ICtuYW1lc3BhY2UgUnVzdCB7DQo+PiArbmFtZXNwYWNlIENvbXBpbGUgew0K Pj4gKw0KPj4gK2NsYXNzIFJlc29sdmVQYXRoUmVmIDogcHVibGljIEhJUkNvbXBpbGVCYXNl LCBwdWJsaWMgSElSOjpISVJQYXR0ZXJuVmlzaXRvcg0KPj4gK3sNCj4+ICtwdWJsaWM6DQo+ PiArICBzdGF0aWMgdHJlZSBDb21waWxlIChISVI6OlF1YWxpZmllZFBhdGhJbkV4cHJlc3Np b24gJmV4cHIsIENvbnRleHQgKmN0eCkNCj4+ICsgIHsNCj4+ICsgICAgUmVzb2x2ZVBhdGhS ZWYgcmVzb2x2ZXIgKGN0eCk7DQo+PiArICAgIGV4cHIuYWNjZXB0X3ZpcyAocmVzb2x2ZXIp Ow0KPj4gKyAgICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZWQ7DQo+PiArICB9DQo+PiArDQo+ PiArICBzdGF0aWMgdHJlZSBDb21waWxlIChISVI6OlBhdGhJbkV4cHJlc3Npb24gJmV4cHIs IENvbnRleHQgKmN0eCkNCj4+ICsgIHsNCj4+ICsgICAgUmVzb2x2ZVBhdGhSZWYgcmVzb2x2 ZXIgKGN0eCk7DQo+PiArICAgIGV4cHIuYWNjZXB0X3ZpcyAocmVzb2x2ZXIpOw0KPj4gKyAg ICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZWQ7DQo+PiArICB9DQo+PiArDQo+PiArICB2b2lk IHZpc2l0IChISVI6OlBhdGhJbkV4cHJlc3Npb24gJmV4cHIpIG92ZXJyaWRlOw0KPj4gKyAg dm9pZCB2aXNpdCAoSElSOjpRdWFsaWZpZWRQYXRoSW5FeHByZXNzaW9uICZleHByKSBvdmVy cmlkZTsNCj4+ICsNCj4+ICsgIC8vIEVtcHR5IHZpc2l0IGZvciB1bnVzZWQgUGF0dGVybiBI SVIgbm9kZXMuDQo+PiArICB2b2lkIHZpc2l0IChISVI6Okdyb3VwZWRQYXR0ZXJuICYpIG92 ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OklkZW50aWZpZXJQYXR0ZXJuICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkxpdGVyYWxQYXR0ZXJuICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlJhbmdlUGF0dGVybiAmKSBv dmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpSZWZlcmVuY2VQYXR0ZXJuICYp IG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlNsaWNlUGF0dGVybiAmKSBv dmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpTdHJ1Y3RQYXR0ZXJuICYpIG92 ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlR1cGxlUGF0dGVybiAmKSBvdmVy cmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpUdXBsZVN0cnVjdFBhdHRlcm4gJikg b3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6V2lsZGNhcmRQYXR0ZXJuICYp IG92ZXJyaWRlIHt9DQo+PiArDQo+PiArICBSZXNvbHZlUGF0aFJlZiAoQ29udGV4dCAqY3R4 KQ0KPj4gKyAgICA6IEhJUkNvbXBpbGVCYXNlIChjdHgpLCByZXNvbHZlZCAoZXJyb3JfbWFy a19ub2RlKQ0KPj4gKyAge30NCj4+ICsNCj4+ICsgIHRyZWUgcmVzb2x2ZSAoY29uc3QgSElS OjpQYXRoSWRlbnRTZWdtZW50ICZmaW5hbF9zZWdtZW50LA0KPj4gKyAgICAgICAgICAgICAg IGNvbnN0IEFuYWx5c2lzOjpOb2RlTWFwcGluZyAmbWFwcGluZ3MsIExvY2F0aW9uIGxvY3Vz LA0KPj4gKyAgICAgICAgICAgICAgIGJvb2wgaXNfcXVhbGlmaWVkX3BhdGgpOw0KPj4gKw0K Pj4gKyAgdHJlZSByZXNvbHZlZDsNCj4+ICt9Ow0KPj4gKw0KPj4gK30gLy8gbmFtZXNwYWNl IENvbXBpbGUNCj4+ICt9IC8vIG5hbWVzcGFjZSBSdXN0DQo+PiArDQo+PiArI2VuZGlmIC8v IFJVU1RfQ09NUElMRV9SRVNPTFZFX1BBVEgNCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9i YWNrZW5kL3J1c3QtY29tcGlsZS1zdG10LmNjIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNv bXBpbGUtc3RtdC5jYw0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAw MDAwMDAwLi5iZmIyNWYxMjk4MA0KPj4gLS0tIC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1 c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtc3RtdC5jYw0KPj4gQEAgLTAsMCArMSwxMTUgQEAN Cj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIEluYy4NCj4+ICsNCj4+ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+PiAr DQo+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8v IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyDQo+PiArLy8gdmVyc2lvbi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJ VEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3 YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCj4+ICsvLyBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UN Cj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxzLg0KPj4gKw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+ PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBz ZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+PiArDQo+PiAr I2luY2x1ZGUgInJ1c3QtY29tcGlsZS1zdG10LmgiDQo+PiArI2luY2x1ZGUgInJ1c3QtY29t cGlsZS1leHByLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4gK25hbWVzcGFj ZSBDb21waWxlIHsNCj4+ICsNCj4+ICtDb21waWxlU3RtdDo6Q29tcGlsZVN0bXQgKENvbnRl eHQgKmN0eCkNCj4+ICsgIDogSElSQ29tcGlsZUJhc2UgKGN0eCksIHRyYW5zbGF0ZWQgKG51 bGxwdHIpDQo+PiAre30NCj4+ICsNCj4+ICt0cmVlDQo+PiArQ29tcGlsZVN0bXQ6OkNvbXBp bGUgKEhJUjo6U3RtdCAqc3RtdCwgQ29udGV4dCAqY3R4KQ0KPj4gK3sNCj4+ICsgIENvbXBp bGVTdG10IGNvbXBpbGVyIChjdHgpOw0KPj4gKyAgc3RtdC0+YWNjZXB0X3ZpcyAoY29tcGls ZXIpOw0KPj4gKyAgcmV0dXJuIGNvbXBpbGVyLnRyYW5zbGF0ZWQ7DQo+PiArfQ0KPj4gKw0K Pj4gK3ZvaWQNCj4+ICtDb21waWxlU3RtdDo6dmlzaXQgKEhJUjo6RXhwclN0bXRXaXRoQmxv Y2sgJnN0bXQpDQo+PiArew0KPj4gKyAgdHJhbnNsYXRlZCA9IENvbXBpbGVFeHByOjpDb21w aWxlIChzdG10LmdldF9leHByICgpLCBjdHgpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+ PiArQ29tcGlsZVN0bXQ6OnZpc2l0IChISVI6OkV4cHJTdG10V2l0aG91dEJsb2NrICZzdG10 KQ0KPj4gK3sNCj4+ICsgIHRyYW5zbGF0ZWQgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoc3Rt dC5nZXRfZXhwciAoKSwgY3R4KTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK0NvbXBp bGVTdG10Ojp2aXNpdCAoSElSOjpMZXRTdG10ICZzdG10KQ0KPj4gK3sNCj4+ICsgIC8vIG5v dGhpbmcgdG8gZG8NCj4+ICsgIGlmICghc3RtdC5oYXNfaW5pdF9leHByICgpKQ0KPj4gKyAg ICByZXR1cm47DQo+PiArDQo+PiArICBjb25zdCBISVI6OlBhdHRlcm4gJnN0bXRfcGF0dGVy biA9ICpzdG10LmdldF9wYXR0ZXJuICgpOw0KPj4gKyAgSGlySWQgc3RtdF9pZCA9IHN0bXRf cGF0dGVybi5nZXRfcGF0dGVybl9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCk7DQo+PiArDQo+ PiArICBUeVR5OjpCYXNlVHlwZSAqdHkgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFjdHgtPmdl dF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKHN0bXRfaWQsICZ0eSkpDQo+PiArICAgIHsNCj4+ ICsgICAgICAvLyBGSVhNRSB0aGlzIHNob3VsZCBiZSBhbiBhc3NlcnRpb24gaW5zdGVhZA0K Pj4gKyAgICAgIHJ1c3RfZmF0YWxfZXJyb3IgKHN0bXQuZ2V0X2xvY3VzICgpLA0KPj4gKyAg ICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBsb29rdXAgdmFyaWFibGUgZGVjbGFy YXRpb24gdHlwZSIpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgQnZhcmlhYmxlICp2YXIgPSBudWxscHRyOw0KPj4gKyAgaWYgKCFjdHgtPmxvb2t1cF92 YXJfZGVjbCAoc3RtdF9pZCwgJnZhcikpDQo+PiArICAgIHsNCj4+ICsgICAgICAvLyBGSVhN RSB0aGlzIHNob3VsZCBiZSBhbiBhc3NlcnRpb24gaW5zdGVhZCBhbmQgdXNlIGVycm9yIG1h cmsgbm9kZQ0KPj4gKyAgICAgIHJ1c3RfZmF0YWxfZXJyb3IgKHN0bXQuZ2V0X2xvY3VzICgp LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBsb29rdXAgY29tcGls ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24iKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAg IH0NCj4+ICsNCj4+ICsgIHRyZWUgaW5pdCA9IENvbXBpbGVFeHByOjpDb21waWxlIChzdG10 LmdldF9pbml0X2V4cHIgKCksIGN0eCk7DQo+PiArICAvLyBGSVhNRSB1c2UgZXJyb3JfbWFy a19ub2RlLCBjaGVjayB0aGF0IENvbXBpbGVFeHByIHJldHVybnMgZXJyb3JfbWFya19ub2Rl DQo+PiArICAvLyBvbiBmYWlsdXJlIGFuZCBtYWtlIHRoaXMgYW4gYXNzZXJ0aW9uDQo+PiAr ICBpZiAoaW5pdCA9PSBudWxscHRyKQ0KPj4gKyAgICByZXR1cm47DQo+PiArDQo+PiArICBU eVR5OjpCYXNlVHlwZSAqYWN0dWFsID0gbnVsbHB0cjsNCj4+ICsgIGJvb2wgb2sgPSBjdHgt PmdldF90eWN0eCAoKS0+bG9va3VwX3R5cGUgKA0KPj4gKyAgICBzdG10LmdldF9pbml0X2V4 cHIgKCktPmdldF9tYXBwaW5ncyAoKS5nZXRfaGlyaWQgKCksICZhY3R1YWwpOw0KPj4gKyAg cnVzdF9hc3NlcnQgKG9rKTsNCj4+ICsgIHRyZWUgc3RtdF90eXBlID0gVHlUeVJlc29sdmVD b21waWxlOjpjb21waWxlIChjdHgsIHR5KTsNCj4+ICsNCj4+ICsgIExvY2F0aW9uIGx2YWx1 ZV9sb2N1cyA9IHN0bXQuZ2V0X3BhdHRlcm4gKCktPmdldF9sb2N1cyAoKTsNCj4+ICsgIExv Y2F0aW9uIHJ2YWx1ZV9sb2N1cyA9IHN0bXQuZ2V0X2luaXRfZXhwciAoKS0+Z2V0X2xvY3Vz ICgpOw0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKmV4cGVjdGVkID0gdHk7DQo+PiArICBpbml0 ID0gY29lcmNpb25fc2l0ZSAoc3RtdC5nZXRfbWFwcGluZ3MgKCkuZ2V0X2hpcmlkICgpLCBp bml0LCBhY3R1YWwsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwgbHZh bHVlX2xvY3VzLCBydmFsdWVfbG9jdXMpOw0KPj4gKw0KPj4gKyAgYXV0byBmbmN0eCA9IGN0 eC0+cGVla19mbiAoKTsNCj4+ICsgIGlmICh0eS0+aXNfdW5pdCAoKSkNCj4+ICsgICAgew0K Pj4gKyAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAoaW5pdCk7DQo+PiArDQo+PiArICAgICAg YXV0byB1bml0X3R5cGVfaW5pdF9leHByDQo+PiArICAgICAgID0gY3R4LT5nZXRfYmFja2Vu ZCAoKS0+Y29uc3RydWN0b3JfZXhwcmVzc2lvbiAoc3RtdF90eXBlLCBmYWxzZSwge30sIC0x LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJ2YWx1ZV9sb2N1cyk7DQo+PiArICAgICAgYXV0byBzID0gY3R4LT5nZXRfYmFj a2VuZCAoKS0+aW5pdF9zdGF0ZW1lbnQgKGZuY3R4LmZuZGVjbCwgdmFyLA0KPj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdHlw ZV9pbml0X2V4cHIpOw0KPj4gKyAgICAgIGN0eC0+YWRkX3N0YXRlbWVudCAocyk7DQo+PiAr ICAgIH0NCj4+ICsgIGVsc2UNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gcyA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPmluaXRfc3RhdGVtZW50IChmbmN0eC5mbmRlY2wsIHZhciwgaW5p dCk7DQo+PiArICAgICAgY3R4LT5hZGRfc3RhdGVtZW50IChzKTsNCj4+ICsgICAgfQ0KPj4g K30NCj4+ICsNCj4+ICt9IC8vIG5hbWVzcGFjZSBDb21waWxlDQo+PiArfSAvLyBuYW1lc3Bh Y2UgUnVzdA0KPj4gZGlmZiAtLWdpdCBhL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxl LXN0bXQuaCBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLXN0bXQuaA0KPj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAwMDAwMDAwLi5hMGVjOGIyNjY2Nw0K Pj4gLS0tIC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBp bGUtc3RtdC5oDQo+PiBAQCAtMCwwICsxLDY5IEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAy MDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8g VGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVy DQo+PiArLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl aXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8v IHZlcnNpb24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklM SVRZIG9yDQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWls cy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpZm5kZWYgUlVTVF9DT01QSUxFX1NU TVQNCj4+ICsjZGVmaW5lIFJVU1RfQ09NUElMRV9TVE1UDQo+PiArDQo+PiArI2luY2x1ZGUg InJ1c3QtY29tcGlsZS1iYXNlLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qgew0KPj4g K25hbWVzcGFjZSBDb21waWxlIHsNCj4+ICsNCj4+ICtjbGFzcyBDb21waWxlU3RtdCA6IHBy aXZhdGUgSElSQ29tcGlsZUJhc2UsIHByb3RlY3RlZCBISVI6OkhJUlN0bXRWaXNpdG9yDQo+ PiArew0KPj4gK3B1YmxpYzoNCj4+ICsgIHN0YXRpYyB0cmVlIENvbXBpbGUgKEhJUjo6U3Rt dCAqc3RtdCwgQ29udGV4dCAqY3R4KTsNCj4+ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 RXhwclN0bXRXaXRoQmxvY2sgJnN0bXQpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpFeHByU3RtdFdpdGhvdXRCbG9jayAmc3RtdCkgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChISVI6OkxldFN0bXQgJnN0bXQpIG92ZXJyaWRlOw0KPj4gKw0KPj4gKyAgLy8g RW1wdHkgdmlzaXQgZm9yIHVudXNlZCBTdG10IEhJUiBub2Rlcy4NCj4+ICsgIHZvaWQgdmlz aXQgKEhJUjo6VHVwbGVTdHJ1Y3QgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6RW51bUl0ZW0gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 RW51bUl0ZW1UdXBsZSAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpF bnVtSXRlbVN0cnVjdCAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpF bnVtSXRlbURpc2NyaW1pbmFudCAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpUeXBlUGF0aFNlZ21lbnRGdW5jdGlvbiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9p ZCB2aXNpdCAoSElSOjpUeXBlUGF0aCAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNp dCAoSElSOjpRdWFsaWZpZWRQYXRoSW5UeXBlICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lk IHZpc2l0IChISVI6Ok1vZHVsZSAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpFeHRlcm5DcmF0ZSAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElS OjpVc2VEZWNsYXJhdGlvbiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElS OjpGdW5jdGlvbiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAoSElSOjpUeXBl QWxpYXMgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6U3RydWN0U3Ry dWN0ICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkVudW0gJikgb3Zl cnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6VW5pb24gJikgb3ZlcnJpZGUge30N Cj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6Q29uc3RhbnRJdGVtICYpIG92ZXJyaWRlIHt9DQo+ PiArICB2b2lkIHZpc2l0IChISVI6OlN0YXRpY0l0ZW0gJikgb3ZlcnJpZGUge30NCj4+ICsg IHZvaWQgdmlzaXQgKEhJUjo6VHJhaXQgJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlz aXQgKEhJUjo6SW1wbEJsb2NrICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChI SVI6OkV4dGVybkJsb2NrICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6 OkVtcHR5U3RtdCAmKSBvdmVycmlkZSB7fQ0KPj4gKw0KPj4gK3ByaXZhdGU6DQo+PiArICBD b21waWxlU3RtdCAoQ29udGV4dCAqY3R4KTsNCj4+ICsNCj4+ICsgIHRyZWUgdHJhbnNsYXRl ZDsNCj4+ICt9Ow0KPj4gKw0KPj4gK30gLy8gbmFtZXNwYWNlIENvbXBpbGUNCj4+ICt9IC8v IG5hbWVzcGFjZSBSdXN0DQo+PiArDQo+PiArI2VuZGlmIC8vIFJVU1RfQ09NUElMRV9TVE1U DQo+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtc3RydWN0 LWZpZWxkLWV4cHIuY2MgYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS1zdHJ1Y3Qt ZmllbGQtZXhwci5jYw0KPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4+IGluZGV4IDAwMDAw MDAwMDAwLi5jOWEyODExZjYxMQ0KPj4gLS0tIC9kZXYvbnVsbA0KPj4gKysrIGIvZ2NjL3J1 c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtc3RydWN0LWZpZWxkLWV4cHIuY2MNCj4+IEBAIC0w LDAgKzEsODEgQEANCj4+ICsvLyBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMiBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBv ZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCj4+ICsvLyB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg RnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9y IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+PiArLy8gdmVyc2lvbi4NCj4+ICsNCj4+ ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8gV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCj4+ICsvLyBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBkZXRhaWxzLg0KPj4gKw0KPj4gKy8vIFlv dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5H My4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4u DQo+PiArDQo+PiArI2luY2x1ZGUgInJ1c3QtY29tcGlsZS1zdHJ1Y3QtZmllbGQtZXhwci5o Ig0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtZXhwci5oIg0KPj4gKw0KPj4gK25hbWVz cGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2UgQ29tcGlsZSB7DQo+PiArDQo+PiArQ29tcGls ZVN0cnVjdEV4cHJGaWVsZDo6Q29tcGlsZVN0cnVjdEV4cHJGaWVsZCAoQ29udGV4dCAqY3R4 KQ0KPj4gKyAgOiBISVJDb21waWxlQmFzZSAoY3R4KSwgdHJhbnNsYXRlZCAoZXJyb3JfbWFy a19ub2RlKQ0KPj4gK3t9DQo+PiArDQo+PiArdHJlZQ0KPj4gK0NvbXBpbGVTdHJ1Y3RFeHBy RmllbGQ6OkNvbXBpbGUgKEhJUjo6U3RydWN0RXhwckZpZWxkICpmaWVsZCwgQ29udGV4dCAq Y3R4KQ0KPj4gK3sNCj4+ICsgIENvbXBpbGVTdHJ1Y3RFeHByRmllbGQgY29tcGlsZXIgKGN0 eCk7DQo+PiArICBzd2l0Y2ggKGZpZWxkLT5nZXRfa2luZCAoKSkNCj4+ICsgICAgew0KPj4g KyAgICBjYXNlIEhJUjo6U3RydWN0RXhwckZpZWxkOjpTdHJ1Y3RFeHByRmllbGRLaW5kOjpJ REVOVElGSUVSOg0KPj4gKyAgICAgIGNvbXBpbGVyLnZpc2l0IChzdGF0aWNfY2FzdDxISVI6 OlN0cnVjdEV4cHJGaWVsZElkZW50aWZpZXIgJj4gKCpmaWVsZCkpOw0KPj4gKyAgICAgIGJy ZWFrOw0KPj4gKw0KPj4gKyAgICBjYXNlIEhJUjo6U3RydWN0RXhwckZpZWxkOjpTdHJ1Y3RF eHByRmllbGRLaW5kOjpJREVOVElGSUVSX1ZBTFVFOg0KPj4gKyAgICAgIGNvbXBpbGVyLnZp c2l0ICgNCj4+ICsgICAgICAgc3RhdGljX2Nhc3Q8SElSOjpTdHJ1Y3RFeHByRmllbGRJZGVu dGlmaWVyVmFsdWUgJj4gKCpmaWVsZCkpOw0KPj4gKyAgICAgIGJyZWFrOw0KPj4gKw0KPj4g KyAgICBjYXNlIEhJUjo6U3RydWN0RXhwckZpZWxkOjpTdHJ1Y3RFeHByRmllbGRLaW5kOjpJ TkRFWF9WQUxVRToNCj4+ICsgICAgICBjb21waWxlci52aXNpdCAoc3RhdGljX2Nhc3Q8SElS OjpTdHJ1Y3RFeHByRmllbGRJbmRleFZhbHVlICY+ICgqZmllbGQpKTsNCj4+ICsgICAgICBi cmVhazsNCj4+ICsgICAgfQ0KPj4gKyAgcmV0dXJuIGNvbXBpbGVyLnRyYW5zbGF0ZWQ7DQo+ PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtDb21waWxlU3RydWN0RXhwckZpZWxkOjp2aXNp dCAoSElSOjpTdHJ1Y3RFeHByRmllbGRJZGVudGlmaWVyVmFsdWUgJmZpZWxkKQ0KPj4gK3sN Cj4+ICsgIHRyYW5zbGF0ZWQgPSBDb21waWxlRXhwcjo6Q29tcGlsZSAoZmllbGQuZ2V0X3Zh bHVlICgpLCBjdHgpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArQ29tcGlsZVN0cnVj dEV4cHJGaWVsZDo6dmlzaXQgKEhJUjo6U3RydWN0RXhwckZpZWxkSW5kZXhWYWx1ZSAmZmll bGQpDQo+PiArew0KPj4gKyAgdHJhbnNsYXRlZCA9IENvbXBpbGVFeHByOjpDb21waWxlIChm aWVsZC5nZXRfdmFsdWUgKCksIGN0eCk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtD b21waWxlU3RydWN0RXhwckZpZWxkOjp2aXNpdCAoSElSOjpTdHJ1Y3RFeHByRmllbGRJZGVu dGlmaWVyICZmaWVsZCkNCj4+ICt7DQo+PiArICAvLyB3ZSBjYW4gbWFrZSB0aGUgZmllbGQg bG9vayBsaWtlIGEgcGF0aCBleHByIHRvIHRha2UgYWR2YW50YWdlIG9mIGV4aXN0aW5nDQo+ PiArICAvLyBjb2RlDQo+PiArDQo+PiArICBBbmFseXNpczo6Tm9kZU1hcHBpbmcgbWFwcGlu Z3NfY29weTEgPSBmaWVsZC5nZXRfbWFwcGluZ3MgKCk7DQo+PiArICBBbmFseXNpczo6Tm9k ZU1hcHBpbmcgbWFwcGluZ3NfY29weTIgPSBmaWVsZC5nZXRfbWFwcGluZ3MgKCk7DQo+PiAr DQo+PiArICBISVI6OlBhdGhJZGVudFNlZ21lbnQgaWRlbnRfc2VnIChmaWVsZC5nZXRfZmll bGRfbmFtZSAoKSk7DQo+PiArICBISVI6OlBhdGhFeHByU2VnbWVudCBzZWcgKG1hcHBpbmdz X2NvcHkxLCBpZGVudF9zZWcsIGZpZWxkLmdldF9sb2N1cyAoKSwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICBISVI6OkdlbmVyaWNBcmdzOjpjcmVhdGVfZW1wdHkgKCkpOw0K Pj4gKyAgSElSOjpQYXRoSW5FeHByZXNzaW9uIGV4cHIgKG1hcHBpbmdzX2NvcHkyLCB7c2Vn fSwgZmllbGQuZ2V0X2xvY3VzICgpLCBmYWxzZSwNCj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHt9KTsNCj4+ICsgIHRyYW5zbGF0ZWQgPSBDb21waWxlRXhwcjo6Q29tcGls ZSAoJmV4cHIsIGN0eCk7DQo+PiArfQ0KPj4gKw0KPj4gK30gLy8gbmFtZXNwYWNlIENvbXBp bGUNCj4+ICt9IC8vIG5hbWVzcGFjZSBSdXN0DQo+PiBkaWZmIC0tZ2l0IGEvZ2NjL3J1c3Qv YmFja2VuZC9ydXN0LWNvbXBpbGUtc3RydWN0LWZpZWxkLWV4cHIuaCBiL2djYy9ydXN0L2Jh Y2tlbmQvcnVzdC1jb21waWxlLXN0cnVjdC1maWVsZC1leHByLmgNCj4+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uYmM1ZGEwODBkZmUNCj4+IC0tLSAv ZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLXN0cnVj dC1maWVsZC1leHByLmgNCj4+IEBAIC0wLDAgKzEsNDYgQEANCj4+ICsvLyBDb3B5cmlnaHQg KEMpIDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4+ICsNCj4+ ICsvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuDQo+PiArDQo+PiArLy8gR0NDIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQg dW5kZXINCj4+ICsvLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KPj4gKy8vIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyDQo+ PiArLy8gdmVyc2lvbi4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQo+PiArLy8g V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO VEFCSUxJVFkgb3INCj4+ICsvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBmb3IgbW9yZSBk ZXRhaWxzLg0KPj4gKw0KPj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gYWxvbmcgd2l0aCBH Q0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUNCj4+ICsvLyA8aHR0cDov L3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQo+PiArDQo+PiArI2lmbmRlZiBSVVNUX0NPTVBJ TEVfU1RSVUNUX0ZJRUxEX0VYUFINCj4+ICsjZGVmaW5lIFJVU1RfQ09NUElMRV9TVFJVQ1Rf RklFTERfRVhQUg0KPj4gKw0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtYmFzZS5oIg0K Pj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2UgQ29tcGlsZSB7DQo+ PiArDQo+PiArY2xhc3MgQ29tcGlsZVN0cnVjdEV4cHJGaWVsZCA6IHByaXZhdGUgSElSQ29t cGlsZUJhc2UNCj4+ICt7DQo+PiArcHVibGljOg0KPj4gKyAgc3RhdGljIHRyZWUgQ29tcGls ZSAoSElSOjpTdHJ1Y3RFeHByRmllbGQgKmZpZWxkLCBDb250ZXh0ICpjdHgpOw0KPj4gKw0K Pj4gK3Byb3RlY3RlZDoNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6U3RydWN0RXhwckZpZWxk SWRlbnRpZmllclZhbHVlICZmaWVsZCk7DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlN0cnVj dEV4cHJGaWVsZEluZGV4VmFsdWUgJmZpZWxkKTsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6 U3RydWN0RXhwckZpZWxkSWRlbnRpZmllciAmZmllbGQpOw0KPj4gKw0KPj4gK3ByaXZhdGU6 DQo+PiArICBDb21waWxlU3RydWN0RXhwckZpZWxkIChDb250ZXh0ICpjdHgpOw0KPj4gKw0K Pj4gKyAgdHJlZSB0cmFuc2xhdGVkOw0KPj4gK307DQo+PiArDQo+PiArfSAvLyBuYW1lc3Bh Y2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+ICsNCj4+ICsjZW5kaWYg Ly8gUlVTVF9DT01QSUxFX1NUUlVDVF9GSUVMRF9FWFBSDQo+PiBkaWZmIC0tZ2l0IGEvZ2Nj L3J1c3QvYmFja2VuZC9ydXN0LWNvbXBpbGUtdHlwZS5jYyBiL2djYy9ydXN0L2JhY2tlbmQv cnVzdC1jb21waWxlLXR5cGUuY2MNCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRl eCAwMDAwMDAwMDAwMC4uZWNlZDkwOTY3M2UNCj4+IC0tLSAvZGV2L251bGwNCj4+ICsrKyBi L2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLXR5cGUuY2MNCj4+IEBAIC0wLDAgKzEs NzEzIEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0ND Lg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiArLy8gdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUN Cj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZlcnNpb24uDQo+PiArDQo+PiArLy8g R0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws IGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yDQo+PiArLy8gRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ICsNCj4+ICsvLyBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJ ZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KPj4g Kw0KPj4gKyNpbmNsdWRlICJydXN0LWNvbXBpbGUtdHlwZS5oIg0KPj4gKyNpbmNsdWRlICJy dXN0LWNvbXBpbGUtZXhwci5oIg0KPj4gKyNpbmNsdWRlICJydXN0LWNvbnN0ZXhwci5oIg0K Pj4gKw0KPj4gKyNpbmNsdWRlICJ0cmVlLmgiDQo+PiArDQo+PiArbmFtZXNwYWNlIFJ1c3Qg ew0KPj4gK25hbWVzcGFjZSBDb21waWxlIHsNCj4+ICsNCj4+ICtzdGF0aWMgY29uc3Qgc3Rk OjpzdHJpbmcgUlVTVF9FTlVNX0RJU1JfRklFTERfTkFNRSA9ICJSVVNUJEVOVU0kRElTUiI7 DQo+PiArDQo+PiArVHlUeVJlc29sdmVDb21waWxlOjpUeVR5UmVzb2x2ZUNvbXBpbGUgKENv bnRleHQgKmN0eCwgYm9vbCB0cmFpdF9vYmplY3RfbW9kZSkNCj4+ICsgIDogY3R4IChjdHgp LCB0cmFpdF9vYmplY3RfbW9kZSAodHJhaXRfb2JqZWN0X21vZGUpLA0KPj4gKyAgICB0cmFu c2xhdGVkIChlcnJvcl9tYXJrX25vZGUpLCByZWN1cmlzdmVfb3BzICgwKQ0KPj4gK3t9DQo+ PiArDQo+PiArdHJlZQ0KPj4gK1R5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoQ29udGV4 dCAqY3R4LCBjb25zdCBUeVR5OjpCYXNlVHlwZSAqdHksDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGJvb2wgdHJhaXRfb2JqZWN0X21vZGUpDQo+PiArew0KPj4gKyAgVHlU eVJlc29sdmVDb21waWxlIGNvbXBpbGVyIChjdHgsIHRyYWl0X29iamVjdF9tb2RlKTsNCj4+ ICsgIHR5LT5hY2NlcHRfdmlzIChjb21waWxlcik7DQo+PiArDQo+PiArICBpZiAoY29tcGls ZXIudHJhbnNsYXRlZCAhPSBlcnJvcl9tYXJrX25vZGUNCj4+ICsgICAgICAmJiBUWVBFX05B TUUgKGNvbXBpbGVyLnRyYW5zbGF0ZWQpICE9IE5VTEwpDQo+PiArICAgIHsNCj4+ICsgICAg ICAvLyBjYW5vbmljYWxpemUgdGhlIHR5cGUNCj4+ICsgICAgICBjb21waWxlci50cmFuc2xh dGVkID0gY3R4LT5pbnNlcnRfY29tcGlsZWRfdHlwZSAoY29tcGlsZXIudHJhbnNsYXRlZCk7 DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHJldHVybiBjb21waWxlci50cmFuc2xhdGVkOw0K Pj4gK30NCj4+ICsNCj4+ICsvLyBzZWU6IGdjYy9jL2MtZGVjbC5jYzo4MjMwLTgyNDENCj4+ ICsvLyBodHRwczovL2dpdGh1Yi5jb20vUnVzdC1HQ0MvZ2NjcnMvYmxvYi8wMDI0YmMyZjAy ODM2OWI4NzFhNjVjZWIxMWIyZmRkZmIwZjljM2FhL2djYy9jL2MtZGVjbC5jI0w4MjI5LUw4 MjQxDQo+PiArdHJlZQ0KPj4gK1R5VHlSZXNvbHZlQ29tcGlsZTo6Z2V0X2ltcGxpY2l0X2Vu dW1lcmFsX25vZGVfdHlwZSAoQ29udGV4dCAqY3R4KQ0KPj4gK3sNCj4+ICsgIC8vIHN0YXRp YyB0cmVlIGVudW1fbm9kZSA9IE5VTExfVFJFRTsNCj4+ICsgIC8vIGlmIChlbnVtX25vZGUg PT0gTlVMTF9UUkVFKQ0KPj4gKyAgLy8gICB7DQo+PiArICAvLyAgICAgZW51bV9ub2RlID0g bWFrZV9ub2RlIChFTlVNRVJBTF9UWVBFKTsNCj4+ICsgIC8vICAgICBTRVRfVFlQRV9NT0RF IChlbnVtX25vZGUsIFRZUEVfTU9ERSAodW5zaWduZWRfdHlwZV9ub2RlKSk7DQo+PiArICAv LyAgICAgU0VUX1RZUEVfQUxJR04gKGVudW1fbm9kZSwgVFlQRV9BTElHTiAodW5zaWduZWRf dHlwZV9ub2RlKSk7DQo+PiArICAvLyAgICAgVFlQRV9VU0VSX0FMSUdOIChlbnVtX25vZGUp ID0gMDsNCj4+ICsgIC8vICAgICBUWVBFX1VOU0lHTkVEIChlbnVtX25vZGUpID0gMTsNCj4+ ICsgIC8vICAgICBUWVBFX1BSRUNJU0lPTiAoZW51bV9ub2RlKSA9IFRZUEVfUFJFQ0lTSU9O ICh1bnNpZ25lZF90eXBlX25vZGUpOw0KPj4gKyAgLy8gICAgIFRZUEVfTUlOX1ZBTFVFIChl bnVtX25vZGUpID0gVFlQRV9NSU5fVkFMVUUgKHVuc2lnbmVkX3R5cGVfbm9kZSk7DQo+PiAr ICAvLyAgICAgVFlQRV9NQVhfVkFMVUUgKGVudW1fbm9kZSkgPSBUWVBFX01BWF9WQUxVRSAo dW5zaWduZWRfdHlwZV9ub2RlKTsNCj4+ICsNCj4+ICsgIC8vICAgICAvLyB0cmVlIGlkZW50 aWZpZXIgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5nZXRfaWRlbnRpZmllcl9ub2RlDQo+PiAr ICAvLyAgICAgLy8gKCJlbnVtZXJhbCIpOyB0cmVlIGVudW1fZGVjbA0KPj4gKyAgLy8gICAg IC8vICAgPSBidWlsZF9kZWNsIChCVUlMVElOU19MT0NBVElPTiwgVFlQRV9ERUNMLCBpZGVu dGlmaWVyLA0KPj4gKyAgLy8gICAgIGVudW1fbm9kZSk7DQo+PiArICAvLyAgICAgLy8gVFlQ RV9OQU1FIChlbnVtX25vZGUpID0gZW51bV9kZWNsOw0KPj4gKyAgLy8gICB9DQo+PiArICAv LyByZXR1cm4gZW51bV9ub2RlOw0KPj4gKw0KPj4gKyAgc3RhdGljIHRyZWUgZW51bV9ub2Rl ID0gTlVMTF9UUkVFOw0KPj4gKyAgaWYgKGVudW1fbm9kZSA9PSBOVUxMX1RSRUUpDQo+PiAr ICAgIHsNCj4+ICsgICAgICBlbnVtX25vZGUgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5uYW1l ZF90eXBlICgNCj4+ICsgICAgICAgImVudW1lcmFsIiwgY3R4LT5nZXRfYmFja2VuZCAoKS0+ aW50ZWdlcl90eXBlIChmYWxzZSwgNjQpLA0KPj4gKyAgICAgICBMaW5lbWFwOjpwcmVkZWNs YXJlZF9sb2NhdGlvbiAoKSk7DQo+PiArICAgIH0NCj4+ICsgIHJldHVybiBlbnVtX25vZGU7 DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtUeVR5UmVzb2x2ZUNvbXBpbGU6OnZpc2l0 IChjb25zdCBUeVR5OjpFcnJvclR5cGUgJikNCj4+ICt7DQo+PiArICB0cmFuc2xhdGVkID0g ZXJyb3JfbWFya19ub2RlOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArVHlUeVJlc29s dmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6SW5mZXJUeXBlICYpDQo+PiArew0KPj4g KyAgdHJhbnNsYXRlZCA9IGVycm9yX21hcmtfbm9kZTsNCj4+ICt9DQo+PiArDQo+PiArdm9p ZA0KPj4gK1R5VHlSZXNvbHZlQ29tcGlsZTo6dmlzaXQgKGNvbnN0IFR5VHk6OkNsb3N1cmVU eXBlICYpDQo+PiArew0KPj4gKyAgZ2NjX3VucmVhY2hhYmxlICgpOw0KPj4gK30NCj4+ICsN Cj4+ICt2b2lkDQo+PiArVHlUeVJlc29sdmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6 UHJvamVjdGlvblR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgdHlwZS5nZXQgKCktPmFjY2Vw dF92aXMgKCp0aGlzKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK1R5VHlSZXNvbHZl Q29tcGlsZTo6dmlzaXQgKGNvbnN0IFR5VHk6OlBsYWNlaG9sZGVyVHlwZSAmdHlwZSkNCj4+ ICt7DQo+PiArICB0eXBlLnJlc29sdmUgKCktPmFjY2VwdF92aXMgKCp0aGlzKTsNCj4+ICt9 DQo+PiArDQo+PiArdm9pZA0KPj4gK1R5VHlSZXNvbHZlQ29tcGlsZTo6dmlzaXQgKGNvbnN0 IFR5VHk6OlBhcmFtVHlwZSAmcGFyYW0pDQo+PiArew0KPj4gKyAgaWYgKHJlY3VyaXN2ZV9v cHMrKyA+PSBydXN0X21heF9yZWN1cnNpb25fZGVwdGgpDQo+PiArICAgIHsNCj4+ICsgICAg ICBydXN0X2Vycm9yX2F0IChMb2NhdGlvbiAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAg ICIlPHJlY3Vyc2lvbiBkZXB0aCU+IGNvdW50IGV4Y2VlZHMgbGltaXQgb2YgJWkgKHVzZSAi DQo+PiArICAgICAgICAgICAgICAgICAgICAiJTxmcnVzdC1tYXgtcmVjdXJzaW9uLWRlcHRo PSU+IHRvIGluY3JlYXNlIHRoZSBsaW1pdCkiLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg cnVzdF9tYXhfcmVjdXJzaW9uX2RlcHRoKTsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gZXJy b3JfbWFya19ub2RlOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgcGFyYW0ucmVzb2x2ZSAoKS0+YWNjZXB0X3ZpcyAoKnRoaXMpOw0KPj4gK30NCj4+ICsN Cj4+ICt2b2lkDQo+PiArVHlUeVJlc29sdmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6 Rm5UeXBlICZ0eXBlKQ0KPj4gK3sNCj4+ICsgIEJhY2tlbmQ6OnR5cGVkX2lkZW50aWZpZXIg cmVjZWl2ZXI7DQo+PiArICBzdGQ6OnZlY3RvcjxCYWNrZW5kOjp0eXBlZF9pZGVudGlmaWVy PiBwYXJhbWV0ZXJzOw0KPj4gKyAgc3RkOjp2ZWN0b3I8QmFja2VuZDo6dHlwZWRfaWRlbnRp Zmllcj4gcmVzdWx0czsNCj4+ICsNCj4+ICsgIGlmICghdHlwZS5nZXRfcmV0dXJuX3R5cGUg KCktPmlzX3VuaXQgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICBhdXRvIGhpcl90eXBlID0g dHlwZS5nZXRfcmV0dXJuX3R5cGUgKCk7DQo+PiArICAgICAgYXV0byByZXQgPSBUeVR5UmVz b2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0eCwgaGlyX3R5cGUsIHRyYWl0X29iamVjdF9tb2Rl KTsNCj4+ICsgICAgICByZXN1bHRzLnB1c2hfYmFjayAoQmFja2VuZDo6dHlwZWRfaWRlbnRp ZmllciAoDQo+PiArICAgICAgICJfIiwgcmV0LA0KPj4gKyAgICAgICBjdHgtPmdldF9tYXBw aW5ncyAoKS0+bG9va3VwX2xvY2F0aW9uIChoaXJfdHlwZS0+Z2V0X3JlZiAoKSkpKTsNCj4+ ICsgICAgfQ0KPj4gKw0KPj4gKyAgZm9yIChhdXRvICZwYXJhbV9wYWlyIDogdHlwZS5nZXRf cGFyYW1zICgpKQ0KPj4gKyAgICB7DQo+PiArICAgICAgYXV0byBwYXJhbV90eXR5ID0gcGFy YW1fcGFpci5zZWNvbmQ7DQo+PiArICAgICAgYXV0byBjb21waWxlZF9wYXJhbV90eXBlDQo+ PiArICAgICAgID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIHBhcmFtX3R5 dHksIHRyYWl0X29iamVjdF9tb2RlKTsNCj4+ICsNCj4+ICsgICAgICBhdXRvIGNvbXBpbGVk X3BhcmFtID0gQmFja2VuZDo6dHlwZWRfaWRlbnRpZmllciAoDQo+PiArICAgICAgIHBhcmFt X3BhaXIuZmlyc3QtPmFzX3N0cmluZyAoKSwgY29tcGlsZWRfcGFyYW1fdHlwZSwNCj4+ICsg ICAgICAgY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9sb2NhdGlvbiAocGFyYW1fdHl0 eS0+Z2V0X3JlZiAoKSkpOw0KPj4gKw0KPj4gKyAgICAgIHBhcmFtZXRlcnMucHVzaF9iYWNr IChjb21waWxlZF9wYXJhbSk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIGlmICghdHlwZS5p c192YXJhZGljICgpKQ0KPj4gKyAgICB0cmFuc2xhdGVkDQo+PiArICAgICAgPSBjdHgtPmdl dF9iYWNrZW5kICgpLT5mdW5jdGlvbl90eXBlIChyZWNlaXZlciwgcGFyYW1ldGVycywgcmVz dWx0cywgTlVMTCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdHlwZS5nZXRfaWRlbnQgKCkubG9jdXMpOw0KPj4gKyAgZWxzZQ0KPj4gKyAgICB0 cmFuc2xhdGVkDQo+PiArICAgICAgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5mdW5jdGlvbl90 eXBlX3ZhcmFkaWMgKHJlY2VpdmVyLCBwYXJhbWV0ZXJzLA0KPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsIE5VTEwsDQo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dHlwZS5nZXRfaWRlbnQgKCkubG9jdXMpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiAr VHlUeVJlc29sdmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6Rm5QdHIgJnR5cGUpDQo+ PiArew0KPj4gKyAgdHJlZSByZXN1bHRfdHlwZSA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29t cGlsZSAoY3R4LCB0eXBlLmdldF9yZXR1cm5fdHlwZSAoKSk7DQo+PiArDQo+PiArICBzdGQ6 OnZlY3Rvcjx0cmVlPiBwYXJhbWV0ZXJzOw0KPj4gKw0KPj4gKyAgYXV0byAmcGFyYW1zID0g dHlwZS5nZXRfcGFyYW1zICgpOw0KPj4gKyAgZm9yIChhdXRvICZwIDogcGFyYW1zKQ0KPj4g KyAgICB7DQo+PiArICAgICAgdHJlZSBwdHkgPSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBp bGUgKGN0eCwgcC5nZXRfdHl0eSAoKSk7DQo+PiArICAgICAgcGFyYW1ldGVycy5wdXNoX2Jh Y2sgKHB0eSk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyYW5zbGF0ZWQgPSBjdHgtPmdl dF9iYWNrZW5kICgpLT5mdW5jdGlvbl9wdHJfdHlwZSAocmVzdWx0X3R5cGUsIHBhcmFtZXRl cnMsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdHlwZS5nZXRfaWRlbnQgKCkubG9jdXMpOw0KPj4gK30NCj4+ICsNCj4+ICt2 b2lkDQo+PiArVHlUeVJlc29sdmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6QURUVHlw ZSAmdHlwZSkNCj4+ICt7DQo+PiArICB0cmVlIHR5cGVfcmVjb3JkID0gZXJyb3JfbWFya19u b2RlOw0KPj4gKyAgaWYgKCF0eXBlLmlzX2VudW0gKCkpDQo+PiArICAgIHsNCj4+ICsgICAg ICBydXN0X2Fzc2VydCAodHlwZS5udW1iZXJfb2ZfdmFyaWFudHMgKCkgPT0gMSk7DQo+PiAr DQo+PiArICAgICAgVHlUeTo6VmFyaWFudERlZiAmdmFyaWFudCA9ICp0eXBlLmdldF92YXJp YW50cyAoKS5hdCAoMCk7DQo+PiArICAgICAgc3RkOjp2ZWN0b3I8QmFja2VuZDo6dHlwZWRf aWRlbnRpZmllcj4gZmllbGRzOw0KPj4gKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg dmFyaWFudC5udW1fZmllbGRzICgpOyBpKyspDQo+PiArICAgICAgIHsNCj4+ICsgICAgICAg ICBjb25zdCBUeVR5OjpTdHJ1Y3RGaWVsZFR5cGUgKmZpZWxkID0gdmFyaWFudC5nZXRfZmll bGRfYXRfaW5kZXggKGkpOw0KPj4gKyAgICAgICAgIHRyZWUgY29tcGlsZWRfZmllbGRfdHkN Cj4+ICsgICAgICAgICAgID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIGZp ZWxkLT5nZXRfZmllbGRfdHlwZSAoKSk7DQo+PiArDQo+PiArICAgICAgICAgQmFja2VuZDo6 dHlwZWRfaWRlbnRpZmllciBmIChmaWVsZC0+Z2V0X25hbWUgKCksIGNvbXBpbGVkX2ZpZWxk X3R5LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5n ZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9sb2NhdGlvbiAoDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0X3R5X3JlZiAoKSkpOw0KPj4gKyAg ICAgICAgIGZpZWxkcy5wdXNoX2JhY2sgKHN0ZDo6bW92ZSAoZikpOw0KPj4gKyAgICAgICB9 DQo+PiArDQo+PiArICAgICAgdHlwZV9yZWNvcmQgPSB0eXBlLmlzX3VuaW9uICgpDQo+PiAr ICAgICAgICAgICAgICAgICAgICAgPyBjdHgtPmdldF9iYWNrZW5kICgpLT51bmlvbl90eXBl IChmaWVsZHMpDQo+PiArICAgICAgICAgICAgICAgICAgICAgOiBjdHgtPmdldF9iYWNrZW5k ICgpLT5zdHJ1Y3RfdHlwZSAoZmllbGRzKTsNCj4+ICsgICAgfQ0KPj4gKyAgZWxzZQ0KPj4g KyAgICB7DQo+PiArICAgICAgLy8gc2VlOg0KPj4gKyAgICAgIC8vIGh0dHBzOi8vZ2l0aHVi LmNvbS9ibWlub3IvYmludXRpbHMtZ2RiL2Jsb2IvNTI3Yjg4NjFjZDQ3MjM4NWZhOTE2MGE5 MWRkNmQ2NWEyNWM0MTk4Ny9nZGIvZHdhcmYyL3JlYWQuYyNMOTAxMC1MOTI0MQ0KPj4gKyAg ICAgIC8vDQo+PiArICAgICAgLy8gZW51bXMgYXJlIGFjdHVhbGx5IGEgYmlnIHVuaW9uIHNv IGZvciBleGFtcGxlIHRoZSBydXN0IGVudW06DQo+PiArICAgICAgLy8NCj4+ICsgICAgICAv LyBlbnVtIEFuRW51bSB7DQo+PiArICAgICAgLy8gICBBLA0KPj4gKyAgICAgIC8vICAgQiwN Cj4+ICsgICAgICAvLyAgIEMgKGNoYXIpLA0KPj4gKyAgICAgIC8vICAgRCB7IHg6IGk2NCwg eTogaTY0IH0sDQo+PiArICAgICAgLy8gfQ0KPj4gKyAgICAgIC8vDQo+PiArICAgICAgLy8g d2UgYWN0dWFsbHkgdHVybiB0aGlzIGludG8NCj4+ICsgICAgICAvLw0KPj4gKyAgICAgIC8v IHVuaW9uIHsNCj4+ICsgICAgICAvLyAgIHN0cnVjdCBBIHsgaW50IFJVU1QkRU5VTSRESVNS OyB9OyA8LSB0aGlzIGlzIGEgZGF0YS1sZXNzIHZhcmlhbnQNCj4+ICsgICAgICAvLyAgIHN0 cnVjdCBCIHsgaW50IFJVU1QkRU5VTSRESVNSOyB9OyA8LSB0aGlzIGlzIGEgZGF0YS1sZXNz IHZhcmlhbnQNCj4+ICsgICAgICAvLyAgIHN0cnVjdCBDIHsgaW50IFJVU1QkRU5VTSRESVNS OyBjaGFyIF9fMDsgfTsNCj4+ICsgICAgICAvLyAgIHN0cnVjdCBEIHsgaW50IFJVU1QkRU5V TSRESVNSOyBpNjQgeDsgaTY0IHk7IH07DQo+PiArICAgICAgLy8gfQ0KPj4gKyAgICAgIC8v DQo+PiArICAgICAgLy8gQWRhLCBxdWFsX3VuaW9uX3R5cGVzIG1pZ2h0IHN0aWxsIHdvcmsg Zm9yIHRoaXMgYnV0IEkgYW0gbm90IDEwMCUgc3VyZS4NCj4+ICsgICAgICAvLyBJIHJhbiBp bnRvIHNvbWUgaXNzdWVzIGxldHMgcmV1c2Ugb3VyIG5vcm1hbCB1bmlvbiBhbmQgYXNrIEFk YSBwZW9wbGUNCj4+ICsgICAgICAvLyBhYm91dCBpdC4NCj4+ICsNCj4+ICsgICAgICBzdGQ6 OnZlY3Rvcjx0cmVlPiB2YXJpYW50X3JlY29yZHM7DQo+PiArICAgICAgZm9yIChhdXRvICZ2 YXJpYW50IDogdHlwZS5nZXRfdmFyaWFudHMgKCkpDQo+PiArICAgICAgIHsNCj4+ICsgICAg ICAgICBzdGQ6OnZlY3RvcjxCYWNrZW5kOjp0eXBlZF9pZGVudGlmaWVyPiBmaWVsZHM7DQo+ PiArDQo+PiArICAgICAgICAgLy8gYWRkIGluIHRoZSBxdWFsaWZpZXIgZmllbGQgZm9yIHRo ZSB2YXJpYW50DQo+PiArICAgICAgICAgdHJlZSBlbnVtZXJhbF90eXBlDQo+PiArICAgICAg ICAgICA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Z2V0X2ltcGxpY2l0X2VudW1lcmFsX25vZGVf dHlwZSAoY3R4KTsNCj4+ICsgICAgICAgICBCYWNrZW5kOjp0eXBlZF9pZGVudGlmaWVyIGYg KFJVU1RfRU5VTV9ESVNSX0ZJRUxEX05BTUUsIGVudW1lcmFsX3R5cGUsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmdldF9tYXBwaW5ncyAoKS0+ bG9va3VwX2xvY2F0aW9uICgNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdmFyaWFudC0+Z2V0X2lkICgpKSk7DQo+PiArICAgICAgICAgZmllbGRzLnB1 c2hfYmFjayAoc3RkOjptb3ZlIChmKSk7DQo+PiArDQo+PiArICAgICAgICAgLy8gY29tcGls ZSB0aGUgcmVzdCBvZiB0aGUgZmllbGRzDQo+PiArICAgICAgICAgZm9yIChzaXplX3QgaSA9 IDA7IGkgPCB2YXJpYW50LT5udW1fZmllbGRzICgpOyBpKyspDQo+PiArICAgICAgICAgICB7 DQo+PiArICAgICAgICAgICAgIGNvbnN0IFR5VHk6OlN0cnVjdEZpZWxkVHlwZSAqZmllbGQN Cj4+ICsgICAgICAgICAgICAgICA9IHZhcmlhbnQtPmdldF9maWVsZF9hdF9pbmRleCAoaSk7 DQo+PiArICAgICAgICAgICAgIHRyZWUgY29tcGlsZWRfZmllbGRfdHkNCj4+ICsgICAgICAg ICAgICAgICA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCBmaWVsZC0+Z2V0 X2ZpZWxkX3R5cGUgKCkpOw0KPj4gKw0KPj4gKyAgICAgICAgICAgICBzdGQ6OnN0cmluZyBm aWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lICgpOw0KPj4gKyAgICAgICAgICAgICBpZiAo dmFyaWFudC0+Z2V0X3ZhcmlhbnRfdHlwZSAoKQ0KPj4gKyAgICAgICAgICAgICAgICAgPT0g VHlUeTo6VmFyaWFudERlZjo6VmFyaWFudFR5cGU6OlRVUExFKQ0KPj4gKyAgICAgICAgICAg ICAgIGZpZWxkX25hbWUgPSAiX18iICsgZmllbGQtPmdldF9uYW1lICgpOw0KPj4gKw0KPj4g KyAgICAgICAgICAgICBCYWNrZW5kOjp0eXBlZF9pZGVudGlmaWVyIGYgKA0KPj4gKyAgICAg ICAgICAgICAgIGZpZWxkX25hbWUsIGNvbXBpbGVkX2ZpZWxkX3R5LA0KPj4gKyAgICAgICAg ICAgICAgIGN0eC0+Z2V0X21hcHBpbmdzICgpLT5sb29rdXBfbG9jYXRpb24gKHR5cGUuZ2V0 X3R5X3JlZiAoKSkpOw0KPj4gKyAgICAgICAgICAgICBmaWVsZHMucHVzaF9iYWNrIChzdGQ6 Om1vdmUgKGYpKTsNCj4+ICsgICAgICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAgICB0cmVl IHZhcmlhbnRfcmVjb3JkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+c3RydWN0X3R5cGUgKGZp ZWxkcyk7DQo+PiArICAgICAgICAgdHJlZSBuYW1lZF92YXJpYW50X3JlY29yZCA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPm5hbWVkX3R5cGUgKA0KPj4gKyAgICAgICAgICAgdmFyaWFudC0+ Z2V0X2lkZW50ICgpLnBhdGguZ2V0ICgpLCB2YXJpYW50X3JlY29yZCwNCj4+ICsgICAgICAg ICAgIHZhcmlhbnQtPmdldF9pZGVudCAoKS5sb2N1cyk7DQo+PiArDQo+PiArICAgICAgICAg Ly8gc2V0IHRoZSBxdWFsaWZpZXIgdG8gYmUgYSBidWlsdGluDQo+PiArICAgICAgICAgREVD TF9BUlRJRklDSUFMIChUWVBFX0ZJRUxEUyAodmFyaWFudF9yZWNvcmQpKSA9IDE7DQo+PiAr DQo+PiArICAgICAgICAgLy8gYWRkIHRoZW0gdG8gdGhlIGxpc3QNCj4+ICsgICAgICAgICB2 YXJpYW50X3JlY29yZHMucHVzaF9iYWNrIChuYW1lZF92YXJpYW50X3JlY29yZCk7DQo+PiAr ICAgICAgIH0NCj4+ICsNCj4+ICsgICAgICAvLyBub3cgd2UgbmVlZCB0byBtYWtlIHRoZSBh Y3R1YWwgdW5pb24sIGJ1dCBmaXJzdCB3ZSBuZWVkIHRvIG1ha2UNCj4+ICsgICAgICAvLyBu YW1lZF90eXBlIFRZUEVfREVDTCdzIG91dCBvZiB0aGUgdmFyaWFudHMNCj4+ICsNCj4+ICsg ICAgICBzaXplX3QgaSA9IDA7DQo+PiArICAgICAgc3RkOjp2ZWN0b3I8QmFja2VuZDo6dHlw ZWRfaWRlbnRpZmllcj4gZW51bV9maWVsZHM7DQo+PiArICAgICAgZm9yIChhdXRvICZ2YXJp YW50X3JlY29yZCA6IHZhcmlhbnRfcmVjb3JkcykNCj4+ICsgICAgICAgew0KPj4gKyAgICAg ICAgIFR5VHk6OlZhcmlhbnREZWYgKnZhcmlhbnQgPSB0eXBlLmdldF92YXJpYW50cyAoKS5h dCAoaSsrKTsNCj4+ICsgICAgICAgICBzdGQ6OnN0cmluZyBpbXBsaWNpdF92YXJpYW50X25h bWUgPSB2YXJpYW50LT5nZXRfaWRlbnRpZmllciAoKTsNCj4+ICsNCj4+ICsgICAgICAgICBC YWNrZW5kOjp0eXBlZF9pZGVudGlmaWVyIGYgKGltcGxpY2l0X3ZhcmlhbnRfbmFtZSwgdmFy aWFudF9yZWNvcmQsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjdHgtPmdldF9tYXBwaW5ncyAoKS0+bG9va3VwX2xvY2F0aW9uICgNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRfdHlfcmVmICgpKSk7 DQo+PiArICAgICAgICAgZW51bV9maWVsZHMucHVzaF9iYWNrIChzdGQ6Om1vdmUgKGYpKTsN Cj4+ICsgICAgICAgfQ0KPj4gKw0KPj4gKyAgICAgIC8vIGZpbmFsbHkgbWFrZSB0aGUgdW5p b24gb3IgdGhlIGVudW0NCj4+ICsgICAgICB0eXBlX3JlY29yZCA9IGN0eC0+Z2V0X2JhY2tl bmQgKCktPnVuaW9uX3R5cGUgKGVudW1fZmllbGRzKTsNCj4+ICsgICAgfQ0KPj4gKw0KPj4g KyAgLy8gSGFuZGxlIHJlcHIgb3B0aW9ucw0KPj4gKyAgLy8gVE9ETzogInBhY2tlZCIgc2hv dWxkIG9ubHkgbmFycm93IHR5cGUgYWxpZ25tZW50IGFuZCAiYWxpZ24iIHNob3VsZCBvbmx5 DQo+PiArICAvLyB3aWRlbiBpdC4gRG8gd2UgbmVlZCB0byBjaGVjayBhbmQgZW5mb3JjZSB0 aGlzIGhlcmUsIG9yIGlzIGl0IHRha2VuIGNhcmUgb2YNCj4+ICsgIC8vIGxhdGVyIG9uIGlu IHRoZSBnY2MgbWlkZGxlLWVuZD8NCj4+ICsgIFR5VHk6OkFEVFR5cGU6OlJlcHJPcHRpb25z IHJlcHIgPSB0eXBlLmdldF9yZXByX29wdGlvbnMgKCk7DQo+PiArICBpZiAocmVwci5wYWNr KQ0KPj4gKyAgICB7DQo+PiArICAgICAgVFlQRV9QQUNLRUQgKHR5cGVfcmVjb3JkKSA9IDE7 DQo+PiArICAgICAgaWYgKHJlcHIucGFjayA+IDEpDQo+PiArICAgICAgIHsNCj4+ICsgICAg ICAgICBTRVRfVFlQRV9BTElHTiAodHlwZV9yZWNvcmQsIHJlcHIucGFjayAqIDgpOw0KPj4g KyAgICAgICAgIFRZUEVfVVNFUl9BTElHTiAodHlwZV9yZWNvcmQpID0gMTsNCj4+ICsgICAg ICAgfQ0KPj4gKyAgICB9DQo+PiArICBlbHNlIGlmIChyZXByLmFsaWduKQ0KPj4gKyAgICB7 DQo+PiArICAgICAgU0VUX1RZUEVfQUxJR04gKHR5cGVfcmVjb3JkLCByZXByLmFsaWduICog OCk7DQo+PiArICAgICAgVFlQRV9VU0VSX0FMSUdOICh0eXBlX3JlY29yZCkgPSAxOw0KPj4g KyAgICB9DQo+PiArDQo+PiArICBzdGQ6OnN0cmluZyBuYW1lZF9zdHJ1Y3Rfc3RyDQo+PiAr ICAgID0gdHlwZS5nZXRfaWRlbnQgKCkucGF0aC5nZXQgKCkgKyB0eXBlLnN1YnN0X2FzX3N0 cmluZyAoKTsNCj4+ICsgIHRyYW5zbGF0ZWQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5uYW1l ZF90eXBlIChuYW1lZF9zdHJ1Y3Rfc3RyLCB0eXBlX3JlY29yZCwNCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0X2lkZW50ICgp LmxvY3VzKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK1R5VHlSZXNvbHZlQ29tcGls ZTo6dmlzaXQgKGNvbnN0IFR5VHk6OlR1cGxlVHlwZSAmdHlwZSkNCj4+ICt7DQo+PiArICBp ZiAodHlwZS5udW1fZmllbGRzICgpID09IDApDQo+PiArICAgIHsNCj4+ICsgICAgICB0cmFu c2xhdGVkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+dW5pdF90eXBlICgpOw0KPj4gKyAgICAg IHJldHVybjsNCj4+ICsgICAgfQ0KPj4gKw0KPj4gKyAgLy8gY3JlYXRlIGltcGxpY2l0IHN0 cnVjdA0KPj4gKyAgc3RkOjp2ZWN0b3I8QmFja2VuZDo6dHlwZWRfaWRlbnRpZmllcj4gZmll bGRzOw0KPj4gKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0eXBlLm51bV9maWVsZHMgKCk7 IGkrKykNCj4+ICsgICAgew0KPj4gKyAgICAgIFR5VHk6OkJhc2VUeXBlICpmaWVsZCA9IHR5 cGUuZ2V0X2ZpZWxkIChpKTsNCj4+ICsgICAgICB0cmVlIGNvbXBpbGVkX2ZpZWxkX3R5ID0g VHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIGZpZWxkKTsNCj4+ICsNCj4+ICsg ICAgICAvLyBydXN0YyB1c2VzIHRoZSBjb252ZW50aW9uIF9fTiwgd2hlcmUgTiBpcyBhbiBp bnRlZ2VyLCB0bw0KPj4gKyAgICAgIC8vIG5hbWUgdGhlIGZpZWxkcyBvZiBhIHR1cGxlLiAg V2UgZm9sbG93IHRoaXMgYXMgd2VsbCwNCj4+ICsgICAgICAvLyBiZWNhdXNlIHRoaXMgaXMg dXNlZCBieSBHREIuICBPbmUgZnVydGhlciByZWFzb24gdG8gcHJlZmVyDQo+PiArICAgICAg Ly8gdGhpcywgcmF0aGVyIHRoYW4gc2ltcGx5IGVtaXR0aW5nIHRoZSBpbnRlZ2VyLCBpcyB0 aGF0IHRoaXMNCj4+ICsgICAgICAvLyBhcHByb2FjaCBtYWtlcyBpdCBzaW1wbGVyIHRvIHVz ZSBhIEMtb25seSBkZWJ1Z2dlciwgb3INCj4+ICsgICAgICAvLyBHREIncyBDIG1vZGUsIHdo ZW4gZGVidWdnaW5nIFJ1c3QuDQo+PiArICAgICAgQmFja2VuZDo6dHlwZWRfaWRlbnRpZmll ciBmICgiX18iICsgc3RkOjp0b19zdHJpbmcgKGkpLCBjb21waWxlZF9maWVsZF90eSwNCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5nZXRfbWFwcGluZ3Mg KCktPmxvb2t1cF9sb2NhdGlvbiAoDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdHlwZS5nZXRfdHlfcmVmICgpKSk7DQo+PiArICAgICAgZmllbGRzLnB1c2hf YmFjayAoc3RkOjptb3ZlIChmKSk7DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyZWUgc3Ry dWN0X3R5cGVfcmVjb3JkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+c3RydWN0X3R5cGUgKGZp ZWxkcyk7DQo+PiArICB0cmFuc2xhdGVkDQo+PiArICAgID0gY3R4LT5nZXRfYmFja2VuZCAo KS0+bmFtZWRfdHlwZSAodHlwZS5hc19zdHJpbmcgKCksIHN0cnVjdF90eXBlX3JlY29yZCwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0X2lk ZW50ICgpLmxvY3VzKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK1R5VHlSZXNvbHZl Q29tcGlsZTo6dmlzaXQgKGNvbnN0IFR5VHk6OkFycmF5VHlwZSAmdHlwZSkNCj4+ICt7DQo+ PiArICB0cmVlIGVsZW1lbnRfdHlwZQ0KPj4gKyAgICA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6 Y29tcGlsZSAoY3R4LCB0eXBlLmdldF9lbGVtZW50X3R5cGUgKCkpOw0KPj4gKyAgdHJlZSBj YXBhY2l0eV9leHByID0gQ29tcGlsZUV4cHI6OkNvbXBpbGUgKCZ0eXBlLmdldF9jYXBhY2l0 eV9leHByICgpLCBjdHgpOw0KPj4gKyAgdHJlZSBmb2xkZWRfY2FwYWNpdHlfZXhwciA9IGZv bGRfZXhwciAoY2FwYWNpdHlfZXhwcik7DQo+PiArDQo+PiArICB0cmFuc2xhdGVkDQo+PiAr ICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+YXJyYXlfdHlwZSAoZWxlbWVudF90eXBlLCBm b2xkZWRfY2FwYWNpdHlfZXhwcik7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtUeVR5 UmVzb2x2ZUNvbXBpbGU6OnZpc2l0IChjb25zdCBUeVR5OjpTbGljZVR5cGUgJnR5cGUpDQo+ PiArew0KPj4gKyAgdHJlZSB0eXBlX3JlY29yZCA9IGNyZWF0ZV9zbGljZV90eXBlX3JlY29y ZCAodHlwZSk7DQo+PiArDQo+PiArICBzdGQ6OnN0cmluZyBuYW1lZF9zdHJ1Y3Rfc3RyDQo+ PiArICAgID0gc3RkOjpzdHJpbmcgKCJbIikgKyB0eXBlLmdldF9lbGVtZW50X3R5cGUgKCkt PmdldF9uYW1lICgpICsgIl0iOw0KPj4gKyAgdHJhbnNsYXRlZCA9IGN0eC0+Z2V0X2JhY2tl bmQgKCktPm5hbWVkX3R5cGUgKG5hbWVkX3N0cnVjdF9zdHIsIHR5cGVfcmVjb3JkLA0KPj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5n ZXRfaWRlbnQgKCkubG9jdXMpOw0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArVHlUeVJl c29sdmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6Qm9vbFR5cGUgJnR5cGUpDQo+PiAr ew0KPj4gKyAgdHJhbnNsYXRlZA0KPj4gKyAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPm5h bWVkX3R5cGUgKCJib29sIiwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGN0eC0+Z2V0X2JhY2tlbmQgKCktPmJvb2xfdHlwZSAoKSwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVtYXA6OnByZWRlY2xhcmVkX2xv Y2F0aW9uICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK1R5VHlSZXNvbHZlQ29t cGlsZTo6dmlzaXQgKGNvbnN0IFR5VHk6OkludFR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAg c3dpdGNoICh0eXBlLmdldF9pbnRfa2luZCAoKSkNCj4+ICsgICAgew0KPj4gKyAgICBjYXNl IFR5VHk6OkludFR5cGU6Okk4Og0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBjdHgtPmdldF9i YWNrZW5kICgpLT5uYW1lZF90eXBlICgNCj4+ICsgICAgICAgImk4IiwgY3R4LT5nZXRfYmFj a2VuZCAoKS0+aW50ZWdlcl90eXBlIChmYWxzZSwgOCksDQo+PiArICAgICAgIExpbmVtYXA6 OnByZWRlY2xhcmVkX2xvY2F0aW9uICgpKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArDQo+ PiArICAgIGNhc2UgVHlUeTo6SW50VHlwZTo6STE2Og0KPj4gKyAgICAgIHRyYW5zbGF0ZWQg PSBjdHgtPmdldF9iYWNrZW5kICgpLT5uYW1lZF90eXBlICgNCj4+ICsgICAgICAgImkxNiIs IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmludGVnZXJfdHlwZSAoZmFsc2UsIDE2KSwNCj4+ICsg ICAgICAgTGluZW1hcDo6cHJlZGVjbGFyZWRfbG9jYXRpb24gKCkpOw0KPj4gKyAgICAgIHJl dHVybjsNCj4+ICsNCj4+ICsgICAgY2FzZSBUeVR5OjpJbnRUeXBlOjpJMzI6DQo+PiArICAg ICAgdHJhbnNsYXRlZCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPm5hbWVkX3R5cGUgKA0KPj4g KyAgICAgICAiaTMyIiwgY3R4LT5nZXRfYmFja2VuZCAoKS0+aW50ZWdlcl90eXBlIChmYWxz ZSwgMzIpLA0KPj4gKyAgICAgICBMaW5lbWFwOjpwcmVkZWNsYXJlZF9sb2NhdGlvbiAoKSk7 DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKw0KPj4gKyAgICBjYXNlIFR5VHk6OkludFR5cGU6 Okk2NDoNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+bmFt ZWRfdHlwZSAoDQo+PiArICAgICAgICJpNjQiLCBjdHgtPmdldF9iYWNrZW5kICgpLT5pbnRl Z2VyX3R5cGUgKGZhbHNlLCA2NCksDQo+PiArICAgICAgIExpbmVtYXA6OnByZWRlY2xhcmVk X2xvY2F0aW9uICgpKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiArDQo+PiArICAgIGNhc2Ug VHlUeTo6SW50VHlwZTo6STEyODoNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY3R4LT5nZXRf YmFja2VuZCAoKS0+bmFtZWRfdHlwZSAoDQo+PiArICAgICAgICJpMTI4IiwgY3R4LT5nZXRf YmFja2VuZCAoKS0+aW50ZWdlcl90eXBlIChmYWxzZSwgMTI4KSwNCj4+ICsgICAgICAgTGlu ZW1hcDo6cHJlZGVjbGFyZWRfbG9jYXRpb24gKCkpOw0KPj4gKyAgICAgIHJldHVybjsNCj4+ ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ICt2b2lkDQo+PiArVHlUeVJlc29sdmVDb21waWxl Ojp2aXNpdCAoY29uc3QgVHlUeTo6VWludFR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgc3dp dGNoICh0eXBlLmdldF91aW50X2tpbmQgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgY2FzZSBU eVR5OjpVaW50VHlwZTo6VTg6DQo+PiArICAgICAgdHJhbnNsYXRlZCA9IGN0eC0+Z2V0X2Jh Y2tlbmQgKCktPm5hbWVkX3R5cGUgKA0KPj4gKyAgICAgICAidTgiLCBjdHgtPmdldF9iYWNr ZW5kICgpLT5pbnRlZ2VyX3R5cGUgKHRydWUsIDgpLA0KPj4gKyAgICAgICBMaW5lbWFwOjpw cmVkZWNsYXJlZF9sb2NhdGlvbiAoKSk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKw0KPj4g KyAgICBjYXNlIFR5VHk6OlVpbnRUeXBlOjpVMTY6DQo+PiArICAgICAgdHJhbnNsYXRlZCA9 IGN0eC0+Z2V0X2JhY2tlbmQgKCktPm5hbWVkX3R5cGUgKA0KPj4gKyAgICAgICAidTE2Iiwg Y3R4LT5nZXRfYmFja2VuZCAoKS0+aW50ZWdlcl90eXBlICh0cnVlLCAxNiksDQo+PiArICAg ICAgIExpbmVtYXA6OnByZWRlY2xhcmVkX2xvY2F0aW9uICgpKTsNCj4+ICsgICAgICByZXR1 cm47DQo+PiArDQo+PiArICAgIGNhc2UgVHlUeTo6VWludFR5cGU6OlUzMjoNCj4+ICsgICAg ICB0cmFuc2xhdGVkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+bmFtZWRfdHlwZSAoDQo+PiAr ICAgICAgICJ1MzIiLCBjdHgtPmdldF9iYWNrZW5kICgpLT5pbnRlZ2VyX3R5cGUgKHRydWUs IDMyKSwNCj4+ICsgICAgICAgTGluZW1hcDo6cHJlZGVjbGFyZWRfbG9jYXRpb24gKCkpOw0K Pj4gKyAgICAgIHJldHVybjsNCj4+ICsNCj4+ICsgICAgY2FzZSBUeVR5OjpVaW50VHlwZTo6 VTY0Og0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5uYW1l ZF90eXBlICgNCj4+ICsgICAgICAgInU2NCIsIGN0eC0+Z2V0X2JhY2tlbmQgKCktPmludGVn ZXJfdHlwZSAodHJ1ZSwgNjQpLA0KPj4gKyAgICAgICBMaW5lbWFwOjpwcmVkZWNsYXJlZF9s b2NhdGlvbiAoKSk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKw0KPj4gKyAgICBjYXNlIFR5 VHk6OlVpbnRUeXBlOjpVMTI4Og0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBjdHgtPmdldF9i YWNrZW5kICgpLT5uYW1lZF90eXBlICgNCj4+ICsgICAgICAgInUxMjgiLCBjdHgtPmdldF9i YWNrZW5kICgpLT5pbnRlZ2VyX3R5cGUgKHRydWUsIDEyOCksDQo+PiArICAgICAgIExpbmVt YXA6OnByZWRlY2xhcmVkX2xvY2F0aW9uICgpKTsNCj4+ICsgICAgICByZXR1cm47DQo+PiAr ICAgIH0NCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK1R5VHlSZXNvbHZlQ29tcGlsZTo6 dmlzaXQgKGNvbnN0IFR5VHk6OkZsb2F0VHlwZSAmdHlwZSkNCj4+ICt7DQo+PiArICBzd2l0 Y2ggKHR5cGUuZ2V0X2Zsb2F0X2tpbmQgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgY2FzZSBU eVR5OjpGbG9hdFR5cGU6OkYzMjoNCj4+ICsgICAgICB0cmFuc2xhdGVkDQo+PiArICAgICAg ID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+bmFtZWRfdHlwZSAoImYzMiIsDQo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5nZXRfYmFja2VuZCAo KS0+ZmxvYXRfdHlwZSAoMzIpLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIExpbmVtYXA6OnByZWRlY2xhcmVkX2xvY2F0aW9uICgpKTsNCj4+ICsg ICAgICByZXR1cm47DQo+PiArDQo+PiArICAgIGNhc2UgVHlUeTo6RmxvYXRUeXBlOjpGNjQ6 DQo+PiArICAgICAgdHJhbnNsYXRlZA0KPj4gKyAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQg KCktPm5hbWVkX3R5cGUgKCJmNjQiLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGN0eC0+Z2V0X2JhY2tlbmQgKCktPmZsb2F0X3R5cGUgKDY0KSwN Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lbWFw OjpwcmVkZWNsYXJlZF9sb2NhdGlvbiAoKSk7DQo+PiArICAgICAgcmV0dXJuOw0KPj4gKyAg ICB9DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ICtUeVR5UmVzb2x2ZUNvbXBpbGU6OnZp c2l0IChjb25zdCBUeVR5OjpVU2l6ZVR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgdHJhbnNs YXRlZCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPm5hbWVkX3R5cGUgKA0KPj4gKyAgICAidXNp emUiLA0KPj4gKyAgICBjdHgtPmdldF9iYWNrZW5kICgpLT5pbnRlZ2VyX3R5cGUgKA0KPj4g KyAgICAgIHRydWUsIGN0eC0+Z2V0X2JhY2tlbmQgKCktPmdldF9wb2ludGVyX3NpemUgKCkp LA0KPj4gKyAgICBMaW5lbWFwOjpwcmVkZWNsYXJlZF9sb2NhdGlvbiAoKSk7DQo+PiArfQ0K Pj4gKw0KPj4gK3ZvaWQNCj4+ICtUeVR5UmVzb2x2ZUNvbXBpbGU6OnZpc2l0IChjb25zdCBU eVR5OjpJU2l6ZVR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgdHJhbnNsYXRlZCA9IGN0eC0+ Z2V0X2JhY2tlbmQgKCktPm5hbWVkX3R5cGUgKA0KPj4gKyAgICAiaXNpemUiLA0KPj4gKyAg ICBjdHgtPmdldF9iYWNrZW5kICgpLT5pbnRlZ2VyX3R5cGUgKA0KPj4gKyAgICAgIGZhbHNl LCBjdHgtPmdldF9iYWNrZW5kICgpLT5nZXRfcG9pbnRlcl9zaXplICgpKSwNCj4+ICsgICAg TGluZW1hcDo6cHJlZGVjbGFyZWRfbG9jYXRpb24gKCkpOw0KPj4gK30NCj4+ICsNCj4+ICt2 b2lkDQo+PiArVHlUeVJlc29sdmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6Q2hhclR5 cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgdHJhbnNsYXRlZA0KPj4gKyAgICA9IGN0eC0+Z2V0 X2JhY2tlbmQgKCktPm5hbWVkX3R5cGUgKCJjaGFyIiwNCj4+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Z2V0X2JhY2tlbmQgKCktPndjaGFyX3R5cGUg KCksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lbWFw OjpwcmVkZWNsYXJlZF9sb2NhdGlvbiAoKSk7DQo+PiArfQ0KPj4gKw0KPj4gK3ZvaWQNCj4+ ICtUeVR5UmVzb2x2ZUNvbXBpbGU6OnZpc2l0IChjb25zdCBUeVR5OjpSZWZlcmVuY2VUeXBl ICZ0eXBlKQ0KPj4gK3sNCj4+ICsgIGNvbnN0IFR5VHk6OlNsaWNlVHlwZSAqc2xpY2UgPSBu dWxscHRyOw0KPj4gKyAgY29uc3QgVHlUeTo6U3RyVHlwZSAqc3RyID0gbnVsbHB0cjsNCj4+ ICsgIGlmICh0eXBlLmlzX2R5bl9zbGljZV90eXBlICgmc2xpY2UpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgdHJlZSB0eXBlX3JlY29yZCA9IGNyZWF0ZV9zbGljZV90eXBlX3JlY29yZCAo KnNsaWNlKTsNCj4+ICsgICAgICBzdGQ6OnN0cmluZyBkeW5fc2xpY2VfdHlwZV9zdHINCj4+ ICsgICAgICAgPSBzdGQ6OnN0cmluZyAodHlwZS5pc19tdXRhYmxlICgpID8gIiZtdXQgIiA6 ICImIikgKyAiWyINCj4+ICsgICAgICAgICArIHNsaWNlLT5nZXRfZWxlbWVudF90eXBlICgp LT5nZXRfbmFtZSAoKSArICJdIjsNCj4+ICsNCj4+ICsgICAgICB0cmFuc2xhdGVkDQo+PiAr ICAgICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+bmFtZWRfdHlwZSAoZHluX3NsaWNlX3R5 cGVfc3RyLCB0eXBlX3JlY29yZCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzbGljZS0+Z2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ICsgICAgICBy ZXR1cm47DQo+PiArICAgIH0NCj4+ICsgIGVsc2UgaWYgKHR5cGUuaXNfZHluX3N0cl90eXBl ICgmc3RyKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHRyZWUgdHlwZV9yZWNvcmQgPSBjcmVh dGVfc3RyX3R5cGVfcmVjb3JkICgqc3RyKTsNCj4+ICsgICAgICBzdGQ6OnN0cmluZyBkeW5f c3RyX3R5cGVfc3RyDQo+PiArICAgICAgID0gc3RkOjpzdHJpbmcgKHR5cGUuaXNfbXV0YWJs ZSAoKSA/ICImbXV0ICIgOiAiJiIpICsgInN0ciI7DQo+PiArDQo+PiArICAgICAgdHJhbnNs YXRlZA0KPj4gKyAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPm5hbWVkX3R5cGUgKGR5 bl9zdHJfdHlwZV9zdHIsIHR5cGVfcmVjb3JkLA0KPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0ci0+Z2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ICsg ICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyZWUgYmFzZV9jb21waWxl ZF90eXBlDQo+PiArICAgID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21waWxlIChjdHgsIHR5 cGUuZ2V0X2Jhc2UgKCksIHRyYWl0X29iamVjdF9tb2RlKTsNCj4+ICsgIGlmICh0eXBlLmlz X211dGFibGUgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY3R4LT5n ZXRfYmFja2VuZCAoKS0+cmVmZXJlbmNlX3R5cGUgKGJhc2VfY29tcGlsZWRfdHlwZSk7DQo+ PiArICAgIH0NCj4+ICsgIGVsc2UNCj4+ICsgICAgew0KPj4gKyAgICAgIGF1dG8gYmFzZSA9 IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmltbXV0YWJsZV90eXBlIChiYXNlX2NvbXBpbGVkX3R5 cGUpOw0KPj4gKyAgICAgIHRyYW5zbGF0ZWQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5yZWZl cmVuY2VfdHlwZSAoYmFzZSk7DQo+PiArICAgIH0NCj4+ICt9DQo+PiArDQo+PiArdm9pZA0K Pj4gK1R5VHlSZXNvbHZlQ29tcGlsZTo6dmlzaXQgKGNvbnN0IFR5VHk6OlBvaW50ZXJUeXBl ICZ0eXBlKQ0KPj4gK3sNCj4+ICsgIGNvbnN0IFR5VHk6OlNsaWNlVHlwZSAqc2xpY2UgPSBu dWxscHRyOw0KPj4gKyAgY29uc3QgVHlUeTo6U3RyVHlwZSAqc3RyID0gbnVsbHB0cjsNCj4+ ICsgIGlmICh0eXBlLmlzX2R5bl9zbGljZV90eXBlICgmc2xpY2UpKQ0KPj4gKyAgICB7DQo+ PiArICAgICAgdHJlZSB0eXBlX3JlY29yZCA9IGNyZWF0ZV9zbGljZV90eXBlX3JlY29yZCAo KnNsaWNlKTsNCj4+ICsgICAgICBzdGQ6OnN0cmluZyBkeW5fc2xpY2VfdHlwZV9zdHINCj4+ ICsgICAgICAgPSBzdGQ6OnN0cmluZyAodHlwZS5pc19tdXRhYmxlICgpID8gIiptdXQgIiA6 ICIqY29uc3QgIikgKyAiWyINCj4+ICsgICAgICAgICArIHNsaWNlLT5nZXRfZWxlbWVudF90 eXBlICgpLT5nZXRfbmFtZSAoKSArICJdIjsNCj4+ICsNCj4+ICsgICAgICB0cmFuc2xhdGVk DQo+PiArICAgICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+bmFtZWRfdHlwZSAoZHluX3Ns aWNlX3R5cGVfc3RyLCB0eXBlX3JlY29yZCwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzbGljZS0+Z2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ICsg ICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsgIGVsc2UgaWYgKHR5cGUuaXNfZHluX3N0 cl90eXBlICgmc3RyKSkNCj4+ICsgICAgew0KPj4gKyAgICAgIHRyZWUgdHlwZV9yZWNvcmQg PSBjcmVhdGVfc3RyX3R5cGVfcmVjb3JkICgqc3RyKTsNCj4+ICsgICAgICBzdGQ6OnN0cmlu ZyBkeW5fc3RyX3R5cGVfc3RyDQo+PiArICAgICAgID0gc3RkOjpzdHJpbmcgKHR5cGUuaXNf bXV0YWJsZSAoKSA/ICIqbXV0ICIgOiAiKmNvbnN0ICIpICsgInN0ciI7DQo+PiArDQo+PiAr ICAgICAgdHJhbnNsYXRlZA0KPj4gKyAgICAgICA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPm5h bWVkX3R5cGUgKGR5bl9zdHJfdHlwZV9zdHIsIHR5cGVfcmVjb3JkLA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci0+Z2V0X2xvY3VzICgpKTsN Cj4+ICsNCj4+ICsgICAgICByZXR1cm47DQo+PiArICAgIH0NCj4+ICsNCj4+ICsgIHRyZWUg YmFzZV9jb21waWxlZF90eXBlDQo+PiArICAgID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21w aWxlIChjdHgsIHR5cGUuZ2V0X2Jhc2UgKCksIHRyYWl0X29iamVjdF9tb2RlKTsNCj4+ICsg IGlmICh0eXBlLmlzX211dGFibGUgKCkpDQo+PiArICAgIHsNCj4+ICsgICAgICB0cmFuc2xh dGVkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+cG9pbnRlcl90eXBlIChiYXNlX2NvbXBpbGVk X3R5cGUpOw0KPj4gKyAgICB9DQo+PiArICBlbHNlDQo+PiArICAgIHsNCj4+ICsgICAgICBh dXRvIGJhc2UgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5pbW11dGFibGVfdHlwZSAoYmFzZV9j b21waWxlZF90eXBlKTsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY3R4LT5nZXRfYmFja2Vu ZCAoKS0+cG9pbnRlcl90eXBlIChiYXNlKTsNCj4+ICsgICAgfQ0KPj4gK30NCj4+ICsNCj4+ ICt2b2lkDQo+PiArVHlUeVJlc29sdmVDb21waWxlOjp2aXNpdCAoY29uc3QgVHlUeTo6U3Ry VHlwZSAmdHlwZSkNCj4+ICt7DQo+PiArICB0cmVlIHJhd19zdHIgPSBjcmVhdGVfc3RyX3R5 cGVfcmVjb3JkICh0eXBlKTsNCj4+ICsgIHRyYW5zbGF0ZWQNCj4+ICsgICAgPSBjdHgtPmdl dF9iYWNrZW5kICgpLT5uYW1lZF90eXBlICgic3RyIiwgcmF3X3N0ciwNCj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVtYXA6OnByZWRlY2xhcmVkX2xv Y2F0aW9uICgpKTsNCj4+ICt9DQo+PiArDQo+PiArdm9pZA0KPj4gK1R5VHlSZXNvbHZlQ29t cGlsZTo6dmlzaXQgKGNvbnN0IFR5VHk6Ok5ldmVyVHlwZSAmKQ0KPj4gK3sNCj4+ICsgIHRy YW5zbGF0ZWQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT51bml0X3R5cGUgKCk7DQo+PiArfQ0K Pj4gKw0KPj4gK3ZvaWQNCj4+ICtUeVR5UmVzb2x2ZUNvbXBpbGU6OnZpc2l0IChjb25zdCBU eVR5OjpEeW5hbWljT2JqZWN0VHlwZSAmdHlwZSkNCj4+ICt7DQo+PiArICBpZiAodHJhaXRf b2JqZWN0X21vZGUpDQo+PiArICAgIHsNCj4+ICsgICAgICB0cmFuc2xhdGVkID0gY3R4LT5n ZXRfYmFja2VuZCAoKS0+aW50ZWdlcl90eXBlICgNCj4+ICsgICAgICAgdHJ1ZSwgY3R4LT5n ZXRfYmFja2VuZCAoKS0+Z2V0X3BvaW50ZXJfc2l6ZSAoKSk7DQo+PiArICAgICAgcmV0dXJu Ow0KPj4gKyAgICB9DQo+PiArDQo+PiArICAvLyBjcmVhdGUgaW1wbGljaXQgc3RydWN0DQo+ PiArICBhdXRvIGl0ZW1zID0gdHlwZS5nZXRfb2JqZWN0X2l0ZW1zICgpOw0KPj4gKyAgc3Rk Ojp2ZWN0b3I8QmFja2VuZDo6dHlwZWRfaWRlbnRpZmllcj4gZmllbGRzOw0KPj4gKw0KPj4g KyAgdHJlZSB1aW50ID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+aW50ZWdlcl90eXBlICgNCj4+ ICsgICAgdHJ1ZSwgY3R4LT5nZXRfYmFja2VuZCAoKS0+Z2V0X3BvaW50ZXJfc2l6ZSAoKSk7 DQo+PiArICB0cmVlIHVpbnRwdHJfdHkgPSBidWlsZF9wb2ludGVyX3R5cGUgKHVpbnQpOw0K Pj4gKw0KPj4gKyAgQmFja2VuZDo6dHlwZWRfaWRlbnRpZmllciBmICgicG9pbnRlciIsIHVp bnRwdHJfdHksDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5nZXRf bWFwcGluZ3MgKCktPmxvb2t1cF9sb2NhdGlvbiAoDQo+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB0eXBlLmdldF90eV9yZWYgKCkpKTsNCj4+ICsgIGZpZWxkcy5wdXNo X2JhY2sgKHN0ZDo6bW92ZSAoZikpOw0KPj4gKw0KPj4gKyAgdHJlZSB2dGFibGVfc2l6ZSA9 IGJ1aWxkX2ludF9jc3QgKHNpemVfdHlwZV9ub2RlLCBpdGVtcy5zaXplICgpKTsNCj4+ICsg IHRyZWUgdnRhYmxlX3R5cGUgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5hcnJheV90eXBlICh1 aW50cHRyX3R5LCB2dGFibGVfc2l6ZSk7DQo+PiArICBCYWNrZW5kOjp0eXBlZF9pZGVudGlm aWVyIHZ0ZiAoInZ0YWJsZSIsIHZ0YWJsZV90eXBlLA0KPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY3R4LT5nZXRfbWFwcGluZ3MgKCktPmxvb2t1cF9sb2NhdGlvbiAo DQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0X3R5X3Jl ZiAoKSkpOw0KPj4gKyAgZmllbGRzLnB1c2hfYmFjayAoc3RkOjptb3ZlICh2dGYpKTsNCj4+ ICsNCj4+ICsgIHRyZWUgdHlwZV9yZWNvcmQgPSBjdHgtPmdldF9iYWNrZW5kICgpLT5zdHJ1 Y3RfdHlwZSAoZmllbGRzKTsNCj4+ICsgIHRyYW5zbGF0ZWQgPSBjdHgtPmdldF9iYWNrZW5k ICgpLT5uYW1lZF90eXBlICh0eXBlLmdldF9uYW1lICgpLCB0eXBlX3JlY29yZCwNCj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0 X2lkZW50ICgpLmxvY3VzKTsNCj4+ICt9DQo+PiArDQo+PiArdHJlZQ0KPj4gK1R5VHlSZXNv bHZlQ29tcGlsZTo6Y3JlYXRlX3NsaWNlX3R5cGVfcmVjb3JkIChjb25zdCBUeVR5OjpTbGlj ZVR5cGUgJnR5cGUpDQo+PiArew0KPj4gKyAgLy8gbG9va3VwIHVzaXplDQo+PiArICBUeVR5 OjpCYXNlVHlwZSAqdXNpemUgPSBudWxscHRyOw0KPj4gKyAgYm9vbCBvayA9IGN0eC0+Z2V0 X3R5Y3R4ICgpLT5sb29rdXBfYnVpbHRpbiAoInVzaXplIiwgJnVzaXplKTsNCj4+ICsgIHJ1 c3RfYXNzZXJ0IChvayk7DQo+PiArDQo+PiArICB0cmVlIGVsZW1lbnRfdHlwZQ0KPj4gKyAg ICA9IFR5VHlSZXNvbHZlQ29tcGlsZTo6Y29tcGlsZSAoY3R4LCB0eXBlLmdldF9lbGVtZW50 X3R5cGUgKCkpOw0KPj4gKyAgdHJlZSBkYXRhX2ZpZWxkX3R5ID0gYnVpbGRfcG9pbnRlcl90 eXBlIChlbGVtZW50X3R5cGUpOw0KPj4gKyAgQmFja2VuZDo6dHlwZWRfaWRlbnRpZmllciBk YXRhX2ZpZWxkICgiZGF0YSIsIGRhdGFfZmllbGRfdHksDQo+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRfbG9jdXMgKCkpOw0KPj4gKw0KPj4g KyAgdHJlZSBsZW5fZmllbGRfdHkgPSBUeVR5UmVzb2x2ZUNvbXBpbGU6OmNvbXBpbGUgKGN0 eCwgdXNpemUpOw0KPj4gKyAgQmFja2VuZDo6dHlwZWRfaWRlbnRpZmllciBsZW5fZmllbGQg KCJsZW4iLCBsZW5fZmllbGRfdHksIHR5cGUuZ2V0X2xvY3VzICgpKTsNCj4+ICsNCj4+ICsg IHRyZWUgcmVjb3JkID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+c3RydWN0X3R5cGUgKHtkYXRh X2ZpZWxkLCBsZW5fZmllbGR9KTsNCj4+ICsgIFNMSUNFX0ZMQUcgKHJlY29yZCkgPSAxOw0K Pj4gKyAgVFlQRV9NQUlOX1ZBUklBTlQgKHJlY29yZCkgPSBjdHgtPmluc2VydF9tYWluX3Zh cmlhbnQgKHJlY29yZCk7DQo+PiArDQo+PiArICByZXR1cm4gcmVjb3JkOw0KPj4gK30NCj4+ ICsNCj4+ICt0cmVlDQo+PiArVHlUeVJlc29sdmVDb21waWxlOjpjcmVhdGVfc3RyX3R5cGVf cmVjb3JkIChjb25zdCBUeVR5OjpTdHJUeXBlICZ0eXBlKQ0KPj4gK3sNCj4+ICsgIC8vIGxv b2t1cCB1c2l6ZQ0KPj4gKyAgVHlUeTo6QmFzZVR5cGUgKnVzaXplID0gbnVsbHB0cjsNCj4+ ICsgIGJvb2wgb2sgPSBjdHgtPmdldF90eWN0eCAoKS0+bG9va3VwX2J1aWx0aW4gKCJ1c2l6 ZSIsICZ1c2l6ZSk7DQo+PiArICBydXN0X2Fzc2VydCAob2spOw0KPj4gKw0KPj4gKyAgdHJl ZSBjaGFyX3B0ciA9IGJ1aWxkX3BvaW50ZXJfdHlwZSAoY2hhcl90eXBlX25vZGUpOw0KPj4g KyAgdHJlZSBjb25zdF9jaGFyX3R5cGUgPSBidWlsZF9xdWFsaWZpZWRfdHlwZSAoY2hhcl9w dHIsIFRZUEVfUVVBTF9DT05TVCk7DQo+PiArDQo+PiArICB0cmVlIGVsZW1lbnRfdHlwZSA9 IGNvbnN0X2NoYXJfdHlwZTsNCj4+ICsgIHRyZWUgZGF0YV9maWVsZF90eSA9IGJ1aWxkX3Bv aW50ZXJfdHlwZSAoZWxlbWVudF90eXBlKTsNCj4+ICsgIEJhY2tlbmQ6OnR5cGVkX2lkZW50 aWZpZXIgZGF0YV9maWVsZCAoImRhdGEiLCBkYXRhX2ZpZWxkX3R5LA0KPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0X2xvY3VzICgpKTsNCj4+ ICsNCj4+ICsgIHRyZWUgbGVuX2ZpZWxkX3R5ID0gVHlUeVJlc29sdmVDb21waWxlOjpjb21w aWxlIChjdHgsIHVzaXplKTsNCj4+ICsgIEJhY2tlbmQ6OnR5cGVkX2lkZW50aWZpZXIgbGVu X2ZpZWxkICgibGVuIiwgbGVuX2ZpZWxkX3R5LCB0eXBlLmdldF9sb2N1cyAoKSk7DQo+PiAr DQo+PiArICB0cmVlIHJlY29yZCA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPnN0cnVjdF90eXBl ICh7ZGF0YV9maWVsZCwgbGVuX2ZpZWxkfSk7DQo+PiArICBTTElDRV9GTEFHIChyZWNvcmQp ID0gMTsNCj4+ICsgIFRZUEVfTUFJTl9WQVJJQU5UIChyZWNvcmQpID0gY3R4LT5pbnNlcnRf bWFpbl92YXJpYW50IChyZWNvcmQpOw0KPj4gKw0KPj4gKyAgcmV0dXJuIHJlY29yZDsNCj4+ ICt9DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgQ29tcGlsZQ0KPj4gK30gLy8gbmFtZXNw YWNlIFJ1c3QNCj4+IGRpZmYgLS1naXQgYS9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGls ZS10eXBlLmggYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS10eXBlLmgNCj4+IG5l dyBmaWxlIG1vZGUgMTAwNjQ0DQo+PiBpbmRleCAwMDAwMDAwMDAwMC4uYjUyZmQ3MWJmNmIN Cj4+IC0tLSAvZGV2L251bGwNCj4+ICsrKyBiL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21w aWxlLXR5cGUuaA0KPj4gQEAgLTAsMCArMSw3OSBAQA0KPj4gKy8vIENvcHlyaWdodCAoQykg MjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KPj4gKw0KPj4gKy8v IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4NCj4+ICsNCj4+ICsvLyBHQ0MgaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRl cg0KPj4gKy8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQo+PiArLy8gU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXINCj4+ICsv LyB2ZXJzaW9uLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCj4+ICsvLyBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJ TElUWSBvcg0KPj4gKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGZvciBtb3JlIGRldGFp bHMuDQo+PiArDQo+PiArLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCj4+ICsvLyBhbG9uZyB3aXRoIEdDQzsg c2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQ0KPj4gKy8vIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4NCj4+ICsNCj4+ICsjaWZuZGVmIFJVU1RfQ09NUElMRV9U WVBFDQo+PiArI2RlZmluZSBSVVNUX0NPTVBJTEVfVFlQRQ0KPj4gKw0KPj4gKyNpbmNsdWRl ICJydXN0LWNvbXBpbGUtY29udGV4dC5oIg0KPj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsN Cj4+ICtuYW1lc3BhY2UgQ29tcGlsZSB7DQo+PiArDQo+PiArY2xhc3MgVHlUeVJlc29sdmVD b21waWxlIDogcHJvdGVjdGVkIFR5VHk6OlR5Q29uc3RWaXNpdG9yDQo+PiArew0KPj4gK3B1 YmxpYzoNCj4+ICsgIHN0YXRpYyB0cmVlIGNvbXBpbGUgKENvbnRleHQgKmN0eCwgY29uc3Qg VHlUeTo6QmFzZVR5cGUgKnR5LA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICBib29sIHRy YWl0X29iamVjdF9tb2RlID0gZmFsc2UpOw0KPj4gKw0KPj4gKyAgc3RhdGljIHRyZWUgZ2V0 X2ltcGxpY2l0X2VudW1lcmFsX25vZGVfdHlwZSAoQ29udGV4dCAqY3R4KTsNCj4+ICsNCj4+ ICsgIHZvaWQgdmlzaXQgKGNvbnN0IFR5VHk6OkluZmVyVHlwZSAmKSBvdmVycmlkZTsNCj4+ ICsgIHZvaWQgdmlzaXQgKGNvbnN0IFR5VHk6OkFEVFR5cGUgJikgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChjb25zdCBUeVR5OjpUdXBsZVR5cGUgJikgb3ZlcnJpZGU7DQo+PiAr ICB2b2lkIHZpc2l0IChjb25zdCBUeVR5OjpGblR5cGUgJikgb3ZlcnJpZGU7DQo+PiArICB2 b2lkIHZpc2l0IChjb25zdCBUeVR5OjpGblB0ciAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQg dmlzaXQgKGNvbnN0IFR5VHk6OkFycmF5VHlwZSAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQg dmlzaXQgKGNvbnN0IFR5VHk6OlNsaWNlVHlwZSAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQg dmlzaXQgKGNvbnN0IFR5VHk6OkJvb2xUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoY29uc3QgVHlUeTo6SW50VHlwZSAmKSBvdmVycmlkZTsNCj4+ICsgIHZvaWQgdmlz aXQgKGNvbnN0IFR5VHk6OlVpbnRUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoY29uc3QgVHlUeTo6RmxvYXRUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoY29uc3QgVHlUeTo6VVNpemVUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoY29uc3QgVHlUeTo6SVNpemVUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoY29uc3QgVHlUeTo6RXJyb3JUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2aXNp dCAoY29uc3QgVHlUeTo6Q2hhclR5cGUgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lkIHZpc2l0 IChjb25zdCBUeVR5OjpSZWZlcmVuY2VUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoY29uc3QgVHlUeTo6UG9pbnRlclR5cGUgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChjb25zdCBUeVR5OjpQYXJhbVR5cGUgJikgb3ZlcnJpZGU7DQo+PiArICB2b2lk IHZpc2l0IChjb25zdCBUeVR5OjpTdHJUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoY29uc3QgVHlUeTo6TmV2ZXJUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAgdm9pZCB2 aXNpdCAoY29uc3QgVHlUeTo6UGxhY2Vob2xkZXJUeXBlICYpIG92ZXJyaWRlOw0KPj4gKyAg dm9pZCB2aXNpdCAoY29uc3QgVHlUeTo6UHJvamVjdGlvblR5cGUgJikgb3ZlcnJpZGU7DQo+ PiArICB2b2lkIHZpc2l0IChjb25zdCBUeVR5OjpEeW5hbWljT2JqZWN0VHlwZSAmKSBvdmVy cmlkZTsNCj4+ICsgIHZvaWQgdmlzaXQgKGNvbnN0IFR5VHk6OkNsb3N1cmVUeXBlICYpIG92 ZXJyaWRlOw0KPj4gKw0KPj4gK3B1YmxpYzoNCj4+ICsgIHN0YXRpYyBoYXNodmFsX3QgdHlw ZV9oYXNoZXIgKHRyZWUgdHlwZSk7DQo+PiArDQo+PiArcHJvdGVjdGVkOg0KPj4gKyAgdHJl ZSBjcmVhdGVfc2xpY2VfdHlwZV9yZWNvcmQgKGNvbnN0IFR5VHk6OlNsaWNlVHlwZSAmdHlw ZSk7DQo+PiArICB0cmVlIGNyZWF0ZV9zdHJfdHlwZV9yZWNvcmQgKGNvbnN0IFR5VHk6OlN0 clR5cGUgJnR5cGUpOw0KPj4gKw0KPj4gK3ByaXZhdGU6DQo+PiArICBUeVR5UmVzb2x2ZUNv bXBpbGUgKENvbnRleHQgKmN0eCwgYm9vbCB0cmFpdF9vYmplY3RfbW9kZSk7DQo+PiArDQo+ PiArICBDb250ZXh0ICpjdHg7DQo+PiArICBib29sIHRyYWl0X29iamVjdF9tb2RlOw0KPj4g KyAgdHJlZSB0cmFuc2xhdGVkOw0KPj4gKyAgaW50IHJlY3VyaXN2ZV9vcHM7DQo+PiArfTsN Cj4+ICsNCj4+ICt9IC8vIG5hbWVzcGFjZSBDb21waWxlDQo+PiArfSAvLyBuYW1lc3BhY2Ug UnVzdA0KPj4gKw0KPj4gKyNlbmRpZiAvLyBSVVNUX0NPTVBJTEVfVFlQRQ0KPj4gZGlmZiAt LWdpdCBhL2djYy9ydXN0L2JhY2tlbmQvcnVzdC1jb21waWxlLXZhci1kZWNsLmggYi9nY2Mv cnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS12YXItZGVjbC5oDQo+PiBuZXcgZmlsZSBtb2Rl IDEwMDY0NA0KPj4gaW5kZXggMDAwMDAwMDAwMDAuLmUyZWUwNWI4MTYzDQo+PiAtLS0gL2Rl di9udWxsDQo+PiArKysgYi9nY2MvcnVzdC9iYWNrZW5kL3J1c3QtY29tcGlsZS12YXItZGVj bC5oDQo+PiBAQCAtMCwwICsxLDk1IEBADQo+PiArLy8gQ29weXJpZ2h0IChDKSAyMDIwLTIw MjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+PiArDQo+PiArLy8gVGhpcyBm aWxlIGlzIHBhcnQgb2YgR0NDLg0KPj4gKw0KPj4gKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQo+PiAr Ly8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUNCj4+ICsvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcg0KPj4gKy8vIHZlcnNp b24uDQo+PiArDQo+PiArLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KPj4gKy8vIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9y DQo+PiArLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQo+PiArLy8gZm9yIG1vcmUgZGV0YWlscy4NCj4+ ICsNCj4+ICsvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPj4gKy8vIGFsb25nIHdpdGggR0NDOyBzZWUgdGhl IGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlDQo+PiArLy8gPGh0dHA6Ly93d3cuZ251Lm9y Zy9saWNlbnNlcy8+Lg0KPj4gKw0KPj4gKyNpZm5kZWYgUlVTVF9DT01QSUxFX1ZBUl9ERUNM DQo+PiArI2RlZmluZSBSVVNUX0NPTVBJTEVfVkFSX0RFQ0wNCj4+ICsNCj4+ICsjaW5jbHVk ZSAicnVzdC1jb21waWxlLWJhc2UuaCINCj4+ICsjaW5jbHVkZSAicnVzdC1oaXItdmlzaXRv ci5oIg0KPj4gKw0KPj4gK25hbWVzcGFjZSBSdXN0IHsNCj4+ICtuYW1lc3BhY2UgQ29tcGls ZSB7DQo+PiArDQo+PiArY2xhc3MgQ29tcGlsZVZhckRlY2wgOiBwdWJsaWMgSElSQ29tcGls ZUJhc2UsIHB1YmxpYyBISVI6OkhJUlBhdHRlcm5WaXNpdG9yDQo+PiArew0KPj4gKyAgdXNp bmcgSElSOjpISVJQYXR0ZXJuVmlzaXRvcjo6dmlzaXQ7DQo+PiArDQo+PiArcHVibGljOg0K Pj4gKyAgc3RhdGljIDo6QnZhcmlhYmxlICpjb21waWxlICh0cmVlIGZuZGVjbCwgdHJlZSB0 cmFuc2xhdGVkX3R5cGUsDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElS OjpQYXR0ZXJuICpwYXR0ZXJuLCBDb250ZXh0ICpjdHgpDQo+PiArICB7DQo+PiArICAgIENv bXBpbGVWYXJEZWNsIGNvbXBpbGVyIChjdHgsIGZuZGVjbCwgdHJhbnNsYXRlZF90eXBlKTsN Cj4+ICsgICAgcGF0dGVybi0+YWNjZXB0X3ZpcyAoY29tcGlsZXIpOw0KPj4gKyAgICByZXR1 cm4gY29tcGlsZXIuY29tcGlsZWRfdmFyaWFibGU7DQo+PiArICB9DQo+PiArDQo+PiArICB2 b2lkIHZpc2l0IChISVI6OklkZW50aWZpZXJQYXR0ZXJuICZwYXR0ZXJuKSBvdmVycmlkZQ0K Pj4gKyAgew0KPj4gKyAgICBpZiAoIXBhdHRlcm4uaXNfbXV0ICgpKQ0KPj4gKyAgICAgIHRy YW5zbGF0ZWRfdHlwZSA9IGN0eC0+Z2V0X2JhY2tlbmQgKCktPmltbXV0YWJsZV90eXBlICh0 cmFuc2xhdGVkX3R5cGUpOw0KPj4gKw0KPj4gKyAgICBjb21waWxlZF92YXJpYWJsZQ0KPj4g KyAgICAgID0gY3R4LT5nZXRfYmFja2VuZCAoKS0+bG9jYWxfdmFyaWFibGUgKGZuZGVjbCwg cGF0dGVybi5nZXRfaWRlbnRpZmllciAoKSwNCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRfdHlwZSwgTlVMTCAvKmRlY2xfdmFy Ki8sDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw YXR0ZXJuLmdldF9sb2N1cyAoKSk7DQo+PiArDQo+PiArICAgIEhpcklkIHN0bXRfaWQgPSBw YXR0ZXJuLmdldF9wYXR0ZXJuX21hcHBpbmdzICgpLmdldF9oaXJpZCAoKTsNCj4+ICsgICAg Y3R4LT5pbnNlcnRfdmFyX2RlY2wgKHN0bXRfaWQsIGNvbXBpbGVkX3ZhcmlhYmxlKTsNCj4+ ICsgIH0NCj4+ICsNCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6V2lsZGNhcmRQYXR0ZXJuICZw YXR0ZXJuKSBvdmVycmlkZQ0KPj4gKyAgew0KPj4gKyAgICB0cmFuc2xhdGVkX3R5cGUgPSBj dHgtPmdldF9iYWNrZW5kICgpLT5pbW11dGFibGVfdHlwZSAodHJhbnNsYXRlZF90eXBlKTsN Cj4+ICsNCj4+ICsgICAgY29tcGlsZWRfdmFyaWFibGUNCj4+ICsgICAgICA9IGN0eC0+Z2V0 X2JhY2tlbmQgKCktPmxvY2FsX3ZhcmlhYmxlIChmbmRlY2wsICJfIiwgdHJhbnNsYXRlZF90 eXBlLA0KPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TlVMTCAvKmRlY2xfdmFyKi8sDQo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwYXR0ZXJuLmdldF9sb2N1cyAoKSk7DQo+PiArDQo+PiArICAgIEhp cklkIHN0bXRfaWQgPSBwYXR0ZXJuLmdldF9wYXR0ZXJuX21hcHBpbmdzICgpLmdldF9oaXJp ZCAoKTsNCj4+ICsgICAgY3R4LT5pbnNlcnRfdmFyX2RlY2wgKHN0bXRfaWQsIGNvbXBpbGVk X3ZhcmlhYmxlKTsNCj4+ICsgIH0NCj4+ICsNCj4+ICsgIC8vIEVtcHR5IHZpc2l0IGZvciB1 bnVzZWQgUGF0dGVybiBISVIgbm9kZXMuDQo+PiArICB2b2lkIHZpc2l0IChISVI6Okdyb3Vw ZWRQYXR0ZXJuICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OkxpdGVy YWxQYXR0ZXJuICYpIG92ZXJyaWRlIHt9DQo+PiArICB2b2lkIHZpc2l0IChISVI6OlBhdGhJ bkV4cHJlc3Npb24gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJUjo6UXVh bGlmaWVkUGF0aEluRXhwcmVzc2lvbiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNp dCAoSElSOjpSYW5nZVBhdHRlcm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6UmVmZXJlbmNlUGF0dGVybiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNp dCAoSElSOjpTbGljZVBhdHRlcm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQg KEhJUjo6U3RydWN0UGF0dGVybiAmKSBvdmVycmlkZSB7fQ0KPj4gKyAgdm9pZCB2aXNpdCAo SElSOjpUdXBsZVBhdHRlcm4gJikgb3ZlcnJpZGUge30NCj4+ICsgIHZvaWQgdmlzaXQgKEhJ Ujo6VHVwbGVTdHJ1Y3RQYXR0ZXJuICYpIG92ZXJyaWRlIHt9DQo+PiArDQo+PiArcHJpdmF0 ZToNCj4+ICsgIENvbXBpbGVWYXJEZWNsIChDb250ZXh0ICpjdHgsIHRyZWUgZm5kZWNsLCB0 cmVlIHRyYW5zbGF0ZWRfdHlwZSkNCj4+ICsgICAgOiBISVJDb21waWxlQmFzZSAoY3R4KSwg Zm5kZWNsIChmbmRlY2wpLCB0cmFuc2xhdGVkX3R5cGUgKHRyYW5zbGF0ZWRfdHlwZSksDQo+ PiArICAgICAgY29tcGlsZWRfdmFyaWFibGUgKGN0eC0+Z2V0X2JhY2tlbmQgKCktPmVycm9y X3ZhcmlhYmxlICgpKQ0KPj4gKyAge30NCj4+ICsNCj4+ICsgIHRyZWUgZm5kZWNsOw0KPj4g KyAgdHJlZSB0cmFuc2xhdGVkX3R5cGU7DQo+PiArDQo+PiArICBCdmFyaWFibGUgKmNvbXBp bGVkX3ZhcmlhYmxlOw0KPj4gK307DQo+PiArDQo+PiArfSAvLyBuYW1lc3BhY2UgQ29tcGls ZQ0KPj4gK30gLy8gbmFtZXNwYWNlIFJ1c3QNCj4+ICsNCj4+ICsjZW5kaWYgLy8gUlVTVF9D T01QSUxFX1ZBUl9ERUNMDQo+IA0KPiBBZ2FpbiBJIHRoaW5rIHRoaXMgcGFydCBvZiB0aGUg UnVzdCBmcm9udGVuZCBpcyBPSyB0byBtZXJnZS4gDQoNCkdyZWF0ISBUaGFuayB5b3UuIEkn dmUgdGFrZW4gaW50byBhY2NvdW50IGVhY2ggb2YgdGhlIG5vdGVzIHlvdSBtYWRlIGFuZCAN CmNyZWF0ZWQgcmVsZXZhbnQgaXNzdWVzIGZvciB1cyB0byBmaXggYmVmb3JlIHRoZSBuZXh0 IHZlcnNpb24gb2YgdGhlIA0KcGF0Y2hlcy4NCg0KPiBJIHdvdWxkDQo+IGhhdmUgYXBwcmVj aWF0ZWQgc29tZQ0KPiBoaWdoLWxldmVsIG92ZXJ2aWV3IG9mIHRoZSBjb21waWxhdGlvbiBw cm9jZXNzIGJ1dCBJIGNhbid0IGZpbmQNCj4gYW55dGhpbmcgaW4gdGhlIHJ1c3QvIGRpcmVj dG9yeQ0KPiBvciBnY2MvZG9jLiANCg0KSSdsbCB0cnkgYW5kIHB1dCBzb21ldGhpbmcgdG9n ZXRoZXIuIFdlIGRvIG5lZWQgYSBsb3QgbW9yZSBkb2N1bWVudGF0aW9uIA0KdGhhbiB3aGF0 IHdlIHByZXNlbnRseSBoYXZlLg0KDQo+IFRoZXJlIHNlZW1zIHRvIGJlIGEgJ3Zpc2l0JyBw YXR0ZXJuIGV2ZXJ5d2hlcmUgYW5kIEkNCj4gdGhpbmsgSSBnb3QgYW4gaWRlYSBvbiBob3cN Cj4gdGhlIHJ1c3QgSVIgLT4gR0VORVJJQyB0cmFuc2xhdGlvbiB3b3Jrcywgc3RpbGwgYXQg d2hpY2ggcG9pbnRzDQo+IChnbG9iYWwpIHR5cGVzLCBkYXRhIGFuZA0KPiBmdW5jdGlvbnMg YXJlICJjb21waWxlZCIgaXNuJ3QgY2xlYXIgdG8gbWUuICBHaXZlbiB3ZSBoYXZlIG11bHRp cGxlDQo+IElScyBJIHN1cHBvc2Ugd2UgcGFyc2UNCj4gdGhlIHdob2xlIHVuaXQsIHRyYW5z bGF0ZSBpdCBpbiB3aG9sZSBhbmQgb25seSBhcyBhIGxhc3Qgc3RlcCBkbyB0aGUNCj4gcnVz dCBJUiAtPiBHRU5FUklDDQo+IHRyYW5zbGF0aW9uIGFmdGVyIHdoaWNoIHdlIGFyZSBmaW5p c2hlZD8NCg0KVGhpcyBpcyBjb3JyZWN0LiBPdXIgcGFyc2VyIGNyZWF0ZXMgbm9kZXMgb2Yg b3VyIEFTVCByZXByZXNlbnRhdGlvbiwgDQp3aGljaCBnZXRzIGV4cGFuZGVkIGFuZCBuYW1l LXJlc29sdmVkLCB0aGVuIGxvd2VyZWQgdG8gb3VyIEhJUiANCnJlcHJlc2VudGF0aW9uIHdo aWNoIGlzIHN1Ym1pdHRlZCB0byBtdWx0aXBsZSBwYXNzZXMgc3VjaCBhcyB0eXBlIA0KcmVz b2x1dGlvbiwgdW5zYWZlIGNoZWNraW5nLCBjb25zdCBjaGVja2luZy4uLiBhbmQgdGhlbiBm aW5hbGx5IGFzIGEgDQpsYXN0IHN0ZXAgb2YgdGhlIGZyb250ZW5kIGxvd2VyZWQgaW50byBH RU5FUklDLg0KDQo+IA0KPiBUaGFua3MsDQo+IFJpY2hhcmQuDQo+IA0KPj4gLS0NCj4+IDIu MzcuMg0KPj4NCkFnYWluLCB0aGFuayB5b3UgZm9yIHRoZSB0aG91Z2h0ZnVsIGFuZCBkZXRh aWxlZCByZXZpZXcuDQoNCkFsbCB0aGUgYmVzdCwNCg0KQXJ0aHVyDQo= --------------0EWczDzaU7KaPXNcK7GstdiF Content-Type: application/pgp-keys; name="OpenPGP_0x1B3465B044AD9C65.asc" Content-Disposition: attachment; filename="OpenPGP_0x1B3465B044AD9C65.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- xsFNBGIMH/sBEAC/+yKgi+y9knsqZUNIqlF85v9Lv0lZ2jOUgFgD5R10gz8j39vI YxM/DWA8BGudqx/s0V3T2arTIJ9u9StA6846SD4lCmdFBUkE0ylOl9UjYrZpoNOY F85TrhwDBB8LxNzopJxrQIv/WqU2pfs4+QyZuzNPWkGv1b06dDqY1hr7jUxJzAhR klGMyd6kPzr4lJUJLvIPxjQ1Y+NXAiLrm7n7HqXeHxGBHFwxTRKMb720fcP8pkNQ KZNoZBAhNr/665yIH3fV1+D/xsjbVkowBJn5MG3iburNfps50fMNNkBZgzIBRjBx dyJ7iJmpZRQkdLSEf/gpWEc/vUVs8OIdqT60vuFoueuQUyntFuvGWyCP/o71+eaM dG1Xx8TROJM9usU+Zz3V8GwpPSUUiAI/tDhR/ANtrrJ7jbuhw/9fm7HLovGniQcp N2INgY/Ema3dmU7EWnFqeGymP8R3MQY1Ge8xqlNL1KGrp45ZHp623XgH+IDkvy1n e7RU+WuOPxKKWGeN9LfHNGfTX3ZvFCCxlnbU6KwwoeiLBVdkY1zbgA5LPIPrPtzQ vSPTivQswMkCEVrqLkBYnAXGiavx8V63HltdohJMvkE0wkH3XmsTgrbtqxADlHHz 7WZbBWx9G6OElEThcuT/H/pR9dxr83+qbkUpyIYxW3zP/kpz97oOElSyEQARAQAB zShBcnRodXIgQ29oZW4gPGFydGh1ci5jb2hlbkBlbWJlY29zbS5jb20+wsGOBBMB CAA4FiEEhx8wPNj7cw6CrvzGGzRlsEStnGUFAmIMH/sCGwMFCwkIBwIGFQoJCAsC BBYCAwECHgECF4AACgkQGzRlsEStnGW7GhAApgjuTe1IRIGxhF8o2VLRYYOHugSI 6tNBPpnOjRBbt/Uj5xECBLDtIx+/GR+fUSZ/wRj7hIpbSoClfnCwQ5/Z0055MY8T 9UsCwElOPluzCNmrmRPL2snMsAhhMxDVVtX5xvF25It0qRQJLVKWiJPoPsQbl3ou aQhPbr2zeIAa74BlWn03zbUJdTXcdjd8+ZBnSGntqwV/hP/g1NwZzuxhroOq1Uaf PFd3RKwcuIRUkr5JE1ymNP4R8u3GU4/gwGr9s69wIEsBohPowgYGt84ZvLZpt84y Ufsf9CH4OE4/+x1QGumD1b9VcIv5/vZsg7Z8EXKibb6X5TM2vtCcNAHv+0KsERZy LHXn+GOjPQgISzPEcxYkeGNtEnf6IhsIfZyeUe2ZiMPz48Tok9w7r0XfhMCj2SMF jbAFfsufsglDnGO7CRuCBXtYJYZInmf5XzaQ8FfMRPs9jZeD6SFZjFH00E1o5GLs Y9le5euxLo1aLqDNqMp6I8R70rK65c7zRAnQ9CO8watmXsBMuJ0Y6Jmf/noFXn8S GVA9b7j+uumum1zToTSmPwhn83X3KwoXTmQ9RD1eiEBJDT9/phSTVDTqhsu8GJVz OIRVXKHxRZLZJo1pGt3YzbDlTshXAV4Ln5YsJIgyAuLU6vmH50QoZhuJK3xMnUaM RdxgyqZe5ACmWXXOwU0EYgwf+wEQAL5Bd4WYiqpsBgW1k/Tozz4cThT+CueIqitD 5lhTzEJ73SyrAmUiZrkSmR2Vc6G1mJEqozkmeXHjjQ8gMbz6HZBmacnJhWObf1aU THjowIsyT0hJJVag1Exq16lBUZCelNG0Jb07TnVWTi/2xHRTLsNVzTQpKnWC3OoA y6M9KwNp5I0hk2cJaFrMjz7/Q16kx8vOov28UcsNDhbq25W64fdEYZApNZI1sKk3 3tAQj4t0BxHtG1Hb6EwxbPmVZpL07fmLLVWe3nI5znekXq8AHlUcPGpb4EjUIsmK 8+VnGF3f0cDeSupJWSaHiuufc/jONsM8ZiuYJ6i9Lr8IvgeTUZMXVrjwuIDaMLn5 F24dmNSheuwLukQTTiB9LKfUyKZzkFb8Opiqzjng+psvkECIVwk5xaZgraKtivyq +RHGrhSzkJv17QLb7rEiMjKl+20v3xCYl8ogR/7O/slPZMisDV5QOEZEMrWfVYZC W5UIO+vXekTweJxVzPfrkUSpzce67iyeTzzNNwPlFnS/6eB1+IKKAtuxEhbOokBs Yf+WnY7xdLGCLyVTXdg99oXZ9AJUUJL3dy9eIggZciQSzkhfeKykoUDmHUAAbWTA xWLwkJ/QBku/Ay5ffRQ9ukhngdu8PsyPGwsOORNIVYbKU0hMtqU7UjOzhVviQufJ Y2C4KCp5ABEBAAHCwXYEGAEIACAWIQSHHzA82PtzDoKu/MYbNGWwRK2cZQUCYgwf +wIbDAAKCRAbNGWwRK2cZQJ6D/95URtl/eu1akFC1VNqdghWrOAJiL8Jgk53cXug 3GXoh8qjDYXT7S6zC6Gyq2nqhGy5JdNmZRdhFCIqZAg2DyBY/1gJEM0yLXEhWZy8 AxuUaadAuUG8erdngXD2az4glSKhjAM5oxRXkWB3P9lr5I2n0Yx7tPlFusfIInV/ 3RKOYezPS9seoJS31hb6dvYsf3/RGF5Fau3+sm4urTn7zqhqBYgqBmih8sgsifXA zsJ+tO33Cd10SPZmKlKlZWxouTL4Nky6e2DJHX7phX1DIZBmJBIUvkK6uA7mdJ1y zQonNJq8nABtXBioO+YnP3msZPutEJzGnBjRSpJr0FULqeIX5JTPqa023Kj2zvnF fqKrT6rgMUomNjQxCryix+EoBUvHcHAyWPQuYb38eV15GqcCjEezziKqTXPBETXk M3rq8+STsSwxn6wz6gwgC1sbj+IXUY2jGzq8fS/99uferADYXEnzKheU5Q4gWv2X Q/juSJh6AuxTdlr7+5ndAmVUh8U0p47S5ErJnHt1H4pLxIoR7VM9YiIZHn833Xms 2QT2JVIVzL+opHU5XdoXPgd58b8Sxd2j1Fj8LevvZ4isfpr6ZHQ3S0sdOZFtg+Sd nri0Eg+Zg28sczMMKT0W+wb/dpZCA8p3ONJE5hWUhtUpNuhV7j8A4PBVzNHOqPWx 7FJmBg=3D=3D =3DQnyj -----END PGP PUBLIC KEY BLOCK----- --------------0EWczDzaU7KaPXNcK7GstdiF-- --------------B3aOl7ALSILCHFEdeGHlViEk-- --------------o6NHHJQJAuWqBswmktjLrZ5w Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEEhx8wPNj7cw6CrvzGGzRlsEStnGUFAmNzhvEFAwAAAAAACgkQGzRlsEStnGWk UBAAkQ7Cz4B3v66PeAVCUMkyy8PM5jNX8Wn0RICOAneRtlsCKSkpCEbNm5jifcU71btgzZiIYvL1 ldHJmpIXDg0fqtUu0qeT1QtJ03UOEDh0f9p/k9N/TE+NQjKY57xlm9KoUMJ5JSXJ26dg7sprwq8R sY5ng1Neg/O6x8uvOhF7Y0dbBMvC8Wc4IGcx9TmctZwMEZJUUI8xqrIwi2TrJFlQRhWbmsu1alyC bbigHvF6OyT8qKfNOsjt4XSAxt13qqMwS7qADnkFb7KEaZEThP9SNpkw+NwffcgFe0aJhRQC69a+ VHTT+nAG3YaZEljqXgeJozzSPPMdnJY8TT1hhqU5bhzR4HjBPuyyU8UPoHaJ6KiayKiuCk72mrip 8a3XU2p/Mm3j9VXjkwTfZnFho2YqmpZcaz4ObarMFuG4qyloJEUqNvQ/Bvk3EPeYSpWVKaXGRI22 V4vC0hRB+wmETzub1RgNbjYxKI+9x/VoN8LplZbCS85prUXQ5b8PLXjbDjvhpHnhl3PkffpPj+jq 7KwX5m+DKCLProdIAfHUS1CPXVD8CtGP1Z8vJlfp8QJZDDrpOeA2Yti4/i1sa12MGm11TJR+dkhm LvHtIiNuO4rBMKrm5LC7BUUxxQtZPHYMV2ut50BFvIYuabUy5ct5IhR8UCzoYV8tQSxEIPS3EyVN lfE= =T5xx -----END PGP SIGNATURE----- --------------o6NHHJQJAuWqBswmktjLrZ5w--