From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6A38CC5B57D for ; Tue, 2 Jul 2019 07:42:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2E25B2146F for ; Tue, 2 Jul 2019 07:42:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725867AbfGBHmJ (ORCPT ); Tue, 2 Jul 2019 03:42:09 -0400 Received: from mga12.intel.com ([192.55.52.136]:58975 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725851AbfGBHmI (ORCPT ); Tue, 2 Jul 2019 03:42:08 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 02 Jul 2019 00:42:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,442,1557212400"; d="scan'208";a="362532127" Received: from orsmsx101.amr.corp.intel.com ([10.22.225.128]) by fmsmga006.fm.intel.com with ESMTP; 02 Jul 2019 00:42:06 -0700 Received: from orsmsx116.amr.corp.intel.com ([169.254.7.97]) by ORSMSX101.amr.corp.intel.com ([169.254.8.95]) with mapi id 14.03.0439.000; Tue, 2 Jul 2019 00:42:06 -0700 From: "Xing, Cedric" To: Casey Schaufler , Stephen Smalley CC: "linux-sgx@vger.kernel.org" , "linux-security-module@vger.kernel.org" , "selinux@vger.kernel.org" , "Schaufler, Casey" , "jmorris@namei.org" , "luto@kernel.org" , "jethro@fortanix.com" , "greg@enjellic.com" , "sds@tycho.nsa.gov" , "jarkko.sakkinen@linux.intel.com" , "Christopherson, Sean J" Subject: RE: [RFC PATCH v2 1/3] x86/sgx: Add SGX specific LSM hooks Thread-Topic: [RFC PATCH v2 1/3] x86/sgx: Add SGX specific LSM hooks Thread-Index: AQHVLG/L9SgvyZq9qEim/LcvveBd6KawhbyA//+RRaCAAIfxgP//kpmggAGW7oCAAIp0gIABTq0AgAJvZOCAAJjsAP//jbMgABUzBwAAANV7wA== Date: Tue, 2 Jul 2019 07:42:06 +0000 Message-ID: <960B34DE67B9E140824F1DCDEC400C0F6551DBF7@ORSMSX116.amr.corp.intel.com> References: <72420cff8fa944b64e57df8d25c63bd30f8aacfa.1561588012.git.cedric.xing@intel.com> <960B34DE67B9E140824F1DCDEC400C0F6551B8D7@ORSMSX116.amr.corp.intel.com> <9f525db2-f46b-b4cb-c4e9-b9dbd18ed4d2@schaufler-ca.com> <960B34DE67B9E140824F1DCDEC400C0F6551B975@ORSMSX116.amr.corp.intel.com> <18833f2e-9d18-1f39-6bc5-9242910ab25c@schaufler-ca.com> <960B34DE67B9E140824F1DCDEC400C0F6551D585@ORSMSX116.amr.corp.intel.com> <960B34DE67B9E140824F1DCDEC400C0F6551D7F7@ORSMSX116.amr.corp.intel.com> <63c92ab6-dc8d-826b-b8bf-05ad262f06e4@schaufler-ca.com> In-Reply-To: <63c92ab6-dc8d-826b-b8bf-05ad262f06e4@schaufler-ca.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZDEzZGJiMTYtNzIzMS00NGM4LThiZWMtODNmMjZkM2Q5OTM1IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiRWN6NCtJUzl0MmY4TkF5T0E3ekpvQTR1bjA1anlQUW1IZDRTVkRaSk85ZEI4bmZhaUs2RXU0aHk5aGRYVjEzdSJ9 x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.22.254.140] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: linux-sgx-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sgx@vger.kernel.org PiBGcm9tOiBDYXNleSBTY2hhdWZsZXIgW21haWx0bzpjYXNleUBzY2hhdWZsZXItY2EuY29tXQ0K PiBTZW50OiBNb25kYXksIEp1bHkgMSwgMjAxOSA0OjEyIFBNDQo+IA0KPiBPbiA3LzEvMjAxOSAy OjQ1IFBNLCBYaW5nLCBDZWRyaWMgd3JvdGU6DQo+ID4+IEZyb206IGxpbnV4LXNneC1vd25lckB2 Z2VyLmtlcm5lbC5vcmcgW21haWx0bzpsaW51eC1zZ3gtDQo+ID4+IG93bmVyQHZnZXIua2VybmVs Lm9yZ10gT24gQmVoYWxmIE9mIENhc2V5IFNjaGF1Zmxlcg0KPiA+PiBTZW50OiBNb25kYXksIEp1 bHkgMDEsIDIwMTkgMTI6NTQgUE0NCj4gPj4+IElmIHlvdSB1bmRlcnN0YW5kIHRoZSBwdXJwb3Nl LA0KPiA+PiBUaGUgcHVycG9zZSBpcyB0byBzdXBwb3J0IHRoZSBTR1ggaGFyZHdhcmUsIGlzIGl0 IG5vdD8NCj4gPj4gSWYgeW91IGRvbid0IGhhdmUgU0dYIGhhcmR3YXJlIChlLmcuIE1JUFMsIEFS TSwgczM5MCkgeW91IGRvbid0IG5lZWQNCj4gPj4gdGhpcyBjb2RlLg0KPiA+IE5vLCBpdCBpcyBO T1QgdG8gc3VwcG9ydCBTR1gNCj4gDQo+IFRoZW4gd2hhdCAqaXMqIGl0IGZvcj8NCj4gDQo+ID4g IC0gaS5lLiBTR1ggZG9lc24ndCByZXF1aXJlIHRoaXMgcGllY2Ugb2YgY29kZSB0byB3b3JrLg0K PiA+DQo+ID4gQW5kIGFzIERyLiBHcmVnIHBvaW50ZWQgb3V0LCBpdCBjYW4gYmUgdXNlZCBmb3Ig b3RoZXIgVEVFcyB0aGFuIFNHWC4NCj4gDQo+IFRoYXQgc3VyZSBtYWtlcyBpdCBzb3VuZCBsaWtl IGl0J3MgZm9yIFNHWCB0byBtZS4NCg0KSSBtZWFudCBpdCBpcyBnZW5lcmljIGFuZCBwb3RlbnRp YWxseSB1c2VmdWwgdG8gbW9yZSBURUVzIGJ1dCBzbyBmYXIgdXNlZnVsIHRvIFNHWCwgd2hpY2gg aXMgdGhlIGZpcnN0IHRlY2hub2xvZ3kgdGhhdCB1c2VzIHRoaXMgaW5mcmFzdHJ1Y3R1cmUuIEkg aG9wZSB0aGF0IG1ha2VzIG1vcmUgc2Vuc2UuDQoNCj4gDQo+ID4gIEl0IGRvZXNuJ3QgY29udGFp biBTR1ggaC93IHNwZWNpZmljcy4NCj4gDQo+IEkgbmV2ZXIgc2FpZCBpdCBkaWQuIEJ1dCBubyBv bmUgZXZlciBzdWdnZXN0ZWQgZG9pbmcgYW55dGhpbmcNCj4gaGVyZSBiZWZvcmUgU0dYLCBhbmQg eW91ciBzdWJqZWN0IGxpbmU6DQo+IA0KPiAJIng4Ni9zZ3g6IEFkZCBTR1ggc3BlY2lmaWMgTFNN IGhvb2tzIg0KPiANCj4gc2F5cyBpdCBkb2VzLg0KDQpZZXMuIEFuZCBpbiB0aGUgY29tbWl0IG1l c3NhZ2UgSSBhbHNvIHN0YXRlZCB0aGF0IHRoZSBuZWVkIGZvciBzdWNoIHRyYWNraW5nIHN0cnVj dHVyZSBpcyBkdWUgdG8gdGhlIHVuaXF1ZSBsaWZlc3BhbiBvZiBlbmNsYXZlIHBhZ2VzLiBIZW5j ZSB0aGlzIGluZnJhc3RydWN0dXJlIHdpbGwgYWxzbyBiZSB1c2VmdWwgZm9yIG90aGVyIFRFRXMg d2hvc2UgcGFnZXMgc2hhcmUgdGhlIHNhbWUgbGlmZXNwYW4uDQogDQo+IA0KPiA+IEl0IGlzIGNv bXBpbGVkIG91dCBiZWNhdXNlIHRoZXJlJ3Mgbm8gbW9kdWxlIGNhbGxpbmcgaXQgb24gb3RoZXIg YXJjaGl0ZWN0dXJlcyB0b2RheS4NCj4gQnV0IGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBhbnkg aC93IGFuZCBtYXkgYmUgdXNlZnVsIChmb3Igb3RoZXIgVEVFcykgb24gb3RoZXINCj4gYXJjaGl0 ZWN0dXJlcyBpbiBmdXR1cmUuDQo+ID4NCj4gPj4+IHRoZW4gd2h5IGFyZSB5b3Ugb2JqZWN0aW5n IHRoZSBsc21fIHByZWZpeCBhcyB0aGV5IGFyZSBBUElzIHRvIGJlIHVzZWQNCj4gPj4gYnkgYWxs IExTTSBtb2R1bGVzPw0KPiA+Pg0KPiA+PiBXZSBuYW1lIGludGVyZmFjZXMgYmFzZWQgb24gd2hh dCB0aGV5IHByb3ZpZGUsIG5vdCB3aG8gY29uc3VtZXMgdGhlbS4NCj4gPj4gQXMgeW91ciBjb2Rl IHByb3ZpZGVzIGVuY2xhdmUgc2VydmljZXMsIHRoYXQgaXMgaG93IHRoZXkgc2hvdWxkIGJlIG5h bWVkLg0KPiA+Pg0KPiA+Pj4gIE9yIHdoYXQgc2hvdWxkIGJlIHRoZSBwcmVmaXggaW4geW91ciBt aW5kPw0KPiA+PiBJJ20gcHJldHR5IHN1cmUgdGhhdCBJJ3ZlIGNvbnNpc3RlbnRseSBzdWdnZXN0 ZWQgImVuY2xhdmUiLg0KPiA+Pg0KPiA+Pj4gT3Igd2hhdCBraW5kIG9mIEFQSXMgZG8geW91IHRo aW5rIGNhbiBxdWFsaWZ5IHRoZSBsc21fIHByZWZpeD8NCj4gPj4gQ29kZSB0aGF0IGltcGxlbWVu dHMgdGhlIExTTSBpbmZyYXN0cnVjdHVyZS4gVGhlcmUgaXMgb25lIExTTSBibG9iDQo+ID4+IGFs bG9jYXRpb24gaW50ZXJmYWNlLCBsc21faW5vZGVfYWxsb2MoKSwgdGhhdCBpcyB1c2VkIGluIGVh cmx5IHNldC11cA0KPiA+PiB0aGF0IGlzIGV4cG9ydGVkLiBBcyBJJ3ZlIG1lbnRpb25lZCBtb3Jl IHRoYW4gb25jZSwgZW5jbGF2ZS9wYWdlDQo+ID4+IG1hbmFnZW1lbnQgaXMgbm90IGFuIExTTSBp bmZyYXN0cnVjdHVyZSBmdW5jdGlvbiwgaXQncyBhIG1lbW9yeQ0KPiA+PiBtYW5hZ2VtZW50IGZ1 bmN0aW9uLg0KPiA+IEl0IGRvZXNuJ3QgbWFuYWdlIGFueXRoaW5nLg0KPiANCj4gU29ycnksICJt ZW1vcnkgbWFuYWdlbWVudCIgYXMgaW4gYWxsIHRoYXQgc3R1ZmYgYXJvdW5kIHBhZ2VzIGFuZA0K PiBUTEJzIGFuZCB3aG8gZ2V0cyB3aGF0IHBhZ2VzLCBhcyBvcHBvc2VkIHRvIGtlZXBpbmcgdHJh Y2sgb2YgYW55dGhpbmcNCj4gb24gaXRzIG93bi4NCj4gDQo+ID4gVGhlIHJlYXNvbiBpdCBhcHBl YXJzIGluIHRoZSBpbmZyYXN0cnVjdHVyZSBpcyBiZWNhdXNlIHRoZSBkZWNpc2lvbiBvZiBpbnNl cnRpbmcgYW4gRU1BDQo+IGRlcGVuZHMgb24gdGhlIGRlY2lzaW9ucyBmcm9tICphbGwqIGFjdGl2 ZSBMU01zLg0KPiANCj4gWW91IGhhdmUgbm90IGJlZW4gbGlzdGVuaW5nLiBNb3N0IExTTXMgdXNl IFZGUy4gV2UgaGF2ZW4ndCByb2xsZWQgVkZTDQo+IGZ1bmN0aW9ucyBpbnRvIHRoZSBMU00gaW5m cmFzdHJ1Y3R1cmUuDQo+IA0KPiA+IFRoYXQgaXMgTk9UIG5ldyBlaXRoZXIsIGFzIHlvdSBjYW4g c2VlIGl0IGluIHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbigpIGFuZA0KPiBzZWN1cml0eV92bV9l bm91Z2hfbWVtb3J5X21tKCksIGJvdGggZG8gc29tZXRoaW5nIGFmdGVyIGFsbCBMU00gbW9kdWxl cyBtYWtlIHRoZWlyDQo+IGRlY2lzaW9ucy4NCj4gDQo+IERpZCB5b3UgbG9vayB0byBzZWUgd2hh dCBpdCBpcyB0aGV5J3JlIGRvaW5nPyBJZiB5b3UgaGFkLA0KPiB5b3Ugd291bGQgc2VlIHRoYXQg aXMgbm90aGluZyBsaWtlIHdoYXQgeW91J3JlIHByb3Bvc2luZy4NCg0KSSBmZWVsIGxpa2Ugd2Ug YXJlIHRhbGtpbmcgYWJvdXQgZGlmZmVyZW50IHRoaW5ncy4gSSBzYWlkIHRob3NlIGhvb2tzIGRp ZCBtb3JlIHRoYW4ganVzdCBjYWxsaW5nIHJlZ2lzdGVyZWQgaG9va3MuIEFuZCBzZWN1cml0eV9l bmNsYXZlX2xvYWQoKSBpcyBzaW1pbGFyIHRvIHRoZW0sIGFsc28gZm9yIGEgc2ltaWxhciByZWFz b24gLSBzb21ldGhpbmcgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciAqYWxsKiBMU00gbW9kdWxlcyBt YWtlIHRoZWlyIGRlY2lzaW9ucy4gDQoNCkknbSBub3Qgc3VyZSB3aGF0IHlvdSBhcmUgdGFsa2lu ZyBhYm91dC4NCg0KPiANCj4gDQo+ID4gV291bGQgeW91IHBsZWFzZSBleHBsYWluIHdoeSB5b3Ug ZG9uJ3Qgc2VlIHRob3NlIGFzIHByb2JsZW1zIGJ1dCBjYWxsaW5nIEVNQSBmdW5jdGlvbnMNCj4g aW4gc2VjdXJpdHlfZW5jbGF2ZV9sb2FkKCkgaXMgYSBwcm9ibGVtPw0KPiANCj4gVGhlIGVuY2xh dmUgY29kZSBzaG91bGQgYmUgY2FsbGluZyBzZWN1cml0eV9lbmNsYXZlX2xvYWQoKSwNCj4gbm90 IHRoZSBvdGhlciB3YXkgYXJvdW5kLiBUaGF0IGFzc3VtZXMgeW91J3JlIHVzaW5nIHRoZSBuYW1p bmcNCj4gY29udmVudGlvbiBjb3JyZWN0bHkuDQoNClllcy4gVGhlIGVuY2xhdmUgY29kZSAoU0dY IGRyaXZlcikgY2FsbHMgc2VjdXJpdHlfZW5jbGF2ZV9sb2FkL2luaXQuIE5ldmVyIHRoZSBvdGhl ciB3YXkgYXJvdW5kLg0KDQpBZ2FpbiwgRU1BIGNvZGUgaXMgc2ltaWxhciB0byBhdWRpdGluZyBj b2RlLiBJdCBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYnkgTFNNIG1vZHVsZXMuIA0KDQo+IA0K PiBzZWN1cml0eV92bV9lbm91Z2hfbWVtb3J5X21tKCkgd2FzIGRpc2N1c3NlZCBhdCBsZW5ndGgg YW5kIHRoZXJlDQo+IHdhc24ndCBhIGNsZWFuIHdheSB0byBnZXQgdGhlIGxvZ2ljIHJpZ2h0IHdp dGhvdXQgcHV0dGluZyB0aGUgY29kZQ0KPiBoZXJlLiBzZWN1cml0eV9maWxlX3Blcm1pc3Npb24o KSBoYXMgdGhlIGZzX25vdGlmeV9wZXJtIGNhbGwgZm9yDQo+IHNpbWlsYXIgcmVhc29ucy4gTmVp dGhlciBpcyBhbnl0aGluZyBsaWtlIHdoYXQgeW91J3JlIHN1Z2dlc3RpbmcuDQoNCkd1ZXNzIHdl IGFyZSBkaXNjdXNzaW5nICJhdCBsZW5ndGgiIHJpZ2h0IG5vdyBvbiBob3cgdG8gZ2V0IHRoZSBs b2dpYyByaWdodC4gSSdtIG5vdCBzdXJlIHdoeSAibmVpdGhlciBpcyBhbnl0aGluZyBsaWtlIHdo YXQgSSdtIHN1Z2dlc3RpbmciLiANCg0KPiANCj4gDQo+ID4+PiBBbmQgSSdkIGxpa2UgdG8gY2xh cmlmeSB0aGF0IGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcsIGJ1dCBpcyBqdXN0IGENCj4gPj4g Yml0IGRpZmZlcmVudCwgaW4gdGhhdCBzZWN1cml0eV9lbmNsYXZlX2xvYWQoKSBhbmQgc2VjdXJp dHlfZmlsZV9mcmVlKCkNCj4gPj4gY2FsbCBpbnRvIHRob3NlIEFQSXMuDQo+ID4+DQo+ID4+IFRo ZXJlIHNob3VsZCBiZSBub3RoaW5nIGluIHNlY3VyaXR5X2VuY2xhdmVfbG9hZCgpIGV4Y2VwdCBj YWxscyB0byB0aGUNCj4gPj4gZW5jbGF2ZV9sb2FkKCkgaG9va3MgKGUuZy4gc2VsaW51eF9lbmNs YXZlX2xvYWQoKSkuIFRoZXJlIHNob3VsZCBiZQ0KPiA+PiBub3RoaW5nIGluIHNlY3VyaXR5X2Zp bGVfZnJlZSgpIGV4Y2VwdCBmaWxlIGJsb2IgbWFuYWdlbWVudCBjYWxscyB0byB0aGUNCj4gPj4g ZmlsZV9mcmVlKCkgaG9va3MgKGUuZy4gYXBwYXJtb3JfZmlsZV9mcmVlKCkpLg0KPiA+IEFzIGFi b3ZlLCB0aGVyZSBhcmUgZXhhbXBsZXMgaW4gc2VjdXJpdHkvc2VjdXJpdHkuYyB3aGVyZSB0aGUg aG9vayBkb2VzIG1vcmUgdGhhbiBqdXN0DQo+IGNhbGxpbmcgcmVnaXN0ZXJlZCBob29rcyBmcm9t IExTTXMuDQo+IA0KPiBBbmQgYXMgSSd2ZSBzYWlkLCB0aGF0IGRvZXNuJ3QgbWF0dGVyLiBZb3Un cmUgc3RpbGwgZ29pbmcgYWJvdXQNCj4gdXNpbmcgdGhlIExTTSBpbmZyYXN0cnVjdHVyZSBiYWNr d2FyZHMuDQo+IA0KPiA+Pj4gQnV0IHRoZXJlJ3MgYSBuZWVkIGZvciB0aGVtIGJlY2F1c2Ugb3Ro ZXJ3aXNlIGNvZGUvZGF0YSB3b3VsZCBoYXZlIHRvDQo+ID4+PiBiZSBkdXBsaWNhdGVkIGFtb25n IExTTXMNCj4gPj4gVGhlcmUncyBwbGVudHkgb2YgY29kZSBkdXBsaWNhdGlvbiBhbW9uZyB0aGUg TFNNcywgYmVjYXVzZSBhIGxvdCBvZiB3aGF0DQo+ID4+IHRoZXkgZG8gaXMgdGhlIHNhbWUgdGhp bmcuIFNvbWVkYXkgdGhlcmUgbWF5IGJlIGFuIGVmZm9ydCB0byBhZGRyZXNzDQo+ID4+IHNvbWUg b2YgdGhhdCwgYnV0IEkgZG9uJ3QgdGhpbmsgaXQncyBvbiBhbnlib2R5J3MgcmFkYXIuDQo+ID4+ IEFzIGZvciBkYXRhIGR1cGxpY2F0aW9uLCB0aGVyZSdzIGEgcmVhc29uIHdlIHVzZSBsb3RzIG9m IHBvaW50ZXJzLg0KPiA+IEFzIHN0YXRlZCBhYm92ZSwgc2VjdXJpdHlfZW5jbGF2ZV9sb2FkKCkg bmVlZHMgdG8gZG8gc29tZXRoaW5nIGV4dHJhIGFmdGVyIGFsbCBMU01zIG1ha2UNCj4gdGhlaXIg ZGVjaXNpb25zLiBIb3cgY2FuIHBvaW50ZXJzIGhlbHAgaGVyZT8NCj4gDQo+IEkgY2FuIGV4cGxh aW4gaXQsIGJ1dCB5b3UgY2xlYXJseSBoYXZlIG5vIGludGVyZXN0IGluIGRvaW5nDQo+IGFueXRo aW5nIHRvIG1ha2UgeW91ciBjb2RlIGZpdCBpbnRvIHRoZSBzeXN0ZW0uIEkgaGF2ZSBhIGxvdA0K PiBvZiBvdGhlciB0aGluZ3MgdG8gYmUgZG9pbmcuDQoNCkknbSBzbyBpbnRlcmVzdGVkIGluIGdl dHRpbmcgdGhpbmdzIGZpdC4gSnVzdCB0aGF0IHdoYXQgSSBzZWUgZml0IGRvZXNuJ3Qgc2VlbSBm aXQgZnJvbSB5b3VyIHBlcnNwZWN0aXZlLg0KDQo+IA0KPiA+Pj4gYW5kIHRoZSBsb2dpYyB3b3Vs ZCBiZSBoYXJkZXIgdG8gY29tcHJlaGVuZC4NCj4gPj4gS2VlcGluZyB0aGUgbGF5ZXJpbmcgY2xl YW4gaXMgY3JpdGljYWwgdG8gY29tcHJlaGVuc2lvbi4NCj4gPj4gVGhlcmUncyBhIGxvdCBvZiBW RlMgY29kZSB0aGF0IGNvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB3aXRoaW4gdGhlDQo+ID4+ IExTTSBpbmZyYXN0cnVjdHVyZSwgYnV0IEkgZG9uJ3QgdGhpbmsgdGhhdCBhbnlvbmUgd291bGQg YXJndWUgdGhhdCBpdA0KPiA+PiBzaG91bGQgaGF2ZSBiZWVuLg0KPiA+Pg0KPiA+Pj4gU28gdGhh dCdzIGEgdHJhZGUtb2ZmLg0KPiA+PiBJIHJlbWFpbiBjb21wbGV0ZWx5IHVuY29udmluY2VkIHRo YXQgeW91ciBwcm9wb3NhbCByZXByZXNlbnRzIGEgZ29vZCB3YXkNCj4gPj4gdG8gaW1wbGVtZW50 IHlvdSBzY2hlbWUuDQo+ID4+DQo+ID4+PiBUaGVuIHdoYXQncyB0aGUgcHJhY3RpY2FsIGRyYXdi YWNrIG9mIGRvaW5nIHRoYXQ/DQo+ID4+IE5hbWUgc3BhY2UgcG9sbHV0aW9uLg0KPiA+IEFscmln aHQsIEkgY2FuIGZpeCB0aGUgbmFtZXMuDQo+IA0KPiBHb29kIQ0KPiANCj4gDQo+ID4+IExheWVy aW5nIHZpb2xhdGlvbi4NCj4gPiBOb3Qgc3VyZSB3aGF0IHlvdSBhcmUgcmVmZXJyaW5nIHRvLg0K PiANCj4gVGhlIG9ubHkgcGxhY2VzIHdoZXJlIHRoZSBibG9iIGZyZWVkIGJ5IHNlY3VyaXR5X2Zp bGVfZnJlZSgpDQo+IG1heSBiZSBhbGxvY2F0ZWQgaXMgc2VjdXJpdHlfZmlsZV9hbGxvYygpLiBU aGUgc2VjdXJpdHkgbW9kdWxlcw0KPiBhcmUgd2VsY29tZSB0byBkbyBhbnl0aGluZyB0aGV5IGxp a2UgaW4gYWRkaXRpb24sIHByb3ZpZGVkDQo+IHRoZXkgY2xlYW4gdXAgYWZ0ZXIgdGhlbXNlbHZl cyBpbiB0aGVpciBmaWxlX2ZyZWUoKSBob29rcy4NCg0KRXhhY3RseSENCg0KTGlrZSBJIHNhaWQs IGFsbG9jYXRpb24gY291bGQgaGFwcGVuIGluIHNlY3VyaXR5X2ZpbGVfYWxsb2MoKSBidXQgSSBk aWQgaXQgaW4gc2VjdXJpdHlfZW5jbGF2ZV9sb2FkKCkgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYWxs b2NhdGlvbiBmb3Igbm9uLWVuY2xhdmVzLg0KDQpJIGtub3cgInNlY3VyaXR5IiBsb29rcyBjbG9z ZSB0byAic2VsaW51eCIgYnV0IEkgYmVnIHlvdXIgYXR0ZW50aW9uIGluIHRoZSBmdW5jdGlvbiBu YW1lcy4gV2hhdGV2ZXIgYWxsb2NhdGVkIGluc2lkZSBTRUxpbnV4ICpuZXZlciogZ2V0cyBmcmVl ZCBieSB0aGUgaW5mcmFzdHJ1Y3R1cmUsIGV4Y2VwdCB0aG9zZSBpbXBsaWNpdCBhbGxvY2F0aW9u cyBkdWUgdG8gRU1BIHNwbGl0cy4NCiANCj4gDQo+IElmIFNFTGludXggd2FudHMgdG8gc3VwcG9y dCBjb250cm9scyBvbiBlbmNsYXZlIGluZm9ybWF0aW9uLA0KPiBhbmQgdGhhdCByZXF1aXJlcyBh ZGRpdGlvbmFsIGRhdGEsIFNFTGludXggc2hvdWxkIGluY2x1ZGUNCj4gc3BhY2UgaW4gaXRzIGZp bGUgYmxvYiBmb3IgdGhhdCBpbmZvcm1hdGlvbiwgb3IgYSBwb2ludGVyIHRvDQo+IHRoZSBwbGFj ZSB3aGVyZSB0aGUgZW5jbGF2ZSBjb2RlIGlzIG1haW50YWluaW5nIGl0Lg0KPiANCj4gVGhhdCdz IHRoZSB3YXkgYXVkaXQgd29ya3MuDQoNCkkgaGF2ZSB0byByZXBlYXQgbXlzZWxmLiBUaGlzIHdh cyB3aGF0IHYxIGRvZXMuDQoNClRoZSBkcmF3YmFjayBpcywgdGhlcmUgY291bGQgYmUgbXVsdGlw bGUgTFNNcyBhY3RpdmUgYXQgdGhlIHNhbWUgdGltZS4gQW5kIGFuIEVNQSBpcyBpbnNlcnRlZCBp ZmYgKmFsbCogTFNNcyBoYXZlIGFwcHJvdmVkIGl0LiBUaHVzIHRoZSBhY3R1YWwgaW5zZXJ0aW9u IGlzIG5vdyBkb25lIGF0IHRoZSBlbmQgb2Ygc2VjdXJpdHlfZW5jbGF2ZV9sb2FkKCkuIFRoYXQg bWFrZXMgdGhlIGxvZ2ljIGNsZWFyIGFuZCBsZXNzIGVycm9yIHByb25lLCBhbmQgc2F2ZXMgY29k ZSB0aGF0J2QgYmUgZHVwbGljYXRlZCBpbnRvIG11bHRpcGxlIExTTXMgb3RoZXJ3aXNlLiBBbmQg dGhhdCdzIHdoeSBJIGNpdGVkIHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbigpL3NlY3VyaXR5X3Zt X2Vub3VnaF9tZW1vcnkoKSBhcyBwcmVjZWRlbmNlIHRvIHNlY3VyaXR5X2VuY2xhdmVfbG9hZCgp Lg0KDQo+IA0KPiA+IElmIHlvdSBhcmUgcmVmZXJyaW5nIHRvIGJ1ZmZlcnMgYWxsb2NhdGVkIGlu IG9uZSBsYXllciBhbmQgZnJlZWQgaW4gZWxzZXdoZXJlLCB5b3UgaGF2ZQ0KPiBnb3QgdGhlIGNv ZGUgd3JvbmcuIEJ1ZmZlcnMgYWxsb2NhdGVkIGluIHNlY3VyaXR5X2VuY2xhdmVfbG9hZCgpIGlz IGZyZWVkIGluDQo+IHNlY3VyaXR5X2ZpbGVfZnJlZSgpLg0KPiANCj4gSXQncyB1cCB0byB0aGUg c2VjdXJpdHkgbW9kdWxlJ3MgZmlsZV9mcmVlKCkgdG8gY2xlYW4gdXAgYW55dGhpbmcgdGhhdA0K PiB3YXNuJ3QgYWxsb2NhdGVkIGluIHNlY3VyaXR5X2ZpbGVfZnJlZSgpLiBJbnRlcmVzdGVkIHNl Y3VyaXR5IG1vZHVsZXMNCj4gc2hvdWxkIGNhbGwgZW5jbGF2ZV9sb2FkKCksIGFuZCBwdXQgdGhl IGluZm9ybWF0aW9uIGludG8gdGhlaXIgcG9ydGlvbg0KPiBvZiB0aGUgc2VjdXJpdHkgYmxvYi4g VGhlIG1vZHVsZSBzcGVjaWZpYyBjb2RlIGNhbiBjYWxsIGVuY2xhdmVfZmlsZV9mcmVlKCksDQo+ IG9yIHdoYXRldmVyIGludGVyZmFjZSB5b3Ugd2FudCB0byBwcm92aWRlLCB0byBjbGVhbiB1cC4g VGhhdCBtaWdodCB0YWtlDQo+IHBsYWNlIGluIGZpbGVfZnJlZSgpLCBidXQgaXQgYWxzbyBtaWdo dCBiZSBlbHNld2hlcmUuDQoNCldvdWxkIHlvdSBwbGVhc2UgdGFrZSBhIGNsb3NlciBsb29rIGF0 IG15IGNvZGU/IFdoYXRldmVyIEkgYWRkZWQgdG8gU0VMaW51eCBkaWQgKm5vdCogYWxsb2NhdGUg YW55dGhpbmchIE9yIGFyZSB5b3UgdGFsa2luZyBhYm91dCBzb21ldGhpbmcgZWxzZT8NCg0KPiAN Cj4gDQo+ID4gV2hhdGV2ZXIgZWxzZSBhbGxvY2F0ZWQgaW4gTFNNcyBhcmUgbm90IHNlZW4gb3Ig dGFrZW4gY2FyZSBvZiBieSB0aGUgaW5mcmFzdHJ1Y3R1cmUuIFRoZQ0KPiBwdXJwb3NlIG9mIGFs bG9jYXRpbmcgRU1BcyBpbiBlbmNsYXZlX2xvYWQoKSBpcyB0cnlpbmcgdG8gbWluaW1pemUgb3Zl cmhlYWQgZm9yIG5vbi0NCj4gZW5jbGF2ZSBmaWxlcywgb3RoZXJ3aXNlIGl0IGNvdWxkIGJlIGRv bmUgaW4gZmlsZV9hbGxvYygpIHRvIGJlIG1vcmUgInBhaXJlZCIgd2l0aA0KPiBmaWxlX2ZyZWUo KS4gQnV0IEkgZG9uJ3Qgc2VlIGl0IG5lY2Vzc2FyeS4NCj4gDQo+IFRyeSBsb29raW5nIGF0IG1h aW50YWluaW5nIHdoYXQgeW91J3ZlIHB1dCBpbnRvIHRoZSBMU00gY29kZSBhcw0KPiBhIHNlcGFy YXRlIGVudGl0eS4gSXQgbWFrZXMgaXQgc2ltcGxlci4gUmVhbGx5Lg0KDQpJdCBpcyBhbHJlYWR5 IGEgc2VwYXJhdGUgZW50aXR5LiBJdCBoYXMgaXRzIG93biBoZWFkZXIgYW5kIG93biBDIGZpbGUu DQoNCj4gDQo+ID4+IEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwg aW4gYSBnZW5lcmFsIGluZnJhc3RydWN0dXJlLg0KPiA+IFN0YXRlZCBlYXJsaWVyLCBpdCBkb2Vz bid0IGNvbnRhaW4gYW55IGgvdyBzcGVjaWZpY3MgYnV0IGp1c3QgYSBURUUgYWJzdHJhY3Rpb24u DQo+IA0KPiBUaGVuIHB1dCBpdCBpbiB0aGUgVEVFIHN5c3RlbS4NCg0KSXQncyBMU00ncyBhYnN0 cmFjdGlvbiBvZiBURUUgLSBpLmUuLCBpdCB0cmFja3Mgd2hhdCBtYXR0ZXJzIHRvIExTTSBvbmx5 LiBURUUgZG9lc24ndCBjYXJlLiBJdCBqdXN0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBhc2tz IGZvciBhIGRlY2lzaW9uIGF0IHJldHVybi4gVGhhdCdzIGhvdyBMU00gd29ya3MuDQoNCj4gDQo+ ID4gSXQgY291bGQgYmUgbGVmdCBvbiBhbGwgdGhlIHRpbWUgb3IgY29udHJvbGxlZCBieSBhIGRp ZmZlcmVudCBjb25maWcgbWFjcm8uDQo+IA0KPiBUcnVlIGluIGFueSBjYXNlLg0KPiANCj4gPiBJ dCBpcyBjb250aW5nZW50IHRvIENPTkZJR19JTlRFTF9TR1gganVzdCBmb3IgY29udmVuaWVuY2Us IGFzIFNHWCBpcyB0aGUgZmlyc3QgKGFuZCBvbmx5DQo+IHNvIGZhcikgVEVFIHRoYXQgbmVlZHMg YXR0ZW50aW9uIGZyb20gTFNNLCBidXQgdGhlcmUgY291bGQgYmUgbW9yZSBpbiBmdXR1cmUuDQo+ IA0KPiBBbGwgdGhlIG1vcmUgcmVhc29uIHRvIGtlZXAgaXQgc2VwYXJhdGUuIFRoZXNlIHRoaW5n cyBuZXZlciBnZXQgc2ltcGxlcg0KPiB3aGVuIHRoZXkgZ2V0IG1vcmUgZ2VuZXJhbGl6ZWQuDQoN CkkgaGF2ZSBhIGhhcmQgdGltZSB1bmRlcnN0YW5kaW5nIHdoYXQgeW91IG1lYW4gYnkgInNlcGFy YXRlIi4gDQoNCj4gDQo+ID4+PiBJZiBubywgd2h5IHdvdWxkIHdlIHdhbnQgdG8gcGF5IGZvciB0 aGUgY29zdCBmb3Igbm90IGRvaW5nIHRoYXQ/DQo+ID4+IE1vZHVsYXJpdHkgYW5kIG1haW50YWlu YWJpbGl0eSBjb21lIGRpcmVjdGx5IHRvIG1pbmQuDQo+ID4gUHV0dGluZyBpdCBlbHNld2hlcmUg d2lsbCBpbmN1ciBtb3JlIG1haW50ZW5hbmNlIGNvc3QuDQo+IA0KPiBJIGRvbid0IGJlbGlldmUg dGhhdCBmb3IgYSBzZWNvbmQuIDQwIHllYXJzIG9mIEMgcHJvZ3JhbW1pbmcNCj4gaGF2ZSB0YXVn aHQgbWUgdGhhdCB0cnlpbmcgdG8gZG8gbXVsdGlwbGUgdGhpbmdzIGluIG9uZSBwbGFjZQ0KPiBp cyBhbHdheXMgYSBiYWQgaWRlYS4NCg0KQWdyZWVkLiBJJ20gZG9pbmcgb25seSBvbmUgdGhpbmcu DQoNCj4gDQo+IA0KPiA+Pj4+IC4uLiBhbmQgdGhlIG5vdGlvbiB0aGF0IHlvdSBhbGxvY2F0ZSBk YXRhIGZvciBvbmUgYmxvYiB0aGF0IGdldHMNCj4gPj4+PiBmcmVlZCByZWxhdGl2ZSB0byBhbm90 aGVyIGJyZWFrcyB0aGUgZGF0YSBtYW5hZ2VtZW50IG1vZGVsLg0KPiA+Pj4gV2hhdCBkbyB5b3Ug bWVhbiBoZXJlPw0KPiA+PiBZb3UncmUgZnJlZWluZyB0aGUgRU1BIGRhdGEgZnJvbSBzZWN1cml0 eV9maWxlX2ZyZWUoKS4NCj4gPj4gSWYgc2VsaW51eCB3YW50cyB0byBmcmVlIEVNQSBkYXRhIGl0 IGhhcyBhbGxvY2F0ZWQgaW4NCj4gPj4gc2VsaW51eF9lbmNsYXZlX2xvYWQoKSBpbiBzZWxpbnV4 X2ZpbGVfZnJlZSgpIHRoYXQncyBmaW5lLCBidXQgdGhlIExTTQ0KPiA+PiBpbmZyYXN0cnVjdHVy ZSBoYXMgbm8gbmVlZCB0byBrbm93IGFib3V0IGl0Lg0KPiA+PiBFTUEgbmVlZHMgdG8gbWFuYWdl IGl0cyBvd24gZGF0YSwganVzdCBsaWtlIFZGUyBkb2VzLg0KPiA+PiBUaGUgTFNNIGluZnJhc3Ry dWN0dXJlIHByb3ZpZGVzIGJsb2IgbWFuYWdlbWVudCBzbyB0aGF0IHRoZSBzZWN1cml0eQ0KPiA+ PiBtb2R1bGVzIGNhbiBleHRlbmQgZGF0YSBpZiB0aGV5IHdhbnQgdG8uDQo+ID4gWW91J3ZlIGdv dCB0aGUgY29kZSB3cm9uZy4gc2VsaW51eF9lbmNsYXZlX2xvYWQoKSBkb2Vzbid0IGFsbG9jYXRl IGFueSBtZW1vcnkuDQo+IHNlbGludXhfZmlsZV9tcHJvdGVjdCgpIG1heSwgZHVlIHRvIEVNQSBz cGxpdC4gQnV0IHRoYXQncyB0cmFuc3BhcmVudCB0byBhbGwgTFNNcy4NCj4gDQo+IC4uLiBhbmQg dGhlIExTTSBpbmZyYXN0cnVjdHVyZSBkb2Vzbid0IGNhcmUgYW5kDQo+IG11c3Qgbm90IGJlIG1h ZGUgdG8gY2FyZS4gSXQncyBhbGwgdXAgdG8gU0VMaW51eC4NCg0KSXQgZG9lc24ndCBjYXJlIHRo ZSBkZWNpc2lvbnMuIEJ1dCBpdCBhc3Npc3RzIGluIG1haW50YWluaW5nIGluZm9ybWF0aW9uIG9u IHdoaWNoIGRlY2lzaW9ucyAoZnJvbSBtdWx0aXBsZSBMU01zKSBhcmUgYmFzZWQuIA0KDQo+IA0K PiA+IFRoZSBMU00gaW5mcmFzdHJ1Y3R1cmUgZG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IHdo YXQgTFNNIG1vZHVsZXMgZG8sIG5vciBkb2VzIGl0DQo+IG1hbmFnZSBhbnkgYnVmZmVycyBhbGxv Y2F0ZWQgYnkgYW55IExTTSBtb2R1bGVzLg0KPiANCj4gUmlnaHQsIHdoaWNoIGlzIHdoeSBwdXR0 aW5nIHlvdXIgbHNtX2VtYV9ibG9iIGlzIHdyb25nLCBhbmQgd2h5DQo+IGZvcmNpbmcgaW50byB0 aGUgZmlsZSBibG9iIGlzIHdyb25nLg0KDQpsc21fZW1hX2Jsb2IgaXMgTk9UIHBhcnQgb2YgZmls ZSBibG9iLg0KDQo+IA0KPiA+IEVNQSBpcyBjdXJyZW50bHkgbWFuYWdpbmcgaXRzIG93biBkYXRh LiBXaGF0J3MgbmVlZGVkIGlzIHRoZSB0cmlnZ2VyIC0gdG8gbGV0IEVNQSBrbm93DQo+IHdoZW4g dG8gdXBkYXRlIGl0cyBzdGF0ZXMuIFRoZSB0cmlnZ2VyIGNvdWxkIGJlIHBsYWNlZCBpbiBMU00g aW5mcmFzdHJ1Y3R1cmUgb3IgaW5zaWRlDQo+IGluZGl2aWR1YWwgTFNNcy4NCj4gDQo+IFllcy4g VGhlIGxhdHRlci4NCj4gDQo+ID4gVGhlIHJlYXNvbiB0byBwdXQgaXQgaW4gdGhlIGluZnJhc3Ry dWN0dXJlLCBpcyB0aGF0IGl0IGRlcGVuZHMgb24gdGhlIGRlY2lzaW9uIG9mICphbGwqDQo+IExT TXMgd2hldGhlciB0byBpbnNlcnQgYSBuZXcgRU1BLg0KPiANCj4gVGhhdCdzIGJhc2ljIHN0YWNr aW5nIGJlaGF2aW9yLiAiQmFpbCBvbiBmYWlsIiwgd2hpY2ggc2F5cyB0aGF0IG9uY2UNCj4gZGVu aWFsIGlzIGRldGVjdGVkLCB5b3UncmUgZG9uZS4NCg0KV2hvIGRvZXMgdGhlIGluc2VydGlvbiBv biBzdWNjZXNzLCBpZiBub3QgdGhlIExTTSBpbmZyYXN0cnVjdHVyZT8gVGhpcyBpcyBhZ2FpbiBz aW1pbGFyIHRvIHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbi9zZWN1cml0eV92bV9lbm91Z2hfbWVt b3J5LiBUaGUgbGFzdCBzdGVwIGlzIGRvbmUgYnkgdGhlIGluZnJhc3RydWN0dXJlIG9uIHN1Y2Nl c3MuDQoNCj4gDQo+ID4gVGhhdCdzIHNpbWlsYXIgdG8gdm1fZW5vdWdoX21lbW9yeSgpIHdoZXJl IHRoZSBmaW5hbCBfX3ZtX2Vub3VnaF9tZW1vcnkoKSBjYWxsIGlzIG1hZGUNCj4gYnkgdGhlIGlu ZnJhc3RydWN0dXJlIGJ1dCBub3QgaW5kaXZpZHVhbCBMU01zLg0KPiANCj4gRG8geW91IHJlYWxs eSB1bmRlcnN0YW5kIHRoZSBwYWluZnVsIHJlYXNvbnMgdGhhdCBjYXNlIGlzIHJlcXVpcmVkPw0K PiBBbmQgaWYgc28sIHdoeSB5b3UgYXJlbid0IHRha2luZyBzdGVwcyB0byBhdm9pZCB0aGVtPw0K DQpJIHRoaW5rIEkndmUgcnVuIGludG8gdGhlIHNhbWUgcGFpbmZ1bCByZWFzb25zLiANCg0KSG9u ZXN0bHksIEkgdHJpZWQgbm90IHRvIGRvIGFueXRoaW5nIG1vcmUgdGhhbiBqdXN0IGEgY2FsbF9p bnRfaG9va3MuIEJ1dCBJIHJlYWxpemVkIHRoYXQnZCBtYWtlIHRoaW5nIG11Y2ggbW9yZSBjb21w bGljYXRlZCBhbmQgZXJyb3IgcHJvbmUgaW4gbXVsdGlwbGUtYWN0aXZlLUxTTSBjYXNlcy4NCg0K U28gSSB0aGluayBJJ3ZlIHJ1biBpbnRvIHRoZSBzYW1lIHBhaW5mdWwgcmVhc29ucy4gQW5kIEkg ZG9uJ3Qgc2VlIGFueSBhY3Rpb25hYmxlIHN1Z2dlc3Rpb25zIGZyb20geW91IHNvIGZhci4NCg0K PiANCj4gDQo+ID4+PiBFTUEgYmxvYnMgYXJlIGFsbG9jYXRlZC9mcmVlZCAqbm90KiByZWxhdGl2 ZSB0byBhbnkgb3RoZXIgYmxvYnMuDQo+ID4+IEluIHRoZSBjb2RlIHlvdSBwcm9wb3NlZCB0aGV5 IGFyZSBmcmVlZCBpbiBzZWN1cml0eV9maWxlX2ZyZWUoKS4NCj4gPj4gVGhhdCBpcyBmb3IgZmls ZSBibG9iIG1hbmFnZW1lbnQuDQo+ID4gWWVzLiBFTUEgY29udHJpYnV0ZXMgdG8gdGhlIGZpbGUg YmxvYi4gQnV0IGl0IG9ubHkgZnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUNCj4gaW5mcmFz dHJ1Y3R1cmUgaXRzZWxmLCBub3QgYW55dGhpbmcgZnJvbSBhbnkgTFNNIG1vZHVsZXMuDQo+IA0K PiBUaGF0J3Mgbm90IHRoZSB3YXkgaXQncyBzdXBwb3NlZCB0byBiZSBkb25lLiBUaGUgbW9kdWxl IHRlbGxzDQo+IHRoZSBpbmZyYXN0cnVjdHVyZSB3aGF0IGl0IG5lZWRzLCB3aGljaCBtYXkgaW5j bHVkZSBzcGFjZSBmb3INCj4gRU1BIGRhdGEuIFRoZSBtb2R1bGUgYXNrcyBFTUEgZm9yIHRoZSBk YXRhIGl0IG5lZWRzIGFuZCBzdHVmZnMNCj4gaXQgc29tZXdoZXJlLCBhbmQgdGhlIGZpbGUgYmxv YiBpcyBhIGZpbmUgY2hvaWNlLiBUaGUgbW9kdWxlDQo+IGNsZWFucyB1cCBpbiBmaWxlX2ZyZWUs IG9yIGF0IGFueSB0aW1lIGJlZm9yZSB0aGF0LiBJZiBubyBtb2R1bGUNCj4gdXNlcyBFTUEsIG5v dGhpbmcgZ29lcyBpbiB0aGUgYmxvYi4gSWYgdHdvIG1vZHVsZXMgdXNlIEVNQSBlYWNoDQo+IGlz IHJlc3BvbnNpYmxlIGZvciB0aGUgZGF0YSBpdCB1c2VzLCB3aGljaCBtYXkgYmUgdGhlIHNhbWUg b3INCj4gbWF5IGJlIGRpZmZlcmVudC4NCj4gDQo+IEkndmUgbG9va2VkIGF0IHlvdXIgY29kZS4g TWFraW5nIGl0IHdvcmsgdGhlIHdheSBpdCBzaG91bGQgd291bGQNCj4gbm90IGJlIGRpZmZpY3Vs dCBhbmQgd291bGQgbGlrZWx5IHNpbXBsaWZ5IGEgYnVuY2ggb2YgaXQuDQoNCkd1ZXNzIHRoaXMg ZGlzY3Vzc2lvbiB3aWxsIG5ldmVyIGVuZCBpZiB3ZSBkb24ndCBnZXQgaW50byBjb2RlLiBHdWVz cyBpdCdkIGJlIG1vcmUgcHJvZHVjdGl2ZSB0byB0YWxrIG92ZXIgcGhvbmUgdGhlbiBjb21lIGJh Y2sgdG8gdGhpcyB0aHJlYWQgd2l0aCBhIGNvbmNsdXNpb24uIFdpbGwgdGhhdCBiZSBvayB3aXRo IHlvdT8NCg==