U29tZSB3YXJuaW5ncywgZmlyc3QuCgogKiBCSUcgRkFUIFdBUk5JTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIElmIHlvdSB0b3VjaCBhbnl0aGluZyBvbiBkaXNrIGJldHdlZW4gc3VzcGVuZCBhbmQgcmVzdW1lLi4uCiAqCQkJCS4uLmtpc3MgeW91ciBkYXRhIGdvb2RieWUuCiAqCiAqIElmIHlvdSBkbyByZXN1bWUgZnJvbSBpbml0cmQgYWZ0ZXIgeW91ciBmaWxlc3lzdGVtcyBhcmUgbW91bnRlZC4uLgogKgkJCQkuLi5ieWUgYnllIHJvb3QgcGFydGl0aW9uLgogKgkJCVt0aGlzIGlzIGFjdHVhbGx5IHNhbWUgY2FzZSBhcyBhYm92ZV0KICoKICogSWYgeW91IGhhdmUgdW5zdXBwb3J0ZWQgKCopIGRldmljZXMgdXNpbmcgRE1BLCB5b3UgbWF5IGhhdmUgc29tZQogKiBwcm9ibGVtcy4gSWYgeW91ciBkaXNrIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHN1c3BlbmQuLi4gKElERSBkb2VzKSwKICogaXQgbWF5IGNhdXNlIHNvbWUgcHJvYmxlbXMsIHRvby4gSWYgeW91IGNoYW5nZSBrZXJuZWwgY29tbWFuZCBsaW5lCiAqIGJldHdlZW4gc3VzcGVuZCBhbmQgcmVzdW1lLCBpdCBtYXkgZG8gc29tZXRoaW5nIHdyb25nLiBJZiB5b3UgY2hhbmdlCiAqIHlvdXIgaGFyZHdhcmUgd2hpbGUgc3lzdGVtIGlzIHN1c3BlbmRlZC4uLiB3ZWxsLCBpdCB3YXMgbm90IGdvb2QgaWRlYTsKICogYnV0IGl0IHdpbGwgcHJvYmFibHkgb25seSBjcmFzaC4KICoKICogKCopIHN1c3BlbmQvcmVzdW1lIHN1cHBvcnQgaXMgbmVlZGVkIHRvIG1ha2UgaXQgc2FmZS4KICoKICogSWYgeW91IGhhdmUgYW55IGZpbGVzeXN0ZW1zIG9uIFVTQiBkZXZpY2VzIG1vdW50ZWQgYmVmb3JlIHNvZnR3YXJlIHN1c3BlbmQsCiAqIHRoZXkgd29uJ3QgYmUgYWNjZXNzaWJsZSBhZnRlciByZXN1bWUgYW5kIHlvdSBtYXkgbG9zZSBkYXRhLCBhcyB0aG91Z2gKICogeW91IGhhdmUgdW5wbHVnZ2VkIHRoZSBVU0IgZGV2aWNlcyB3aXRoIG1vdW50ZWQgZmlsZXN5c3RlbXMgb24gdGhlbTsKICogc2VlIHRoZSBGQVEgYmVsb3cgZm9yIGRldGFpbHMuICAoVGhpcyBpcyBub3QgdHJ1ZSBmb3IgbW9yZSB0cmFkaXRpb25hbAogKiBwb3dlciBzdGF0ZXMgbGlrZSAic3RhbmRieSIsIHdoaWNoIG5vcm1hbGx5IGRvbid0IHR1cm4gVVNCIG9mZi4pCgpZb3UgbmVlZCB0byBhcHBlbmQgcmVzdW1lPS9kZXYveW91cl9zd2FwX3BhcnRpdGlvbiB0byBrZXJuZWwgY29tbWFuZApsaW5lLiBUaGVuIHlvdSBzdXNwZW5kIGJ5CgplY2hvIHNodXRkb3duID4gL3N5cy9wb3dlci9kaXNrOyBlY2hvIGRpc2sgPiAvc3lzL3Bvd2VyL3N0YXRlCgouIElmIHlvdSBmZWVsIEFDUEkgd29ya3MgcHJldHR5IHdlbGwgb24geW91ciBzeXN0ZW0sIHlvdSBtaWdodCB0cnkKCmVjaG8gcGxhdGZvcm0gPiAvc3lzL3Bvd2VyL2Rpc2s7IGVjaG8gZGlzayA+IC9zeXMvcG93ZXIvc3RhdGUKCi4gSWYgeW91IGhhdmUgU0FUQSBkaXNrcywgeW91J2xsIG5lZWQgcmVjZW50IGtlcm5lbHMgd2l0aCBTQVRBIHN1c3BlbmQKc3VwcG9ydC4gRm9yIHN1c3BlbmQgYW5kIHJlc3VtZSB0byB3b3JrLCBtYWtlIHN1cmUgeW91ciBkaXNrIGRyaXZlcnMKYXJlIGJ1aWx0IGludG8ga2VybmVsIC0tIG5vdCBtb2R1bGVzLiBbVGhlcmUncyB3YXkgdG8gbWFrZQpzdXNwZW5kL3Jlc3VtZSB3aXRoIG1vZHVsYXIgZGlzayBkcml2ZXJzLCBzZWUgRkFRLCBidXQgeW91IHByb2JhYmx5CnNob3VsZCBub3QgZG8gdGhhdC5dCgpJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgc3VzcGVuZCBpbWFnZSBzaXplIHRvIE4gYnl0ZXMsIGRvCgplY2hvIE4gPiAvc3lzL3Bvd2VyL2ltYWdlX3NpemUKCmJlZm9yZSBzdXNwZW5kIChpdCBpcyBsaW1pdGVkIHRvIDUwMCBNQiBieSBkZWZhdWx0KS4KCgpBcnRpY2xlIGFib3V0IGdvYWxzIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBTb2Z0d2FyZSBTdXNwZW5kIGZvciBMaW51eAp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpBdXRob3I6IEeC4WJvciBLdXRpCkxhc3QgcmV2aXNlZDogMjAwMy0xMC0yMCBieSBQYXZlbCBNYWNoZWsKCklkZWEgYW5kIGdvYWxzIHRvIGFjaGlldmUKCk5vd2FkYXlzIGl0IGlzIGNvbW1vbiBpbiBzZXZlcmFsIGxhcHRvcHMgdGhhdCB0aGV5IGhhdmUgYSBzdXNwZW5kIGJ1dHRvbi4gSXQKc2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBtYWNoaW5lIHRvIGEgZmlsZXN5c3RlbSBvciB0byBhIHBhcnRpdGlvbiBhbmQgc3dpdGNoZXMKdG8gc3RhbmRieSBtb2RlLiBMYXRlciByZXN1bWluZyB0aGUgbWFjaGluZSB0aGUgc2F2ZWQgc3RhdGUgaXMgbG9hZGVkIGJhY2sgdG8KcmFtIGFuZCB0aGUgbWFjaGluZSBjYW4gY29udGludWUgaXRzIHdvcmsuIEl0IGhhcyB0d28gcmVhbCBiZW5lZml0cy4gRmlyc3Qgd2UKc2F2ZSBvdXJzZWx2ZXMgdGhlIHRpbWUgbWFjaGluZSBnb2VzIGRvd24gYW5kIGxhdGVyIGJvb3RzIHVwLCBlbmVyZ3kgY29zdHMKYXJlIHJlYWwgaGlnaCB3aGVuIHJ1bm5pbmcgZnJvbSBiYXR0ZXJpZXMuIFRoZSBvdGhlciBnYWluIGlzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0bwppbnRlcnJ1cHQgb3VyIHByb2dyYW1zIHNvIHByb2Nlc3NlcyB0aGF0IGFyZSBjYWxjdWxhdGluZyBzb21ldGhpbmcgZm9yIGEgbG9uZwp0aW1lIHNob3VsZG4ndCBuZWVkIHRvIGJlIHdyaXR0ZW4gaW50ZXJydXB0aWJsZS4KCnN3c3VzcCBzYXZlcyB0aGUgc3RhdGUgb2YgdGhlIG1hY2hpbmUgaW50byBhY3RpdmUgc3dhcHMgYW5kIHRoZW4gcmVib290cyBvcgpwb3dlcmRvd25zLiAgWW91IG11c3QgZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBzd2FwIHBhcnRpdGlvbiB0byByZXN1bWUgZnJvbSB3aXRoCmBgcmVzdW1lPScnIGtlcm5lbCBvcHRpb24uIElmIHNpZ25hdHVyZSBpcyBmb3VuZCBpdCBsb2FkcyBhbmQgcmVzdG9yZXMgc2F2ZWQKc3RhdGUuIElmIHRoZSBvcHRpb24gYGBub3Jlc3VtZScnIGlzIHNwZWNpZmllZCBhcyBhIGJvb3QgcGFyYW1ldGVyLCBpdCBza2lwcwp0aGUgcmVzdW1pbmcuCgpJbiB0aGUgbWVhbnRpbWUgd2hpbGUgdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgeW91IHNob3VsZCBub3QgYWRkL3JlbW92ZSBhbnkKb2YgdGhlIGhhcmR3YXJlLCB3cml0ZSB0byB0aGUgZmlsZXN5c3RlbXMsIGV0Yy4KClNsZWVwIHN0YXRlcyBzdW1tYXJ5Cj09PT09PT09PT09PT09PT09PT09CgpUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGludGVyZmFjZXMgeW91IGNhbiB1c2UsIC9wcm9jL2FjcGkgc2hvdWxkCndvcmsgbGlrZSB0aGlzOgoKSW4gYSByZWFsbHkgcGVyZmVjdCB3b3JsZDoKZWNobyAxID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzdGFuZGJ5CmVjaG8gMiA+IC9wcm9jL2FjcGkvc2xlZXAgICAgICAgIyBmb3Igc3VzcGVuZCB0byByYW0KZWNobyAzID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzdXNwZW5kIHRvIHJhbSwgYnV0IHdpdGggbW9yZSBwb3dlciBjb25zZXJ2YXRpdmUKZWNobyA0ID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzdXNwZW5kIHRvIGRpc2sKZWNobyA1ID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzaHV0ZG93biB1bmZyaWVuZGx5IHRoZSBzeXN0ZW0KCmFuZCBwZXJoYXBzCmVjaG8gNGIgPiAvcHJvYy9hY3BpL3NsZWVwICAgICAgIyBmb3Igc3VzcGVuZCB0byBkaXNrIHZpYSBzNGJpb3MKCkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpROiB3ZWxsLCBzdXNwZW5kaW5nIGEgc2VydmVyIGlzIElNSE8gYSByZWFsbHkgc3R1cGlkIHRoaW5nLApidXQuLi4gKERpZWdvIFp1Y2NhdG8pOgoKQTogWW91IGJvdWdodCBuZXcgVVBTIGZvciB5b3VyIHNlcnZlci4gSG93IGRvIHlvdSBpbnN0YWxsIGl0IHdpdGhvdXQKYnJpbmdpbmcgbWFjaGluZSBkb3duPyBTdXNwZW5kIHRvIGRpc2ssIHJlYXJyYW5nZSBwb3dlciBjYWJsZXMsCnJlc3VtZS4KCllvdSBoYXZlIHlvdXIgc2VydmVyIG9uIFVQUy4gUG93ZXIgZGllZCwgYW5kIFVQUyBpcyBpbmRpY2F0aW5nIDMwCnNlY29uZHMgdG8gZmFpbHVyZS4gV2hhdCBkbyB5b3UgZG8/IFN1c3BlbmQgdG8gZGlzay4KCgpROiBNYXliZSBJJ20gbWlzc2luZyBzb21ldGhpbmcsIGJ1dCB3aHkgZG9uJ3QgdGhlIHJlZ3VsYXIgSS9PIHBhdGhzIHdvcms/CgpBOiBXZSBkbyB1c2UgdGhlIHJlZ3VsYXIgSS9PIHBhdGhzLiBIb3dldmVyIHdlIGNhbm5vdCByZXN0b3JlIHRoZSBkYXRhCnRvIGl0cyBvcmlnaW5hbCBsb2NhdGlvbiBhcyB3ZSBsb2FkIGl0LiBUaGF0IHdvdWxkIGNyZWF0ZSBhbgppbmNvbnNpc3RlbnQga2VybmVsIHN0YXRlIHdoaWNoIHdvdWxkIGNlcnRhaW5seSByZXN1bHQgaW4gYW4gb29wcy4KSW5zdGVhZCwgd2UgbG9hZCB0aGUgaW1hZ2UgaW50byB1bnVzZWQgbWVtb3J5IGFuZCB0aGVuIGF0b21pY2FsbHkgY29weQppdCBiYWNrIHRvIGl0IG9yaWdpbmFsIGxvY2F0aW9uLiBUaGlzIGltcGxpZXMsIG9mIGNvdXJzZSwgYSBtYXhpbXVtCmltYWdlIHNpemUgb2YgaGFsZiB0aGUgYW1vdW50IG9mIG1lbW9yeS4KClRoZXJlIGFyZSB0d28gc29sdXRpb25zIHRvIHRoaXM6CgoqIHJlcXVpcmUgaGFsZiBvZiBtZW1vcnkgdG8gYmUgZnJlZSBkdXJpbmcgc3VzcGVuZC4gVGhhdCB3YXkgeW91IGNhbgpyZWFkICJuZXciIGRhdGEgb250byBmcmVlIHNwb3RzLCB0aGVuIGNsaSBhbmQgY29weQoKKiBhc3N1bWUgd2UgaGFkIHNwZWNpYWwgInBvbGxpbmciIGlkZSBkcml2ZXIgdGhhdCBvbmx5IHVzZXMgbWVtb3J5CmJldHdlZW4gMC02NDBLQi4gVGhhdCB3YXksIEknZCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IDAtNjQwS0IgaXMgZnJlZQpkdXJpbmcgc3VzcGVuZGluZywgYnV0IG90aGVyd2lzZSBpdCB3b3VsZCB3b3JrLi4uCgpzdXNwZW5kMiBzaGFyZXMgdGhpcyBmdW5kYW1lbnRhbCBsaW1pdGF0aW9uLCBidXQgZG9lcyBub3QgaW5jbHVkZSB1c2VyCmRhdGEgYW5kIGRpc2sgY2FjaGVzIGludG8gInVzZWQgbWVtb3J5IiBieSBzYXZpbmcgdGhlbSBpbgphZHZhbmNlLiBUaGF0IG1lYW5zIHRoYXQgdGhlIGxpbWl0YXRpb24gZ29lcyBhd2F5IGluIHByYWN0aWNlLgoKUTogRG9lcyBsaW51eCBzdXBwb3J0IEFDUEkgUzQ/CgpBOiBZZXMuIFRoYXQncyB3aGF0IGVjaG8gcGxhdGZvcm0gPiAvc3lzL3Bvd2VyL2Rpc2sgZG9lcy4KClE6IFdoYXQgaXMgJ3N1c3BlbmQyJz8KCkE6IHN1c3BlbmQyIGlzICdTb2Z0d2FyZSBTdXNwZW5kIDInLCBhIGZvcmtlZCBpbXBsZW1lbnRhdGlvbiBvZgpzdXNwZW5kLXRvLWRpc2sgd2hpY2ggaXMgYXZhaWxhYmxlIGFzIHNlcGFyYXRlIHBhdGNoZXMgZm9yIDIuNCBhbmQgMi42Cmtlcm5lbHMgZnJvbSBzd3N1c3Auc291cmNlZm9yZ2UubmV0LiBJdCBpbmNsdWRlcyBzdXBwb3J0IGZvciBTTVAsIDRHQgpoaWdobWVtIGFuZCBwcmVlbXB0aW9uLiBJdCBhbHNvIGhhcyBhIGV4dGVuc2libGUgYXJjaGl0ZWN0dXJlIHRoYXQKYWxsb3dzIGZvciBhcmJpdHJhcnkgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBpbWFnZSAoY29tcHJlc3Npb24sCmVuY3J5cHRpb24pIGFuZCBhcmJpdHJhcnkgYmFja2VuZHMgZm9yIHdyaXRpbmcgdGhlIGltYWdlIChlZyB0byBzd2FwCm9yIGFuIE5GUyBzaGFyZVtXb3JrIEluIFByb2dyZXNzXSkuIFF1ZXN0aW9ucyByZWdhcmRpbmcgc3VzcGVuZDIKc2hvdWxkIGJlIHNlbnQgdG8gdGhlIG1haWxpbmcgbGlzdCBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc3VzcGVuZDIKd2Vic2l0ZSwgYW5kIG5vdCB0byB0aGUgTGludXggS2VybmVsIE1haWxpbmcgTGlzdC4gV2UgYXJlIHdvcmtpbmcKdG93YXJkIG1lcmdpbmcgc3VzcGVuZDIgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgoKUTogQSBrZXJuZWwgdGhyZWFkIG11c3Qgdm9sdW50YXJpbHkgZnJlZXplIGl0c2VsZiAoY2FsbCAncmVmcmlnZXJhdG9yJykuCkkgZm91bmQgc29tZSBrZXJuZWwgdGhyZWFkcyB0aGF0IGRvbid0IGRvIGl0LCBhbmQgdGhleSBkb24ndCBmcmVlemUKc28gdGhlIHN5c3RlbSBjYW4ndCBzbGVlcC4gSXMgdGhpcyBhIGtub3duIGJlaGF2aW9yPwoKQTogQWxsIHN1Y2gga2VybmVsIHRocmVhZHMgbmVlZCB0byBiZSBmaXhlZCwgb25lIGJ5IG9uZS4gU2VsZWN0IHRoZQpwbGFjZSB3aGVyZSB0aGUgdGhyZWFkIGlzIHNhZmUgdG8gYmUgZnJvemVuIChubyBrZXJuZWwgc2VtYXBob3JlcwpzaG91bGQgYmUgaGVsZCBhdCB0aGF0IHBvaW50IGFuZCBpdCBtdXN0IGJlIHNhZmUgdG8gc2xlZXAgdGhlcmUpLCBhbmQKYWRkOgoKICAgICAgIHRyeV90b19mcmVlemUoKTsKCklmIHRoZSB0aHJlYWQgaXMgbmVlZGVkIGZvciB3cml0aW5nIHRoZSBpbWFnZSB0byBzdG9yYWdlLCB5b3Ugc2hvdWxkCmluc3RlYWQgc2V0IHRoZSBQRl9OT0ZSRUVaRSBwcm9jZXNzIGZsYWcgd2hlbiBjcmVhdGluZyB0aGUgdGhyZWFkIChhbmQKYmUgdmVyeSBjYXJlZnVsKS4KCgpROiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gInBsYXRmb3JtIiwgInNodXRkb3duIiBhbmQKImZpcm13YXJlIiBpbiAvc3lzL3Bvd2VyL2Rpc2s/CgpBOgoKc2h1dGRvd246IHNhdmUgc3RhdGUgaW4gbGludXgsIHRoZW4gdGVsbCBiaW9zIHRvIHBvd2VyZG93bgoKcGxhdGZvcm06IHNhdmUgc3RhdGUgaW4gbGludXgsIHRoZW4gdGVsbCBiaW9zIHRvIHBvd2VyZG93biBhbmQgYmxpbmsKICAgICAgICAgICJzdXNwZW5kZWQgbGVkIgoKZmlybXdhcmU6IHRlbGwgYmlvcyB0byBzYXZlIHN0YXRlIGl0c2VsZiBbbmVlZHMgQklPUy1zcGVjaWZpYyBzdXNwZW5kCgkgIHBhcnRpdGlvbiwgYW5kIGhhcyB2ZXJ5IGxpdHRsZSB0byBkbyB3aXRoIHN3c3VzcF0KCiJwbGF0Zm9ybSIgaXMgYWN0dWFsbHkgcmlnaHQgdGhpbmcgdG8gZG8sIGJ1dCAic2h1dGRvd24iIGlzIG1vc3QKcmVsaWFibGUuCgpROiBJIGRvIG5vdCB1bmRlcnN0YW5kIHdoeSB5b3UgaGF2ZSBzdWNoIHN0cm9uZyBvYmplY3Rpb25zIHRvIGlkZWEgb2YKc2VsZWN0aXZlIHN1c3BlbmQuCgpBOiBEbyBzZWxlY3RpdmUgc3VzcGVuZCBkdXJpbmcgcnVudGltZSBwb3dlciBtYW5hZ2VtZW50LCB0aGF0J3Mgb2theS4gQnV0Cml0J3MgdXNlbGVzcyBmb3Igc3VzcGVuZC10by1kaXNrLiAoQW5kIEkgZG8gbm90IHNlZSBob3cgeW91IGNvdWxkIHVzZQppdCBmb3Igc3VzcGVuZC10by1yYW0sIEkgaG9wZSB5b3UgZG8gbm90IHdhbnQgdGhhdCkuCgpMZXRzIHNlZSwgc28geW91IHN1Z2dlc3QgdG8KCiogU1VTUEVORCBhbGwgYnV0IHN3YXAgZGV2aWNlIGFuZCBwYXJlbnRzCiogU25hcHNob3QKKiBXcml0ZSBpbWFnZSB0byBkaXNrCiogU1VTUEVORCBzd2FwIGRldmljZSBhbmQgcGFyZW50cwoqIFBvd2VyZG93bgoKT2ggbm8sIHRoYXQgZG9lcyBub3Qgd29yaywgaWYgc3dhcCBkZXZpY2Ugb3IgaXRzIHBhcmVudHMgdXNlcyBETUEsCnlvdSd2ZSBjb3JydXB0ZWQgZGF0YS4gWW91J2QgaGF2ZSB0byBkbwoKKiBTVVNQRU5EIGFsbCBidXQgc3dhcCBkZXZpY2UgYW5kIHBhcmVudHMKKiBGUkVFWkUgc3dhcCBkZXZpY2UgYW5kIHBhcmVudHMKKiBTbmFwc2hvdAoqIFVORlJFRVpFIHN3YXAgZGV2aWNlIGFuZCBwYXJlbnRzCiogV3JpdGUKKiBTVVNQRU5EIHN3YXAgZGV2aWNlIGFuZCBwYXJlbnRzCgpXaGljaCBtZWFucyB0aGF0IHlvdSBzdGlsbCBuZWVkIHRoYXQgRlJFRVpFIHN0YXRlLCBhbmQgeW91IGdldCBtb3JlCmNvbXBsaWNhdGVkIGNvZGUuIChBbmQgSSBoYXZlIG5vdCB5ZXQgaW50cm9kdWNlIGRldGFpbHMgbGlrZSBzeXN0ZW0KZGV2aWNlcykuCgpROiBUaGVyZSBkb24ndCBzZWVtIHRvIGJlIGFueSBnZW5lcmFsbHkgdXNlZnVsIGJlaGF2aW9yYWwKZGlzdGluY3Rpb25zIGJldHdlZW4gU1VTUEVORCBhbmQgRlJFRVpFLgoKQTogRG9pbmcgU1VTUEVORCB3aGVuIHlvdSBhcmUgYXNrZWQgdG8gZG8gRlJFRVpFIGlzIGFsd2F5cyBjb3JyZWN0LApidXQgaXQgbWF5IGJlIHVubmVjY2Vzc2FyaWx5IHNsb3cuIElmIHlvdSB3YW50IHlvdXIgZHJpdmVyIHRvIHN0YXkgc2ltcGxlLApzbG93bmVzcyBtYXkgbm90IG1hdHRlciB0byB5b3UuIEl0IGNhbiBhbHdheXMgYmUgZml4ZWQgbGF0ZXIuCgpGb3IgZGV2aWNlcyBsaWtlIGRpc2sgaXQgZG9lcyBtYXR0ZXIsIHlvdSBkbyBub3Qgd2FudCB0byBzcGluZG93biBmb3IKRlJFRVpFLgoKUTogQWZ0ZXIgcmVzdW1pbmcsIHN5c3RlbSBpcyBwYWdpbmcgaGVhdmlseSwgbGVhZGluZyB0byB2ZXJ5IGJhZCBpbnRlcmFjdGl2aXR5LgoKQTogVHJ5IHJ1bm5pbmcKCmNhdCBgY2F0IC9wcm9jL1swLTldKi9tYXBzIHwgZ3JlcCAvIHwgc2VkICdzOi4qIC86LzonIHwgc29ydCAtdWAgPiAvZGV2L251bGwKCmFmdGVyIHJlc3VtZS4gc3dhcG9mZiAtYTsgc3dhcG9uIC1hIG1heSBhbHNvIGJlIHVzZWZ1bC4KClE6IFdoYXQgaGFwcGVucyB0byBkZXZpY2VzIGR1cmluZyBzd3N1c3A/IFRoZXkgc2VlbSB0byBiZSByZXN1bWVkCmR1cmluZyBzeXN0ZW0gc3VzcGVuZD8KCkE6IFRoYXQncyBjb3JyZWN0LiBXZSBuZWVkIHRvIHJlc3VtZSB0aGVtIGlmIHdlIHdhbnQgdG8gd3JpdGUgaW1hZ2UgdG8KZGlzay4gV2hvbGUgc2VxdWVuY2UgZ29lcyBsaWtlCgogICAgICBTdXNwZW5kIHBhcnQKICAgICAgfn5+fn5+fn5+fn5+CiAgICAgIHJ1bm5pbmcgc3lzdGVtLCB1c2VyIGFza3MgZm9yIHN1c3BlbmQtdG8tZGlzawoKICAgICAgdXNlciBwcm9jZXNzZXMgYXJlIHN0b3BwZWQKCiAgICAgIHN1c3BlbmQoUE1TR19GUkVFWkUpOiBkZXZpY2VzIGFyZSBmcm96ZW4gc28gdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZQogICAgICAJCSAgICAgIHdpdGggc3RhdGUgc25hcHNob3QKCiAgICAgIHN0YXRlIHNuYXBzaG90OiBjb3B5IG9mIHdob2xlIHVzZWQgbWVtb3J5IGlzIHRha2VuIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAoKICAgICAgcmVzdW1lKCk6IGRldmljZXMgYXJlIHdva2VuIHVwIHNvIHRoYXQgd2UgY2FuIHdyaXRlIGltYWdlIHRvIHN3YXAKCiAgICAgIHdyaXRlIGltYWdlIHRvIHN3YXAKCiAgICAgIHN1c3BlbmQoUE1TR19TVVNQRU5EKTogc3VzcGVuZCBkZXZpY2VzIHNvIHRoYXQgd2UgY2FuIHBvd2VyIG9mZgoKICAgICAgdHVybiB0aGUgcG93ZXIgb2ZmCgogICAgICBSZXN1bWUgcGFydAogICAgICB+fn5+fn5+fn5+fgogICAgICAoaXMgYWN0dWFsbHkgcHJldHR5IHNpbWlsYXIpCgogICAgICBydW5uaW5nIHN5c3RlbSwgdXNlciBhc2tzIGZvciBzdXNwZW5kLXRvLWRpc2sKCiAgICAgIHVzZXIgcHJvY2Vzc2VzIGFyZSBzdG9wcGVkIChpbiBjb21tb24gY2FzZSB0aGVyZSBhcmUgbm9uZSwgYnV0IHdpdGggcmVzdW1lLWZyb20taW5pdHJkLCBub29uZSBrbm93cykKCiAgICAgIHJlYWQgaW1hZ2UgZnJvbSBkaXNrCgogICAgICBzdXNwZW5kKFBNU0dfRlJFRVpFKTogZGV2aWNlcyBhcmUgZnJvemVuIHNvIHRoYXQgdGhleSBkb24ndCBpbnRlcmZlcmUKICAgICAgCQkgICAgICB3aXRoIGltYWdlIHJlc3RvcmF0aW9uCgogICAgICBpbWFnZSByZXN0b3JhdGlvbjogcmV3cml0ZSBtZW1vcnkgd2l0aCBpbWFnZQoKICAgICAgcmVzdW1lKCk6IGRldmljZXMgYXJlIHdva2VuIHVwIHNvIHRoYXQgc3lzdGVtIGNhbiBjb250aW51ZQoKICAgICAgdGhhdyBhbGwgdXNlciBwcm9jZXNzZXMKClE6IFdoYXQgaXMgdGhpcyAnRW5jcnlwdCBzdXNwZW5kIGltYWdlJyBmb3I/CgpBOiBGaXJzdCBvZiBhbGw6IGl0IGlzIG5vdCBhIHJlcGxhY2VtZW50IGZvciBkbS1jcnlwdCBlbmNyeXB0ZWQgc3dhcC4KSXQgY2Fubm90IHByb3RlY3QgeW91ciBjb21wdXRlciB3aGlsZSBpdCBpcyBzdXNwZW5kZWQuIEluc3RlYWQgaXQgZG9lcwpwcm90ZWN0IGZyb20gbGVha2luZyBzZW5zaXRpdmUgZGF0YSBhZnRlciByZXN1bWUgZnJvbSBzdXNwZW5kLgoKVGhpbmsgb2YgdGhlIGZvbGxvd2luZzogeW91IHN1c3BlbmQgd2hpbGUgYW4gYXBwbGljYXRpb24gaXMgcnVubmluZwp0aGF0IGtlZXBzIHNlbnNpdGl2ZSBkYXRhIGluIG1lbW9yeS4gVGhlIGFwcGxpY2F0aW9uIGl0c2VsZiBwcmV2ZW50cwp0aGUgZGF0YSBmcm9tIGJlaW5nIHN3YXBwZWQgb3V0LiBTdXNwZW5kLCBob3dldmVyLCBtdXN0IHdyaXRlIHRoZXNlCmRhdGEgdG8gc3dhcCB0byBiZSBhYmxlIHRvIHJlc3VtZSBsYXRlciBvbi4gV2l0aG91dCBzdXNwZW5kIGVuY3J5cHRpb24KeW91ciBzZW5zaXRpdmUgZGF0YSBhcmUgdGhlbiBzdG9yZWQgaW4gcGxhaW50ZXh0IG9uIGRpc2suICBUaGlzIG1lYW5zCnRoYXQgYWZ0ZXIgcmVzdW1lIHlvdXIgc2Vuc2l0aXZlIGRhdGEgYXJlIGFjY2Vzc2libGUgdG8gYWxsCmFwcGxpY2F0aW9ucyBoYXZpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUgc3dhcCBkZXZpY2Ugd2hpY2ggd2FzIHVzZWQKZm9yIHN1c3BlbmQuIElmIHlvdSBkb24ndCBuZWVkIHN3YXAgYWZ0ZXIgcmVzdW1lIHRoZXNlIGRhdGEgY2FuIHJlbWFpbgpvbiBkaXNrIHZpcnR1YWxseSBmb3JldmVyLiBUaHVzIGl0IGNhbiBoYXBwZW4gdGhhdCB5b3VyIHN5c3RlbSBnZXRzCmJyb2tlbiBpbiB3ZWVrcyBsYXRlciBhbmQgc2Vuc2l0aXZlIGRhdGEgd2hpY2ggeW91IHRob3VnaHQgd2VyZQplbmNyeXB0ZWQgYW5kIHByb3RlY3RlZCBhcmUgcmV0cmlldmVkIGFuZCBzdG9sZW4gZnJvbSB0aGUgc3dhcCBkZXZpY2UuClRvIHByZXZlbnQgdGhpcyBzaXR1YXRpb24geW91IHNob3VsZCB1c2UgJ0VuY3J5cHQgc3VzcGVuZCBpbWFnZScuCgpEdXJpbmcgc3VzcGVuZCBhIHRlbXBvcmFyeSBrZXkgaXMgY3JlYXRlZCBhbmQgdGhpcyBrZXkgaXMgdXNlZCB0bwplbmNyeXB0IHRoZSBkYXRhIHdyaXR0ZW4gdG8gZGlzay4gV2hlbiwgZHVyaW5nIHJlc3VtZSwgdGhlIGRhdGEgd2FzCnJlYWQgYmFjayBpbnRvIG1lbW9yeSB0aGUgdGVtcG9yYXJ5IGtleSBpcyBkZXN0cm95ZWQgd2hpY2ggc2ltcGx5Cm1lYW5zIHRoYXQgYWxsIGRhdGEgd3JpdHRlbiB0byBkaXNrIGR1cmluZyBzdXNwZW5kIGFyZSB0aGVuCmluYWNjZXNzaWJsZSBzbyB0aGV5IGNhbid0IGJlIHN0b2xlbiBsYXRlciBvbi4gIFRoZSBvbmx5IHRoaW5nIHRoYXQKeW91IG11c3QgdGhlbiB0YWtlIGNhcmUgb2YgaXMgdGhhdCB5b3UgY2FsbCAnbWtzd2FwJyBmb3IgdGhlIHN3YXAKcGFydGl0aW9uIHVzZWQgZm9yIHN1c3BlbmQgYXMgZWFybHkgYXMgcG9zc2libGUgZHVyaW5nIHJlZ3VsYXIKYm9vdC4gVGhpcyBhc3NlcnRzIHRoYXQgYW55IHRlbXBvcmFyeSBrZXkgZnJvbSBhbiBvb3BzZWQgc3VzcGVuZCBvcgpmcm9tIGEgZmFpbGVkIG9yIGFib3J0ZWQgcmVzdW1lIGlzIGVyYXNlZCBmcm9tIHRoZSBzd2FwIGRldmljZS4KCkFzIGEgcnVsZSBvZiB0aHVtYiB1c2UgZW5jcnlwdGVkIHN3YXAgdG8gcHJvdGVjdCB5b3VyIGRhdGEgd2hpbGUgeW91cgpzeXN0ZW0gaXMgc2h1dCBkb3duIG9yIHN1c3BlbmRlZC4gQWRkaXRpb25hbGx5IHVzZSB0aGUgZW5jcnlwdGVkCnN1c3BlbmQgaW1hZ2UgdG8gcHJldmVudCBzZW5zaXRpdmUgZGF0YSBmcm9tIGJlaW5nIHN0b2xlbiBhZnRlcgpyZXN1bWUuCgpROiBDYW4gSSBzdXNwZW5kIHRvIGEgc3dhcCBmaWxlPwoKQTogR2VuZXJhbGx5LCB5ZXMsIHlvdSBjYW4uICBIb3dldmVyLCBpdCByZXF1aXJlcyB5b3UgdG8gdXNlIHRoZSAicmVzdW1lPSIgYW5kCiJyZXN1bWVfb2Zmc2V0PSIga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLCBzbyB0aGUgcmVzdW1lIGZyb20gYSBzd2FwIGZpbGUKY2Fubm90IGJlIGluaXRpYXRlZCBmcm9tIGFuIGluaXRyZCBvciBpbml0cmFtZnMgaW1hZ2UuICBTZWUKc3dzdXNwLWFuZC1zd2FwLWZpbGVzLnR4dCBmb3IgZGV0YWlscy4KClE6IElzIHRoZXJlIGEgbWF4aW11bSBzeXN0ZW0gUkFNIHNpemUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgc3dzdXNwPwoKQTogSXQgc2hvdWxkIHdvcmsgb2theSB3aXRoIGhpZ2htZW0uCgpROiBEb2VzIHN3c3VzcCAodG8gZGlzaykgdXNlIG9ubHkgb25lIHN3YXAgcGFydGl0aW9uIG9yIGNhbiBpdCB1c2UKbXVsdGlwbGUgc3dhcCBwYXJ0aXRpb25zIChhZ2dyZWdhdGUgdGhlbSBpbnRvIG9uZSBsb2dpY2FsIHNwYWNlKT8KCkE6IE9ubHkgb25lIHN3YXAgcGFydGl0aW9uLCBzb3JyeS4KClE6IElmIG15IGFwcGxpY2F0aW9uKHMpIGNhdXNlcyBsb3RzIG9mIG1lbW9yeSAmIHN3YXAgc3BhY2UgdG8gYmUgdXNlZAoob3ZlciBoYWxmIG9mIHRoZSB0b3RhbCBzeXN0ZW0gUkFNKSwgaXMgaXQgY29ycmVjdCB0aGF0IGl0IGlzIGxpa2VseQp0byBiZSB1c2VsZXNzIHRvIHRyeSB0byBzdXNwZW5kIHRvIGRpc2sgd2hpbGUgdGhhdCBhcHAgaXMgcnVubmluZz8KCkE6IE5vLCBpdCBzaG91bGQgd29yayBva2F5LCBhcyBsb25nIGFzIHlvdXIgYXBwIGRvZXMgbm90IG1sb2NrKCkKaXQuIEp1c3QgcHJlcGFyZSBiaWcgZW5vdWdoIHN3YXAgcGFydGl0aW9uLgoKUTogV2hhdCBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBzdXNwZW5kLXRvLWRpc2sgcHJvYmxlbXM/CgpBOiBXZWxsLCBsYXN0IG1lc3NhZ2VzIG9uIHRoZSBzY3JlZW4gYXJlIGFsd2F5cyB1c2VmdWwuIElmIHNvbWV0aGluZwppcyBicm9rZW4sIGl0IGlzIHVzdWFsbHkgc29tZSBrZXJuZWwgZHJpdmVyLCB0aGVyZWZvcmUgdHJ5aW5nIHdpdGggYXMKbGl0dGxlIGFzIHBvc3NpYmxlIG1vZHVsZXMgbG9hZGVkIGhlbHBzIGEgbG90LiBJIGFsc28gcHJlZmVyIHBlb3BsZSB0bwpzdXNwZW5kIGZyb20gY29uc29sZSwgcHJlZmVyYWJseSB3aXRob3V0IFggcnVubmluZy4gQm9vdGluZyB3aXRoCmluaXQ9L2Jpbi9iYXNoLCB0aGVuIHN3YXBvbiBhbmQgc3RhcnRpbmcgc3VzcGVuZCBzZXF1ZW5jZSBtYW51YWxseQp1c3VhbGx5IGRvZXMgdGhlIHRyaWNrLiBUaGVuIGl0IGlzIGdvb2QgaWRlYSB0byB0cnkgd2l0aCBsYXRlc3QKdmFuaWxsYSBrZXJuZWwuCgpROiBIb3cgY2FuIGRpc3RyaWJ1dGlvbnMgc2hpcCBhIHN3c3VzcC1zdXBwb3J0aW5nIGtlcm5lbCB3aXRoIG1vZHVsYXIKZGlzayBkcml2ZXJzIChlc3BlY2lhbGx5IFNBVEEpPwoKQTogV2VsbCwgaXQgY2FuIGJlIGRvbmUsIGxvYWQgdGhlIGRyaXZlcnMsIHRoZW4gZG8gZWNobyBpbnRvCi9zeXMvcG93ZXIvZGlzay9yZXN1bWUgZmlsZSBmcm9tIGluaXRyZC4gQmUgc3VyZSBub3QgdG8gbW91bnQKYW55dGhpbmcsIG5vdCBldmVuIHJlYWQtb25seSBtb3VudCwgb3IgeW91IGFyZSBnb2luZyB0byBsb3NlIHlvdXIKZGF0YS4KClE6IEhvdyBkbyBJIG1ha2Ugc3VzcGVuZCBtb3JlIHZlcmJvc2U/CgpBOiBJZiB5b3Ugd2FudCB0byBzZWUgYW55IG5vbi1lcnJvciBrZXJuZWwgbWVzc2FnZXMgb24gdGhlIHZpcnR1YWwKdGVybWluYWwgdGhlIGtlcm5lbCBzd2l0Y2hlcyB0byBkdXJpbmcgc3VzcGVuZCwgeW91IGhhdmUgdG8gc2V0IHRoZQprZXJuZWwgY29uc29sZSBsb2dsZXZlbCB0byBhdCBsZWFzdCA0IChLRVJOX1dBUk5JTkcpLCBmb3IgZXhhbXBsZSBieQpkb2luZwoKCSMgc2F2ZSB0aGUgb2xkIGxvZ2xldmVsCglyZWFkIExPR0xFVkVMIERVTU1ZIDwgL3Byb2Mvc3lzL2tlcm5lbC9wcmludGsKCSMgc2V0IHRoZSBsb2dsZXZlbCBzbyB3ZSBzZWUgdGhlIHByb2dyZXNzIGJhci4KCSMgaWYgdGhlIGxldmVsIGlzIGhpZ2hlciB0aGFuIG5lZWRlZCwgd2UgbGVhdmUgaXQgYWxvbmUuCglpZiBbICRMT0dMRVZFTCAtbHQgNSBdOyB0aGVuCgkgICAgICAgIGVjaG8gNSA+IC9wcm9jL3N5cy9rZXJuZWwvcHJpbnRrCgkJZmkKCiAgICAgICAgSU1HX1NaPTAKICAgICAgICByZWFkIElNR19TWiA8IC9zeXMvcG93ZXIvaW1hZ2Vfc2l6ZQogICAgICAgIGVjaG8gLW4gZGlzayA+IC9zeXMvcG93ZXIvc3RhdGUKICAgICAgICBSRVQ9JD8KICAgICAgICAjCiAgICAgICAgIyB0aGUgbG9naWMgaGVyZSBpczoKICAgICAgICAjIGlmIGltYWdlX3NpemUgPiAwICh3aXRob3V0IGtlcm5lbCBzdXBwb3J0LCBJTUdfU1ogd2lsbCBiZSB6ZXJvKSwKICAgICAgICAjIHRoZW4gdHJ5IGFnYWluIHdpdGggaW1hZ2Vfc2l6ZSBzZXQgdG8gemVyby4KCWlmIFsgJFJFVCAtbmUgMCAtYSAkSU1HX1NaIC1uZSAwIF07IHRoZW4gIyB0cnkgYWdhaW4gd2l0aCBtaW5pbWFsIGltYWdlIHNpemUKICAgICAgICAgICAgICAgIGVjaG8gMCA+IC9zeXMvcG93ZXIvaW1hZ2Vfc2l6ZQogICAgICAgICAgICAgICAgZWNobyAtbiBkaXNrID4gL3N5cy9wb3dlci9zdGF0ZQogICAgICAgICAgICAgICAgUkVUPSQ/CiAgICAgICAgZmkKCgkjIHJlc3RvcmUgcHJldmlvdXMgbG9nbGV2ZWwKCWVjaG8gJExPR0xFVkVMID4gL3Byb2Mvc3lzL2tlcm5lbC9wcmludGsKCWV4aXQgJFJFVAoKUTogSXMgdGhpcyB0cnVlIHRoYXQgaWYgSSBoYXZlIGEgbW91bnRlZCBmaWxlc3lzdGVtIG9uIGEgVVNCIGRldmljZSBhbmQKSSBzdXNwZW5kIHRvIGRpc2ssIEkgY2FuIGxvc2UgZGF0YSB1bmxlc3MgdGhlIGZpbGVzeXN0ZW0gaGFzIGJlZW4gbW91bnRlZAp3aXRoICJzeW5jIj8KCkE6IFRoYXQncyByaWdodCAuLi4gaWYgeW91IGRpc2Nvbm5lY3QgdGhhdCBkZXZpY2UsIHlvdSBtYXkgbG9zZSBkYXRhLgpJbiBmYWN0LCBldmVuIHdpdGggIi1vIHN5bmMiIHlvdSBjYW4gbG9zZSBkYXRhIGlmIHlvdXIgcHJvZ3JhbXMgaGF2ZQppbmZvcm1hdGlvbiBpbiBidWZmZXJzIHRoZXkgaGF2ZW4ndCB3cml0dGVuIG91dCB0byBhIGRpc2sgeW91IGRpc2Nvbm5lY3QsCm9yIGlmIHlvdSBkaXNjb25uZWN0IGJlZm9yZSB0aGUgZGV2aWNlIGZpbmlzaGVkIHNhdmluZyBkYXRhIHlvdSB3cm90ZS4KClNvZnR3YXJlIHN1c3BlbmQgbm9ybWFsbHkgcG93ZXJzIGRvd24gVVNCIGNvbnRyb2xsZXJzLCB3aGljaCBpcyBlcXVpdmFsZW50CnRvIGRpc2Nvbm5lY3RpbmcgYWxsIFVTQiBkZXZpY2VzIGF0dGFjaGVkIHRvIHlvdXIgc3lzdGVtLgoKWW91ciBzeXN0ZW0gbWlnaHQgd2VsbCBzdXBwb3J0IGxvdy1wb3dlciBtb2RlcyBmb3IgaXRzIFVTQiBjb250cm9sbGVycwp3aGlsZSB0aGUgc3lzdGVtIGlzIGFzbGVlcCwgbWFpbnRhaW5pbmcgdGhlIGNvbm5lY3Rpb24sIHVzaW5nIHRydWUgc2xlZXAKbW9kZXMgbGlrZSAic3VzcGVuZC10by1SQU0iIG9yICJzdGFuZGJ5Ii4gIChEb24ndCB3cml0ZSAiZGlzayIgdG8gdGhlCi9zeXMvcG93ZXIvc3RhdGUgZmlsZTsgd3JpdGUgInN0YW5kYnkiIG9yICJtZW0iLikgIFdlJ3ZlIG5vdCBzZWVuIGFueQpoYXJkd2FyZSB0aGF0IGNhbiB1c2UgdGhlc2UgbW9kZXMgdGhyb3VnaCBzb2Z0d2FyZSBzdXNwZW5kLCBhbHRob3VnaCBpbgp0aGVvcnkgc29tZSBzeXN0ZW1zIG1pZ2h0IHN1cHBvcnQgInBsYXRmb3JtIiBvciAiZmlybXdhcmUiIG1vZGVzIHRoYXQKd29uJ3QgYnJlYWsgdGhlIFVTQiBjb25uZWN0aW9ucy4KClJlbWVtYmVyIHRoYXQgaXQncyBhbHdheXMgYSBiYWQgaWRlYSB0byB1bnBsdWcgYSBkaXNrIGRyaXZlIGNvbnRhaW5pbmcgYQptb3VudGVkIGZpbGVzeXN0ZW0uICBUaGF0J3MgdHJ1ZSBldmVuIHdoZW4geW91ciBzeXN0ZW0gaXMgYXNsZWVwISAgVGhlCnNhZmVzdCB0aGluZyBpcyB0byB1bm1vdW50IGFsbCBmaWxlc3lzdGVtcyBvbiByZW1vdmFibGUgbWVkaWEgKHN1Y2ggVVNCLApGaXJld2lyZSwgQ29tcGFjdEZsYXNoLCBNTUMsIGV4dGVybmFsIFNBVEEsIG9yIGV2ZW4gSURFIGhvdHBsdWcgYmF5cykKYmVmb3JlIHN1c3BlbmRpbmc7IHRoZW4gcmVtb3VudCB0aGVtIGFmdGVyIHJlc3VtaW5nLgoKUTogSSB1cGdyYWRlZCB0aGUga2VybmVsIGZyb20gMi42LjE1IHRvIDIuNi4xNi4gQm90aCBrZXJuZWxzIHdlcmUKY29tcGlsZWQgd2l0aCB0aGUgc2ltaWxhciBjb25maWd1cmF0aW9uIGZpbGVzLiBBbnl3YXkgSSBmb3VuZCB0aGF0CnN1c3BlbmQgdG8gZGlzayAoYW5kIHJlc3VtZSkgaXMgbXVjaCBzbG93ZXIgb24gMi42LjE2IGNvbXBhcmVkIHRvCjIuNi4xNS4gQW55IGlkZWEgZm9yIHdoeSB0aGF0IG1pZ2h0IGhhcHBlbiBvciBob3cgY2FuIEkgc3BlZWQgaXQgdXA/CgpBOiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNpemUgb2YgdGhlIHN1c3BlbmQgaW1hZ2UgaXMgbm93IGdyZWF0ZXIgdGhhbgpmb3IgMi42LjE1IChieSBzYXZpbmcgbW9yZSBkYXRhIHdlIGNhbiBnZXQgbW9yZSByZXNwb25zaXZlIHN5c3RlbQphZnRlciByZXN1bWUpLgoKVGhlcmUncyB0aGUgL3N5cy9wb3dlci9pbWFnZV9zaXplIGtub2IgdGhhdCBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUKaW1hZ2UuICBJZiB5b3Ugc2V0IGl0IHRvIDAgKGVnLiBieSBlY2hvIDAgPiAvc3lzL3Bvd2VyL2ltYWdlX3NpemUgYXMKcm9vdCksIHRoZSAyLjYuMTUgYmVoYXZpb3Igc2hvdWxkIGJlIHJlc3RvcmVkLiAgSWYgaXQgaXMgc3RpbGwgdG9vCnNsb3csIHRha2UgYSBsb29rIGF0IHN1c3BlbmQuc2YubmV0IC0tIHVzZXJsYW5kIHN1c3BlbmQgaXMgZmFzdGVyIGFuZApzdXBwb3J0cyBMWkYgY29tcHJlc3Npb24gdG8gc3BlZWQgaXQgdXAgZnVydGhlci4K