From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=star.zeng@intel.com; receiver=edk2-devel@lists.01.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 0FFFE2118F766 for ; Mon, 11 Jun 2018 20:35:09 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Jun 2018 20:35:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,213,1526367600"; d="scan'208";a="66243299" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga002.jf.intel.com with ESMTP; 11 Jun 2018 20:35:09 -0700 Received: from fmsmsx118.amr.corp.intel.com (10.18.116.18) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 11 Jun 2018 20:35:09 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx118.amr.corp.intel.com (10.18.116.18) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 11 Jun 2018 20:35:08 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.223]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.87]) with mapi id 14.03.0319.002; Tue, 12 Jun 2018 11:35:06 +0800 From: "Zeng, Star" To: Laszlo Ersek , "Wang, Jian J" , "edk2-devel@lists.01.org" CC: "Ni, Ruiyu" , "Yao, Jiewen" , "Dong, Eric" , "Zeng, Star" Thread-Topic: [edk2] [PATCH 1/2] UefiCpuPkg/CpuDxe: allow accessing (DXE) page table in SMM mode Thread-Index: AQHUAVMaznh+wW0ajkeltKHpqqsiWKRac5uAgAGDraA= Date: Tue, 12 Jun 2018 03:35:06 +0000 Message-ID: <0C09AFA07DD0434D9E2A0C6AEB0483103BB55B2F@shsmsx102.ccr.corp.intel.com> References: <20180611070833.5440-1-jian.j.wang@intel.com> <20180611070833.5440-2-jian.j.wang@intel.com> In-Reply-To: Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH 1/2] UefiCpuPkg/CpuDxe: allow accessing (DXE) page table in SMM mode X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jun 2018 03:35:10 -0000 Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 U2hhcmUgc29tZSBpbmZvcm1hdGlvbiBoZXJlIGFjY29yZGluZyB0byBteSBrbm93bGVkZ2UuDQoN ClRoZSBFRklfU01NX0JBU0UyX1BST1RPQ09MLkluU21tIGRlZmluaXRpb24gaW4gUEkgc3BlYyBp cyByZWFsbHkgdmVyeSBjb25mdXNpb24uIFRoZSBuYW1pbmcgZm9yIGl0IGFyZSBub3QgY29uc2lz dGVudC4NClRoZSBpbnRlcmZhY2UgbmFtZTogSW4qU21tKg0KVGhlIHR5cGVkZWYgbmFtZSBvZiBJ blNtbTogRUZJXypTTU1fSU5TSURFX09VVCoyDQpUaGUgc2Vjb25kIHBhcmFtZXRlciBuYW1lIG9m IEluU21tOiBJbipTbXJhbSoNCiANCkluIHJlYWxpdHksIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBF RklfU01NX0JBU0UyX1BST1RPQ09MLkluU21tIGluIFBpU21tSXBsIHJldHVybnMgdGhlIGluZm9y bWF0aW9uIHRoYXQgd2hldGhlciBjdXJyZW50IGV4ZWN1dGluZyBjb2RlIGlzIFNNTSBjb2RlIG9y IGV4ZWN1dGVkIGZyb20gU01NIGNvZGUuDQoNCkRYRSA+IChTTU0gY29tbXVuY2F0aW9uKSA+IElu U21tID0gVFJVRSA+IFNNTSBkcml2ZXIgZGlzcGF0Y2hlci9TTU0gaGFuZGxlciA+IChleGl0IFNN TSBjb21tdW5pY2F0aW9uKSA+IEluU21tID0gRkFMU0UgPiBEWEUNCg0KDQpUaGFua3MsDQpTdGFy DQoNCi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQpGcm9tOiBlZGsyLWRldmVsIFttYWlsdG86 ZWRrMi1kZXZlbC1ib3VuY2VzQGxpc3RzLjAxLm9yZ10gT24gQmVoYWxmIE9mIExhc3psbyBFcnNl aw0KU2VudDogTW9uZGF5LCBKdW5lIDExLCAyMDE4IDg6MTggUE0NClRvOiBXYW5nLCBKaWFuIEog PGppYW4uai53YW5nQGludGVsLmNvbT47IGVkazItZGV2ZWxAbGlzdHMuMDEub3JnDQpDYzogTmks IFJ1aXl1IDxydWl5dS5uaUBpbnRlbC5jb20+OyBZYW8sIEppZXdlbiA8amlld2VuLnlhb0BpbnRl bC5jb20+OyBEb25nLCBFcmljIDxlcmljLmRvbmdAaW50ZWwuY29tPg0KU3ViamVjdDogUmU6IFtl ZGsyXSBbUEFUQ0ggMS8yXSBVZWZpQ3B1UGtnL0NwdUR4ZTogYWxsb3cgYWNjZXNzaW5nIChEWEUp IHBhZ2UgdGFibGUgaW4gU01NIG1vZGUNCg0KSGkgSmlhbiwNCg0KT24gMDYvMTEvMTggMDk6MDgs IEppYW4gSiBXYW5nIHdyb3RlOg0KPiBUaGUgU01NIHZlcnNpb24gb2YgTWVtb3J5QWxsb2NhdGlv bkxpYiBhbGxvd3MgdG8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIA0KPiBpbiBEWEUgKGJlZm9yZSBF bmRPZkR4ZSkuIFRoaXMgaXMgZG9uZSBieSBjaGVja2luZyB0aGUgbWVtb3J5IHJhbmdlIA0KPiBh bmQgY2FsbGluZyBnQlMgc2VydmljZXMgdG8gZG8gcmVhbCBvcGVyYXRpb24gaWYgdGhlIG1lbW9y eSB0byBmcmVlIGlzIA0KPiBvdXQgb2YgU01SQU0uIFRoaXMgd291bGQgY2F1c2UgcHJvYmxlbSBp ZiBzb21lIG1lbW9yeSByZWxhdGVkIA0KPiBmZWF0dXJlcywgbGlrZSBIZWFwIEd1YXJkLCBoYXZl IHRvIHVwZGF0ZSBwYWdlIHRhYmxlIHRvIGNoYW5nZSBtZW1vcnkgYXR0cmlidXRlcy4NCj4gQmVj YXVzZSBwYWdlIHRhYmxlIGluIFNNTSBtb2RlIGlzIGRpZmZlcmVudCBmcm9tIERYRSBtb2RlLCBn QlMgbWVtb3J5IA0KPiBzZXJ2aWNlcyBjYW5ub3QgZ2V0IHRoZSBjb3JyZWN0IGF0dHJpYnV0ZXMg b2YgRFhFIG1lbW9yeSBmcm9tIFNNTSBwYWdlIA0KPiB0YWJsZSBhbmQgdGhlbiBjYXVzZSBpbmNv cnJlY3QgbWVtb3J5IG1hbmlwdWxhdGlvbnMuDQoNCigxKSBJIHRoaW5rIHRoaXMgZGVzY3JpcHRp b24gbWFrZXMgc2Vuc2UsIGJ1dCBpdCBkb2VzIG5vdCBoaWdobGlnaHQgdGhlIGludm9sdmVtZW50 IG9mIENwdUR4ZS4NCg0KKDFhKSBQbGVhc2UgcmVmZXJlbmNlICJNZGVQa2cvTGlicmFyeS9TbW1N ZW1vcnlBbGxvY2F0aW9uTGliIiBzcGVjaWZpY2FsbHkuDQoNCigxYikgVGhlIFNtbU1lbW9yeUFs bG9jYXRpb25MaWIgaW5zdGFuY2UgaW1wbGllcyB0aGF0IHRoZSBjYWxsIGNoYWluIHN0YXJ0cyB3 aXRoIGEgRFhFX1NNTV9EUklWRVIgY2FsbGluZyBGcmVlUG9vbCgpIG9yIEZyZWVQYWdlcygpLg0K DQpEWEVfU01NX0RSSVZFUnMgY2FuIG9ubHkgY2FsbCBib290IHNlcnZpY2VzLCBhbmQgcHJvdG9j b2xzIGxvY2F0ZWQgd2l0aCBib290IHNlcnZpY2VzLCBpbiB0aGVpciBlbnRyeSBwb2ludCBmdW5j dGlvbnMuDQoNCkNwdUR4ZSBpcyBhIERYRV9EUklWRVIgYW5kIGl0IHByb3ZpZGVzIHRoZSBDUFUg YXJjaCBwcm90b2NvbCAoYW5kIHRoZSBNUCBzZXJ2aWNlcyBwcm90b2NvbCkuIFRodXMsIG91ciBj YWxsIGNoYWluIGNhbiBvbmx5IG9jY3VyIGlmOg0KDQotIGEgRFhFX1NNTV9EUklWRVIgY2FsbHMg dGhlIEZyZWVQb29sKCkgb3IgRnJlZVBhZ2VzKCkgbGlicmFyeSBBUEksDQoNCi0gaW4gaXRzIGVu dHJ5IHBvaW50IGZ1bmN0aW9uLA0KDQotIHJlbGVhc2luZyBtZW1vcnkgdGhhdCdzIG5vdCBTTVJB TSwNCg0KLSBhbmQgdGhlIGhlYXAgZ3VhcmQgZmVhdHVyZSBpcyBlbmFibGVkLCBzbyB0aGUgRnJl ZVBvb2woKSBvcg0KICBGcmVlUGFnZXMoKSBib290IHNlcnZpY2UgZW5kcyB1cCBjYWxsaW5nDQog IEVGSV9DUFVfQVJDSF9QUk9UT0NPTC5TZXRNZW1vcnlBdHRyaWJ1dGVzKCkuDQoNClBsZWFzZSBp bmNsdWRlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIGNvbW1pdCBtZXNzYWdlLg0KDQooMikgQ2Fu IHlvdSByZW1pbmQgbWUgaG93IHRoZSBTTU0gcGFnZSB0YWJsZXMgbWFwIG5vbi1TTVJBTSBtZW1v cnk/DQoNCkJlY2F1c2UsIEkgYXNzdW1lIHRoYXQsIGFmdGVyIGEgRnJlZVBhZ2VzKCkgbGliYXJ5 IEFQSSBjYWxsLCB0aGUgZnJlZWQgbWVtb3J5IHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZSB0byBl aXRoZXIgU01NIGNvZGUgb3Igbm9ybWFsIERYRSBjb2RlLg0KVGhpcyBzZWVtcyB0byBpbXBseSB0 aGF0IGJvdGggc2V0cyBvZiBwYWdlIHRhYmxlcyBzaG91bGQgYmUgbW9kaWZpZWQuDQpXaGF0IGFt IEkgbWlzc2luZz8NCg0KPiANCj4gVGhlIHNvbHV0aW9uIGluIHRoaXMgcGF0Y2ggaXMgdG8gc3Rv cmUgdGhlIERYRSBwYWdlIHRhYmxlIGluZm9ybWF0aW9uIA0KPiAoZS5nLiB2YWx1ZSBvZiBDUjAs IENSMyByZWdpc3RlcnMsIGV0Yy4pIGluIGEgZ2xvYmFsIHZhcmlhYmxlIG9mIA0KPiBDcHVEeGUg ZHJpdmVyLiBJZiBDcHVEeGUgZGV0ZWN0cyBpdCdzIGluIFNNTSBtb2RlLCBpdCB3aWxsIHVzZSB0 aGlzIA0KPiBnbG9iYWwgdmFyaWFibGUgdG8gYWNjZXNzIHBhZ2UgdGFibGUgaW5zdGVhZCBvZiBj dXJyZW50IHByb2Nlc3NvciByZWdpc3RlcnMuDQo+IA0KPiBDaGFuZ2UtSWQ6IElmODEwYmIxODI4 MTYwYjhiZGQ4Y2I2MTZkODZkZjI4NTljNzQ5NzFmDQoNCigzKSBJIHRoaW5rIHRoaXMgY29tZXMg ZnJvbSBHZXJyaXQuIERvIHlvdSByZWFsbHkgbmVlZCB0aGUgIkNoYW5nZS1JZCINCnRhZyBpbiB0 aGUgY29tbWl0IG1lc3NhZ2U/IEl0IGRvZXNuJ3Qgc2F5IGFueXRoaW5nIHRvIHRoZSB1cHN0cmVh bSBlZGsyIHVzZXJzLg0KDQpJZiB5b3UgcmVhbGx5IG5lZWQgaXQsIEkgZG9uJ3QgbWluZCBpdCB0 aG91Z2g7IGp1c3QgcGxlYXNlIGxldCdzIG5vdCBhZGQgaXQgZHVlIHRvIG92ZXJzaWdodC4NCg0K KDQpIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgZG9uJ3QgKnB1c2gqIHRoZSBwYXRjaCB3aXRo IEdlcnJpdC4gR2Vycml0IGRvZXMgYmFkIHRoaW5ncyB0byBnaXQgbWV0YWRhdGEuIFBsZWFzZSBz ZWUgPGh0dHA6Ly9taWQubWFpbC1hcmNoaXZlLmNvbS80QTg5RTJFRjNERkVEQjRDOEJGREU1MTAx NEY2MDZBMTRFMjIzNDREQFNIU01TWDEwNC5jY3IuY29ycC5pbnRlbC5jb20+Lg0KDQo+IENjOiBF cmljIERvbmcgPGVyaWMuZG9uZ0BpbnRlbC5jb20+DQo+IENjOiBMYXN6bG8gRXJzZWsgPGxlcnNl a0ByZWRoYXQuY29tPg0KPiBDYzogSmlld2VuIFlhbyA8amlld2VuLnlhb0BpbnRlbC5jb20+DQo+ IENjOiBSdWl5dSBOaSA8cnVpeXUubmlAaW50ZWwuY29tPg0KPiBDb250cmlidXRlZC11bmRlcjog VGlhbm9Db3JlIENvbnRyaWJ1dGlvbiBBZ3JlZW1lbnQgMS4xDQo+IFNpZ25lZC1vZmYtYnk6IEpp YW4gSiBXYW5nIDxqaWFuLmoud2FuZ0BpbnRlbC5jb20+DQo+IC0tLQ0KPiAgVWVmaUNwdVBrZy9D cHVEeGUvQ3B1RHhlLmMgICAgICAgfCAgIDIgKy0NCj4gIFVlZmlDcHVQa2cvQ3B1RHhlL0NwdUR4 ZS5pbmYgICAgIHwgICAxICsNCj4gIFVlZmlDcHVQa2cvQ3B1RHhlL0NwdVBhZ2VUYWJsZS5jIHwg MTA4IA0KPiArKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0NCj4gIDMgZmls ZXMgY2hhbmdlZCwgNzUgaW5zZXJ0aW9ucygrKSwgMzYgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZm IC0tZ2l0IGEvVWVmaUNwdVBrZy9DcHVEeGUvQ3B1RHhlLmMgYi9VZWZpQ3B1UGtnL0NwdUR4ZS9D cHVEeGUuYyANCj4gaW5kZXggNmFlMmRjZDFjNy4uMWZkOTk2ZmMzZiAxMDA2NDQNCj4gLS0tIGEv VWVmaUNwdVBrZy9DcHVEeGUvQ3B1RHhlLmMNCj4gKysrIGIvVWVmaUNwdVBrZy9DcHVEeGUvQ3B1 RHhlLmMNCj4gQEAgLTQwNCw3ICs0MDQsNyBAQCBDcHVTZXRNZW1vcnlBdHRyaWJ1dGVzICgNCj4g ICAgLy8gdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcHV0aW5nLg0KPiAgICAvLw0KPiAgICBpZiAo bUlzRmx1c2hpbmdHQ0QpIHsNCj4gLSAgICBERUJVRygoREVCVUdfSU5GTywgIiAgRmx1c2hpbmcg R0NEXG4iKSk7DQo+ICsgICAgREVCVUcoKERFQlVHX0dDRCwgIiAgRmx1c2hpbmcgR0NEXG4iKSk7 DQo+ICAgICAgcmV0dXJuIEVGSV9TVUNDRVNTOw0KPiAgICB9DQoNCig1KSBJIHRoaW5rIGl0IHdv dWxkIGJlIGNsZWFuZXIgaWYgd2UgZml4ZWQgdGhlIGRlYnVnIGxldmVsIGZvciB0aGlzIG1lc3Nh Z2UgaW4gYSBzZXBhcmF0ZSBwYXRjaC4gWW91IGFyZSBub3QgdG91Y2hpbmcgIkNwdUR4ZS5jIiBm b3IgYW55IG90aGVyIHJlYXNvbi4NCg0KPiAgDQo+IGRpZmYgLS1naXQgYS9VZWZpQ3B1UGtnL0Nw dUR4ZS9DcHVEeGUuaW5mIA0KPiBiL1VlZmlDcHVQa2cvQ3B1RHhlL0NwdUR4ZS5pbmYgaW5kZXgg M2M5MzhjZWU1My4uOGM4NzczYWY5MCAxMDA2NDQNCj4gLS0tIGEvVWVmaUNwdVBrZy9DcHVEeGUv Q3B1RHhlLmluZg0KPiArKysgYi9VZWZpQ3B1UGtnL0NwdUR4ZS9DcHVEeGUuaW5mDQo+IEBAIC02 Niw2ICs2Niw3IEBADQo+ICBbUHJvdG9jb2xzXQ0KPiAgICBnRWZpQ3B1QXJjaFByb3RvY29sR3Vp ZCAgICAgICAgICAgICAgICAgICAgICAgIyMgUFJPRFVDRVMNCj4gICAgZ0VmaU1wU2VydmljZVBy b3RvY29sR3VpZCAgICAgICAgICAgICAgICAgICAgICMjIFBST0RVQ0VTDQo+ICsgIGdFZmlTbW1C YXNlMlByb3RvY29sR3VpZA0KDQooNikgcHJvdG9jb2wgdXNhZ2Ugbm90ZSBpcyBtaXNzaW5nIChz aG91bGQgYmUgIiMjIFNPTUVUSU1FU19DT05TVU1FUyIgSQ0KdGhpbmsuKQ0KDQo+ICANCj4gIFtH dWlkc10NCj4gICAgZ0lkbGVMb29wRXZlbnRHdWlkICAgICAgICAgICAgICAgICAgICAgICAgICAg ICMjIENPTlNVTUVTICAgICAgICAgICAjIyBFdmVudA0KPiBkaWZmIC0tZ2l0IGEvVWVmaUNwdVBr Zy9DcHVEeGUvQ3B1UGFnZVRhYmxlLmMgDQo+IGIvVWVmaUNwdVBrZy9DcHVEeGUvQ3B1UGFnZVRh YmxlLmMNCj4gaW5kZXggZTI1OTViNGQ4OS4uYmY0MjBkMzc5MiAxMDA2NDQNCj4gLS0tIGEvVWVm aUNwdVBrZy9DcHVEeGUvQ3B1UGFnZVRhYmxlLmMNCj4gKysrIGIvVWVmaUNwdVBrZy9DcHVEeGUv Q3B1UGFnZVRhYmxlLmMNCj4gQEAgLTIzLDYgKzIzLDcgQEANCj4gICNpbmNsdWRlIDxMaWJyYXJ5 L0RlYnVnTGliLmg+DQo+ICAjaW5jbHVkZSA8TGlicmFyeS9VZWZpQm9vdFNlcnZpY2VzVGFibGVM aWIuaD4NCj4gICNpbmNsdWRlIDxQcm90b2NvbC9NcFNlcnZpY2UuaD4NCj4gKyNpbmNsdWRlIDxQ cm90b2NvbC9TbW1CYXNlMi5oPg0KPiAgDQo+ICAjaW5jbHVkZSAiQ3B1RHhlLmgiDQo+ICAjaW5j bHVkZSAiQ3B1UGFnZVRhYmxlLmgiDQo+IEBAIC04Nyw3ICs4OCwzMyBAQCBQQUdFX0FUVFJJQlVU RV9UQUJMRSBtUGFnZUF0dHJpYnV0ZVRhYmxlW10gPSB7DQo+ICAgIHtQYWdlMUcsICBTSVpFXzFH QiwgUEFHSU5HXzFHX0FERFJFU1NfTUFTS182NH0sICB9Ow0KPiAgDQo+IC1QQUdFX1RBQkxFX1BP T0wgICAqbVBhZ2VUYWJsZVBvb2wgPSBOVUxMOw0KPiArUEFHRV9UQUJMRV9QT09MICAgICAgICAg ICAgICAgICAgICptUGFnZVRhYmxlUG9vbCA9IE5VTEw7DQo+ICtQQUdFX1RBQkxFX0xJQl9QQUdJ TkdfQ09OVEVYVCAgICAgbVBhZ2luZ0NvbnRleHQ7DQo+ICtFRklfU01NX0JBU0UyX1BST1RPQ09M ICAgICAgICAgICAgKm1TbW1CYXNlMiA9IE5VTEw7DQo+ICsNCj4gK0JPT0xFQU4NCj4gK0lzSW5T bW0gKA0KPiArICBWT0lEDQo+ICsgICkNCj4gK3sNCj4gKyAgRUZJX1NUQVRVUyAgICAgICAgICAg ICAgU3RhdHVzOw0KPiArICBCT09MRUFOICAgICAgICAgICAgICAgICBJblNtbTsNCj4gKw0KPiAr ICBJblNtbSA9IEZBTFNFOw0KPiArICBpZiAobVNtbUJhc2UyID09IE5VTEwpIHsNCj4gKyAgICBT dGF0dXMgPSBnQlMtPkxvY2F0ZVByb3RvY29sICgmZ0VmaVNtbUJhc2UyUHJvdG9jb2xHdWlkLCBO VUxMLA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICoqKSZtU21t QmFzZTIpOw0KDQooNykgSW5kZW50YXRpb24gaXMgaW5jb3JyZWN0Lg0KDQo+ICsgICAgaWYgKEVG SV9FUlJPUiAoU3RhdHVzKSkgew0KPiArICAgICAgbVNtbUJhc2UyID0gTlVMTDsNCj4gKyAgICB9 DQoNCig4KSBJIHRoaW5rIHlvdSBjYW4gc2ltcGx5IGRyb3AgdGhlIEVGSV9FUlJPUiAoU3RhdHVz KSBicmFuY2g7ICJtU21tQmFzZTIiIHdpbGwgc2ltcGx5IHJlbWFpbiBOVUxMLg0KDQo+ICsgIH0N Cj4gKw0KPiArICBpZiAobVNtbUJhc2UyICE9IE5VTEwpIHsNCj4gKyAgICBtU21tQmFzZTItPklu U21tIChtU21tQmFzZTIsICZJblNtbSk7ICB9DQo+ICsNCj4gKyAgcmV0dXJuIEluU21tOw0KPiAr fQ0KDQooOSkgSSBkb24ndCB1bmRlcnN0YW5kIGhvdyB0aGUgSW5TbW0oKSBtZW1iZXIgZnVuY3Rp b24gaXMgc3VwcG9zZWQgdG8gd29yay4gQWNjb3JkaW5nIHRvIHRoZSBQSSBzcGVjICh2MS42KToN Cg0KIiIiDQpFRklfTU1fQkFTRV9QUk9UT0NPTC5Jbk1tKCkNClsuLi5dDQpTZXJ2aWNlIHRvIGlu ZGljYXRlIHdoZXRoZXIgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgZXhlY3V0aW5nIGluIHRoZSBN TSBEcml2ZXIgSW5pdGlhbGl6YXRpb24gcGhhc2UuDQpbLi4uXQ0KSW5NbXJhbQ0KUG9pbnRlciB0 byBhIEJvb2xlYW4gd2hpY2gsIG9uIHJldHVybiwgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBp cyBjdXJyZW50bHkgZXhlY3V0aW5nIGluc2lkZSBvZiBNTVJBTSAoVFJVRSkgb3Igb3V0c2lkZSBv ZiBNTVJBTSAoRkFMU0UpLg0KWy4uLl0NClRoaXMgc2VydmljZSByZXR1cm5zIHdoZXRoZXIgdGhl IGNhbGxlciBpcyBiZWluZyBleGVjdXRlZCBpbiB0aGUgTU0gRHJpdmVyIEluaXRpYWxpemF0aW9u IHBoYXNlLiBGb3IgTU0gRHJpdmVycywgdGhpcyB3aWxsIHJldHVybiBUUlVFIGluIEluTW1yYW0g d2hpbGUgaW5zaWRlIHRoZSBkcml2ZXLigJlzIGVudHJ5IHBvaW50IGFuZCBvdGhlcndpc2UgRkFM U0UuIEZvciBjb21iaW5hdGlvbiBNTS9EWEUgZHJpdmVycywgdGhpcyB3aWxsIHJldHVybiBGQUxT RSBpbiB0aGUgRFhFIGxhdW5jaC4NCkZvciB0aGUgTU0gbGF1bmNoLCBpdCBiZWhhdmVzIGFzIGFu IE1NIERyaXZlci4NCiIiIg0KDQpGaXJzdCBvZiBhbGwsIHRvIG15IGtub3dsZWRnZSwgd2UgZG9u J3QgaGF2ZSBhbnkgY29tYmluYXRpb24gTU0vRFhFIGRyaXZlcnMgaW4gZWRrMiAod2l0aCBkdWFs IGVudHJ5IHBvaW50IGxhdW5jaGVzLCBiaW5hcnkgdHlwZSAweDBDKS4gV2UgaGF2ZSB0cmFkaXRp b25hbCBNTSBkcml2ZXJzIChiaW5hcnkgdHlwZSAweDBBKSB0aGF0IGFyZSBsYXVuY2hlZCBkaXJl Y3RseSBmcm9tIFNNUkFNLiBIb3dldmVyLCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZXkg YXJlIGxhdW5jaGVkIHdpdGggdGhlIHByb2Nlc3NvciBvcGVyYXRpbmcgaW4gU3lzdGVtIE1hbmFn ZW1lbnQgTW9kZS4NCg0KU2Vjb25kbHksIGZvY3VzaW5nIG9uIHRyYWRpdGlvbmFsIE1NIGRyaXZl cnMsIHRoZSBJbk1tKCkgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IHNlZW0gdG8gc2F5IGFueXRoaW5n IGFzIHRvIHdoZXRoZXIgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIFNNTSAoc3lzdGVtIG1h bmFnZW1lbnQgbW9kZSkgb3Igbm9ybWFsIG1vZGUuIEluaXRpYWxseSwgU01SQU0gaXMgb3Blbiwg YW5kIHRodXMgdGhlIHByb2Nlc3NvciBjYW4gZXhlY3V0ZSBNTSBkcml2ZXIgY29kZSBvdXQgb2Yg aXQgd2l0aG91dCBhY3R1YWxseSBvcGVyYXRpbmcgaW4gU01NIChzZWUgYWJvdmUpLg0KDQpGdXJ0 aGVybW9yZSwgQ3B1RHhlIGlzIGEgRFhFX0RSSVZFUiwgdGh1cyBpdCBpcyBuZXZlciBsb2FkZWQg aW50byBTTVJBTS4NCg0KSSBub3RpY2UgdGhhdCB5b3UgY2FsbCB0aGUgIkluTW1yYW0iIHBhcmFt ZXRlciAiSW5TbW0iLiBBcmUgeW91IHNheWluZyB0aGF0IHRoZSBQSSBzcGVjIGlzIHdyb25nLCBh bmQgZWRrMiBhY3R1YWxseSByZXR1cm5zIHdoZXRoZXIgdGhlIHByb2Nlc3NvciBpcyBleGVjdXRp bmcgQ3B1RHhlIGNvZGUgaW4gTWFuYWdlbWVudCBNb2RlPyAoRHVlIHRvIGEgY2FsbCBmcm9tIHRo ZSBlbnRyeSBwb2ludCBmdW5jdGlvbiBvZiBhIHRyYWRpdGlvbmFsIE1NIGRyaXZlcj8pDQoNClRo aXJkLCB0aGUgc3BlYyBpcyBpbmNvbnNpc3RlbnQgZXZlbiB3aXRoIGl0c2VsZi4gVGhlIGdlbmVy YWwgZGVzY3JpcHRpb24gc2F5cywgIkZvciBNTSBEcml2ZXJzLCB0aGlzIHdpbGwgcmV0dXJuIFRS VUUgaW4gSW5NbXJhbSB3aGlsZSBpbnNpZGUgdGhlIGRyaXZlcuKAmXMgZW50cnkgcG9pbnQgYW5k IG90aGVyd2lzZSBGQUxTRSIuIEJ1dCBhIERYRSBwcm90b2NvbCBtdXN0IG5vdCBldmVuIGJlIGlu dm9rZWQgZnJvbSBhIHRyYWRpdGlvbmFsIE1NIGRyaXZlciAqZXhjZXB0KiBmcm9tIHRoZSBlbnRy eSBwb2ludCEgV2hpY2ggd291bGQgaW1wbHkgdGhhdCwgZm9yIHRyYWRpdGlvbmFsIE1NIGRyaXZl cnMsIHRoZSBvdXRwdXQgcGFyYW1ldGVyIGNvdWxkIG9ubHkgYmUgc2V0IHRvIFRSVUUuDQoNClNv IGJhc2ljYWxseSB3aGF0IEknZCBsaWtlIHRvIHNlZSBoZXJlIGlzIGV2aWRlbmNlIHRoYXQNCg0K KDlhKSB0aGUgSXNJblNtbSgpIGhlbHBlciBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgb3V0c2lk ZSBvZiB0aGUgZW50cnkNCiAgICAgcG9pbnQgb2YgYW4gTU0gZHJpdmVyLCBkdWUgdG8gdGhlIHJl c3RyaWN0aW9ucyBvbg0KICAgICBnQlMtPkxvY2F0ZVByb3RvY29sKCkgYW5kIG1TbW1CYXNlMi0+ SW5TbW0oKSwNCg0KKDliKSB0aGUgbVNtbUJhc2UyLT5JblNtbSgpIHByb3RvY29sIG1lbWJlciBk ZXRlcm1pbmVzIHdoZXRoZXIgQ3B1RHhlIGlzDQogICAgIGJlaW5nIGV4ZWN1dGVkIGJ5IHRoZSBw cm9jZXNzb3IgaW4gTWFuYWdlbWVudCBNb2RlLCBhbmQgKm5vdCoNCiAgICAgd2hldGhlciB0aGUg Q3B1RHhlIGRyaXZlciBpcyBiZWluZyBleGVjdXRlZCBmcm9tIHdpdGhpbiBTTVJBTS4NCg0KPiAg DQo+ICAvKioNCj4gICAgUmV0dXJuIGN1cnJlbnQgcGFnaW5nIGNvbnRleHQuDQo+IEBAIC0xMDIs NDIgKzEyOSw0NSBAQCBHZXRDdXJyZW50UGFnaW5nQ29udGV4dCAoDQo+ICAgIFVJTlQzMiAgICAg ICAgICAgICAgICAgICAgICAgICBSZWdFYXg7DQo+ICAgIFVJTlQzMiAgICAgICAgICAgICAgICAg ICAgICAgICBSZWdFZHg7DQo+ICANCj4gLSAgWmVyb01lbShQYWdpbmdDb250ZXh0LCBzaXplb2Yo KlBhZ2luZ0NvbnRleHQpKTsNCj4gLSAgaWYgKHNpemVvZihVSU5UTikgPT0gc2l6ZW9mKFVJTlQ2 NCkpIHsNCj4gLSAgICBQYWdpbmdDb250ZXh0LT5NYWNoaW5lVHlwZSA9IElNQUdFX0ZJTEVfTUFD SElORV9YNjQ7DQo+IC0gIH0gZWxzZSB7DQo+IC0gICAgUGFnaW5nQ29udGV4dC0+TWFjaGluZVR5 cGUgPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NjsNCj4gLSAgfQ0KPiAtICBpZiAoKEFzbVJlYWRD cjAgKCkgJiBCSVQzMSkgIT0gMCkgew0KPiAtICAgIFBhZ2luZ0NvbnRleHQtPkNvbnRleHREYXRh Llg2NC5QYWdlVGFibGVCYXNlID0gKEFzbVJlYWRDcjMgKCkgJiBQQUdJTkdfNEtfQUREUkVTU19N QVNLXzY0KTsNCj4gLSAgfSBlbHNlIHsNCj4gLSAgICBQYWdpbmdDb250ZXh0LT5Db250ZXh0RGF0 YS5YNjQuUGFnZVRhYmxlQmFzZSA9IDA7DQo+IC0gIH0NCj4gKyAgaWYgKCFJc0luU21tICgpKSB7 DQo+ICsgICAgaWYgKHNpemVvZihVSU5UTikgPT0gc2l6ZW9mKFVJTlQ2NCkpIHsNCj4gKyAgICAg IG1QYWdpbmdDb250ZXh0Lk1hY2hpbmVUeXBlID0gSU1BR0VfRklMRV9NQUNISU5FX1g2NDsNCj4g KyAgICB9IGVsc2Ugew0KPiArICAgICAgbVBhZ2luZ0NvbnRleHQuTWFjaGluZVR5cGUgPSBJTUFH RV9GSUxFX01BQ0hJTkVfSTM4NjsNCj4gKyAgICB9DQo+ICsgICAgaWYgKChBc21SZWFkQ3IwICgp ICYgQklUMzEpICE9IDApIHsNCj4gKyAgICAgIG1QYWdpbmdDb250ZXh0LkNvbnRleHREYXRhLlg2 NC5QYWdlVGFibGVCYXNlID0gKEFzbVJlYWRDcjMgKCkgJiBQQUdJTkdfNEtfQUREUkVTU19NQVNL XzY0KTsNCj4gKyAgICB9IGVsc2Ugew0KPiArICAgICAgbVBhZ2luZ0NvbnRleHQuQ29udGV4dERh dGEuWDY0LlBhZ2VUYWJsZUJhc2UgPSAwOw0KPiArICAgIH0NCj4gIA0KPiAtICBpZiAoKEFzbVJl YWRDcjQgKCkgJiBCSVQ0KSAhPSAwKSB7DQo+IC0gICAgUGFnaW5nQ29udGV4dC0+Q29udGV4dERh dGEuSWEzMi5BdHRyaWJ1dGVzIHw9IFBBR0VfVEFCTEVfTElCX1BBR0lOR19DT05URVhUX0lBMzJf WDY0X0FUVFJJQlVURVNfUFNFOw0KPiAtICB9DQo+IC0gIGlmICgoQXNtUmVhZENyNCAoKSAmIEJJ VDUpICE9IDApIHsNCj4gLSAgICBQYWdpbmdDb250ZXh0LT5Db250ZXh0RGF0YS5JYTMyLkF0dHJp YnV0ZXMgfD0gUEFHRV9UQUJMRV9MSUJfUEFHSU5HX0NPTlRFWFRfSUEzMl9YNjRfQVRUUklCVVRF U19QQUU7DQo+IC0gIH0NCj4gLSAgaWYgKChBc21SZWFkQ3IwICgpICYgQklUMTYpICE9IDApIHsN Cj4gLSAgICBQYWdpbmdDb250ZXh0LT5Db250ZXh0RGF0YS5JYTMyLkF0dHJpYnV0ZXMgfD0gUEFH RV9UQUJMRV9MSUJfUEFHSU5HX0NPTlRFWFRfSUEzMl9YNjRfQVRUUklCVVRFU19XUF9FTkFCTEU7 DQo+IC0gIH0NCj4gKyAgICBpZiAoKEFzbVJlYWRDcjQgKCkgJiBCSVQ0KSAhPSAwKSB7DQo+ICsg ICAgICBtUGFnaW5nQ29udGV4dC5Db250ZXh0RGF0YS5JYTMyLkF0dHJpYnV0ZXMgfD0gUEFHRV9U QUJMRV9MSUJfUEFHSU5HX0NPTlRFWFRfSUEzMl9YNjRfQVRUUklCVVRFU19QU0U7DQo+ICsgICAg fQ0KPiArICAgIGlmICgoQXNtUmVhZENyNCAoKSAmIEJJVDUpICE9IDApIHsNCj4gKyAgICAgIG1Q YWdpbmdDb250ZXh0LkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PSBQQUdFX1RBQkxFX0xJ Ql9QQUdJTkdfQ09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1BBRTsNCj4gKyAgICB9DQo+ICsg ICAgaWYgKChBc21SZWFkQ3IwICgpICYgQklUMTYpICE9IDApIHsNCj4gKyAgICAgIG1QYWdpbmdD b250ZXh0LkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PSBQQUdFX1RBQkxFX0xJQl9QQUdJ TkdfQ09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1dQX0VOQUJMRTsNCj4gKyAgICB9DQo+ICAN Cj4gLSAgQXNtQ3B1aWQgKDB4ODAwMDAwMDAsICZSZWdFYXgsIE5VTEwsIE5VTEwsIE5VTEwpOw0K PiAtICBpZiAoUmVnRWF4ID4gMHg4MDAwMDAwMCkgew0KPiAtICAgIEFzbUNwdWlkICgweDgwMDAw MDAxLCBOVUxMLCBOVUxMLCBOVUxMLCAmUmVnRWR4KTsNCj4gLSAgICBpZiAoKFJlZ0VkeCAmIEJJ VDIwKSAhPSAwKSB7DQo+IC0gICAgICAvLyBYRCBzdXBwb3J0ZWQNCj4gLSAgICAgIGlmICgoQXNt UmVhZE1zcjY0ICgweEMwMDAwMDgwKSAmIEJJVDExKSAhPSAwKSB7DQo+IC0gICAgICAgIC8vIFhE IGFjdGl2YXRlZA0KPiAtICAgICAgICBQYWdpbmdDb250ZXh0LT5Db250ZXh0RGF0YS5JYTMyLkF0 dHJpYnV0ZXMgfD0gUEFHRV9UQUJMRV9MSUJfUEFHSU5HX0NPTlRFWFRfSUEzMl9YNjRfQVRUUklC VVRFU19YRF9BQ1RJVkFURUQ7DQo+ICsgICAgQXNtQ3B1aWQgKDB4ODAwMDAwMDAsICZSZWdFYXgs IE5VTEwsIE5VTEwsIE5VTEwpOw0KPiArICAgIGlmIChSZWdFYXggPiAweDgwMDAwMDAwKSB7DQo+ ICsgICAgICBBc21DcHVpZCAoMHg4MDAwMDAwMSwgTlVMTCwgTlVMTCwgTlVMTCwgJlJlZ0VkeCk7 DQo+ICsgICAgICBpZiAoKFJlZ0VkeCAmIEJJVDIwKSAhPSAwKSB7DQo+ICsgICAgICAgIC8vIFhE IHN1cHBvcnRlZA0KPiArICAgICAgICBpZiAoKEFzbVJlYWRNc3I2NCAoMHhDMDAwMDA4MCkgJiBC SVQxMSkgIT0gMCkgew0KPiArICAgICAgICAgIC8vIFhEIGFjdGl2YXRlZA0KPiArICAgICAgICAg IG1QYWdpbmdDb250ZXh0LkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PSBQQUdFX1RBQkxF X0xJQl9QQUdJTkdfQ09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1hEX0FDVElWQVRFRDsNCj4g KyAgICAgICAgfQ0KPiArICAgICAgfQ0KPiArICAgICAgaWYgKChSZWdFZHggJiBCSVQyNikgIT0g MCkgew0KPiArICAgICAgICBtUGFnaW5nQ29udGV4dC5Db250ZXh0RGF0YS5JYTMyLkF0dHJpYnV0 ZXMgfD0gDQo+ICsgUEFHRV9UQUJMRV9MSUJfUEFHSU5HX0NPTlRFWFRfSUEzMl9YNjRfQVRUUklC VVRFU19QQUdFXzFHX1NVUFBPUlQ7DQo+ICAgICAgICB9DQo+IC0gICAgfQ0KPiAtICAgIGlmICgo UmVnRWR4ICYgQklUMjYpICE9IDApIHsNCj4gLSAgICAgIFBhZ2luZ0NvbnRleHQtPkNvbnRleHRE YXRhLklhMzIuQXR0cmlidXRlcyB8PSBQQUdFX1RBQkxFX0xJQl9QQUdJTkdfQ09OVEVYVF9JQTMy X1g2NF9BVFRSSUJVVEVTX1BBR0VfMUdfU1VQUE9SVDsNCj4gICAgICB9DQo+ICAgIH0NCj4gKw0K PiArICBDb3B5TWVtIChQYWdpbmdDb250ZXh0LCAmbVBhZ2luZ0NvbnRleHQsIHNpemVvZiAobVBh Z2luZ0NvbnRleHQpKTsNCj4gIH0NCg0KKDEwKSBFdmVuIGFzc3VtaW5nIHRoYXQgSXNJblNtbSgp IGFsd2F5cyByZXR1cm5zIGZhbHNlIC0tIGZvciBleGFtcGxlIGJlY2F1c2UgdGhlIHBsYXRmb3Jt IGRvZXMgbm90IGluY2x1ZGUgdGhlIFNNTSBkcml2ZXJzIC0tLCB0aGlzIGNoYW5nZSBkb2VzIG5v dCBsb29rIGxpa2UgYSBuby1vcCB0byBtZS4NCg0KVGhlIFplcm9NZW0oKSBjYWxsIGF0IHRoZSB0 b3AgaXMgcmVtb3ZlZCBieSB0aGUgcGF0Y2gsIGJ1dCBhdHRyaWJ1dGVzIGxpa2UgUFNFLCBQQUUs IFdQX0VOQUJMRSwgWERfQUNUSVZBVEVEIGFuZCAxR19TVVBQT1JUIGFyZSBuZXZlcg0KKmNsZWFy ZWQqIGluICJtUGFnaW5nQ29udGV4dCIsIG9uY2UgdGhleSBhcmUgc2V0Lg0KDQpJIGd1ZXNzIHRo ZSBpZGVhIGlzIHRoYXQgYSBmZXcgKGhvdyBtYW55PykgaW5pdGlhbCBjYWxscyB0bw0KR2V0Q3Vy cmVudFBhZ2luZ0NvbnRleHQoKSBzZXQgdXAgIm1QYWdpbmdDb250ZXh0IiwgYW5kIGFmdGVyIHRo YXQsDQpHZXRDdXJyZW50UGFnaW5nQ29udGV4dCgpIGp1c3Qga2VlcHMgcmV0dXJuaW5nIHRoZSBs YXN0IHNldCBjb250ZXh0LiBCdXQgSSBkb24ndCB0aGluayB0aGF0IHRob3NlICJpbml0aWFsIGNh bGxzIiB3b3JrIGNvcnJlY3RseS4NCg0KPiAgDQo+ICAvKioNCj4gQEAgLTUwNyw3ICs1MzcsMTAg QEAgSXNSZWFkT25seVBhZ2VXcml0ZVByb3RlY3RlZCAoDQo+ICAgIFZPSUQNCj4gICAgKQ0KPiAg ew0KPiAtICByZXR1cm4gKChBc21SZWFkQ3IwICgpICYgQklUMTYpICE9IDApOw0KPiArICBpZiAo IUlzSW5TbW0gKCkpIHsNCj4gKyAgICByZXR1cm4gKChBc21SZWFkQ3IwICgpICYgQklUMTYpICE9 IDApOyAgfSAgcmV0dXJuIEZBTFNFOw0KPiAgfQ0KPiAgDQo+ICAvKioNCj4gQEAgLTUxOCw3ICs1 NTEsOSBAQCBEaXNhYmxlUmVhZE9ubHlQYWdlV3JpdGVQcm90ZWN0ICgNCj4gICAgVk9JRA0KPiAg ICApDQo+ICB7DQo+IC0gIEFzbVdyaXRlQ3IwIChBc21SZWFkQ3IwKCkgJiB+QklUMTYpOw0KPiAr ICBpZiAoIUlzSW5TbW0gKCkpIHsNCj4gKyAgICBBc21Xcml0ZUNyMCAoQXNtUmVhZENyMCAoKSAm IH5CSVQxNik7ICB9DQo+ICB9DQo+ICANCj4gIC8qKg0KPiBAQCAtNTI5LDcgKzU2NCw5IEBAIEVu YWJsZVJlYWRPbmx5UGFnZVdyaXRlUHJvdGVjdCAoDQo+ICAgIFZPSUQNCj4gICAgKQ0KPiAgew0K PiAtICBBc21Xcml0ZUNyMCAoQXNtUmVhZENyMCgpIHwgQklUMTYpOw0KPiArICBpZiAoIUlzSW5T bW0gKCkpIHsNCj4gKyAgICBBc21Xcml0ZUNyMCAoQXNtUmVhZENyMCAoKSB8IEJJVDE2KTsNCj4g KyAgfQ0KPiAgfQ0KDQooMTEpIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGVzZSBjaGFuZ2VzIGF0IGFs bC4gV2h5IGFyZSB0aGVzZSBmdW5jdGlvbnMNCm5vLW9wcyB3aGVuIENwdUR4ZSBpcyBpbnZva2Vk IGluIE1hbmFnZW1lbnQgTW9kZT8NCg0KVGhhbmtzDQpMYXN6bG8NCg0KPiAgDQo+ICAvKioNCj4g QEAgLTEwNTQsNiArMTA5MSw3IEBAIEluaXRpYWxpemVQYWdlVGFibGVMaWIgKA0KPiAgew0KPiAg ICBQQUdFX1RBQkxFX0xJQl9QQUdJTkdfQ09OVEVYVCAgICAgQ3VycmVudFBhZ2luZ0NvbnRleHQ7 DQo+ICANCj4gKyAgWmVyb01lbSAoJm1QYWdpbmdDb250ZXh0LCBzaXplb2YobVBhZ2luZ0NvbnRl eHQpKTsNCj4gICAgR2V0Q3VycmVudFBhZ2luZ0NvbnRleHQgKCZDdXJyZW50UGFnaW5nQ29udGV4 dCk7DQo+ICANCj4gICAgLy8NCj4gDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fDQplZGsyLWRldmVsIG1haWxpbmcgbGlzdA0KZWRrMi1kZXZlbEBsaXN0 cy4wMS5vcmcNCmh0dHBzOi8vbGlzdHMuMDEub3JnL21haWxtYW4vbGlzdGluZm8vZWRrMi1kZXZl bA0K