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: usb: musb: Support gadget mode when the port is set to dual role From: Maxime Ripard Message-Id: <20190322134630.c4cauwj5smxvj77y@flea> Date: Fri, 22 Mar 2019 14:46:30 +0100 To: Bin Liu , Greg Kroah-Hartman , Paul Kocialkowski , Paul Kocialkowski , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Chen-Yu Tsai List-ID: T24gRnJpLCBNYXIgMjIsIDIwMTkgYXQgMDg6Mjg6NDZBTSAtMDUwMCwgQmluIExpdSB3cm90ZToK PiBPbiBGcmksIE1hciAyMiwgMjAxOSBhdCAwMjowOTo1M1BNICswMTAwLCBNYXhpbWUgUmlwYXJk IHdyb3RlOgo+ID4gT24gRnJpLCBNYXIgMjIsIDIwMTkgYXQgMDc6NDY6MjJBTSAtMDUwMCwgQmlu IExpdSB3cm90ZToKPiA+ID4gT24gVGh1LCBNYXIgMjEsIDIwMTkgYXQgMDU6NDE6MzhQTSArMDEw MCwgR3JlZyBLcm9haC1IYXJ0bWFuIHdyb3RlOgo+ID4gPiA+IE9uIFRodSwgTWFyIDIxLCAyMDE5 IGF0IDAyOjAxOjMzUE0gKzAxMDAsIE1heGltZSBSaXBhcmQgd3JvdGU6Cj4gPiA+ID4gPiBIaSwK PiA+ID4gPiA+Cj4gPiA+ID4gPiBJJ20gcmV2aXZpbmcgdGhpcyB0aHJlYWQgYSBiaXQsIGJlY2F1 c2UgSSBlbmNvdW50ZXJlZCB0aGlzIGJ1ZyB0b2RheS4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBPbiBU aHUsIE1hciAyMSwgMjAxOSBhdCAxMTowMjoxMEFNICswMTAwLCBCaW4gTGl1IHdyb3RlOgo+ID4g PiA+ID4gPiBPbiBTYXQsIEFwciAyMSwgMjAxOCBhdCAxMjo1OToyM1BNICswMjAwLCBQYXVsIEtv Y2lhbGtvd3NraSB3cm90ZToKPiA+ID4gPiA+ID4gPiBIaSwKPiA+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiA+IExlIHZlbmRyZWRpIDIwIGF2cmlsIDIwMTggw6AgMDk6MjUgLTA1MDAsIEJpbiBMaXUg YSDDqWNyaXQgOgo+ID4gPiA+ID4gPiA+ID4gT24gVGh1LCBNYXIgMjksIDIwMTggYXQgMDE6NTc6 MjRQTSArMDIwMCwgUGF1bCBLb2NpYWxrb3dza2kgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+IEhp LAo+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiBPbiBUaHUsIDIwMTgtMDMtMjkg YXQgMTE6MjMgKzAyMDAsIE1heGltZSBSaXBhcmQgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+ID4g T24gV2VkLCBNYXIgMjgsIDIwMTggYXQgMTE6NTI6MTNQTSArMDIwMCwgUGF1bCBLb2NpYWxrb3dz a2kgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBUaGlzIGFsbG93cyBkdWFsLXJvbGUgcG9y dHMgdG8gYmUgcmVwb3J0ZWQgYXMgaGF2aW5nIGdhZGdldCBtb2RlCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiBieQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gdGhlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBt dXNiX2hhc19nYWRnZXQgaGVscGVyLiBUaGlzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBNVVNCIGF0 IGFsbAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gd2l0aAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gTVVT Qgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gZ2x1ZSBsYXllcnMgdGhhdCBzZXQgdGhlIHBvcnQgbW9k ZSB0byBNVVNCX1BPUlRfTU9ERV9EVUFMX1JPTEUKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGF0Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiBpbml0Lgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IE1vc3Qgbm90YWJseSwgdGhpcyBhbGxvd3MgY2FsbGluZyBtdXNiX3N0YXJ0 IHdoZW4gbmVlZGVkIGluIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gdmlydHVhbAo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gTVVTQiByb290IEhVQiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBj dXJyZW50IG1vZGUgc2hvdWxkIGJlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBnYWRnZXQKPiA+ID4g PiA+ID4gPiA+ID4gPiA+IG9yIGhvc3QuCj4gPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiA+ID4gPiA+ID4gVGhpcyBmaXhlcyBVU0IgT1RHIG9uIEFsbHdpbm5lciBkZXZpY2VzIHRoYXQg SSBjb3VsZCB0ZXN0IGl0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiB3aXRoLAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gbWFpbmx5IEEyMCBkZXZpY2VzLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4g PiA+ID4gPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IFBhdWwgS29jaWFsa293c2tpIDxjb250YWN0 QHBhdWxrLmZyPgo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ID4gU3VyZWx5 IHRoZXJlJ3MgbW9yZSB0byBpdCB0aGFuIHRoYXQuIFRoZSBnYWRnZXQgbW9kZSBvZiBBMjAgYm9h cmRzCj4gPiA+ID4gPiA+ID4gPiA+ID4gaGF2ZSBiZWVuIHdvcmtpbmcgaW4gdGhlIHBhc3QsIGlu Y2x1ZGluZyB3aGVuIGNvbXBpbGluZyB3aXRoIG1VU0IKPiA+ID4gPiA+ID4gPiA+ID4gPiBzZXR1 cCBhcyBkdWFsIHJvbGUuCj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiBJ cyB0aGlzIGEgcmVncmVzc2lvbiBzaW5jZSBhIHBhcnRpY3VsYXIgY29tbWl0PyBPciBpcyB0aGVy ZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGFub3RoZXIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gZGVlcGVy IGlzc3VlIG92ZXJsb29rZWQgaW4gdGhlIGNvbW1pdCBsb2c/Cj4gPiA+ID4gPiA+ID4gPiA+Cj4g PiA+ID4gPiA+ID4gPiA+IFRoZSByb290IG9mIHRoZSBpc3N1ZSBoZXJlIGlzIHRoYXQgbXVzYl9z dGFydCBpcyBub3QgY2FsbGVkIGF0IGFueQo+ID4gPiA+ID4gPiA+ID4gPiBwb2ludAo+ID4gPiA+ ID4gPiA+ID4gPiB3aXRob3V0IHRoaXMgcGF0Y2guIE15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGZs b3cgaXMgdGhlIGZvbGxvd2luZzoKPiA+ID4gPiA+ID4gPiA+ID4gd2hlbgo+ID4gPiA+ID4gPiA+ ID4gPiB0aGUgUEhZIGRldGVjdHMgdGhhdCB0aGVyZSB3YXMgYSBWQlVTL0lEIGNoYW5nZSwgaXQg d2lsbCBub3RpZnkgaXRzCj4gPiA+ID4gPiA+ID4gPiA+IGxpc3RlbmVycyAobWFpbmx5IHRoZSBt dXNiIHN1bnhpIGdsdWUgbGF5ZXIpLiBUaGlzIHdpbGwgdGhlbgo+ID4gPiA+ID4gPiA+ID4gPiBz Y2hlZHVsZQo+ID4gPiA+ID4gPiA+ID4gPiB0aGUgZHJpdmVyJ3Mgd29yayAoc3VueGlfbXVzYl93 b3JrKSwgd2hpY2ggZG9lcyBub3RoaW5nIHNpbmNlIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiBTVU5Y SV9NVVNCX0ZMX0VOQUJMRUQgYml0IHdhcyBuZXZlciBzZXQuIFRoaXMgYml0IGlzIG9ubHkgc2V0 IGFmdGVyCj4gPiA+ID4gPiA+ID4gPiA+IGNhbGxpbmcgc3VueGlfbXVzYl9lbmFibGUsIHdoaWNo IGlzIGNhbGxlZCBmcm9tCj4gPiA+ID4gPiA+ID4gPiA+IG11c2JfcGxhdGZvcm1fZW5hYmxlLAo+ ID4gPiA+ID4gPiA+ID4gPiB0aGF0IG9yaWdpbmF0ZXMgZnJvbSBtdXNiX3N0YXJ0Lgo+ID4gPiA+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiBDdXJyZW50bHkgSSBzZWUgdHdvIHBsYWNlcyB3 aGVyZSBtdXNiX3N0YXJ0IGlzIGNhbGxlZDoKPiA+ID4gPiA+ID4gPiA+ID4gKiBtdXNiX3ZpcnRo dWIKPiA+ID4gPiA+ID4gPiA+ID4gKiBtdXNiX2dhZGdldAo+ID4gPiA+ID4gPiA+ID4gPgo+ID4g PiA+ID4gPiA+ID4gPiBJbiB0aGUgbGF0dGVyIGNhc2UsIGl0IGlzIGluIHR1cm4gY2FsbGVkIGZy b20gdWRjX3N0YXJ0LCB3aGljaAo+ID4gPiA+ID4gPiA+ID4gPiBzaG91bGQKPiA+ID4gPiA+ID4g PiA+ID4gcHJvYmFibHkgKGNvcnJlY3QgbWUgaWYgSSdtIHdyb25nKSBoYXBwZW4gbGF0ZXIgaW4g dGhlIGNhbGwgY2hhaW4KPiA+ID4gPiA+ID4gPiA+ID4gdGhhbgo+ID4gPiA+ID4gPiA+ID4gPiBJ RC9WQlVTIGNoYW5nZSBub3RpZmljYXRpb24gdGltZS4KPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+ID4gPiBJIGRvbid0IHRoaW5rIGl0IGlzIGNvcnJlY3QgdGhhdCB1ZGNfc3RhcnQoKSBpcyB0 cmlnZ2VyZWQgYnkgSUQvVkJVUwo+ID4gPiA+ID4gPiA+ID4gZXZlbnRzLCBidXQgSSBkb24ndCBo YXZlIGFuIEFsbHdpbm5lciBwbGF0Zm9ybSB0byB2ZXJpZnkgdGhlIGNhbGxmbG93Lgo+ID4gPiA+ ID4gPiA+Cj4gPiA+ID4gPiA+ID4gWWVzIHlvdSdyZSByaWdodCwgSSBkaWRuJ3QgbWFrZSBteXNl bGYgdmVyeSBjbGVhciBoZXJlLiBJIGRpZG4ndAo+ID4gPiA+ID4gPiA+IGludmVzdGlnYXRlIHRo ZSB1ZGNfc3RhcnQgY2FsbCBwYXRoIG11Y2ggc2luY2UgaXQgd2FzIGFwcGFyZW50bHkgbm90IHRo ZQo+ID4gPiA+ID4gPiA+IGN1bHByaXQuCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IEhh dmUgeW91IHRyaWVkIHRvIGxvYWQgd2l0aCBhIGdhZGdldCBkcml2ZXI/IFdoZW4gYSBnYWRnZXQg ZnVuY3Rpb24gaXMKPiA+ID4gPiA+ID4gPiA+IGJvdW5kIHRvIFVEQywgdWRjX3N0YXJ0KCkgaXMg dHJpZ2dlcmVkLCB3aGljaCBpbiB0dXJuIGNhbGxzCj4gPiA+ID4gPiA+ID4gPiBtdXNiX3N0YXJ0 KCkuCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBJdCBkb2VzIHdvcmsgdW5kZXIgdGhhdCBz Y2VuYXJpbywgYWx0aG91Z2ggbXkgdXNlZCBjYXNlIGhlcmUgaXMgdXNpbmcKPiA+ID4gPiA+ID4g PiBtdXNiIHdpdGggRFVBTF9ST0xFIGJ1dCBubyBnYWRnZXQgZHJpdmVyIGxvYWRlZC4gVGhhdCBp dCwgSSB3YW50IHRoZQo+ID4gPiA+ID4gPiA+IG11c2Jfc3RhcnQgY2FsbCB0byBvcmlnaW5hdGUg ZnJvbSB0aGUgdmlydHVhbCBodWIsIG5vdCBmcm9tIHRoZSBnYWRnZXQKPiA+ID4gPiA+ID4gPiBz aWRlLgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+IEluIHRoZSBmb3JtZXIgY2FzZSwg bXVzYl9zdGFydCBpcyBjYWxsZWQgaW4gdGhlIHJvb3QgY29udHJvbGxlciBodWIKPiA+ID4gPiA+ ID4gPiA+ID4gY29udHJvbCwgd2hlbiBzZXR0aW5nIHRoZSBVU0JfUE9SVF9GRUFUX1BPV0VSIGZl YXR1cmUuIFRoaXMgbG9va3MKPiA+ID4gPiA+ID4gPiA+ID4gcGVyZmVjdGx5IGxlZ2l0IGFuZCBJ TU8gdGhpcyBpcyB3aGVyZSBpdCBzaG91bGQgYmUgaW5pdGlhbGx5IGNhbGxpbmcKPiA+ID4gPiA+ ID4gPiA+ID4gbXVzYl9zdGFydCBpbiB0aGUgZHVhbCByb2xlIGNhc2UuIFRoZSBrZXJuZWwgaXMg aW5kZWVkIHNldHRpbmcgdGhlCj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gTm8gYWN0 dWFsbHkuIEEgZHVhbC1yb2xlIHBvcnQgc2hvdWxkIGJlIGluIGJfaWRsZSBzdGF0ZSBieSBkZWZh dWx0LCBzbwo+ID4gPiA+ID4gPiA+ID4gbG9naWNhbGx5IGFsbCBhY3Rpb25zIHNob3VsZCBnbyB0 byB0aGUgZ2FkZ2V0IHBhdGggdW50aWwgdGhlIHBvcnQKPiA+ID4gPiA+ID4gPiA+IHN3aXRjaGVz IHRvIGhvc3QgbW9kZS4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IEl0IG1ha2VzIHNlbnNl IHRoYXQgdGhlIHBvcnQgc2hvdWxkIGJlIGluIGJfaWRsZSBzdGF0ZSBieSBkZWZhdWx0LCBidXQK PiA+ID4gPiA+ID4gPiBoZXJlIGl0IGZhaWxzIHRvIHN3aXRjaCB0byBob3N0IG1vZGUgd2hlbiB0 aGUgSUQgcGluIGRldGVjdHMgdGhhdCBpdAo+ID4gPiA+ID4gPiA+IHNob3VsZC4gT3IgZG9lcyBi X2lkbGUgc3RhdGUgZW50YWlsIHRoYXQgYSBnYWRnZXQgbXVzdCBiZSBsb2FkZWQgKHBlcgo+ID4g PiA+ID4gPiA+IHRoZSBVU0Igc3BlYyksIGFuZCB0aHVzIG5vdGhpbmcgc2hvdWxkIChldmVyKSBo YXBwZW4gdW50aWwgdGhhdCBoYXBwZW5zPwo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gSSBm aW5kIGl0IHJlYWxseSBvZGQgdG8gbmVlZCBhIGdhZGdldCBkZXZpY2UgdG8gdHJpZ2dlciBob3N0 IG1vZGUuCj4gPiA+ID4gPiA+ID4gVGhpcyBwYXRjaCBkb2VzIGZpeCB0aGUgaXNzdWUsIGJ1dCBJ IGFtIHB1enpsZWQgYXMgdG8gd2h5IGl0IGlzIG5lZWRlZAo+ID4gPiA+ID4gPiA+IGluIHRoZSBm aXJzdCBwbGFjZS4gVGhlIGNvbW1lbnQgYWJvdmUgaXQgbWVudGlvbnMgdGhhdCAiSW4gT1RHIG1v ZGUgd2UKPiA+ID4gPiA+ID4gPiBoYXZlIHRvIHdhaXQgdW50aWwgd2UgbG9hZGVkIGEgZ2FkZ2V0 LiBXZSBkb24ndCByZWFsbHkgbmVlZCBhIGdhZGdldCBpZgo+ID4gPiA+ID4gPiA+IHdlIG9wZXJh dGUgYXMgYSBob3N0IGJ1dCB3ZSBzaG91bGQgbm90IHN0YXJ0IGEgc2Vzc2lvbiBhcyBhIGRldmlj ZQo+ID4gPiA+ID4gPiA+IHdpdGhvdXQgYSBnYWRnZXQgb3IgZWxzZSB3ZSBleHBsb2RlLiIsIHdo aWNoIGlzIGFwcGFyZW50bHkgY29tcGF0aWJsZQo+ID4gPiA+ID4gPiA+IHdpdGggbXkgdXNlIGNh c2U6IGEgZ2FkZ2V0IGlzIG5vdCByZWFsbHkgbmVlZGVkIGFuZCBJJ20gbm90IHRyeWluZyB0bwo+ ID4gPiA+ID4gPiA+IHN0YXJ0IGEgc2Vzc2lvbiBhcyBhIGRldmljZSB3aXRob3V0IGEgZ2FkZ2V0 IGxvYWRlZC4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IFdoYXQgZG8geW91IHRoaW5rPwo+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBPa2F5LCB0aGlzIGNhbWUgZG93biB0byBhbiBhcmd1bWVu dCB0aGF0IHdoZXRoZXIgd2Ugc2hvdWxkIHJlcXVpcmUKPiA+ID4gPiA+ID4gbG9hZGluZyBhIGdh ZGdldCBkcml2ZXIgb24gYSBkdWFsLXJvbGUgcG9ydCB0byB3b3JrIGluIGhvc3QgbW9kZSwKPiA+ ID4gPiA+ID4gd2hpY2ggaXMgY3VycmVudGx5IHJlcXVpcmVkIG9uIG11c2Igc2luY2UgYSBsb25n IGxvbmcgdGltZSBhZ28uCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEkgdW5kZXJzdGFuZCB0aGUg cmVxdWlyZW1lbnQgaXMga2luZGEgdW5uZWNlc3NhcnksIGJ1dCBzaW5jZSBpdCBhbHJlYWR5Cj4g PiA+ID4gPiA+IGV4aXN0cyBvbiBtdXNiIHN0YWNrIGZvciBhIGxvbmcgdGltZSwgSSBkb24ndCBw bGFuIHRvIGNoYW5nZSBpdC4gQmVjYXVzZSBJCj4gPiA+ID4gPiA+IGNhbm5vdCB0aGluayBvZiBh IHVzZSBjYXNlIGluIHJlYWwgcHJvZHVjdHMgdGhhdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkKPiA+ ID4gPiA+ID4gbG9hZCBhIGdhZGdldCBmdW5jdGlvbiBvbiB0aGUgZHVhbC1yb2xlIHBvcnQuCj4g PiA+ID4gPiA+Cj4gPiA+ID4gPiA+IElmIHlvdSBjYW4gZXhwbGFpbiBhIHVzZSBjYXNlIGluIHJl YWwgd29ybGQgKG5vdCBhIGVuZ2luZWVyaW5nIGxhYikgdGhhdAo+ID4gPiA+ID4gPiB0aGUgZ2Fk Z2V0IGRyaXZlciB3aWxsIG5vdCBiZSBsb2FkZWQgYXQgbGludXggYm9vdGluZyB1cCwgYnV0IGxh dGVyCj4gPiA+ID4gPiA+IGJhc2VkIG9uIHVzZXIncyBpbnB1dCwgSSB3aWxsIHJlY29uc2lkZXIg bXkgZGVjaXNpb24uIFRvIHJlbW92ZSB0aGlzCj4gPiA+ID4gPiA+IHJlcXVpcmVtZW50IGZyb20g bXVzYiBzdGFjaywgdGhlIHdvcmsgaXMgbW9yZSB0aGFuIHRoaXMgcGF0Y2guCj4gPiA+ID4gPgo+ ID4gPiA+ID4gSSBoYXZlIG9uZSBmb3IgeW91OiB3ZSdyZSB3b3JraW5nIG9uIGEgZGV2aWNlIHRo YXQgYm9vdHMgcHJldHR5IGZhc3QsCj4gPiA+ID4gPiBhbmQgdGhlcmVmb3JlIGFyZSBwdXNoaW5n IGFzIG11Y2ggdGhpbmdzIGFzIHdlIGNhbiB0byBtb2R1bGVzLiBJdAo+ID4gPiA+ID4gaW5jbHVk ZXMgZ2FkZ2V0cywgdGhlIG11c2IgZHJpdmVyIGFuZCBnbHVlLCBldGMuIFRoYXQgZG9lc24ndCBz b3VuZAo+ID4gPiA+ID4gd2F5IHZlcnkgZGlmZmVyZW50IGZyb20gd2hhdCBhIGdlbmVyaWMgZGlz dHJvIHdvdWxkIGRvIGFzIHdlbGwuCj4gPiA+ID4gPgo+ID4gPiA+ID4gQXQgYm9vdCwgdGhlIHZh cmlvdXMgbW9kdWxlcyBmb3IgdGhlIGhhcmR3YXJlIGFyZSBsb2FkZWQKPiA+ID4gPiA+IGF1dG9t YXRpY2FsbHk6IHRoZSBtdXNiIGdsdWUsIHRoZSBtdXNiIGNvcmUsIG91ciBVU0IgUEhZLCBldGMu IFdlIGVuZAo+ID4gPiA+ID4gdXAgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIG11c2IgZHJpdmVy IGlzIGxvYWRlZCBhbmQgcmVwb3J0ZWQgdG8gd29yawo+ID4gPiA+ID4gcHJvcGVybHkuIFRoZSBV U0IgY2FibGUgdG8gdGhlIE9URyBwb3J0IChpbiBwZXJpcGhlcmFsKSBtaWdodCBvciBtaWdodAo+ ID4gPiA+ID4gbm90IGJlIGNvbm5lY3RlZCwgaXQncyBraW5kIG9mIGlycmVsZXZhbnQuCj4gPiA+ ID4gPgo+ID4gPiA+ID4gVGhlIGdhZGdldHMsIGhvd2V2ZXIsIGFyZSBub3QgbG9hZGVkIGF1dG9t YXRpY2FsbHkuCj4gPiA+ID4gPgo+ID4gPiA+ID4gTm93IGNvbWVzIGEgdXNlciB0aGF0IHdhbnRz IHRvIHVzZSBtdXNiIGFzIGEgaG9zdCwgYW5kIGNvbm5lY3QgYQo+ID4gPiA+ID4gcHJvcGVyIFVT QiBhZGFwdGVyLCB0aGF0IHdpcmVzIHRoZSBJRCBwaW4gcHJvcGVybHkuIEluIG91ciBjYXNlLCB0 aGUKPiA+ID4gPiA+IHBoeSBkZXRlY3RzIGl0LCByZXBvcnRzIHRoZSBtb2RlIGNoYW5nZSwgYW5k IC4uLi4gbm90aGluZy4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBUaGF0IGRvZXNuJ3QgcmVhbGx5IGxv b2sgbGlrZSBhbiBlbmdpbmVlcmluZyBsYWIgc2V0dXAgdG8gbWUuCj4gPiA+ID4KPiA+ID4gPiBJ IGFncmVlLCB0aGF0IHNvdW5kcyBsaWtlIGEgdmFsaWQgc2V0dXAuCj4gPiA+ID4KPiA+ID4gPiBB bHNvIHJlYWxpemUgdGhhdCBBbmRyb2lkIGlzIHB1c2hpbmcgdG8gaGF2ZSBhbGwgZHJpdmVycyBh cyBtb2R1bGVzLCBzbwo+ID4gPiA+IHlvdSB3aWxsIHN0YXJ0IHRvIHNlZSBhIHdob2xlIGxvdCBt b3JlIGRldmljZXMgb3V0IHRoZXJlIGJlIG1vZHVsYXIKPiA+ID4gPiBpbnN0ZWFkIG9mIHN0YXRp Y2FsbHkgYnVpbHQga2VybmVscy4gIFNvIGlzc3VlcyBsaWtlIHRoaXMgYXJlIGdvb2QgdG8KPiA+ ID4gPiByZXNvbHZlIDopCj4gPiA+Cj4gPiA+IFRoaXMgaXNzdWUgaGVyZSBpcyBub3QgcmVsYXRl ZCB0byBidWlsZGluZyBhbGwgZHJpdmVycyBhcyBtb2R1bGVzLiBUb2RheQo+ID4gPiB3ZSBhbHJl YWR5IGhhdmUgYWxsIG11c2IgcmVsYXRlZCBkcml2ZXJzIGluY2x1ZGluZyBnYWRnZXQgZHJpdmVy cyBpbgo+ID4gPiBtb2R1bGVzLgo+ID4gPgo+ID4gPiBUaGUgaXNzdWUgZGlzY3Vzc2VkIGhlcmUg aXMgdGhhdCB3aGVuIG11c2IgaXMgY29uZmlndXJlZCBpbiBkdWFsLXJvbGUKPiA+ID4gbW9kZSAo ZHJfbW9kZSA9ICdvdGcnIGluIGR0cyksIGEgZ2FkZ2V0IGRyaXZlciBoYXMgdG8gYmUgYm91bmQg dG8gdGhlCj4gPiA+IHVkYyB0byBtYWtlIG11c2Igd29ya2luZyBpbiBob3N0IG1vZGUuCj4gPiA+ Cj4gPiA+IEkgbmV2ZXIgZGlzYWdyZWUgaXQgaXMgbm90IGlkZWFsLCBidXQgSSBjb25zaWRlciBp dCBpcyBtaW5vciAtIHNpbmNlIHRoZQo+ID4gPiBwb3J0IGlzIGNvbmZpZ3VyZWQgdG8gZHVhbC1y b2xlIG1vZGUsIGl0IGlzIGludGVuZGVkIHRvIHdvcmsgaW4KPiA+ID4gcGVyaXBoZXJhbCBtb2Rl LCB0aGVuIHdoeSBub3QgYXV0b21hdGljYWxseSBsb2FkIHRoZSBnYWRnZXQgZHJpdmVyIHdoZW4K PiA+ID4gbGludXggYm9vdHMgdXAuCj4KPiBBZ2FpbiwgdGhpbmsgYWJvdXQgYW4gZW1iZWRkZWQg cHJvZHVjdCwKClRoYXQncyBhbGwgSSdtIHRoaW5raW5nIGFib3V0LgoKPiBpZiBkcl9tb2RlIGlz ICdvdGcnIHdoaWNoIGluZGljYXRlcyB0aGUgcGVyaXBoZXJhbCBtb2RlIHdpbGwgYmUgdXNlZAo+ IGF0IHNvbWUgcG9pbnQKCk5vLCBpdCBpbmRpY2F0ZXMgdGhhdCBpdCAqbWlnaHQqIGJlIHVzZWQg YXQgc29tZSBwb2ludCwgYmFzZWQgb24gYQpudW1iZXIgb2YgZXh0ZXJuYWwgZmFjdG9ycywgaW5j bHVkaW5nOgogIC0gV2hldGhlciBvciBub3QgdGhlIHVzZXIgaGFzIHBsdWdnZWQgc29tZXRoaW5n IGluIHRoZSBjb25uZWN0ZWQgVVNCCiAgICBjb25uZWN0b3IKICAtIElmIHRoZXkgZGlkIHNvLCBo b3cgdGhlIElEIHBpbiBoYXMgYmVlbiB3aXJlZCAoYW5kIHRoZXJlZm9yZSwgaXMKICAgIGEgZGV2 aWNlIG9yIGEgaG9zdCBvbiB0aGUgb3RoZXIgZW5kKQogIC0gQW5kIGhvdyB0aGUgc3lzdGVtIGRl c2lnbmVyIGRlY2lkZWQgdG8gY29uZmlndXJlIHRoZWlyIGtlcm5lbCBhbmQKICAgIHVzZXJzcGFj ZS4KCj4gd2hlbiBhbmQgaG93IHRvIGxvYWQgdGhlIGdhZGdldCBkcml2ZXIgaWYgaXQgaXMgbm90 IGxvYWRlZAo+IGF1dG9tYXRpY2FsbHkgd2hlbiBMaW51eCBib290cyB1cD8gdGhlIGVuZCB1c2Vy IGRvZXNuJ3QgaGF2ZSBhY2Nlc3MKPiB0byB0aGUgY29uc29sZS4KCkFuIGFwcGxpY2F0aW9uIGNv dWxkIGxvYWQgaXQuIEFuZCByZWFsbHksIHdlIHN0YXJ0IHNlZWluZyBTb0NzIGluIG1vcmUKYW5k IG1vcmUgcGMtbGlrZSBkZXZpY2VzLCBpbmNsdWRpbmcgd2l0aCBtVVNCLCBzbyBJIGRvbid0IHRo aW5rIHdlCnNob3VsZCBiZSBtYWtpbmcgYXNzdW1wdGlvbnMgaGVyZS4KCkhvdyBkbyB5b3UgdGhp bmsgRmVkb3JhLCBVYnVudHUgb3IgRGViaWFuIHdvdWxkIGJlaGF2ZSBoZXJlPwoKPiA+IEJlY2F1 c2Ugbm8gb3RoZXIgY29udHJvbGxlciByZXF1aXJlcyBpdCBhbmQgdGhlcmVmb3JlIGl0J3Mgbm90 Cj4gPiBzdGFuZGFyZCBhbmQgdmlvbGF0ZXMgdGhlIHByaW5jaXBsZSBvZiBsZWFzdCBzdXJwcmlz ZT8KPgo+IEkga25vdyBubyBvdGhlciBjb250cm9sbGVyIGRvZXMgdGhpcywgYnV0IHRoaXMgZG9l c24ndCBtZWFuIGl0IGlzIG5vdAo+IHN0YW5kYXJkLgoKSSdtIHByZXR0eSBzdXJlIHRoYXQgd291 bGQgYmUgdGhlIGRlZmluaXRpb24gb2YgInN0YW5kYXJkIiwgb3Igb2YgYQpub3JtIGF0IGxlYXN0 LgoKPiA+IEFuZCBldmVuIHdpdGhvdXQgdGFraW5nIHRoaXMgaW50byBhY2NvdW50LCB0aGVyZSdz IGFsc28gdGhlIGZhY3QgdGhhdAo+ID4gd2hpbGUgdGhlICpoYXJkd2FyZSogY2FuIGRvIGR1YWwg cm9sZSwgdGhlIHNvZnR3YXJlIG1pZ2h0IGRlY2lkZQo+ID4gb3RoZXJ3aXNlLiBJZiBJIGRvbid0 IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciBhbnkgZ2FkZ2V0IChhdCBhbGwpIGluCj4gPiB0aGUg ZW5kIHN5c3RlbSwgdGhlbiB3aHkgc2hvdWxkIEkgYmUgZm9yY2VkIHRvIGNvbXBpbGUgYW5kIGxv YWQKPiA+IHNvbWV0aGluZyBJIGRvbid0IGV2ZW4gd2FudCB0byB1c2UgaW4gdGhlIGZpcnN0IHBs YWNlPwo+Cj4gdGhlbiBkcl9tb2RlIHNob3VsZCBiZSBzZXQgdG8gJ2hvc3QnIGluc3RlYWQsIHlv dSBkb24ndCBoYXZlIHRvIGxvYWQgYQo+IGdhZGdldCBpZiBwZXJpcGhlcmFsIG1vZGUgd2lsbCBu ZXZlciBiZSB1c2VkLgoKTm8uIFRoZSBoYXJkd2FyZSBpcyBwZXJmZWN0bHkgY2FwYWJsZSBvZiB1 c2luZyBPVEcuIFRoZSBzb2Z0d2FyZSBoYXMKYmVlbiBjb25maWd1cmVkIG5vdCB0by4KCk1heGlt ZQotLS0KTWF4aW1lIFJpcGFyZCwgQm9vdGxpbgpFbWJlZGRlZCBMaW51eCBhbmQgS2VybmVsIGVu Z2luZWVyaW5nCmh0dHBzOi8vYm9vdGxpbi5jb20K