From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [4/6] usb: gadget: add functions to signal udc driver to delay status stage From: Felipe Balbi Message-Id: <87d0riv4jw.fsf@linux.intel.com> Date: Tue, 06 Nov 2018 13:17:07 +0200 To: Laurent Pinchart , Alan Stern Cc: Paul Elder , Bin Liu , kieran.bingham@ideasonboard.com, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, rogerq@ti.com List-ID: SGksCgpMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+ IHdyaXRlczoKPj4gPj4+PiBGdXJ0aGVybW9yZSwgd2UgaGF2ZSBmb3VuZCB0aGF0IFVTQl9HQURH RVRfREVMQVlFRF9TVEFUVVMgaXMgcmFjZXksCj4+ID4+Pj4gd2hpY2ggaGFzIGFscmVhZHkgYmVl biBvYnNlcnZlZCBpbiB0aGUgVVZDIGdhZGdldCBkcml2ZXIgcHJldmlvdXNseQo+PiA+Pj4+IFsw XS4gVGhlIHJhY2VpbmVzcyBzdGVtcyBmcm9tIHRoZSBmYWN0IHRoYXQgdGhpbmdzIGNhbiBoYXBw ZW4gaW4KPj4gPj4+PiBiZXR3ZWVuIHJldHVybmluZyBVU0JfR0FER0VUX0RFTEFZRURfU1RBVFVT IGFuZCB0aGUgY29tcG9zaXRlIGxheWVyCj4+ID4+Pj4gcmVhY3RpbmcgdG8gaXQgLSBlc3BlY2lh bGx5IGlmIHVzYl9jb21wb3NpdGVfc2V0dXBfY29udGludWUgaXMgY2FsbGVkCj4+ID4+Pj4gd2l0 aGluIHRoYXQgd2luZG93IGl0IGNhdXNlcyBhIFdBUk4uIEluIGFueSBjYXNlLCB0aGUgZmFjdCB0 aGF0IHRoZQo+PiA+Pj4+IG1lY2hhbmlzbSBpdHNlbGYgaXMgcmFjZXkgc3VnZ2VzdHMgdGhhdCBp dCBuZWVkcyBpbXByb3ZlbWVudCwgYW5kIHVzaW5nCj4+ID4+Pj4gaXQgd291bGRuJ3QgYmUgYSBn b29kIHNvbHV0aW9uIGluIHRoaXMgY2FzZS4KPj4gCj4+IEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlz IGF0IGFsbC4gIFRoZSBjb21wb3NpdGUgbGF5ZXIgcmVhY3RzIHRvCj4+IFVTQl9HQURHRVRfREVM QVlFRF9TVEFUVVMgYXMgc29vbiBhcyBpdCByZWNlaXZlcyB0aGUgcmV0dXJuIHZhbHVlLiAgQ2Fu Cj4+IFBhdWwgb3IgTGF1cmVudCBnaXZlIGEgbW9yZSBleHBsaWNpdCBleGFtcGxlIG9mIHRoaXMg cmFjZT8KPgo+IFRoZSBjb21wb3NpdGUgbGF5ZXIgb25seSBoYW5kbGVzIFVTQl9HQURHRVRfREVM QVlFRF9TVEFUVVMgZm9yIAo+IFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04gKGluIHNldF9jb25m aWcoKSkgYW5kIGZvciBVU0JfUkVRX1NFVF9JTlRFUkZBQ0UgKGluIAo+IGNvbXBvc2l0ZV9zZXR1 cCgpKS4gSXQgaW5jcmVtZW50cyBjZGV2LT5kZWxheWVkX3N0YXR1cyBpbW1lZGlhdGVseS4gVGhl biwgaW4gCj4gdXNiX2NvbXBvc2l0ZV9zZXR1cF9jb250aW51ZSgpLCBpZiBjZGV2LT5kZWxheWVk X3N0YXR1cyBpcyBub3QgemVybywgaXQgcXVldWVzIAo+IGEgWkxQLCBhbmQgd2FybnMgb3RoZXJ3 aXNlLgo+Cj4gVGhpcyBtZWNoYW5pc20gZGVsYXlzIHRoZSBkYXRhIHN0YWdlLCBub3QgdGhlIHN0 YXR1cyBzdGFnZSAob3IsIHRvIGJlIHByZWNpc2UsIAo+IGl0IGRlbGF5cyB0aGUgc3RhdHVzIHN0 YWdlIGluc29mYXIgYXMgdGhlIHN0YXR1cyBzdGFnZSBjb21lcyBhZnRlciB0aGUgZGF0YSAKPiBz dGFnZSksIGFuZCBvbmx5IHN1cHBvcnRzIGNvbnRyb2wgT1VUIHJlcXVlc3RzIHdpdGggMCBieXRl cyBvZiBkYXRhICh3aGljaCBpcyAKPiB0aGUgY2FzZSBvZiBib3RoIFVTQl9SRVFfU0VUX0lOVEVS RkFDRSBhbmQgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTikuIEZvciBhbGwgCj4gb3RoZXIgcmVx dWVzdHMsIHRoZSBjb21wb3NpdGUgbGF5ZXIgcGFzc2VzIFVTQl9HQURHRVRfREVMQVlFRF9TVEFU VVMgdG8gdGhlIAo+IFVEQy4KCkRBVEEgc3RhZ2UgYWx3YXlzIGRlcGVuZHMgb24gYSB1c2JfZXBf cXVldWUoKSBmcm9tIGdhZGdldCBkcml2ZXIuIFNvCml0J3MgYWx3YXlzICJkZWxheWVkIiBpbiB0 aGF0IHNlbnNlLgoKPiBUaGUgdGhyZWUgVURDcyB0aGF0IGltcGxlbWVudCBVU0JfR0FER0VUX0RF TEFZRURfU1RBVFVTIHN1cHBvcnQgc2V0IGEgCj4gZGVsYXllZF9zdGF0dXMgZmxhZyBpbiBhbiBp bnRlcm5hbCBzdHJ1Y3R1cmUuIEkgaGF2ZW4ndCBpbnNwZWN0ZWQgaW4gZGV0YWlscyAKPiB3aGF0 IHRoZXkgZG8gbmV4dCBhcyBJJ20gbm90IGZhbWlsaWFyIHdpdGggYWxsIG9mIHRoZW0sIGJ1dCB0 aGUgZHdjMyBkcml2ZXIgCj4ganVzdCBza2lwcyB0aGUgaGFuZGxpbmcgb2YgdGhlIHN0YXR1cyBw aGFzZSBpbiBkd2MzX2VwMF94ZmVybm90cmVhZHkoKSBhbmQgCj4gZGVsYXlzIGl0IHRvIF9fZHdj M19nYWRnZXRfZXAwX3F1ZXVlKCkuIFRoaXMgb25seSB3b3JrcyBmb3IgMC1sZW5ndGggcmVxdWVz dHMsIAo+IHdpdGggbm8gZGF0YSBwaGFzZS4KCmRhdGEgc3RhZ2UgYWx3YXlzIGRlcGVuZHMgb24g dXNiX2VwX3F1ZXVlKCkuIFRoZXJlIHdhcyBuZXZlciBhbnkgbmVlZApmb3IgVURDIHRvIGhhbmRs ZSBEYXRhIHN0YWdlIGludGVybmFsbHkuIEFsc28sIHN0YXR1cyBzdGFnZSBpcyBhbHdheXMgYSBa TFAuCgo+IEV2ZW4gd2hlbiBsaW1pdGVkIHRvIDAtbGVuZ3RoIGNvbnRyb2wgT1VUIHJlcXVlc3Rz LCB0aGlzIG1lY2hhbmlzbSBpcyByYWN5LiAKPiBUaGUgc2V0dXAgaGFuZGxlciwgd2hlbiBpdCB3 YW50cyB0byBkZWxheSB0aGUgc3RhdHVzIHBoYXNlLCB3aWxsIHF1ZXVlIAo+IGFzeW5jaHJvbm91 cyB3b3JrIHRoYXQgd2lsbCwgd2hlbiBpdCBjb21wbGV0ZXMsIGNhbGwgCj4gdXNiX2NvbXBvc2l0 ZV9zZXR1cF9jb250aW51ZSgpIHRvIHByb2NlZWQgd2l0aCB0aGUgc3RhdHVzIHBoYXNlLiBRdWV1 aW5nIHRoZSAKPiB3b3JrIGhhcyB0byBiZSBkb25lIGJlZm9yZSB0aGUgc2V0dXAgaGFuZGxlciBy ZXR1cm5zLCBhbmQgdGhlIGNkZXYtCj4+ZGVsYXllZF9zdGF0dXMgaXMgb25seSBpbmNyZW1lbnRl ZCBhZnRlciB0aGUgc2V0dXAgaGFuZGxlciByZXR1cm5zLCBpbiAKPiBjb21wb3NpdGVfc2V0dXAo KS4gVGhlcmUgaXMgdGh1cyBhIHRpbWUgd2luZG93IGR1cmluZyB3aGljaCB0aGUgYXN5bmNocm9u b3VzIAo+IHdvcmsgY2FuIGNhbGwgdXNiX2NvbXBvc2l0ZV9zZXR1cF9jb250aW51ZSgpIGJlZm9y ZSBjZGV2LT5kZWxheWVkX3N0YXR1cyBoYXMgCj4gYmVlbiBpbmNyZW1lbnRlZC4gV2UgaGF2ZSBt YW5hZ2VkIHRvIGhpdCB0aGlzIGluIHByYWN0aWNlLCB3aXRoIGEgc3VycHJpc2luZ2x5IAo+IGhp Z2ggcmF0ZSBzZWVpbmcgaG93IHNtYWxsIHRoZSB3aW5kb3cgaXMuCgp0aGF0J3Mgb25seSB0aGUg Y2FzZSBiZWNhdXNlIHdlIGhhdmUgdHdvIGRpZmZlcmVudCAibW9kZXMiIGZvciB0aGlzLiBPbmUK d2hlcmUgVURDIGhhbmRsZXMgaXQgaW50ZXJuYWxseSBhbmQgYW5vdGhlciB3aGVyZSBnYWRnZXQg ZHJpdmVyIGhhcyB0bwpxdWV1ZSBhIHJlcXVlc3QuIEknbSB2b3VjaGluZyBmb3IgbWFraW5nIHN0 YXR1cyBzdGFnZSBhbHdheXMgZXhwbGljaXQsCmkuZS4gd2Ugc2hvdWxkIGFsd2F5cyBleHBlY3Qg YSB1c2JfZXBfcXVldWUoKS4KCj4gTm93IHRoYXQgSSd2ZSB3cml0dGVuIGFsbCB0aGlzLCBJIHJl YWxpemUgdGhhdCBjZGV2LT5kZWxheWVkX3N0YXR1cyBpcyBndWFyZGVkIAo+IGJ5IGNkZXYtPmxv Y2suIEkgdGh1cyB3b25kZXIgd2hldGhlciBvdXIgYW5hbHlzaXMgd2FzIGNvcnJlY3QsIG9yIGlm IHdlIHdlcmUgCj4gaGl0dGluZyBhIGRpZmZlcmVudCBidWcgOi1TIFBhdWwsIGNvdWxkIHlvdSB0 ZXN0IHRoaXMgYWdhaW4gPyBQbGVhc2Ugbm90ZSwgCj4gaG93ZXZlciwgdGhhdCB0aGUgcmFjZSBk ZXNjcmliZWQgaGVyZSBpcyBub3QgcmVsYXRlZCB0byB0aGlzIHBhdGNoIHNlcmllcywgCj4gZXhj ZXB0IGluIGhvdyBpdCBpbmZsdWVuY2VzIHRoZSBBUEkgZGVzaWduIHRvIGF2b2lkIHJhY2UgY29u ZGl0aW9ucy4KPgo+PiBBc3N1bWluZyB5b3UgYXJlIGNvcnJlY3QsIHdvdWxkbid0IGl0IG1ha2Ug c2Vuc2UgdG8gZml4IG9yIGVsaW1pbmF0ZQo+PiB0aGUgcmFjZSBieSBjaGFuZ2luZyBjb21wb3Np dGUuYz8KPgo+IEkgd2FzIGFib3V0IHRvIHdyaXRlIHRoYXQgd2Ugd291bGQgbmVlZCB0byBsb2Nr IGFjY2VzcyB0byBjZGV2LQo+PmRlbGF5ZWRfc3RhdHVzLCBhbmQgZm91bmQgb3V0IHRoYXQgd2Ug YWxyZWFkeSB1c2UgY2Rldi0+bG9jayB0byBkbyBzby4gTW9yZSAKPiBpbnZlc3RpZ2F0aW9ucyBh cmUgbmVlZGVkLgo+Cj4gUGxlYXNlIG5vdGUsIGhvd2V2ZXIsIHRoYXQgVVNCX0dBREdFVF9ERUxB WUVEX1NUQVRVUyBpcyBsaW1pdGVkIHRvIDAtbGVuZ3RoIAo+IGNvbnRyb2wgT1VUIHJlcXVlc3Rz LCBzbyB0aGUgcHJvYmxlbSB0aGF0IGxlZCB0byB0aGlzIHBhdGNoIHNlcmllcyBzdGlsbCAKPiBl eGlzdHMsIGV2ZW4gaWYgdGhlIHJhY2UgY29uZGl0aW9uIEkgdGhvdWdodCB3YXMgdGhlcmUgZG9l c24ndCBleGlzdC4KCkFuZCB0aGF0IHByb2JsZW0gaXMuLi4/CgpEQVRBIHN0YWdlIGFsd2F5cyBk ZXBlbmRzIG9uIGEgdXNiX2VwX3F1ZXVlKCkgZnJvbSBnYWRnZXQgZHJpdmVyLgoKPj4gPj4gSWYg dGhpcyB3b3JrcyB3aXRoIGR3YzMgKyB1dmMsIHRoZW4gd2UgaGF2ZSBhIGdvb2QgcmVjaXBlIG9u IGhvdyB0bwo+PiA+PiBpbXBsZW1lbnQgZm9yIHRoZSBvdGhlciBkcml2ZXJzLgo+PiA+IAo+PiA+ IEdpdmVuIHRoYXQgd2UgbmVlZCB0byBkZWxheSB0aGUgc3RhdHVzIHN0YWdlIGFuZCBub3QgdGhl IGRhdGEgc3RhZ2UsIHdlCj4+ID4gY2FuJ3QgZXhwbGljaXRseSByZXF1ZXN0IHRoZSBzdGF0dXMg c3RhZ2UgdGhyb3VnaCBhIHVzYiByZXF1ZXN0IHF1ZXVlLgo+PiAKPj4gV2h5IG5vdD8gIFRoZSBz dGF0dXMgc3RhZ2UgZm9yIGEgY29udHJvbC1PVVQgdHJhbnNmZXIgaXMgc2ltcGx5IGEKPj4gemVy by1sZW5ndGggSU4gdHJhbnNhY3Rpb24uICBJdCdzIGVhc3kgdG8gcXVldWUgYSByZXF1ZXN0IGZv ciBzdWNoIGEKPj4gdHJhbnNhY3Rpb24uICBJcyB0aGUgaXNzdWUgdGhhdCB0aGVyZSdzIG5vIHdh eSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24KPj4gb2YgdGhlIHJlcXVlc3QgKGhlbmNlIG5vIGRp cmVjdCB3YXkgdG8gdGVsbCB3aGV0aGVyIGEgemVyby1sZW5ndGgKPj4gcmVxdWVzdCBpcyBmb3Ig dGhlIGRhdGEgc3RhZ2Ugb3IgdGhlIHN0YXR1cyBzdGFnZSk/Cj4KPiBPSywgSSBzdXBwb3NlIHdl IGNvdWxkIHF1ZXVlIGEgcmVxdWVzdCBmb3IgdGhpcywgaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBo YXZlIAo+IHRvIHF1ZXVlIHR3byByZXF1ZXN0cyBmb3IgY29udHJvbCBPVVQgdHJhbnNmZXJzIChv bmUgZm9yIHRoZSBkYXRhIHN0YWdlIGFuZCAKPiBvbmUgZm9yIHRoZSBzdGF0dXMgc3RhZ2UpLiBJ J20gaG93ZXZlciBub3QgY29udmluY2VkIHRoYXQgd291bGQgYmUgdGhlIGJlc3QgCgp0aGF0J3Mg Y29ycmVjdC4gVGhpcyBpcyB3aGF0ICJtYWtlIHN0YXR1cyBzdGFnZSBhbHdheXMgZXhwbGljaXQi IG1lYW4gOikKCj4gQVBJIHRvIGhhbmRsZSB0aGUgc3RhdHVzIHN0YWdlLCBhcyB0aGUgZnVuY3Rp b24gZHJpdmVyIHdvdWxkIG5lZWQgdG8gcXVldWUgYSAKCml0IGF2b2lkcyBhbGwgdGhlIHNwZWNp YWwgY2FzZXMuIFVEQyBkcml2ZXJzIGNhbiBpbXBsZW1lbnQgYSBzaW5nbGUKaGFuZGxpbmcgZm9y IHN0cnVjdCB1c2JfcmVxdWVzdC4gV2UgY291bGQgZG8gYXdheSB3aXRoIHNwZWNpYWwgcmV0dXJu CnZhbHVlcyBhbmQgc28gb24uLi4KCj4gcmVxdWVzdCBhbmQgdGhlIFVEQyB3b3VsZCB0aGVuIG5l ZWQgdG8gY2hlY2sgd2hldGhlciB0aGF0IHJlcXVlc3QgY29ycmVzcG9uZHMgCj4gdG8gYSBzdGF0 dXMgc3RhZ2UgYW5kIHByb2Nlc3MgaXQgYWNjb3JkaW5nbHkuIEEgbmV3IG9wZXJhdGlvbiBzcGVj aWZpYyB0byB0aGlzIAoKbm8sIGl0IHdvdWxkbid0LiBVREMgd291bGQgaGF2ZSB0byBjaGVjayB0 aGUgc2l6ZSBvZiByZXF1ZXN0LCB0aGF0J3MKYWxsOgoKCWlmIChyLT5sZW5ndGggPT0gMCkKICAg ICAgICAJc3BlY2lhbF96bHBfaGFuZGxpbmcoKTsKCWVsc2UKICAgICAgICAJcmVndWxhcl9ub25f emxwX2hhbmRsaW5nKCk7CgpCdXQgd2UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHNwZWNpYWwg cmV0dXJuIHZhbHVlcyBhbmQgdGhlIGxpa2UuIFdlCmRvbid0IGV2ZW4gbmVlZCB0byBjYXJlIChm cm9tIFVEQyBwZXJzcGVjdGl2ZSkgaWYgd2UncmUgZGVhbGluZyB3aXRoCjItc3RhZ2Ugb3IgMy1z dGFnZSBjb250cm9sIHRyYW5zZmVycyAod2VsbCwgZHdjMyBuZWVkcyB0byBjYXJlIGJlY2F1c2UK b2YgZGlmZmVyZW50IFRSQiB0eXBlcyB0aGF0IG5lZWRzIHRvIGJlIHVzZWQsIGJ1dCB0aGF0J3Mg YW5vdGhlciBzdG9yeSkKCj4gd291bGQgYmUgZWFzaWVyIGZvciBib3RoIHRoZSBmdW5jdGlvbiBk cml2ZXIgYW5kIHRoZSBVREMgaW4gbXkgb3Bpbmlvbi4gCgppdCB3b3VsZG4ndC4gV2Ugd291bGQg anVzdCBiZSBtb3ZpbmcgdGhlIHNwZWNpYWwgY2FzZSB0byBhbm90aGVyCmZ1bmN0aW9uLCByYXRo ZXIgdGhhbiBlbGltaW5hdGluZyBpdC4KCj4gVGhlcmUncyBhbHNvIHRoZSBmYWN0IHRoYXQgcmVx dWVzdHMgY2FuIHNwZWNpZnkgYSBjb21wbGV0aW9uIGhhbmRsZXIsIGJ1dCBvbmx5IAo+IHRoZSBk YXRhIHN0YWdlIHJlcXVlc3Qgd291bGQgc2VlIGl0cyBjb21wbGV0aW9uIGhhbmRsZXIgY2FsbGVk ICh1bmxlc3Mgd2UgCj4gcmVxdWlyZSBVRENzIHRvIGNhbGwgY29tcGxldGlvbiByZXF1ZXN0cyBh dCB0aGUgY29tcGxldGlvbiBvZiB0aGUgc3RhdHVzIAo+IHN0YWdlLCBidXQgSSdtIG5vdCBzdXJl IHRoYXQgYWxsIFVEQ3MgY2FuIHJlcG9ydCB0aGUgZXZlbnQgdG8gdGhlIGRyaXZlciwgYW5kIAo+ IHRoYXQgd291bGQgbGlrZWx5IGJlIHVzZWxlc3MgYXMgbm9ib2R5IG5lZWRzIHRoYXQgZmVhdHVy ZSkuCgp5b3Ugc3RpbGwgd2FubmEga25vdyBpZiB0aGUgaG9zdCBhY3R1YWxseSBwcm9jZXNzZWQg eW91ciBzdGF0dXMKc3RhZ2UuIHVkYy1jb3JlIGNhbiAoYW5kIHNob3VsZCkgcHJvdmlkZSBhIGdl bmVyaWMgc3RhdHVzIHN0YWdlCmNvbXBsZXRpb24gZnVuY3Rpb24gd2hpY2gsIGF0IGEgbWluaW11 bSwgYWlkcyB3aXRoIHNvbWUgdHJhY2Vwb2ludHMuCgpPbmUgd2F5IHRvIHNhdGlzZnkgd2hhdCB5 b3Ugd2FudCwgd2l0aCB3aGF0IEkgd2FudCBpcyB0byBoYXZlIFVEQyBjb3JlCmltcGxlbWVudCBz b21ldGhpbmcgbGlrZSBiZWxvdzoKCmludCB1c2JfZXBfc3RhcnRfc3RhdHVzX3N0YWdlKHN0cnVj dCB1c2JfZ2FkZ2V0ICpnKQp7CglyZXR1cm4gdXNiX2VwX3F1ZXVlKGctPmVwMCwgJmctPmVwMF9z dGF0dXNfcmVxdWVzdCk7Cn0KCnNwZWNpYWwgZnVuY3Rpb24gZm9yIHlvdSwgdXNiX2VwX3F1ZXVl KCkgZm9yIG1lIDotcAoKPj4gQWRtaXR0ZWRseSwgaXQgbWlnaHQgYmUgbmljZSB0byBwcm92aWRl IGEgbGlicmFyeSByb3V0aW5lIGluIHRoZSBVREMKPj4gY29yZSB0byBxdWV1ZSBzdWNoIHJlcXVl c3RzLCBzaW5jZSBpdCBpbnZvbHZlcyBhIGJ1bmNoIG9mIHVuaW50ZXJlc3RpbmcKPj4gYm9pbGVy cGxhdGUgb3BlcmF0aW9ucy4KPj4gCj4+ID4gV291bGQgYSBuZXcgZXhwbGljaXQgZnVuY3Rpb24g Y2FsbCB3b3JrIGZvciB5b3UgZm9yIHRoYXQgcHVycG9zZSA/Cj4+IAo+PiBJdCB3b3VsZCBiZSBv a2F5LCBidXQgSSBxdWVzdGlvbiB3aGV0aGVyIG9uZSBpcyByZWFsbHkgbmVlZGVkLgo+Cj4gSSB0 aGluayB0aGUgQVBJIHdvdWxkIGJlIGNsZWFuZXIsIGJ1dCBpdCBtaWdodCBqdXN0IGJlIGEgbWF0 dGVyIG9mIHRhc3RlLgoKRnJvbSBhIFVEQyBwZXJzcGVjdGl2ZSwgSSdtIG1vcmUgaW5jbGluZWQg dG8gcmVtb3Zpbmcgc3BlY2lhbCBjYXNlcywKcmF0aGVyIHRoYW4gbWFraW5nIHRoZW0gbW9yZSBh cHBhcmVudC4gSGF2aW5nIGEgc2luZ2xlIG1ldGhvZCBmb3IKaGFuZGxpbmcgYWxsIHRocmVlIHN0 YWdlcyBvZiBhIGNvbnRyb2wgdHJhbnNmZXIsIElNTywgaXMgZmFyIG1vcmUKYmVuZWZpY2lhbCBh cyBpdCByZW1vdmVzIG1hZ2ljIHJldHVybiB2YWx1ZXMgYW5kIHNldmVyYWwgYnJhbmNoZXMgb24g VURDCmRyaXZlci4KCj4+ID4+PiAtIFRoZSBtZWNoYW5pc20gaXMgcG9vcmx5IGRvY3VtZW50ZWQu IEFzIFBhdWwgbWVudGlvbmVkLCBjb21tZW50cyBpbgo+PiA+Pj4gdGhlIGNvZGUgc3RhdGUgdGhh dCBVU0JfR0FER0VUX0RFTEFZRURfU1RBVFVTIGRlbGF5IHRoZSAiZGF0YS9zdGF0dXMKPj4gPj4+ IHN0YWdlcyIuIFRoaXMgaXMgdmVyeSB1bmNsZWFyLCBhbmQgdGhlIG9ubHkgdGhyZWUgVURDcyB0 aGF0IGltcGxlbWVudAo+PiA+Pj4gdGhlIG1lY2hhbmlzbSBzZWVtIHRvIGRvIHNvIGluIGRpZmZl cmVudCB3YXlzOgo+PiAKPj4gV2UgY2FuIGZpeCBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBw cmV0dHkgZWFzaWx5LiAgOi0pCj4KPiBJdCdzIGhhcmRlciB0byBmaXggdGhlbSBpZiBkaWZmZXJl bnQgaW1wbGVtZW50YXRpb25zIGludGVycHJldCB0aGVtIGluIAo+IGRpZmZlcmVudCB3YXlzIDot KSBUaGF0IG1pZ2h0IG5vdCBiZSB0aGUgY2FzZSB0aG91Z2gsIGFzIG1lbnRpb25lZCBhYm92ZSBJ IAoKdGhhdCdzIHdoZXJlIGEgcHJvcGVyIGF1ZGl0IG9mIHRoZSBjb2RlIGNvbWVzIGludG8gcGxh eSA6KQoKPiBoYXZlbid0IHN0dWRpZWQgdGhlIHRocmVlIFVEQ3MgdGhhdCBpbXBsZW1lbnQgdGhp cyBpbiBkZXRhaWxzLCBJIG9ubHkgaGFkIGEgCj4gbG9vayBhdCB0aGUgZHdjMy4KCnRoYXQncyBw ZXJmZWN0bHkgZmluZS4gV2UgY2FuIENjIG90aGVyIGZvbGtzIGludm9sdmVkIHdpdGggdGhlIG90 aGVyClVEQ3MgYW5kIGhhdmUgdGhlbSBjaGlwIGluLgoKPj4gVGhpcyByZXF1aXJlcyB0aGUgVURD IHRvIHNwZWNpZmljYWxseSBrZWVwIHRyYWNrIG9mIHRoZSBkaXJlY3Rpb24gb2YKPj4gdGhlIGN1 cnJlbnQgdHJhbnNmZXIgYW5kIHdoZXRoZXIgb3Igbm90IGEgZGF0YS1zdGFnZSB0cmFuc2ZlciBo YXMKPj4gYWxyZWFkeSBiZWVuIHF1ZXVlZC4gIFRoYXQgc2hvdWxkbid0IGJlIGhhcmQuCj4KPiBJ dCdzICJqdXN0IiBhIHN0YXRlIG1hY2hpbmUgc28gaXQgd291bGRuJ3QgYmUgdG9vIGhhcmQuIFdo YXQgd2UgbmVlZCB0byBhZ3JlZSAKPiBvbiBpcyBob3cgdGhlIHN0YXRlIG1hY2hpbmUgb3BlcmF0 ZXMsIGFuZCB0aGVuIHRoZSBBUEkgdG8gY29udHJvbCBpdC4gVGhhdCdzIAo+IHdoYXQgSSB0cmll ZCB0byBkZXNjcmliZSBiZWxvdyBpbiBteSBwcmV2aW91cyBlLW1haWwuCj4KPj4gKEJ1dCBpdCBk b2VzIGludm9sdmUgYQo+PiByYWNlIGluIGNhc2VzIHdoZXJlIHRoZSBob3N0IGdldHMgdGlyZWQg b2Ygd2FpdGluZyBhbmQgaXNzdWVzIGFub3RoZXIKPj4gU0VUVVAgcGFja2V0IGJlZm9yZSB0aGUg cHJvY2Vzc2luZyBvZiB0aGUgZmlyc3QgdHJhbnNmZXIgaXMgZmluaXNoZWQuKQoKSG9zdCB3b3Vs ZCBzdGFsbCBmaXJzdCBpbiB0aGF0IGNhc2UuIERyaXZlciBpcyBhbHJlYWR5IHJlcXVpcmVkIHRv CmhhbmRsZSBzdGFsbHMgZm9yIHNldmVyYWwgb3RoZXIgY29uZGl0aW9ucy4gSWYgdGhlaHJlIGFy ZSBidWdzIGluIHRoYXQKYXJlYSwgSSdkIHByZWZlciBjYXRjaGluZyB0aGVtLgoKPj4gPiBJIHdv bmRlciBpZiB0aGVyZSdzIHJlYWxseSBhIHVzZSBjYXNlIGZvciBkZWxheWluZyB0aGUgZGF0YSBz dGFnZSBvZgo+PiA+IGNvbnRyb2wgT1VUIHJlcXVlc3RzLCBhcyBpdCBzZWVtcyB0byBtZSB0aGF0 IHdlIGNhbiBwZXJmb3JtIHRoZQo+PiA+IGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIHRoZSBz ZXR1cCBhbmQgZGF0YSBzdGFnZXMgdG9nZXRoZXIsIGluIHdoaWNoCj4+ID4gY2FzZSB3ZSB3b3Vs ZCBhbHdheXMgcHJvY2VlZCB0byB0aGUgZGF0YSBzdGFnZSwgYW5kIG9ubHkgcG90ZW50aWFsbHkK Pj4gPiBkZWxheSB0aGUgc3RhdHVzIHN0YWdlLiBIb3dldmVyLCBpZiB3ZSBzd2l0Y2ggdG8gYW4g ZXhwbGljaXQgQVBJIHdoZXJlCj4+ID4gdGhlIHRyYW5zaXRpb24gZnJvbSB0aGUgc2V0dXAgdG8g dGhlIGRhdGEgc3RhZ2UgaXMgdHJpZ2dlcmVkIGJ5IHF1ZXVlaW5nCj4+ID4gYSByZXF1ZXN0LCBh bmQgZ2l2ZW4gdGhhdCBzdWNoIGEgdHJhbnNpdGlvbiBtYXkgbmVlZCB0byBiZSBkZWxheWVkIGZv cgo+PiA+IHRoZSBjb250cm9sIElOIGNhc2UsIGRlbGF5aW5nIHRoZSBkYXRhIHN0YWdlIGZvciBj b250cm9sIE9VVCB3b3VsZAo+PiA+IGVzc2VudGlhbGx5IGNvbWUgZm9yIGZyZWUuCj4KPiBXaGF0 IGRvIHlvdSB0aGluayBhYm91dCB0aGlzID8gU2hvdWxkIHdlIGFsbG93IGZ1bmN0aW9uIGRyaXZl cnMgdG8gZGVsYXkgdGhlIAo+IGRhdGEgc3RhZ2Ugb2YgY29udHJvbCBPVVQgcmVxdWVzdHMgPwoK aXQncyBhbHJlYWR5IGRlbGF5ZWQuIFVEQyB3b24ndCBzdGFydCBkYXRhIHN0YWdlIHVubGVzcyBp dCBoYXMgYSBidWZmZXIKdG8gcHV0IHRoZSBkYXRhLiBXaXRob3V0IGEgdXNiX2VwX3F1ZXVlKCks IFVEQyBkb2Vzbid0IGhhdmUgYSBidWZmZXIuCgo+PiA+IElmIHdlIGVuZCB1cCBtb3ZpbmcgdG8g ZXhwbGljaXQgc3RhdGUgaGFuZGxpbmcsIHdpdGggdGhlIGRhdGEgc3RhZ2UgYmVpbmcKPj4gPiBl bnRlcmVkIGJ5IHF1ZXVlaW5nIGEgcmVxdWVzdCwgYW5kIHRoZSBzdGF0dXMgc3RhZ2UgYmVpbmcg ZW50ZXJlZCBieQo+PiA+IGNhbGxpbmcgYSBuZXcgZnVuY3Rpb24sIGNvbnRyb2wgT1VUIHJlcXVl c3RzIHdpdGggMCBieXRlcyBvZiBkYXRhIHRoYXQKPj4gPiBjYW4gYmUgaGFuZGxlZCBzeW5jaHJv bm91c2x5IGluIHRoZSBzZXR1cCBoYW5kbGVyIHdvdWxkIHJlcXVpcmUgZnVuY3Rpb24KPj4gPiBk cml2ZXJzIHRvIGJvdGggcXVldWUgYSB6ZXJvLWxlbmd0aCByZXF1ZXN0IGFuZCBjYWxsIHRoZSBz dGF0dXMgZnVuY3Rpb24uCj4+ID4gVGhpcyB3b3VsZCBtYWtlIHRoZSBmdW5jdGlvbiBjb2RlIG1v cmUgY29tcGxleCwgYW5kIEkgd29uZGVyIHdoZXRoZXIgYQo+PiA+IHNob3J0Y3V0IHdvdWxkIGJl IGEgZ29vZCBpZGVhLCBwZXJoYXBzIGluIHRoZSBmb3JtIG9mIGEgZmxhZyBpbiB0aGUKPj4gPiBy ZXF1ZXN0IHRoYXQgdGVsbHMgdGhlIFVEQyB0byBhdXRvbWF0aWNhbGx5IHByb2NlZWQgdG8gdGhl IHN0YXR1cyBzdGFnZQo+PiA+IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkYXRhIHN0YWdlLiBPciB3 ZSBjb3VsZCBtYWtlIHRoYXQgYmVoYXZpb3VyIHRoZQo+PiA+IGRlZmF1bHQgd2hlbiB0aGUgcmVx dWVzdCBkb2Vzbid0IGhhdmUgYSBjb21wbGV0aW9uIGhhbmRsZXIgKGFzIG1vdmluZwo+PiA+IGV4 cGxpY2l0bHkgdG8gdGhlIHN0YXR1cyBzdGFnZSBzaG91bGQgYmUgZG9uZSBhdCB0aGUgZWFybGll c3QgZnJvbSB0aGUKPj4gPiBkYXRhIHN0YWdlIGNvbXBsZXRpb24gaGFuZGxlcikuCj4KPiBGcm9t IGFuIEFQSSBwb2ludCBvZiB2aWV3LCB0b3dhcmRzIGZ1bmN0aW9uIGRyaXZlcnMsIEkgcmVhbGx5 IHdhbnQgYW4gZXhwbGljaXQgCj4gZnVuY3Rpb24gdG8gcHJvY2VlZCB3aXRoIHRoZSBzdGF0dXMg c3RhZ2UuIFRoYXQgY291bGQgaW50ZXJuYWxseSBxdWV1ZSBhIFpMUCAKPiByZXF1ZXN0IG9yIGNh bGwgYW5vdGhlciBBUEksIGJ1dCBpbiBhbnkgY2FzZSBJIGRvbid0IHdhbnQgdGhlIHN0YXR1cyBz dGFnZSBaTFAgCj4gcmVxdWVzdCB0byBiZSB2aXNpYmxlIHRvIHRoZSBmdW5jdGlvbiBkcml2ZXJz LiBEbyB5b3UgYWdyZWUgd2l0aCB0aGlzID8KCndoeSBjYW4ndCBpdCBiZSB2aXNpYmxlPyBJIGRv bid0IG1pbmQgaGF2aW5nIGEgZnVuY3Rpb24gd3JhcHBpbmcKdXNiX2VwX3F1ZXVlKCksIGJ1dCB3 aHkgaXMgaXQgYmFkIHRvIGhhdmUgZnVuY3Rpb25zIGNhbGwgdXNiX2VwX3F1ZXVlKCkKZGlyZWN0 bHk/Cgo+IFRvIHNpbXBsaWZ5IGZ1bmN0aW9uIGRyaXZlcnMsIGRvIHlvdSB0aGluayB0aGUgYWJv dmUgcHJvcG9zYWwgb2YgYWRkaW5nIGEgZmxhZyAKPiB0byB0aGUgKGRhdGEgc3RhZ2UpIHJlcXVl c3QgdG8gcmVxdWVzdCBhbiBhdXRvbWF0aWMgdHJhbnNpdGlvbiB0byB0aGUgc3RhdHVzIAo+IHN0 YWdlIGlzIGEgZ29vZCBpZGVhID8gV2UgY291bGQgZXZlbiBwb3NzaWJseSBpbnZlcnQgdGhlIGxv Z2ljIGFuZCB0cmFuc2l0aW9uIAoKbm8sIEkgZG9uJ3QgdGhpbmsgc28uIE1ha2luZyB0aGUgc3Rh dHVzIHBoYXNlIGFsd2F5cyBleHBsaWNpdCBpcyBmYXIKYmV0dGVyLiBVRENzIHdvbid0IGhhdmUg dG8gY2hlY2sgZmxhZ3MsIG9yIGFjdCBvbiBtYWdpYyByZXR1cm4KdmFsdWVzLiBJdCBqdXN0IHdv bid0IGRvIGFueXRoaW5nIHVudGlsIGEgcmVxdWVzdCBpcyBxdWV1ZWQuCg==