From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) by mx.groups.io with SMTP id smtpd.web10.8291.1662006218544084300 for ; Wed, 31 Aug 2022 21:23:39 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@csie-io.20210112.gappssmtp.com header.s=20210112 header.b=Hvf50qrk; spf=pass (domain: csie.io, ip: 209.85.208.180, mailfrom: nickle@csie.io) Received: by mail-lj1-f180.google.com with SMTP id s15so11492617ljp.5 for ; Wed, 31 Aug 2022 21:23:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=csie-io.20210112.gappssmtp.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc; bh=JC+BPBpzffzq0vNSnD1lUz/mk4jyC3NOb44+TwuCT9U=; b=Hvf50qrkwzDGqHR1K6xxIBcjtQI3BgCDTjTsmQAkL/S9uUYc7ovHHqB0r2T2q1P135 rRgDRuLJHBYsMacFlY12oCAMMjeRXlgZBRVbidvroQdAenEKlO5TJQ715YO9c3nSenBJ 6UFuEEpVZ1lC9vHXe48k0fljRAuDb1JPYUj4gmNDLjf5Wepm36TEve9YOzv3PwAdjxxk FOkKKSdUzwaLyTRf9Ndw9104mLIndD1d4+NHEcplOnxizVAYDPqyPPLS8ckwEMWvzSQi Z1617+WdHKjcyB3IZCYVrhgLi7l5f1voFraqcjeFK/doyzV7pQt/SI5h4KaHzq+JZKFF 3yrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc; bh=JC+BPBpzffzq0vNSnD1lUz/mk4jyC3NOb44+TwuCT9U=; b=60hbCETp+GP/b9lB2ffPgiY9dvOePJAZX6Tfog8Mt7dBxzZlYXvCKoAOi38wEHhDwr n8H1YIBzQE+9HR1PGhRx/NqX1QnSN8/U0jvL6gXXZi/I09F0L1uE3+nsUQdewiWzPLXx y4QLOX5efnIOAT4qJOPs7csuhNzmztRPHraaLFFgUMa7mh8NqiotSQA11zLZipDLf6Kv 48R31L/Yv19dUAdDr2MkziSXCRn479mI69yBEiFd5AGrAldjQOuUyqa1FSyBNSrNBXCS vOf0ZpBirAY/1Fp/3z6EoorHIuTwQjfP434OSH9BGELAR4MLC0BpYaWz++gfV012Zwk8 uszQ== X-Gm-Message-State: ACgBeo0U4FcDfIF3DL79Ve0/7nLvJSNWdrRqbCiw7Tsv97SRTXX1EJ0f UZgpZuTsgQfh+jFzKuFzUpWM/EjaPzePhtoW5SsFcg== X-Google-Smtp-Source: AA6agR44IiecKG+boOT5NnaBG3pkcfZiEWoDGyUKWbTI+7Qf41t+aqRli1sjDeR/emDWNqwbtFYM2kVHMt72R9fbH1E= X-Received: by 2002:a05:651c:1244:b0:264:40d6:335a with SMTP id h4-20020a05651c124400b0026440d6335amr5735782ljh.6.1662006216859; Wed, 31 Aug 2022 21:23:36 -0700 (PDT) MIME-Version: 1.0 References: <20220901040222.1472-1-abner.chang@amd.com> In-Reply-To: <20220901040222.1472-1-abner.chang@amd.com> From: NickleLa Date: Thu, 1 Sep 2022 12:23:25 +0800 Message-ID: Subject: Re: [PATCH V2] RedfishPkg/RedfishDiscoverDxe: Install EFI_DISCOVER_PROTOCOL on each network interface To: abner.chang@amd.com Cc: devel@edk2.groups.io, Igor Kulchytskyy Content-Type: multipart/alternative; boundary="0000000000002bc29805e795fa46" --0000000000002bc29805e795fa46 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Reviewed-by: Nickle Wang Thanks, Nickle =E6=96=BC 2022=E5=B9=B49=E6=9C=881=E6=97=A5 =E9=80=B1= =E5=9B=9B =E4=B8=AD=E5=8D=8812:02=E5=AF=AB=E9=81=93=EF=BC=9A > From: Abner Chang > > BZ 4037: > Install EFI_DISCOVER_PROTOCOL on each network interface. > > This fixes the issue that causes the high-level Redfish driver > on the network interface is stopped when: > 1. EFI_DISCOVER_PROTOCOL is reinstalled on a new-found network > interface, or > 2. EFI_DISCOVER_PROTOCOL is stopped on the network interface > other than the one which is used to communicate with Redfish > service. > > Cc: Nickle Wang > Cc: Igor Kulchytskyy > Signed-off-by: Abner Chang > --- > .../RedfishDiscoverInternal.h | 7 + > .../RedfishDiscoverDxe/RedfishDiscoverDxe.c | 140 ++++++++++-------- > 2 files changed, 88 insertions(+), 59 deletions(-) > > diff --git a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > index 4d1319b2641..04fa09e1cc2 100644 > --- a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > +++ b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h > @@ -2,6 +2,7 @@ > This file defines the EFI Redfish Discover Protocol interface. > > (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, AMD Incorporated. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -107,6 +108,12 @@ typedef struct { > > ///< NETWORK_INTERFACE_PROTOCOL_TYPE. > REDFISH_DISCOVER_NETWORK_INTERFACE_PROTOCOL > NetworkInterfaceProtocolInfo; ///< Network interface protocol information= . > EFI_HANDLE RestExHandle; > ///< REST EX handle associated with this network interface. > + // > + // EFI_REDFISH_DISCOVER_PROTOCOL instance installed > + // on this network interface. > + // > + EFI_HANDLE > EfiRedfishDiscoverProtocolHandle; ///< EFI_REDFISH_DISCOVER_PROTOTOCOL > instance installed > + > ///< on this network interface. > } EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL; > > // > diff --git a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > index bf50c78c928..a271f6e942d 100644 > --- a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > +++ b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c > @@ -3,6 +3,7 @@ > The implementation of EFI Redfidh Discover Protocol. > > (C) Copyright 2021 Hewlett Packard Enterprise Development LP
> + Copyright (c) 2022, AMD Incorporated. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -23,8 +24,6 @@ EFI_GUID mRedfishDiscoverTcp4InstanceGuid =3D > EFI_REDFISH_DISCOVER_TCP4_INSTANC > EFI_GUID mRedfishDiscoverTcp6InstanceGuid =3D > EFI_REDFISH_DISCOVER_TCP6_INSTANCE_GUID; > EFI_GUID mRedfishDiscoverRestExInstanceGuid =3D > EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_GUID; > > -EFI_HANDLE EfiRedfishDiscoverProtocolHandle =3D NULL; > - > EFI_STATUS > EFIAPI > Tcp4GetSubnetInfo ( > @@ -325,6 +324,38 @@ GetTargetNetworkInterfaceInternal ( > return NULL; > } > > +/** > + This function searches EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL > + instance with the given Controller handle. > + > + @param[in] ControllerHandle The controller handle associated with > network interface. > + > + @retval Non-NULL EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL is > returned. > + @retval NULL Non of > EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL instance is returned. > +**/ > +EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL * > +GetTargetNetworkInterfaceInternalByController ( > + IN EFI_HANDLE ControllerHandle > + ) > +{ > + EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *ThisNetworkInterface= ; > + > + ThisNetworkInterface =3D (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTER= NAL > *)GetFirstNode (&mEfiRedfishDiscoverNetworkInterface); > + while (TRUE) { > + if (ThisNetworkInterface->OpenDriverControllerHandle =3D=3D > ControllerHandle) { > + return ThisNetworkInterface; > + } > + > + if (IsNodeAtEnd (&mEfiRedfishDiscoverNetworkInterface, > &ThisNetworkInterface->Entry)) { > + return NULL; > + } > + > + ThisNetworkInterface =3D > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetNextNode > (&mEfiRedfishDiscoverNetworkInterface, &ThisNetworkInterface->Entry); > + } > + > + return NULL; > +} > + > /** > This function validate if target network interface is ready for > discovering > Redfish service. > @@ -1619,29 +1650,30 @@ BuildupNetworkInterface ( > EFI_OPEN_PROTOCOL_BY_DRIVER > ); > if (!EFI_ERROR (Status)) { > - if ((EfiRedfishDiscoverProtocolHandle =3D=3D NULL) && > - (gRequiredProtocol[Index].ProtocolType =3D=3D ProtocolTypeRe= stEx) > && > - !IsListEmpty (&mEfiRedfishDiscoverNetworkInterface) > - ) > - { > - // Install the fisrt Redfish Discover Protocol when EFI REST E= X > protcol is discovered. > - // This ensures EFI REST EX is ready while > EFI_REDFISH_DISCOVER_PROTOCOL consumer acquires > - // Redfish serivce over network interface. > - > - Status =3D gBS->InstallProtocolInterface ( > - &EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - EFI_NATIVE_INTERFACE, > - (VOID *)&mRedfishDiscover > - ); > - } else if ((EfiRedfishDiscoverProtocolHandle !=3D NULL) && > NewNetworkInterfaceInstalled) { > - Status =3D gBS->ReinstallProtocolInterface ( > - EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - (VOID *)&mRedfishDiscover, > - (VOID *)&mRedfishDiscover > - ); > - NewNetworkInterfaceInstalled =3D FALSE; > + if ((gRequiredProtocol[Index].ProtocolType =3D=3D > ProtocolTypeRestEx)) { > + // Install Redfish Discover Protocol when EFI REST EX protcol > is discovered. > + // This ensures EFI REST EX is ready while the consumer of > EFI_REDFISH_DISCOVER_PROTOCOL > + // acquires Redfish serivce over network interface. > + > + if (!NewNetworkInterfaceInstalled) { > + NetworkInterface =3D > GetTargetNetworkInterfaceInternalByController (ControllerHandle); > + if (NetworkInterface =3D=3D NULL) { > + DEBUG ((DEBUG_ERROR, "%a: Can't find network interface by > ControllerHandle\n", __FUNCTION__)); > + return Status; > + } > + } > + > + NewNetworkInterfaceInstalled =3D FALSE; > + NetworkInterface->EfiRedfishDiscoverProtocolHandle =3D NULL; > + Status =3D > gBS->InstallProtocolInterface ( > + > &NetworkInterface->EfiRedfishDiscoverProtocolHandle, > + > &gEfiRedfishDiscoverProtocolGuid, > + > EFI_NATIVE_INTERFACE, > + > (VOID *)&mRedfishDiscover > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: Fail to install > EFI_REDFISH_DISCOVER_PROTOCOL\n", __FUNCTION__)); > + } > } > } > > @@ -1724,6 +1756,7 @@ StopServiceOnNetworkInterface ( > EFI_STATUS Status; > VOID *Interface; > EFI_TPL OldTpl; > + EFI_HANDLE DiscoverProtocolHandl= e; > EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *ThisNetworkInterface= ; > EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_INTERNAL *RestExInstance; > > @@ -1743,30 +1776,34 @@ StopServiceOnNetworkInterface ( > ThisNetworkInterface =3D > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetFirstNode > (&mEfiRedfishDiscoverNetworkInterface); > while (TRUE) { > if > (ThisNetworkInterface->NetworkInterfaceProtocolInfo.ProtocolControllerHan= dle > =3D=3D ControllerHandle) { > - Status =3D CloseProtocolService ( > - // Close protocol and destroy service. > - ThisBindingProtocol, > - ControllerHandle, > - &gRequiredProtocol[Index], > - ThisNetworkInterface->OpenDriverAgentHandle, > - ThisNetworkInterface->OpenDriverControllerHandle > - ); > + DiscoverProtocolHandle =3D > ThisNetworkInterface->EfiRedfishDiscoverProtocolHandle; > + // > + // Close protocol and destroy service. > + // > + Status =3D CloseProtocolService ( > + ThisBindingProtocol, > + ControllerHandle, > + &gRequiredProtocol[Index], > + > ThisNetworkInterface->OpenDriverAgentHandle, > + > ThisNetworkInterface->OpenDriverControllerHandle > + ); > if (!EFI_ERROR (Status)) { > Status =3D DestroyRedfishNetwrokInterface > (ThisNetworkInterface); > } > > gBS->RestoreTPL (OldTpl); > - // Reinstall Redfish Discover protocol to notify network > - // interface change. > - > - Status =3D gBS->ReinstallProtocolInterface ( > - EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - (VOID *)&mRedfishDiscover, > - (VOID *)&mRedfishDiscover > - ); > - if (EFI_ERROR (Status)) { > - DEBUG ((DEBUG_ERROR, "%a: Reinstall > gEfiRedfishDiscoverProtocolGuid fail.", __FUNCTION__)); > + > + // > + // Disconnect EFI Redfish discover driver controller to > notify the > + // clinet which uses .EFI Redfish discover protocol. > + // > + if (DiscoverProtocolHandle !=3D NULL) { > + gBS->DisconnectController (DiscoverProtocolHandle, NULL, > NULL); > + Status =3D gBS->UninstallProtocolInterface ( > + DiscoverProtocolHandle, > + &gEfiRedfishDiscoverProtocolGuid, > + (VOID *)&mRedfishDiscover > + ); > } > > return Status; > @@ -2032,20 +2069,5 @@ RedfishDiscoverUnload ( > StopServiceOnNetworkInterface (&gRedfishDiscoverDriverBinding, > ThisNetworkInterface->NetworkInterfaceProtocolInfo.ProtocolControllerHand= le); > } > > - // Disconnect EFI Redfish discover driver controller to notify the > - // clinet which uses .EFI Redfish discover protocol. > - > - if (EfiRedfishDiscoverProtocolHandle !=3D NULL) { > - // > - // Notify user EFI_REDFISH_DISCOVER_PROTOCOL is unloaded. > - // > - gBS->DisconnectController (EfiRedfishDiscoverProtocolHandle, NULL, > NULL); > - Status =3D gBS->UninstallProtocolInterface ( > - EfiRedfishDiscoverProtocolHandle, > - &gEfiRedfishDiscoverProtocolGuid, > - (VOID *)&mRedfishDiscover > - ); > - } > - > return Status; > } > -- > 2.37.1.windows.1 > > --0000000000002bc29805e795fa46 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PHAgY2xhc3M9Ik1zb05vcm1hbCI+UmV2aWV3 ZWQtYnk6wqANCk5pY2tsZSBXYW5nICZsdDs8YSBocmVmPSJtYWlsdG86bmlja2xlQGNzaWUuaW8i IHRhcmdldD0iX2JsYW5rIj5uaWNrbGVAY3NpZS5pbzwvYT4mZ3Q7PC9wPjxwIGNsYXNzPSJNc29O b3JtYWwiPjxicj48L3A+PHAgY2xhc3M9Ik1zb05vcm1hbCI+VGhhbmtzLDwvcD48cCBjbGFzcz0i TXNvTm9ybWFsIj5OaWNrbGXCoDxzcGFuPjwvc3Bhbj48L3A+PC9kaXY+PC9kaXY+PGJyPjxkaXYg Y2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+Jmx0 OzxhIGhyZWY9Im1haWx0bzphYm5lci5jaGFuZ0BhbWQuY29tIj5hYm5lci5jaGFuZ0BhbWQuY29t PC9hPiZndDsg5pa8IDIwMjLlubQ55pyIMeaXpSDpgLHlm5sg5Lit5Y2IMTI6MDLlr6vpgZPvvJo8 YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBw eCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3Bh ZGRpbmctbGVmdDoxZXgiPkZyb206IEFibmVyIENoYW5nICZsdDs8YSBocmVmPSJtYWlsdG86YWJu ZXIuY2hhbmdAYW1kLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmFibmVyLmNoYW5nQGFtZC5jb208L2E+ Jmd0Ozxicj4NCjxicj4NCkJaIDQwMzc6PGJyPg0KSW5zdGFsbCBFRklfRElTQ09WRVJfUFJPVE9D T0wgb24gZWFjaCBuZXR3b3JrIGludGVyZmFjZS48YnI+DQo8YnI+DQpUaGlzIGZpeGVzIHRoZSBp c3N1ZSB0aGF0IGNhdXNlcyB0aGUgaGlnaC1sZXZlbCBSZWRmaXNoIGRyaXZlcjxicj4NCm9uIHRo ZSBuZXR3b3JrIGludGVyZmFjZSBpcyBzdG9wcGVkIHdoZW46PGJyPg0KMS4gRUZJX0RJU0NPVkVS X1BST1RPQ09MIGlzIHJlaW5zdGFsbGVkIG9uIGEgbmV3LWZvdW5kIG5ldHdvcms8YnI+DQrCoCDC oGludGVyZmFjZSwgb3I8YnI+DQoyLiBFRklfRElTQ09WRVJfUFJPVE9DT0wgaXMgc3RvcHBlZCBv biB0aGUgbmV0d29yayBpbnRlcmZhY2U8YnI+DQrCoCDCoG90aGVyIHRoYW4gdGhlIG9uZSB3aGlj aCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggUmVkZmlzaDxicj4NCsKgIMKgc2VydmljZS48 YnI+DQo8YnI+DQpDYzogTmlja2xlIFdhbmcgJmx0OzxhIGhyZWY9Im1haWx0bzpuaWNrbGVAY3Np ZS5pbyIgdGFyZ2V0PSJfYmxhbmsiPm5pY2tsZUBjc2llLmlvPC9hPiZndDs8YnI+DQpDYzogSWdv ciBLdWxjaHl0c2t5eSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmlnb3JrQGFtaS5jb20iIHRhcmdldD0i X2JsYW5rIj5pZ29ya0BhbWkuY29tPC9hPiZndDs8YnI+DQpTaWduZWQtb2ZmLWJ5OiBBYm5lciBD aGFuZyAmbHQ7PGEgaHJlZj0ibWFpbHRvOmFibmVyLmNoYW5nQGFtZC5jb20iIHRhcmdldD0iX2Js YW5rIj5hYm5lci5jaGFuZ0BhbWQuY29tPC9hPiZndDs8YnI+DQotLS08YnI+DQrCoC4uLi9SZWRm aXNoRGlzY292ZXJJbnRlcm5hbC5owqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8wqAgwqA3ICs8 YnI+DQrCoC4uLi9SZWRmaXNoRGlzY292ZXJEeGUvUmVkZmlzaERpc2NvdmVyRHhlLmPCoCDCoHwg MTQwICsrKysrKysrKystLS0tLS0tLTxicj4NCsKgMiBmaWxlcyBjaGFuZ2VkLCA4OCBpbnNlcnRp b25zKCspLCA1OSBkZWxldGlvbnMoLSk8YnI+DQo8YnI+DQpkaWZmIC0tZ2l0IGEvUmVkZmlzaFBr Zy9SZWRmaXNoRGlzY292ZXJEeGUvUmVkZmlzaERpc2NvdmVySW50ZXJuYWwuaCBiL1JlZGZpc2hQ a2cvUmVkZmlzaERpc2NvdmVyRHhlL1JlZGZpc2hEaXNjb3ZlckludGVybmFsLmg8YnI+DQppbmRl eCA0ZDEzMTliMjY0MS4uMDRmYTA5ZTFjYzIgMTAwNjQ0PGJyPg0KLS0tIGEvUmVkZmlzaFBrZy9S ZWRmaXNoRGlzY292ZXJEeGUvUmVkZmlzaERpc2NvdmVySW50ZXJuYWwuaDxicj4NCisrKyBiL1Jl ZGZpc2hQa2cvUmVkZmlzaERpc2NvdmVyRHhlL1JlZGZpc2hEaXNjb3ZlckludGVybmFsLmg8YnI+ DQpAQCAtMiw2ICsyLDcgQEA8YnI+DQrCoCDCoFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFRkkgUmVk ZmlzaCBEaXNjb3ZlciBQcm90b2NvbCBpbnRlcmZhY2UuPGJyPg0KPGJyPg0KwqAgwqAoQykgQ29w eXJpZ2h0IDIwMjEgSGV3bGV0dCBQYWNrYXJkIEVudGVycHJpc2UgRGV2ZWxvcG1lbnQgTFAmbHQ7 QlImZ3Q7PGJyPg0KK8KgIENvcHlyaWdodCAoYykgMjAyMiwgQU1EIEluY29ycG9yYXRlZC4gQWxs IHJpZ2h0cyByZXNlcnZlZC48YnI+DQo8YnI+DQrCoCDCoFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBCU0QtMi1DbGF1c2UtUGF0ZW50PGJyPg0KPGJyPg0KQEAgLTEwNyw2ICsxMDgsMTIgQEAgdHlw ZWRlZiBzdHJ1Y3Qgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8vLyZsdDsgTkVUV09SS19JTlRFUkZBQ0VfUFJPVE9D T0xfVFlQRS48YnI+DQrCoCDCoFJFREZJU0hfRElTQ09WRVJfTkVUV09SS19JTlRFUkZBQ0VfUFJP VE9DT0zCoCDCoCBOZXR3b3JrSW50ZXJmYWNlUHJvdG9jb2xJbmZvOyAvLy8mbHQ7IE5ldHdvcmsg aW50ZXJmYWNlIHByb3RvY29sIGluZm9ybWF0aW9uLjxicj4NCsKgIMKgRUZJX0hBTkRMRcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUmVzdEV4 SGFuZGxlO8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLy8vJmx0OyBSRVNUIEVYIGhhbmRsZSBh c3NvY2lhdGVkIHdpdGggdGhpcyBuZXR3b3JrIGludGVyZmFjZS48YnI+DQorwqAgLy88YnI+DQor wqAgLy8gRUZJX1JFREZJU0hfRElTQ09WRVJfUFJPVE9DT0wgaW5zdGFuY2UgaW5zdGFsbGVkPGJy Pg0KK8KgIC8vIG9uIHRoaXMgbmV0d29yayBpbnRlcmZhY2UuPGJyPg0KK8KgIC8vPGJyPg0KK8Kg IEVGSV9IQU5ETEXCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoEVmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sSGFuZGxlOyAvLy8mbHQ7IEVGSV9S RURGSVNIX0RJU0NPVkVSX1BST1RPVE9DT0wgaW5zdGFuY2UgaW5zdGFsbGVkPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgLy8vJmx0OyBvbiB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLjxicj4NCsKgfSBFRklfUkVE RklTSF9ESVNDT1ZFUl9ORVRXT1JLX0lOVEVSRkFDRV9JTlRFUk5BTDs8YnI+DQo8YnI+DQrCoC8v PGJyPg0KZGlmZiAtLWdpdCBhL1JlZGZpc2hQa2cvUmVkZmlzaERpc2NvdmVyRHhlL1JlZGZpc2hE aXNjb3ZlckR4ZS5jIGIvUmVkZmlzaFBrZy9SZWRmaXNoRGlzY292ZXJEeGUvUmVkZmlzaERpc2Nv dmVyRHhlLmM8YnI+DQppbmRleCBiZjUwYzc4YzkyOC4uYTI3MWY2ZTk0MmQgMTAwNjQ0PGJyPg0K LS0tIGEvUmVkZmlzaFBrZy9SZWRmaXNoRGlzY292ZXJEeGUvUmVkZmlzaERpc2NvdmVyRHhlLmM8 YnI+DQorKysgYi9SZWRmaXNoUGtnL1JlZGZpc2hEaXNjb3ZlckR4ZS9SZWRmaXNoRGlzY292ZXJE eGUuYzxicj4NCkBAIC0zLDYgKzMsNyBAQDxicj4NCsKgIMKgVGhlIGltcGxlbWVudGF0aW9uIG9m IEVGSSBSZWRmaWRoIERpc2NvdmVyIFByb3RvY29sLjxicj4NCjxicj4NCsKgIMKgKEMpIENvcHly aWdodCAyMDIxIEhld2xldHQgUGFja2FyZCBFbnRlcnByaXNlIERldmVsb3BtZW50IExQJmx0O0JS Jmd0Ozxicj4NCivCoCBDb3B5cmlnaHQgKGMpIDIwMjIsIEFNRCBJbmNvcnBvcmF0ZWQuIEFsbCBy aWdodHMgcmVzZXJ2ZWQuPGJyPg0KPGJyPg0KwqAgwqBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog QlNELTItQ2xhdXNlLVBhdGVudDxicj4NCjxicj4NCkBAIC0yMyw4ICsyNCw2IEBAIEVGSV9HVUlE wqAgbVJlZGZpc2hEaXNjb3ZlclRjcDRJbnN0YW5jZUd1aWTCoCDCoD0gRUZJX1JFREZJU0hfRElT Q09WRVJfVENQNF9JTlNUQU5DPGJyPg0KwqBFRklfR1VJRMKgIG1SZWRmaXNoRGlzY292ZXJUY3A2 SW5zdGFuY2VHdWlkwqAgwqA9IEVGSV9SRURGSVNIX0RJU0NPVkVSX1RDUDZfSU5TVEFOQ0VfR1VJ RDs8YnI+DQrCoEVGSV9HVUlEwqAgbVJlZGZpc2hEaXNjb3ZlclJlc3RFeEluc3RhbmNlR3VpZCA9 IEVGSV9SRURGSVNIX0RJU0NPVkVSX1JFU1RfRVhfSU5TVEFOQ0VfR1VJRDs8YnI+DQo8YnI+DQot RUZJX0hBTkRMRcKgIEVmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sSGFuZGxlID0gTlVMTDs8YnI+ DQotPGJyPg0KwqBFRklfU1RBVFVTPGJyPg0KwqBFRklBUEk8YnI+DQrCoFRjcDRHZXRTdWJuZXRJ bmZvICg8YnI+DQpAQCAtMzI1LDYgKzMyNCwzOCBAQCBHZXRUYXJnZXROZXR3b3JrSW50ZXJmYWNl SW50ZXJuYWwgKDxicj4NCsKgIMKgcmV0dXJuIE5VTEw7PGJyPg0KwqB9PGJyPg0KPGJyPg0KKy8q Kjxicj4NCivCoCBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIEVGSV9SRURGSVNIX0RJU0NPVkVSX05F VFdPUktfSU5URVJGQUNFX0lOVEVSTkFMPGJyPg0KK8KgIGluc3RhbmNlIHdpdGggdGhlIGdpdmVu wqAgQ29udHJvbGxlciBoYW5kbGUuPGJyPg0KKzxicj4NCivCoCBAcGFyYW1baW5dIENvbnRyb2xs ZXJIYW5kbGXCoCBUaGUgY29udHJvbGxlciBoYW5kbGUgYXNzb2NpYXRlZCB3aXRoIG5ldHdvcmsg aW50ZXJmYWNlLjxicj4NCis8YnI+DQorwqAgQHJldHZhbCBOb24tTlVMTMKgIEVGSV9SRURGSVNI X0RJU0NPVkVSX05FVFdPUktfSU5URVJGQUNFX0lOVEVSTkFMIGlzIHJldHVybmVkLjxicj4NCivC oCBAcmV0dmFsIE5VTEzCoCDCoCDCoCBOb24gb2YgRUZJX1JFREZJU0hfRElTQ09WRVJfTkVUV09S S19JTlRFUkZBQ0VfSU5URVJOQUwgaW5zdGFuY2UgaXMgcmV0dXJuZWQuPGJyPg0KKyoqLzxicj4N CitFRklfUkVERklTSF9ESVNDT1ZFUl9ORVRXT1JLX0lOVEVSRkFDRV9JTlRFUk5BTCAqPGJyPg0K K0dldFRhcmdldE5ldHdvcmtJbnRlcmZhY2VJbnRlcm5hbEJ5Q29udHJvbGxlciAoPGJyPg0KK8Kg IElOIEVGSV9IQU5ETEXCoCBDb250cm9sbGVySGFuZGxlPGJyPg0KK8KgICk8YnI+DQorezxicj4N CivCoCBFRklfUkVERklTSF9ESVNDT1ZFUl9ORVRXT1JLX0lOVEVSRkFDRV9JTlRFUk5BTMKgICpU aGlzTmV0d29ya0ludGVyZmFjZTs8YnI+DQorPGJyPg0KK8KgIFRoaXNOZXR3b3JrSW50ZXJmYWNl ID0gKEVGSV9SRURGSVNIX0RJU0NPVkVSX05FVFdPUktfSU5URVJGQUNFX0lOVEVSTkFMICopR2V0 Rmlyc3ROb2RlICgmYW1wO21FZmlSZWRmaXNoRGlzY292ZXJOZXR3b3JrSW50ZXJmYWNlKTs8YnI+ DQorwqAgd2hpbGUgKFRSVUUpIHs8YnI+DQorwqAgwqAgaWYgKFRoaXNOZXR3b3JrSW50ZXJmYWNl LSZndDtPcGVuRHJpdmVyQ29udHJvbGxlckhhbmRsZSA9PSBDb250cm9sbGVySGFuZGxlKSB7PGJy Pg0KK8KgIMKgIMKgIHJldHVybiBUaGlzTmV0d29ya0ludGVyZmFjZTs8YnI+DQorwqAgwqAgfTxi cj4NCis8YnI+DQorwqAgwqAgaWYgKElzTm9kZUF0RW5kICgmYW1wO21FZmlSZWRmaXNoRGlzY292 ZXJOZXR3b3JrSW50ZXJmYWNlLCAmYW1wO1RoaXNOZXR3b3JrSW50ZXJmYWNlLSZndDtFbnRyeSkp IHs8YnI+DQorwqAgwqAgwqAgcmV0dXJuIE5VTEw7PGJyPg0KK8KgIMKgIH08YnI+DQorPGJyPg0K K8KgIMKgIFRoaXNOZXR3b3JrSW50ZXJmYWNlID0gKEVGSV9SRURGSVNIX0RJU0NPVkVSX05FVFdP UktfSU5URVJGQUNFX0lOVEVSTkFMICopR2V0TmV4dE5vZGUgKCZhbXA7bUVmaVJlZGZpc2hEaXNj b3Zlck5ldHdvcmtJbnRlcmZhY2UsICZhbXA7VGhpc05ldHdvcmtJbnRlcmZhY2UtJmd0O0VudHJ5 KTs8YnI+DQorwqAgfTxicj4NCis8YnI+DQorwqAgcmV0dXJuIE5VTEw7PGJyPg0KK308YnI+DQor PGJyPg0KwqAvKio8YnI+DQrCoCDCoFRoaXMgZnVuY3Rpb24gdmFsaWRhdGUgaWYgdGFyZ2V0IG5l dHdvcmsgaW50ZXJmYWNlIGlzIHJlYWR5IGZvciBkaXNjb3ZlcmluZzxicj4NCsKgIMKgUmVkZmlz aCBzZXJ2aWNlLjxicj4NCkBAIC0xNjE5LDI5ICsxNjUwLDMwIEBAIEJ1aWxkdXBOZXR3b3JrSW50 ZXJmYWNlICg8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoEVGSV9PUEVO X1BST1RPQ09MX0JZX0RSSVZFUjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgKTs8YnI+DQrCoCDCoCDCoCDCoGlmICghRUZJX0VSUk9SIChTdGF0dXMpKSB7PGJyPg0KLcKg IMKgIMKgIMKgIGlmICgoRWZpUmVkZmlzaERpc2NvdmVyUHJvdG9jb2xIYW5kbGUgPT0gTlVMTCkg JmFtcDsmYW1wOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCAoZ1JlcXVpcmVkUHJvdG9jb2xbSW5k ZXhdLlByb3RvY29sVHlwZSA9PSBQcm90b2NvbFR5cGVSZXN0RXgpICZhbXA7JmFtcDs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgIUlzTGlzdEVtcHR5ICgmYW1wO21FZmlSZWRmaXNoRGlzY292ZXJO ZXR3b3JrSW50ZXJmYWNlKTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCApPGJyPg0KLcKgIMKgIMKg IMKgIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgLy8gSW5zdGFsbCB0aGUgZmlzcnQgUmVkZmlzaCBE aXNjb3ZlciBQcm90b2NvbCB3aGVuIEVGSSBSRVNUIEVYIHByb3Rjb2wgaXMgZGlzY292ZXJlZC48 YnI+DQotwqAgwqAgwqAgwqAgwqAgLy8gVGhpcyBlbnN1cmVzIEVGSSBSRVNUIEVYIGlzIHJlYWR5 IHdoaWxlIEVGSV9SRURGSVNIX0RJU0NPVkVSX1BST1RPQ09MIGNvbnN1bWVyIGFjcXVpcmVzPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIC8vIFJlZGZpc2ggc2VyaXZjZSBvdmVyIG5ldHdvcmsgaW50ZXJm YWNlLjxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAgwqAgU3RhdHVzID0gZ0JTLSZndDtJbnN0YWxs UHJvdG9jb2xJbnRlcmZhY2UgKDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAmYW1wO0VmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sSGFuZGxlLDxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1wO2dFZmlSZWRmaXNoRGlzY292 ZXJQcm90b2NvbEd1aWQsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIEVGSV9OQVRJVkVfSU5URVJGQUNFLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAoVk9JRCAqKSZhbXA7bVJlZGZpc2hEaXNjb3Zlcjxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCApOzxicj4NCi3CoCDCoCDCoCDCoCB9IGVs c2UgaWYgKChFZmlSZWRmaXNoRGlzY292ZXJQcm90b2NvbEhhbmRsZSAhPSBOVUxMKSAmYW1wOyZh bXA7IE5ld05ldHdvcmtJbnRlcmZhY2VJbnN0YWxsZWQpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAg U3RhdHVzID0gZ0JTLSZndDtSZWluc3RhbGxQcm90b2NvbEludGVyZmFjZSAoPGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIEVmaVJlZGZpc2hEaXNjb3ZlclByb3Rv Y29sSGFuZGxlLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAm YW1wO2dFZmlSZWRmaXNoRGlzY292ZXJQcm90b2NvbEd1aWQsPGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChWT0lEICopJmFtcDttUmVkZmlzaERpc2NvdmVyLDxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoVk9JRCAqKSZhbXA7 bVJlZGZpc2hEaXNjb3Zlcjxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCApOzxicj4NCi3CoCDCoCDCoCDCoCDCoCBOZXdOZXR3b3JrSW50ZXJmYWNlSW5zdGFsbGVk ID0gRkFMU0U7PGJyPg0KK8KgIMKgIMKgIMKgIGlmICgoZ1JlcXVpcmVkUHJvdG9jb2xbSW5kZXhd LlByb3RvY29sVHlwZSA9PSBQcm90b2NvbFR5cGVSZXN0RXgpKSB7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIC8vIEluc3RhbGwgUmVkZmlzaCBEaXNjb3ZlciBQcm90b2NvbCB3aGVuIEVGSSBSRVNUIEVY IHByb3Rjb2wgaXMgZGlzY292ZXJlZC48YnI+DQorwqAgwqAgwqAgwqAgwqAgLy8gVGhpcyBlbnN1 cmVzIEVGSSBSRVNUIEVYIGlzIHJlYWR5IHdoaWxlIHRoZSBjb25zdW1lciBvZiBFRklfUkVERklT SF9ESVNDT1ZFUl9QUk9UT0NPTDxicj4NCivCoCDCoCDCoCDCoCDCoCAvLyBhY3F1aXJlcyBSZWRm aXNoIHNlcml2Y2Ugb3ZlciBuZXR3b3JrIGludGVyZmFjZS48YnI+DQorPGJyPg0KK8KgIMKgIMKg IMKgIMKgIGlmICghTmV3TmV0d29ya0ludGVyZmFjZUluc3RhbGxlZCkgezxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCBOZXR3b3JrSW50ZXJmYWNlID0gR2V0VGFyZ2V0TmV0d29ya0ludGVyZmFjZUlu dGVybmFsQnlDb250cm9sbGVyIChDb250cm9sbGVySGFuZGxlKTs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgaWYgKE5ldHdvcmtJbnRlcmZhY2UgPT0gTlVMTCkgezxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCBERUJVRyAoKERFQlVHX0VSUk9SLCAmcXVvdDslYTogQ2FuJiMzOTt0IGZpbmQgbmV0 d29yayBpbnRlcmZhY2UgYnkgQ29udHJvbGxlckhhbmRsZVxuJnF1b3Q7LCBfX0ZVTkNUSU9OX18p KTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIFN0YXR1czs8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgfTxicj4NCivCoCDCoCDCoCDCoCDCoCB9PGJyPg0KKzxicj4NCivCoCDCoCDC oCDCoCDCoCBOZXdOZXR3b3JrSW50ZXJmYWNlSW5zdGFsbGVkwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqA9IEZBTFNFOzxicj4NCivCoCDCoCDCoCDCoCDCoCBOZXR3b3JrSW50ZXJm YWNlLSZndDtFZmlSZWRmaXNoRGlzY292ZXJQcm90b2NvbEhhbmRsZSA9IE5VTEw7PGJyPg0KK8Kg IMKgIMKgIMKgIMKgIFN0YXR1c8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPSBnQlMtJmd0O0luc3RhbGxQcm90b2NvbElu dGVyZmFjZSAoPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgICZhbXA7TmV0d29ya0ludGVyZmFjZS0mZ3Q7RWZpUmVkZmlzaERpc2NvdmVyUHJvdG9j b2xIYW5kbGUsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgICZhbXA7Z0VmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sR3VpZCw8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgRUZJX05BVElWRV9JTlRF UkZBQ0UsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIChWT0lEICopJmFtcDttUmVkZmlzaERpc2NvdmVyPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIGlm IChFRklfRVJST1IgKFN0YXR1cykpIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgREVCVUcgKChE RUJVR19FUlJPUiwgJnF1b3Q7JWE6IEZhaWwgdG8gaW5zdGFsbCBFRklfUkVERklTSF9ESVNDT1ZF Ul9QUk9UT0NPTFxuJnF1b3Q7LCBfX0ZVTkNUSU9OX18pKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAg fTxicj4NCsKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKgfTxicj4NCjxicj4NCkBAIC0x NzI0LDYgKzE3NTYsNyBAQCBTdG9wU2VydmljZU9uTmV0d29ya0ludGVyZmFjZSAoPGJyPg0KwqAg wqBFRklfU1RBVFVTwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBTdGF0dXM7PGJyPg0KwqAgwqBWT0lEwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqSW50ZXJmYWNl Ozxicj4NCsKgIMKgRUZJX1RQTMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE9sZFRwbDs8YnI+DQorwqAgRUZJX0hBTkRMRcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgRGlz Y292ZXJQcm90b2NvbEhhbmRsZTs8YnI+DQrCoCDCoEVGSV9SRURGSVNIX0RJU0NPVkVSX05FVFdP UktfSU5URVJGQUNFX0lOVEVSTkFMwqAgKlRoaXNOZXR3b3JrSW50ZXJmYWNlOzxicj4NCsKgIMKg RUZJX1JFREZJU0hfRElTQ09WRVJfUkVTVF9FWF9JTlNUQU5DRV9JTlRFUk5BTMKgIMKgKlJlc3RF eEluc3RhbmNlOzxicj4NCjxicj4NCkBAIC0xNzQzLDMwICsxNzc2LDM0IEBAIFN0b3BTZXJ2aWNl T25OZXR3b3JrSW50ZXJmYWNlICg8YnI+DQrCoCDCoCDCoCDCoCDCoFRoaXNOZXR3b3JrSW50ZXJm YWNlID0gKEVGSV9SRURGSVNIX0RJU0NPVkVSX05FVFdPUktfSU5URVJGQUNFX0lOVEVSTkFMICop R2V0Rmlyc3ROb2RlICgmYW1wO21FZmlSZWRmaXNoRGlzY292ZXJOZXR3b3JrSW50ZXJmYWNlKTs8 YnI+DQrCoCDCoCDCoCDCoCDCoHdoaWxlIChUUlVFKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqBp ZiAoVGhpc05ldHdvcmtJbnRlcmZhY2UtJmd0O05ldHdvcmtJbnRlcmZhY2VQcm90b2NvbEluZm8u UHJvdG9jb2xDb250cm9sbGVySGFuZGxlID09IENvbnRyb2xsZXJIYW5kbGUpIHs8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgU3RhdHVzID0gQ2xvc2VQcm90b2NvbFNlcnZpY2UgKDxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8vIENsb3NlIHByb3RvY29sIGFuZCBkZXN0 cm95IHNlcnZpY2UuPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVGhp c0JpbmRpbmdQcm90b2NvbCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBDb250cm9sbGVySGFuZGxlLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCZhbXA7Z1JlcXVpcmVkUHJvdG9jb2xbSW5kZXhdLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoFRoaXNOZXR3b3JrSW50ZXJmYWNlLSZndDtPcGVuRHJpdmVyQWdl bnRIYW5kbGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVGhpc05l dHdvcmtJbnRlcmZhY2UtJmd0O09wZW5Ecml2ZXJDb250cm9sbGVySGFuZGxlPGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg RGlzY292ZXJQcm90b2NvbEhhbmRsZSA9IFRoaXNOZXR3b3JrSW50ZXJmYWNlLSZndDtFZmlSZWRm aXNoRGlzY292ZXJQcm90b2NvbEhhbmRsZTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgLy88YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgLy8gQ2xvc2UgcHJvdG9jb2wgYW5kIGRlc3Ryb3kgc2Vydmlj ZS48YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgLy88YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgU3Rh dHVzwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA9IENsb3NlUHJvdG9jb2xTZXJ2aWNlICg8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBUaGlzQmluZGluZ1Byb3RvY29sLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoENvbnRyb2xsZXJIYW5kbGUsPGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgJmFtcDtnUmVxdWlyZWRQcm90b2NvbFtJbmRleF0sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVGhpc05ldHdvcmtJbnRl cmZhY2UtJmd0O09wZW5Ecml2ZXJBZ2VudEhhbmRsZSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBUaGlzTmV0d29ya0ludGVy ZmFjZS0mZ3Q7T3BlbkRyaXZlckNvbnRyb2xsZXJIYW5kbGU8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqApOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgaWYgKCFFRklfRVJST1IgKFN0YXR1cykpIHs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoFN0YXR1cyA9IERlc3Ryb3lSZWRmaXNoTmV0d3Jva0ludGVyZmFjZSAoVGhp c05ldHdvcmtJbnRlcmZhY2UpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCjxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgZ0JTLSZndDtSZXN0b3JlVFBMIChPbGRUcGwpOzxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCAvLyBSZWluc3RhbGwgUmVkZmlzaCBEaXNjb3ZlciBwcm90b2NvbCB0 byBub3RpZnkgbmV0d29yazxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCAvLyBpbnRlcmZhY2UgY2hh bmdlLjxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgU3RhdHVzID0gZ0JTLSZndDtSZWlu c3RhbGxQcm90b2NvbEludGVyZmFjZSAoPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIEVmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sSGFuZGxlLDxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1wO2dFZmlSZWRmaXNo RGlzY292ZXJQcm90b2NvbEd1aWQsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIChWT0lEICopJmFtcDttUmVkZmlzaERpc2NvdmVyLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoVk9JRCAqKSZhbXA7bVJlZGZpc2hE aXNjb3Zlcjxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAp Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7PGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIERFQlVHICgoREVCVUdfRVJST1IsICZxdW90OyVhOiBSZWlu c3RhbGwgZ0VmaVJlZGZpc2hEaXNjb3ZlclByb3RvY29sR3VpZCBmYWlsLiZxdW90OywgX19GVU5D VElPTl9fKSk7PGJyPg0KKzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCAvLzxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCAvLyBEaXNjb25uZWN0IEVGSSBSZWRmaXNoIGRpc2NvdmVyIGRyaXZlciBjb250 cm9sbGVyIHRvIG5vdGlmeSB0aGU8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgLy8gY2xpbmV0IHdo aWNoIHVzZXMgLkVGSSBSZWRmaXNoIGRpc2NvdmVyIHByb3RvY29sLjxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCAvLzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCBpZiAoRGlzY292ZXJQcm90b2NvbEhh bmRsZSAhPSBOVUxMKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIGdCUy0mZ3Q7RGlzY29u bmVjdENvbnRyb2xsZXIgKERpc2NvdmVyUHJvdG9jb2xIYW5kbGUsIE5VTEwsIE5VTEwpOzxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCBTdGF0dXMgPSBnQlMtJmd0O1VuaW5zdGFsbFByb3RvY29s SW50ZXJmYWNlICg8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgRGlzY292ZXJQcm90b2NvbEhhbmRsZSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJmFtcDtnRWZpUmVkZmlzaERpc2NvdmVyUHJvdG9jb2xH dWlkLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAo Vk9JRCAqKSZhbXA7bVJlZGZpc2hEaXNjb3Zlcjxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCApOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4N Cjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIFN0YXR1czs8YnI+DQpAQCAtMjAzMiwy MCArMjA2OSw1IEBAIFJlZGZpc2hEaXNjb3ZlclVubG9hZCAoPGJyPg0KwqAgwqAgwqBTdG9wU2Vy dmljZU9uTmV0d29ya0ludGVyZmFjZSAoJmFtcDtnUmVkZmlzaERpc2NvdmVyRHJpdmVyQmluZGlu ZywgVGhpc05ldHdvcmtJbnRlcmZhY2UtJmd0O05ldHdvcmtJbnRlcmZhY2VQcm90b2NvbEluZm8u UHJvdG9jb2xDb250cm9sbGVySGFuZGxlKTs8YnI+DQrCoCDCoH08YnI+DQo8YnI+DQotwqAgLy8g RGlzY29ubmVjdCBFRkkgUmVkZmlzaCBkaXNjb3ZlciBkcml2ZXIgY29udHJvbGxlciB0byBub3Rp ZnkgdGhlPGJyPg0KLcKgIC8vIGNsaW5ldCB3aGljaCB1c2VzIC5FRkkgUmVkZmlzaCBkaXNjb3Zl ciBwcm90b2NvbC48YnI+DQotPGJyPg0KLcKgIGlmIChFZmlSZWRmaXNoRGlzY292ZXJQcm90b2Nv bEhhbmRsZSAhPSBOVUxMKSB7PGJyPg0KLcKgIMKgIC8vPGJyPg0KLcKgIMKgIC8vIE5vdGlmeSB1 c2VyIEVGSV9SRURGSVNIX0RJU0NPVkVSX1BST1RPQ09MIGlzIHVubG9hZGVkLjxicj4NCi3CoCDC oCAvLzxicj4NCi3CoCDCoCBnQlMtJmd0O0Rpc2Nvbm5lY3RDb250cm9sbGVyIChFZmlSZWRmaXNo RGlzY292ZXJQcm90b2NvbEhhbmRsZSwgTlVMTCwgTlVMTCk7PGJyPg0KLcKgIMKgIFN0YXR1cyA9 IGdCUy0mZ3Q7VW5pbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UgKDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBFZmlSZWRmaXNoRGlzY292ZXJQcm90b2NvbEhhbmRsZSw8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJmFtcDtnRWZpUmVkZmlzaERpc2NvdmVyUHJv dG9jb2xHdWlkLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoVk9JRCAqKSZh bXA7bVJlZGZpc2hEaXNjb3Zlcjxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAp Ozxicj4NCi3CoCB9PGJyPg0KLTxicj4NCsKgIMKgcmV0dXJuIFN0YXR1czs8YnI+DQrCoH08YnI+ DQotLSA8YnI+DQoyLjM3LjEud2luZG93cy4xPGJyPg0KPGJyPg0KPC9ibG9ja3F1b3RlPjwvZGl2 Pg0K --0000000000002bc29805e795fa46--