Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

[REBOL] Slightly newer HTTP Server Object

From: rex::smallandmighty::com at: 1-Sep-2000 1:29

--==_Boundary-1_== Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Just created (and attached) a newer version of my HTTP server object. Instead of directly overriding the method handlers during object creation you can put a handler in a %handlers directory. Upon start-up the server scans that directory looking for %init.r, %get.r, %post.r, %head.r, and %put.r files. It will replace its default handlers with the appropriate files. I'm attaching the new object along with a sample get.r file. This get.r serves html files, images, etc. from a %www directory, i.e. it behaves like a normal webserver. As one can see, it didn't take much code to implement that functionality on top of the base server object. The HTTP server object itself is meant to be sort of a black box. Any code to extend the server should go in the handlers. (get.r probably being the most common one folks would want to change, probably followed by post.r) The HTTP server object handles multiple connections and has separate queues for reading and writing to those connections. Incidentally, you can change the handlers on the fly while the server is running by visiting the /refresh url. It causes the get.r etc. handlers to be reloaded. /shutdown causes the server to shutdown and cleanup. These both cause 404s to be returned by the above get.r. I'll probably fix that in the next rev. One the server object has solidified, I'm going to start adding some layers on top to facilitate the creation of web application servers. XML- RPC support is somewhat high on the list of features I'd like to implement. Some comments would be welcome :) :Eric --==_Boundary-1_== Content-Type: multipart/mixed; boundary="==_Boundary-2_==" --==_Boundary-2_== Content-Type: application/octet-stream; name="get.r"; x-mac-type="54455854"; x-mac-creator="522A6368" Content-Disposition: attachment Content-Transfer-Encoding: base64 UmVib2wgClsKCVRpdGxlOiAiU2ltcGxlIEV4dGVybmFsIGdldC1oYW5kbGVyIgoJQXV0aG9yOiAi RXJpYyBLaW5nIgpdCgpjb250ZW50LXR5cGU/OiBmdW5jdGlvbiBbIGZpbGVuYW1lIFtzdHJpbmch IGZpbGUhXSBdIFtdIApbCiAgIAlzd2l0Y2gvZGVmYXVsdCBuZXh0IGZvcm0gZmluZC9sYXN0IHRv LXN0cmluZyBmaWxlbmFtZSAiLiIgCiAgIAlbCiAgIAkJOyBTbGlnaHRseSBtb2RpZmllZCBmcm9t IENhbCBEaXhvbidzIGZ1bmN0aW9uCiAgICAJOyBpbiBoaXMgd2ViLXNlcnZlci4gbmV4dCBjYW4n dCBiZSB1c2VkIG9uIGEgbm9uZSEKICAgIAk7IHZhbHVlCiAgICAJInR4dCIgCVsgcmV0dXJuICJ0 ZXh0L3BsYWluIiBdCiAgICAgIAkiZ2lmIiAJWyByZXR1cm4gImltYWdlL2dpZiIgXQogICAgICAJ ImpwZyIgCVsgcmV0dXJuICJpbWFnZS9qcGVnIiBdCiAgICAgIAkicG5nIiAJWyByZXR1cm4gImlt YWdlL3BuZyIgXQogICAgICAJIm1vdiIgCVsgcmV0dXJuICJ2aWRlby9xdWlja3RpbWUiIF0KICAg ICAgCSJ0aWYiIAlbIHJldHVybiAiaW1hZ2UvdGlmZiIgXQogICAgICAJInRpZmYiIAlbIHJldHVy biAiaW1hZ2UvdGlmZiIgXQogICAgICAJIndhdiIgCVsgcmV0dXJuICJhdWRpby93YXYiIF0KICAg ICAgCSJ4bWwiIAlbIHJldHVybiAidGV4dC94bWwiIF0KICAgICAgCSJ4c2wiIAlbIHJldHVybiAi dGV4dC94bWwiIF0KICAgICAgCSJtaWQiIAlbIHJldHVybiAiYXVkaW8vbWlkaSIgXQoJXSAKCVsg cmV0dXJuICJ0ZXh0L2h0bWwiIF0KXQoKOyBUaGUgbGFzdCB0aGluZyByZXR1cm5lZCBmcm9tIHRo aXMgaGFuZGxlciBzaG91bGQgYmUgYSAncmF3JyAKOyBmdW5jdGlvbgoKZnVuY3Rpb24gWyBoZHJz IF0gCglbIHQgIHJlc3BvbnNlIHMgaCB2IGhlYWRlcnN0cmluZyBwYXRoIG1pbWVdCglbCgkJO0Zl dGNoIHRoZSB0YXJnZXQtdXJpIGFuZCBjb252ZXJ0IGl0IHRvIGEgcGF0aAoJCXBhdGg6IGpvaW4g JXd3dyBzZWxlY3QgaGRycyAiVGFyZ2V0LVVSSToiCgkJO0xvb2sgZm9yIGluZGV4Lmh0bWwgaW4g ZGlyZWN0b3JpZXMKCQlpZiBkaXI/IHBhdGggCgkJWyAKCQkJZWl0aGVyIChsYXN0IHBhdGgpID0g IyIvIgoJCQlbIHBhdGg6IGpvaW4gcGF0aCAlaW5kZXguaHRtbCBdIAoJCQlbIHBhdGg6IGpvaW4g cGF0aCAlL2luZGV4Lmh0bWwgXSAKCQldCgkJO01ha2Ugc3VyZSB0aGVyZSdzIGEgZmlsZSB0byBz ZW5kCgkJZWl0aGVyIGV4aXN0cz8gcGF0aAoJCVsJCgkJCTtSZWFkIGluIHRoZSBmaWxlIHRvIHNl bmQKCQkJdDogcmVhZC9iaW5hcnkgcGF0aAoJCQk7QnVpbGQgdGhlIHJlc3BvbnNlIG9iamVjdAoJ CQlyZXNwb25zZTogbWFrZSBoYW5kbGVyLXJlc3BvbnNlCgkJCVsKCQkJCWNvZGU6ICIyMDAiIG1p bWU6IGNvbnRlbnQtdHlwZT8gcGF0aAoJCQkJY29va2llOiAiIiAJZW50aXR5OiB0CgkJCQloZHJz OiBjb3B5IFsgIlNlcnZlcjoiICJSZWJvbC1IVFRQLU9iamVjdCAxLjBhMiIgXQoJCQldCgkJXQoJ CVsKCQkJO0J1aWxkIGEgNDA0IERvY3VtZW50IG5vdCBmb3VuZCBlcnJvciBwYWdlCgkJCXQ6IGNv cHkgZGVmYXVsdC10ZW1wbGF0ZQoJCQl0OiBjbXQtaW5zZXJ0IHQgImNvbnRlbnQiIAoJCQl7PGgy PkVycm9yIDQwNDwvaDI+IERvY3VtZW50IG5vdCBmb3VuZH0KCQkJcmVzcG9uc2U6IG1ha2UgaGFu ZGxlci1yZXNwb25zZQoJCQlbCgkJCQljb2RlOiAiNDA0IiBtaW1lOiAidGV4dC9odG1sIgoJCQkJ Y29va2llOiAiIiAJZW50aXR5OiB0CgkJCQloZHJzOiBjb3B5IFsgIlNlcnZlcjoiICJSZWJvbC1I VFRQLU9iamVjdCAxLjBhMiIgXQoJCQldCgkJCgkJXQoJCXJldHVybiByZXNwb25zZQoJXQo--==_Boundary-2_== Content-Type: application/octet-stream; name="httpobject.r"; x-mac-type="54455854"; x-mac-creator="522A6368" Content-Disposition: attachment Content-Transfer-Encoding: base64 UmVib2wNWw0JVGl0bGU6ICJSZWJvbCBIVFRQIFNlcnZlciBPYmplY3QiDQlWZXJzaW9uOiAiMS4w YTIiDQlEYXRlOiAzMS1BdWctMjAwMA0JQXV0aG9yOiAiRXJpYyBLaW5nIg1dDQ0NOyANOyAJUmFu ZG9tIG5vdGVzOiANOyAJSWYgdGhlIGRlYnVnIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSAod2hp Y2ggaXQgaXMgYnkgZGVmYXVsdCkNOyAJQXR0ZW1wdGluZyB0byByZWFkIChHRVQpIGZyb20gL3No dXRkb3duIHdpbGwgY2F1c2UgdGhlIA07IAl3ZWIgc2VydmVyIHRvIGNsZWFuIHVwIGFuZCBzaHV0 ZG93bi4gDTsgDTsgCVRoaXMgdmVyc2lvbiBub3cgc3VwcG9ydHMgZGlzay1iYXNlZCBtZXRob2Qg aGFuZGxlcnMNOyAJVGhlc2UgaGFuZGxlcnMgY2FuIGJlIG1vZGlmaWVkIGFuZCByZWxvYWRlZCBv biB0aGUgZmx5DTsgCUJ5IGxvYWRpbmcgL3JlZnJlc2ggd2l0aCBkZWJ1ZyBzZXQgdG8gdHJ1ZQ07 IAlpLmUuIHlvdSBjYW4gY2hhbmdlIHRoZSBzZXJ2ZXIncyBjb2RlIHdoaWxlIGl0J3Mgc3RpbGwg cnVubmluZy4NOyAJDTsgCUhhbmRsZXJzIHNob3VsZCBiZSBwbGFjZWQgaW4gYSAlaGFuZGxlcnMv IHN1YmRpcmVjdG9yeS4NOyAJVGhlIHNlcnZlciBsb29rcyBmb3IgaGFuZGxlcnMgbmFtZWQ6DTsg CWdldC5yIHBvc3QuciBoZWFkLnIgcHV0LnIgaW5pdC5yDTsgCVRoZSBpbml0IGhhbmRsZXIgaXMg c3BlY2lhbCBpbiB0aGF0IGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UNOyAJQmVmb3JlIGFueSBvZiB0 aGUgb3RoZXIgaGFuZGxlcnMuIEJ5IGRlZmF1bHQgaXQgZG9lcyBub3RoaW5nDTsgCUJ1dCBpZiBh IGhhbmRsZXIgbmVlZGVkIHRvIHNldCB1cCBzb21lIGRhdGEgaXQgY291bGQgZG8gc28uDTsgCVRo ZXJlJ3MgYWxzbyBhbiBpbml0LWhhbmRsZXItZGF0YSBhdHRyaWJ1dGUgd2hpY2ggaXMgc2V0IHRv IGFuIA07IAlFbXB0eSBibG9jayBbXSBieSBkZWZhdWx0Lg07DTsJSSdtIGluY2x1ZGluZyBhIHNh bXBsZSBleHRlcm5hbCBnZXQtaGFuZGxlciB3aGljaCBzZXJ2ZXMNOwlpbWFnZXMgYW5kIGh0bWwg ZmlsZXMgcGxhY2VkIGluIGEgJXd3dy8gZGlyZWN0b3J5DTsNDWh0dHAtc2VydmVyOiBtYWtlIG9i amVjdCENWw07IA07IAlIVE1MIFRlbXBsYXRlcw07IA0JZGVmYXVsdC10ZW1wbGF0ZTogY29weQ17 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPg08 aHRtbD4NPHRpdGxlPlJlYm9sIEhUVFAgU2VydmVyIE9iamVjdDwvdGl0bGU+DTxzdHlsZSB0eXBl PSJ0ZXh0L2NzcyI+DTwhLS0NYTpsaW5rIF57IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6 ICM2RDRENEQgXn0NYTp2aXNpdGVkIF57IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICM0 RDRENkQgXn0NLnRleHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgU2Fucy1zZXJpZjsgZm9udC1zaXpl OiAxMnB4OyB9DS0tPg08L3N0eWxlPg08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IlJl YmxvZyAzLjAiPg08Ym9keSBiZ2NvbG9yID0gIiNGRkZGRkYiPg08ZGl2IGNsYXNzID0gInRleHQi Pg08IS0tY29udGVudC0tPg08L2Rpdj4NPC9ib2R5Pg08L2h0bWw+fQ0NOyANOyAJQXR0cmlidXRl cw07IA0JcG9ydDoJCQk4MA0JY29ubmVjdGlvbnM6CTANCWxpc3RlbmVyOglub25lDQk7IFF1ZXVl cyB0byBob2xkIHRoZSBzdGF0ZSBvZiBtdWx0aXBsZSBjb25uZWN0aW9ucw0JcmVhZC1xOiAJY29w eSAJW10NCXdyaXRlLXE6IAljb3B5IAlbXQ0JOyBCbG9jayBvZiBoYW5kbGVyIGVycm9ycw0JZXJy b3JzOiAJY29weSAJW10NCTsgSnVzdCBhIGNvbnZlbmllbnQgcGxhY2UgdG8gc3RpY2sgZGF0YSBm b3IgdGhlIGluaXQtaGFuZGxlcg0JaW5pdC1oYW5kbGVyLWRhdGE6IGNvcHkgW10NCTsgQ3JlYXRl IGEgNGsgYnVmZmVyIGZvciBoZWFkZXJzDQloZWFkZXItYnVmZmVyOgltYWtlIHN0cmluZyEgNDA5 Ng0JOyBTZW5kL1JlY2VpdmUgZGF0YSBpbiA4ayBjaHVua3MNCXJlYWQtY2h1bmstc2l6ZTogODE5 Mg0Jd3JpdGUtY2h1bmstc2l6ZTogODE5Mg0JOyBMaW1pdCBzaXplIG9mIFBVVCBvciBQT1NUZWQg ZGF0YQ0JbWF4LWVudGl0eTogMzI3NjgNCWRlYnVnOiB0cnVlDQk7IENvcHkgdGhpcyBvYmplY3Qg YW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZQ0JOyBnZXQtaGFuZGxlciwgcHV0 LWhhbmRsZXIsIHBvc3QtaGFuZGxlciwgYW5kIGhlYWQtaGFuZGxlciANCTsgbWV0aG9kcy4NCWhh bmRsZXItcmVzcG9uc2U6IG1ha2Ugb2JqZWN0IQ0JWw0JCWNvZGU6IAljb3B5ICIyMDAiDQkJbWlt ZTogCWNvcHkgInRleHQvaHRtbCINCQljb29raWU6IGNvcHkgInZhbHVlPW51bGwiDQkJZW50aXR5 OiBjb3B5ICIiDQkJaGRyczoJY29weSBbXQ0JXQ0JDTsgDTsgCVV0aWxpdHkgTWV0aG9kcw07IA0J Y210LWluc2VydDogZnVuY3Rpb24gDQlbc3RyIFtzdHJpbmchXSB0YWcgW3N0cmluZyFdIGNvbiBb c3RyaW5nIV0gL2R1cCAvZXZlcnldDQlbIHMgdCBjIGRdDQlbDQkJczogcmVqb2luIFsgY29weSAi PCEtLSIgY29weSB0YWcgIi0tPiIgXQ0JCWM6IGNvcHkgY29uDQkJaWYgZHVwIFsgYzogYXBwZW5k IGMgcmVmb3JtIFsgIl4vIiBzXSBdDQkJZWl0aGVyIGV2ZXJ5DQkJWyB0OiByZXBsYWNlL2FsbCBj b3B5IHN0ciBzIGNdDQkJWyB0OiByZXBsYWNlIGNvcHkgc3RyIHMgY10NCQlyZXR1cm4gdA0JXQ0J DTsgDTsgCUluaXRpYWxpemF0aW9uIE1ldGhvZHMNOyANDQlpbml0LWhhbmRsZXI6IGZ1bmN0aW9u IFtdDQlbIAldDQlbDQ0JCTsgT3ZlcnJpZGUgdGhpcyBmb3IgY3VzdG9tIGluaXRpYWxpemF0aW9u IGNvZGUuDQ0JXQ0NCXJlZnJlc2g6IGZ1bmN0aW9uIFtdIFsgYmxrIF0NCVsNCQk7IENoZWNrIHRv IHNlZSBpZiB0aGVyZSBhcmUgYW55IGV4dGVybmFsIGhhbmRsZXJzDQkJOyBJZiB5ZXMsIHJlcGxh Y2UgdGhlIGRlZmF1bHQgaGFuZGxlcnMgd2l0aCB0aGVtLg0JCTsgVGhlIGxhc3QgdmFsdWUgcmV0 dXJuZWQgaW4gYW4gZXh0ZXJuYWwgaGFuZGxlcg0JCTsgbXVzdCBiZSBhIGhhbmRsZXIgZnVuY3Rp b24uDQkJaWYgZXhpc3RzPyAlaGFuZGxlcnMvaW5pdC5yIA0JCVsNCQkJYmxrOiBsb2FkICVoYW5k bGVycy9pbml0LnINCQkJYmluZCBibGsgJ2luaXQtaGFuZGxlcg0JCQlpbml0LWhhbmRsZXI6IGRv IGJsawkJCQ0JCV0JDQkJaWYgZXhpc3RzPyAlaGFuZGxlcnMvZ2V0LnIgDQkJWw0JCQlibGs6IGxv YWQgJWhhbmRsZXJzL2dldC5yDQkJCWJpbmQgYmxrICdnZXQtaGFuZGxlcg0JCQlnZXQtaGFuZGxl cjogZG8gYmxrCQkJDQkJXQkNCQlpZiBleGlzdHM/ICVoYW5kbGVycy9wdXQuciANCQlbDQkJCWJs azogbG9hZCAlaGFuZGxlcnMvcHV0LnINCQkJYmluZCBibGsgJ3B1dC1oYW5kbGVyDQkJCXB1dC1o YW5kbGVyOiBkbyBibGsJCQkNCQldCQ0JCWlmIGV4aXN0cz8gJWhhbmRsZXJzL3Bvc3QuciANCQlb DQkJCWJsazogbG9hZCAlaGFuZGxlcnMvcG9zdC5yDQkJCWJpbmQgYmxrICdwb3N0LWhhbmRsZXIN CQkJcG9zdC1oYW5kbGVyOiBkbyBibGsJCQkNCQldCQ0JCWlmIGV4aXN0cz8gJWhhbmRsZXJzL2hl YWQuciANCQlbDQkJCWJsazogbG9hZCAlaGFuZGxlcnMvaGVhZC5yDQkJCWJpbmQgYmxrICdoZWFk LWhhbmRsZXINCQkJaGVhZC1oYW5kbGVyOiBkbyBibGsJCQkNCQldDQkJaW5pdC1oYW5kbGVyLWRh dGE6IGNvcHkgW10JCQ0JCWluaXQtaGFuZGxlcg0JXQ0JDQ0Jc3RhcnR1cDogZnVuY3Rpb24gW10g WyBibGsgXQ0JWw0JCTsgTG9hZCBhbnkgZXh0ZXJuYWwgaGFuZGxlcnMNCQlyZWZyZXNoDQkJOyBP cGVuIHRoZSBodHRwIHBvcnQNCQlsaXN0ZW5lcjogb3Blbi9saW5lcyBqb2luIHRjcDovLzogcG9y dA0JCTsgSSB0aGluayBJIGhhZCBncmFuZGVyIHN0YXJ0dXAgcGxhbnMgdGhhbiB0aGlzLg0JDQld DQ07IA07IAlTZXJ2ZXIgUmVzcG9uc2UgdXRpbGl0aWVzDTsgDQ07IA07IAlIYW5kbGVyIE1ldGhv ZHMNOyANOyANOyAJSGFuZGxlcnMgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhlIEhUVFAgUmVzcG9u c2UgY29kZQ07IAlUaGUgbWltZSB0eXBlIG9mIHRoZSBlbnRpdHkgYmVpbmcgc2VudA07IAlBIGJs b2NrIG9mIGF1eGlsbGFyeSBoZWFkZXJzIGluIHRoZSBmb3JtIG9mIA07IAlbICJIZWFkZXI6ICIg IlZhbHVlIiBdDTsgCVRoZSBhY3R1YWwgZW50aXR5IGJlaW5nIHNlbnQuIEl0IGNhbiBiZSBhIGJp bmFyeSEsIHN0cmluZyEsIA07IAlvciBhbiBvcGVuIHBvcnQhIA07IA07IAlBcyBhIGNvbnZlbmll bmNlLCB0aGVyZSBpcyBhIGhhbmRsZXItcmVzcG9uc2Ugb2JqZWN0IHdoaWNoDTsgCWVuY2Fwc3Vs YXRlcyB0aG9zZSBmb3VyIHRoaW5ncy4gSXRzIGZpZWxkcyBhcmU6IA07IAljb2RlIFtzdHJpbmch XSBtaW1lIFtzdHJpbmchXSBjb29raWUgW3N0cmluZyFdDTsgCWVudGl0eSBbYmluYXJ5ISBwb3J0 IV0gaGRycyBbYmxvY2shXSAgDTsgDTsgCU5vdGU6IExpbmVmZWVkcyBmb3IgdGhlIGF1eGhlYWRl cnMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIA07IAlhZGRlZCBpbiB0aGUgc2VuZC1yZXNwb25zZSBt ZXRob2QuDTsgDTsgCU92ZXJyaWRlIHRoZXNlIGZvdXIgbWV0aG9kcyBpbiBhIGRlcml2ZWQgb2Jq ZWN0IHRvIA07IAltYWtlIHRoaXMgc2VydmVyDTsgCWRvIHdoYXQgeW91IHdhbnQuIGUuZy4gDTsg CW15LXNlcnZlcjogbWFrZSBodHRwc2VydmVyIHJlZHVjZSANOyAJWyBnZXQtaGFuZGxlcjogbXkt Z2V0LWhhbmRsZXIgDTsgCXBvc3QtaGFuZGxlcjogbXktcG9zdC1oYW5kbGVyIHBvcnQ6IDgwMDAg XQ07IA07CVlvdSBjYW4gbm93IHVzZSBleHRlcm5hbCBkaXNrLWJhc2VkIGhhbmRsZXJzLg07CVNl ZSBhYm92ZSBub3RlLg07DTsgCVRoZSByZWFkIGFuZCB3cml0ZSBxdWV1ZXMgYXJlIHNldCB1cCBz dWNoIHRoYXQgdGhlIA07IAloYW5kbGVycyBuZXZlciBoYXZlIHRvIHdvcnJ5IGFib3V0IHN0cmVh bWluZyBkYXRhIHRvIG9yIGZyb20gDTsgCXRoZSBjbGllbnQuIA07IA07IAllLmcuIER1cmluZyBh IEdFVCwgdGhlIGdldC1oYW5kbGVyIG1lcmVseSBoYXMgdG8gZG8gDTsgCXNvbWV0aGluZyB1c2Vm dWwgDTsgCXdpdGggdGhlIGhlYWRlcnMgcGFzc2VkIHRvIGl0IGFuZCBnZW5lcmF0ZSBhbiBhcHBy b3ByaWF0ZSBlbnRpdHkNOyAJdGhlIGNvbm5lY3Rpb24gaXMgdGhlbiBwbGFjZWQgaW4gdGhlIHdy aXRlLXEgYW5kIHRoZSBlbnRpdHkgDTsgCWlzIHNlbnQgdG8gY2xpZW50IGluIHdyaXRlLWNodW5r LXNpemUgc2l6ZWQgYml0cy4NOyANOyAJRHVyaW5nIGEgUFVUIG9yIFBPU1QsIHRoZSBjb25uZWN0 aW9uIGFuZCBkYXRhIGJlaW5nIHNlbnQgZnJvbQ07IAl0aGUgY2xpZW50IGlzIHBsYWNlZCBpbiB0 aGUgcmVhZC1xIGFuZCByZXRyaWV2ZWQgaW4NOyAJcmVhZC1jaHVuay1zaXplIHNpemVkIGNodW5r cy4gVGhlIFBVVCBvciBQT1NUIGhhbmRsZXIgaXMgDTsgCXRoZW4gY2FsbGVkLCBhbmQgaXQJc2hv dWxkIHRha2UgdGhhdCBkYXRhIGFuZCB0aGUgaGVhZGVycyBwYXNzZWQgOyAJdG8gaXQgYW5kIGdl bmVyYXRlIGFuIGFwcHJvcHJpYXRlIGVudGl0eS4gTGlrZSB0aGUgR0VUIGhhbmRsZXIsIA07IAl0 aGUgY29ubmVjdGlvbiBhbmQgdGhlIG5ldyBlbnRpdHkgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSB3 cml0ZS1xIA07IAl3aGVyZSB0aGV5IGFyZSBzdHJlYW1lZCBiYWNrIHRvIHRoZSBjbGllbnQgaW4g d3JpdGUtY2h1bmstc2l6ZSANOyAJc2l6ZWQgY2h1bmtzLg07IA07IAlJIGhhdmUgbm90IGZpZ3Vy ZWQgb3V0IHdoYXQgc2hvdWxkIGJlIGRvbmUgZHVyaW5nIGEgDTsgCUhFQUQgcmVxdWVzdC4gUHJv YmFibHkganVzdCBkbyBhIEdFVCBidXQgZG9uJ3Qgc2VuZCB0aGUgZW50aXR5Lg07IA0NCWdldC1o YW5kbGVyOiBmdW5jdGlvbiBbIGhkcnMgXSANCVsgdCAgcmVzcG9uc2UgcyBoIHYgaGVhZGVyc3Ry aW5nIF0NCVsNCQk7IA0JCTsgQnkgZGVmYXVsdCBmb3JtYXQgYW5kIHJldHVybiB0aGUgaGVhZGVy cyBwYXNzZWQgdG8gDQkJOyB0aGUgc2VydmVyIGZyb20gdGhlIGJyb3dzZXINCQk7IA0JCWhlYWRl cnN0cmluZzogY29weSAiUmVxdWVzdCBIZWFkZXJzOiA8YnI+Xi8iDQkJZm9yZWFjaCBbIGggdiBd IGhkcnMgDQkJWyBhcHBlbmQgaGVhZGVyc3RyaW5nIHJlam9pbiANCQlbIjxsaT4iIGggIiAmbmJz cDsgJm5ic3A7ICIgdiAiPGJyPl4vIl1dDQkJdDogY29weSBkZWZhdWx0LXRlbXBsYXRlDQkJdDog Y210LWluc2VydCB0ICJjb250ZW50IiByZWpvaW4NCQlbIA0JCQkiRGVmYXVsdCBIVFRQIEdldCBI YW5kbGVyPGJyPjxicj5eLyIgDQkJCWZvcm0gbm93ICI8YnI+PGJyPl4vIiANCQkJaGVhZGVyc3Ry aW5nICI8YnI+PGJyPl4vIiANCQldDQkJcmVzcG9uc2U6IG1ha2UgaGFuZGxlci1yZXNwb25zZQ0J CVsNCQkJY29kZTogIjIwMCIgbWltZTogInRleHQvaHRtbCINCQkJY29va2llOiAiIiAJZW50aXR5 OiB0DQkJCWhkcnM6IGNvcHkgWyAiU2VydmVyOiIgIlJlYm9sLUhUVFAtT2JqZWN0IDEuMGEyIiAg XQ0JCV0NCQlyZXR1cm4gcmVzcG9uc2UNCV0NDQloZWFkLWhhbmRsZXI6IGZ1bmN0aW9uIFsgaGRy cyBdIA0JWyByZXNwb25zZSBdDQlbDQkJcmVzcG9uc2U6IG1ha2UgaGFuZGxlci1yZXNwb25zZQ0J CVsNCQkJY29kZTogIjIwMCIJbWltZTogInRleHQvaHRtbCINCQkJY29va2llOiAiIgllbnRpdHk6 ICIiDQkJCWhkcnM6IGNvcHkgWyAiU2VydmVyOiIgIlJlYm9sLUhUVFAtT2JqZWN0IDEuMGEyIiAg XQ0JCV0NCQlyZXR1cm4gcmVzcG9uc2UNCV0NDQlwdXQtaGFuZGxlcjogZnVuY3Rpb24gWyBoZHJz IGRhdGEgXSANCVsgdCAgcmVzcG9uc2UgXQ0JWw0JCTsgDQkJOyBCeSBkZWZhdWx0IGZvcm1hdCBh bmQgcmV0dXJuIHRoZSBoZWFkZXJzIGFuZCBkYXRhIA0JCTsgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIg ZnJvbSB0aGUgYnJvd3Nlcg0JCTsgDQkJaGVhZGVyc3RyaW5nOiBjb3B5ICJSZXF1ZXN0IEhlYWRl cnM6IDxicj5eLyINCQlmb3JlYWNoIFsgaCB2IF0gaGRycyANCQlbIGFwcGVuZCBoZWFkZXJzdHJp bmcgcmVqb2luIA0JCVsiPGxpPiIgaCAiICZuYnNwOyAmbmJzcDsgIiB2ICI8YnI+Xi8iXV0NCQl0 OiBjb3B5IGRlZmF1bHQtdGVtcGxhdGUNCQl0OiBjbXQtaW5zZXJ0IHQgImNvbnRlbnQiIHJlam9p bg0JCVsgDQkJCSJEZWZhdWx0IEhUVFAgUHV0IEhhbmRsZXI8YnI+PGJyPl4vIiANCQkJZm9ybSBu b3cgIjxicj48YnI+Xi8iIA0JCQloZWFkZXJzdHJpbmcgIjxicj48YnI+Xi8iDQkJCSJEYXRhOiA8 YnI+Xi8iIHRvLXN0cmluZyBkYXRhDQkJXQ0JCXJlc3BvbnNlOiBtYWtlIGhhbmRsZXItcmVzcG9u c2UNCQlbDQkJCWNvZGU6ICIyMDAiCW1pbWU6ICJ0ZXh0L2h0bWwiDQkJCWNvb2tpZTogIiIJZW50 aXR5OiB0DQkJCWhkcnM6IGNvcHkgWyAiU2VydmVyOiIgIlJlYm9sLUhUVFAtT2JqZWN0IDEuMGEy IiBdDQkJXQ0JCXJldHVybiByZXNwb25zZQ0JXQ0NCXBvc3QtaGFuZGxlcjogZnVuY3Rpb24gWyBo ZHJzIGRhdGEgXSANCVsgdCAgcmVzcG9uc2UgXQ0JWw0JCTsgDQkJOyBCeSBkZWZhdWx0IGZvcm1h dCBhbmQgcmV0dXJuIHRoZSBoZWFkZXJzIGFuZCBkYXRhIA0JCTsgcGFzc2VkIHRvIHRoZSBzZXJ2 ZXIgZnJvbSB0aGUgYnJvd3Nlcg0JCTsgDQkJaGVhZGVyc3RyaW5nOiBjb3B5ICJSZXF1ZXN0IEhl YWRlcnM6IDxicj5eLyINCQlmb3JlYWNoIFsgaCB2IF0gaGRycyANCQlbIGFwcGVuZCBoZWFkZXJz dHJpbmcgcmVqb2luIA0JCVsiPGxpPiIgaCAiICZuYnNwOyAmbmJzcDsgIiB2ICI8YnI+Xi8iXV0N CQl0OiBjb3B5IGRlZmF1bHQtdGVtcGxhdGUNCQl0OiBjbXQtaW5zZXJ0IHQgImNvbnRlbnQiIHJl am9pbg0JCVsgDQkJCSJEZWZhdWx0IEhUVFAgUE9TVCBIYW5kbGVyPGJyPjxicj5eLyIgDQkJCWZv cm0gbm93ICI8YnI+PGJyPl4vIiANCQkJaGVhZGVyc3RyaW5nICI8YnI+PGJyPl4vIg0JCQkiRGF0 YTogPGJyPl4vIiB0by1zdHJpbmcgZGF0YQ0JCV0NCQlyZXNwb25zZTogbWFrZSBoYW5kbGVyLXJl c3BvbnNlDQkJWw0JCQljb2RlOiAiMjAwIgltaW1lOiAidGV4dC9odG1sIg0JCQljb29raWU6ICIi CWVudGl0eTogdA0JCQloZHJzOiBjb3B5IFsgIlNlcnZlcjoiICJSZWJvbC1IVFRQLU9iamVjdCAx LjBhMiIgXQ0JCV0NCQlyZXR1cm4gcmVzcG9uc2UNCV0NDQ07IA07IAlSZXF1ZXN0IGFuZCBSZXNw b25zZSBzZXJ2aWNpbmcgbWV0aG9kcw07IA0NCWZldGNoLWhlYWRlcnM6IGZ1bmN0aW9uIFsgY29u biBdDQlbIGxpbmUgaGRycyBpcC1hZGQgaGRyc2JsayByYXdoZHJzIGggcCBdDQlbDQkJOyBTdWNr IGVhY2ggbGluZSBvZiBoZWFkZXJzIGZyb20gdGhlIGNvbm5lY3Rpb24NCQk7IEFuZCBwbGFjZSBp dCBpbiBhIGJ1ZmZlcg0JCXdoaWxlIFthbGwgWygobGluZTogcGljayBjb25uIDEpIDw+ICIiKSAo bGluZSA8PiBub25lKV1dDQkJWyBhcHBlbmQgaGVhZGVyLWJ1ZmZlciBqb2luIGxpbmUgIl4vIiBd DQkJDQkJOyBCcmVhayB0aGUgaGVhZGVyLWJ1ZmZlciB1cCBpbnRvIHNvbWV0aGluZyBTZWxlY3Rh YmxlDQkJOyBUaGVyZSBhcmUgcHJvYmFibHkgYSBidW5jaCBvZiBtdWNoIG1vcmUgZWxlZ2FudCB3 YXlzIA0JCTsgdG8gZG8gdGhpcy4uLg0JCWhkcnM6IGNvcHkgW10NCQlyYXdoZHJzOiBwYXJzZSBo ZWFkZXItYnVmZmVyIG5vbmUNCQlhcHBlbmQgaGRycyByZWR1Y2UgDQkJWyANCQkJIk1ldGhvZDoi IGZpcnN0IHJhd2hkcnMgDQkJCSJUYXJnZXQtVVJJOiIgc2Vjb25kIHJhd2hkcnMgDQkJCSJIVFRQ LXZl