ZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9DT1BZSU5HIGIvbGliL2VybC9DT1BZSU5HCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvQ09QWUlORwpyZW5hbWUgdG8gbGliL2VybC9DT1BZSU5HCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvTElDRU5TRSBiL2xpYi9lcmwvTElDRU5TRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L0xJQ0VOU0UKcmVuYW1lIHRvIGxpYi9lcmwvTElDRU5TRQpkaWZmIC0tZ2l0IGEvbGliL2VybC9NYWtlZmlsZSBiL2xpYi9lcmwvTWFrZWZpbGUKaW5kZXggMDcyYzhmYS4uMGYyYzhhOCAxMDA2NDQKLS0tIGEvbGliL2VybC9NYWtlZmlsZQorKysgYi9saWIvZXJsL01ha2VmaWxlCkBAIC0xLDE0ICsxLDcgQEAKLU1PRFVMRVMgPSBsaWIgIyByZWxlYXNlCitNT0RVTEVTID0gXAorCXNyYwogCi1hbGwgY2xlYW46Ci0JQGZvciBkaXIgaW4gJChNT0RVTEVTKTsgZG8gXAorYWxsIGNsZWFuIGRvY3M6CisJZm9yIGRpciBpbiAkKE1PRFVMRVMpOyBkbyBcCiAJCShjZCAkJGRpcjsgJHtNQUtFfSAkQCk7IFwKLQkJaWYgWyAiJCQ/IiAtbmUgIjAiIF07IHRoZW4gRVJST1I9JCQ/OyBlY2hvICJFcnJvciBDb2RlICQkRVJST1IiOyBleGl0ICQkRVJST1I7IGZpOyBcCiAJZG9uZQotCi1kb2NzOgotCShjZCBsaWI7ICR7TUFLRX0gJEApOyBcCi0JaWYgWyAiJCQ/IiAtbmUgIjAiIF07IHRoZW4gRVJST1I9JCQ/OyBlY2hvICJFcnJvciBDb2RlICQkRVJST1IiOyBleGl0ICQkRVJST1I7IGZpOyAKLQotaW5zdGFsbDoKLQllY2hvIE5PIE9QCmRpZmYgLS1naXQgYS9saWIvZXJsL1JFQURNRSBiL2xpYi9lcmwvUkVBRE1FCmluZGV4IDg0MjExYmQuLmNhZWEwNjcgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvUkVBRE1FCisrKyBiL2xpYi9lcmwvUkVBRE1FCkBAIC0xLDY4ICsxLDgyIEBACi1NdWNoIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzIGNhbiBiZSBmb3VuZCBhdCB3d3cuZXJsd2FyZS5vcmcKK1RocmlmdCBFcmxhbmcgTGlicmFyeQogCitSRUFETUUgQXV0aG9yOiBDaHJpcyBQaXJvIChjcGlyb0BmYWNlYm9vay5jb20pCitMYXN0IE1vZGlmaWVkOiAyMDA3LVNlcC0xNwogCi1CdWlsZGluZyB0aGUgdHJlZQotPT09PT09PT09PT09PT09PT0KK1RocmlmdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IG9wZW4gc291cmNlIHNvZnR3YXJlIGxpY2Vuc2UuCitQbGVhc2Ugc2VlIHRoZSBpbmNsdWRlZCBMSUNFTlNFIGZpbGUuCiAKLVRvIGJ1aWxkLCB0eXBlIG1ha2UsIGl0IHNob3VsZCBhbGwgd29yayBmcm9tIHRoZXJlLiAKK1VzaW5nIFRocmlmdCB3aXRoIEVybGFuZworPT09PT09PT09PT09PT09PT09PT09PT09CiAKLU5PVEUqKiBpZiB5b3VyIHN5c3RlbSBoYXMgZXJsYW5nIGluc3RhbGxlZCBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIC91c3IvbG9jYWwvbGliL2VybGFuZwotdGhlbiB5b3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEVSTF9SVU5fVE9QIHRvIHRoYXQgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZQotaWYgeW91IGhhdmUgZXJsYW5nIGluc3RhbGxlZCBpbiAvaG9tZS9qZG9lL2VybGFuZyB0aGVuIHlvdSBzaG91bGQgCi1leHBvcnQgRVJMX1JVTl9UT1A9L2hvbWUvamRvZS9lcmxhbmcKK1RoZSBUaHJpZnQgRXJsYW5nIGJpbmRpbmcgaXMgYnVpbHQgdXNpbmcgR05VIG1ha2UuICBSdW4gYG1ha2UnIGluCitsaWIvZXJsIHRvIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkgLmJlYW0gb2JqZWN0IGZpbGVzIGluIGxpYi9lcmwvZWJpbi8uCitBbHRob3VnaCB0aGUgZGlyZWN0b3JpZXMgYXJlIGxhaWQgb3V0IG11Y2ggbGlrZSBhbiBPVFAgYXBwbGljYXRpb24sCit0aGVzZSBiaW5kaW5ncyAoYXMgeW91IHdpbGwgc29vbiBkaXNjb3ZlcikgYXJlIG5vdCBhbiBPVFAgYXBwbGljYXRpb24KK3Byb3Blci4gIFdoZW4gc3RhcnRpbmcgdGhlIEVybGFuZyBlbXVsYXRvciAoaW50ZXJwcmV0ZXIpIHlvdSBtdXN0IHVzZQorYC1wYSAvcGF0aC90by90aHJpZnQvbGliL2VybC9lYmluJyB0byBsb2FkIHRoZSBiaW5kaW5ncy4KIAorUnVubmluZyB0aGUgVHV0b3JpYWwKKz09PT09PT09PT09PT09PT09PT09CiAKLUNyZWF0aW5nIGEgbmV3IGFwcGxpY2F0aW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PQorSXQgaXMgcmVjb21tZW5kZWQgdG8gcGF0dGVybiB5b3VyIG93biBzZXJ2ZXJzIGFmdGVyIHRoZSB0dXRvcmlhbAoraW5jbHVkZWQgaW4gdHV0b3JpYWwvLiAgR2VuZXJhdGUgdGhlIGdlbi1lcmwvIGRpcmVjdG9yeSBieSBydW5uaW5nCit0dXRvcmlhbC50aHJpZnQsIHRoZW4gY2QgdG8gdHV0b3JpYWwvZXJsLyBhbmQgcnVuIHNlcnZlci5zaC4gIFRoaXMKK3NjcmlwdCBpbmNsdWRlcyB0aGUgY29tbW1hbmRzIG5lY2Vzc2FyeSB0byBjb21waWxlIHRoZSBnZW5lcmF0ZWQKK0VybGFuZyBzb3VyY2UsIGNvbXBpbGUgdGhlIHR1dG9yaWFsIHNlcnZlciBpdHNlbGYsIGFuZCBvcGVuIHRoZSBFcmxhbmcKK2VtdWxhdG9yLiAgQXQgdGhlIGVtdWxhdG9yIHByb21wdCwgdHlwZSBgc2VydmVyOnN0YXJ0KCknIHRvIGJlZ2luCitsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zLgogCi1BIG5ldyBhcHBsaWNhdGlvbiBjYW4gYmUgY3JlYXRlZCBieSB1c2luZyB0aGUgYXBwZ2VuIHV0aWxpdHkgaW4gb3RwL3Rvb2xzL3V0aWxpdGllcy4KLVRoaXMgdXRpbGl0eSB3aWxsIGNyZWF0ZSBhIGJhc2ljIE9UUCBhcHAgZnJhbWV3b3JrIHVuZGVyIHRoZSBvdHAvbGliIGRpcmVjdG9yeSBhbmQKLWFuIE9UUCByZWxlYXNlIHVuZGVyIHRoZSBvdHAvcmVsZWFzZSBkaXJlY3RvcnkuICAKK05vdGUgdGhhdCB0aGVyZSBpcyBubyB0dXRvcmlhbCBjbGllbnQ7IHlvdSBtYXkgdXNlIGEgc3VwcGxpZWQgY2xpZW50CitpbiBhbm90aGVyIGxhbmd1YWdlLgogCi11c2FnZTogYXBwZ2VuIDxhcHBuYW1lPiA8cHJlZml4PiAKK0ltcGxlbWVudGF0aW9uIE5vdGVzCis9PT09PT09PT09PT09PT09PT09PQogCi1BcHBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZS4gIFRoZSBwcmVmaXggaXMgCi11c3VhbGx5IHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkIGluIHRoZSBhcHBuYW1lLiAgVGhpcyBwcmVmaXggaXMgdG8gYXZvaWQgbmFtZQotY2xhc2hlcyBiZXR3ZWVuIGFwcGxpY2F0aW9ucyBpbmNsdWRlZCBpbiBhIHJlbGVhc2UgKEVybGFuZyBkb2VzIG5vdCBoYXZlIHBhY2thZ2VzKS4KK3RFeGVjcHRpb25zIGFuZCB0KkZhY3RvcnlzIGFyZSBzdHJhaWdodCAibmV3IiAtLSBlLmcuIFRGID0KK3RUcmFuc3BvcnRGYWN0b3J5Om5ldygpIGV2ZXJ5dGhpbmcgZWxzZSBpcyBzdGFydF9uZXcKKyhpLmUuIGdlbl9zZXJ2ZXI6c3RhcnRfbGluaykgLS0gdGhpcyBzcGF3bnMgYSBwcm9jZXNzIGFuZCByZXR1cm5zIGEKK3BpZAogCi1leGFtcGxlIHVzYWdlOiBhcHBnZW4gbXlfYXBwIG1hCit0RXJsUHJvY2Vzc29yIGlzIGEgc2hpbSBhcm91bmQgdGhlIGdlbmVyYXRlZCBjb2RlICh3aGljaCBpcyBub3QKK2FjdHVhbGx5IGEgZ2VuX3NlcnZlcikuICBPZiBjb3Vyc2UgdEVybFByb2Nlc3NvciBpc24ndCBhIGdlbl9zZXJ2ZXIKK2VpdGhlciAuLi4gdGhyaWZ0X29vcF9zZXJ2ZXIgaXMgYSBzaGltIHRvIG1ha2Ugb3VyICJUaHJpZnQgb2JqZWN0cyIKK2dlbl9zZXJ2ZXJzLiAgTWF5YmUgd2Ugc2hvdWxkIHJlbW92ZSBzb21lIGxheWVycz8KIAotd2hpY2ggcmVzdWx0cyBpbiAKK2dldC9zZXQgbmV2ZXIgbWVhbnMgcHJvY2VzcyBkaWN0aW9uYXJ5CiAKLW90cC9saWIvbXlfYXBwICYgb3RwL3JlbGVhc2UvbXlfYXBwX3JlbAorVXNlIHRFcmxTZXJ2ZXIgYW5kIHRFcmxBY2NlcHRvci4gIHRTaW1wbGVTZXJ2ZXIgYW5kIHRTZXJ2ZXJTb2NrZXQgYXMKK2FyZSBwcmVzZW50IGluIHRoZSBvdGhlciBiaW5kaW5ncyBhcmUgaW5jb21wYXRpYmxlIGJ5IGRlc2lnbiAuLi4gdGhlCitjYWxsIHRyYWNlIGlzIHNwYXN0aWMgYWNyb3NzIHRoZSBwcm9jZXNzIHRyZWUuICB0RXJsU2VydmVyIGFuZAordEVybEFjY2VwdG9yIGZvbGxvdyB0aGUgc2FtZSBtb2RlbCBhcyBpc2VydmU6CiAKLVJ1bm5pbmcgYSByZWxlYXNlCi09PT09PT09PT09PT09PT09PQorICogdGhlIHRvcCBsZXZlbCBjb2RlIHNwYXducyBhIHRFcmxTZXJ2ZXIsIHdoaWNoIGxpc3RlbnMgb24gYSBzb2NrZXQKKyAqIGEgdEVybEFjY2VwdG9yIGlzIHNwYXduZWQgYW5kIGNhbGxzIGFjY2VwdCgpIG9uIHRoZSBsaXN0ZW5pbmcKK3NvY2tldAorICogd2hlbiBhY2NlcHQoKSBmaW5pc2hlcywgdGhlIHRFcmxBY2NlcHRvcgorICAgKiB0ZWxscyB0aGUgdEVybFNlcnZlciB0byBzcGF3biBhIG5ldyBhY2NlcHRvcgorICAgKiBoYW5kbGVzIHRoZSByZXF1ZXN0cyBieSBzcGF3bmluZyBhIHByb2Nlc3NvciwgYSB0cmFuc3BvcnQsIGFuZCBhCitwcm90b2NvbAorICogKHRoZSB0cmlja3kgcGFydCkgd2hlbiB0aGUgc29ja2V0IGNsb3NlcywgdGhlIHByb3RvY29sIGV4aXRzLCBzbzoKKyAgICogdGhlIHRyYW5zcG9ydCBleGl0cyBiZWNhdXNlIGl0J3MgdGhlIG9uZSBjYWxsZXIgb2YgdGhlIHByb3RvY29sCisgICAqIGxpa2V3aXNlLCB0aGUgcHJvY2Vzc29yIGV4aXRzIGJlY2F1c2UgaXQncyB0aGUgY2FsbGVyIG9mIHRoZQordHJhbnNwb3J0CisgICAqIHRoZSB0RXJsQWNjZXB0b3IgdHJhcHMgdGhlIHByb3RvY29sJ3MgZXhpdCBhbmQgZXhpdHMgd2l0aCBhbgorYWNjZXB0b3JfZG9uZQorICAgKiB0aGUgdEVybFNlcnZlciBzZWVzIHRoYXQgdGhlIGFjY2VwdG9yIGV4aXRlZCBhbmQgZG9lcyBub3RoaW5nCitzaW5jZSB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgYWNjZXB0b3IgYWNjZXB0KClpbmcgb24gdGhlIGxpc3Rlbgorc29ja2V0CiAKLVlvdXIgcmVsZWFzZSBzaG91bGQgY29udGFpbiBhbGwgdGhhdCB5b3UgbmVlZCB0byBydW4geW91ciBhcHBsaWNhdGlvbi4gIElmIHlvdXIgYXBwbGljYXRpb24KLWRlcGVuZHMgb24gYW55IGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBzdXBwbGllZCBvdXRzaWRlIG9mIHRoaXMgYnVpbGQgdHJlZSBvciBPVFAgaXRzZWxmIHRoZW4KLXRoZXkgbWF5IGJlIGFkZGVkIHRvIHRoZSA8YXBwbmFtZT5fcmVsLnJlbC5zcmMgZmlsZS4gIElmIHRoZSBleHRyYSBhcHBsaWNhdGlvbnMgYXJlIHByZXNlbnQKLWluIHRoaXMgYnVpbGQgdHJlZSB0aGVuIHRoZXkgd2lsbCBiZSBmb3VuZCBieSB0aGUgbWFrZSBwcm9jZXNzIGFuZCBpbmNsdWRlZCBpbiB0aGUgZmluYWwgCi1yZWxlYXNlLgorRm9yIGluZm8gYWJvdXQgaXNlcnZlOiBodHRwOi8vd3d3LnRyYXBleGl0Lm9yZy9BX2Zhc3Rfd2ViX3NlcnZlcl9kZW1vbnN0cmF0aW5nX3NvbWVfdW5kb2N1bWVudGVkX0VybGFuZ19mZWF0dXJlcwogCi1UbyBydW4gYSByZWxlYXNlIHRoZXJlIGFyZSB0d28gb3B0aW9uczogImxvY2FsIiBhbmQgaW5zdGFsbGVkLiBUaGUgbG9jYWwgdmVyc2lvbiBjYW4gYmUgZm91bmQKLWluIHRoZSBvdHAvcmVsZWFzZS88YXBwbmFtZT5fcmVsL2xvY2FsIGRpcmVjdG9yeSB3aGljaCBpcyBhZGRlZCBieSB0aGUgbWFrZSBwcm9jZXNzLiAgVGhpcyAKLXNob3VsZCBiZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCB0byBydW4geW91ciByZWxlYXNlIGludGVyYWN0aXZlbHkgdmlhIGFuIEVybGFuZyBzaGVsbC4KLVRvIHJ1biBhIHJlbGVhc2UgaW4gbG9jYWwgbW9kZSBjZCBpbnRvIHRoZSAibG9jYWwiIGRpcmVjdG9yeSBhbmQgcnVuIDxhcHBuYW1lPl9yZWwuc2guCitGaW5hbCBUaG91Z2h0cworPT09PT09PT09PT09PT0KIAotVGhlIHNlY29uZCB3YXkgdG8gcnVuIGEgcmVsZWFzZSBpcyB0byBpbnN0YWxsIGl0IGFuZCBydW4gaXQgYXMgYSBkYWVtb24uICBUaGlzIGlzIHVzZWQgZm9yIAotYXBwbGljYXRpb25zIGluIGEgcHJvZHVjdGlvbiBzZXR0aW5nLiAgVG8gZG8gdGhpcyB5b3UgbmVlZCB0byBmaXJzdCBydW4gbWFrZSAmIG1ha2UgaW5zdGFsbAotZnJvbSB0aGUgPGFwcG5hbWU+X3JlbCBkaXJlY3RvcnkuICBUaGlzIHdpbGwgcGxhY2UgYSBjb21wbGV0ZSBwcm9kdWN0aW9uIHJlYWR5IHZlcnNpb25lZCAKLXJlbGVhc2UgaW4gdGhlIC91c3IvbG9jYWwvbGliLyBkaXJlY3RvcnkgdW5kZXIgPGFwcG5hbWU+X3JlbC4gIFRvIHJ1biBhbiBpbnN0YWxsZWQgcmVsZWFzZQotY2QgdG8gL3Vzci9sb2NhbC9saWIvPGFwcG5hbWU+X3JlbC9yZWxlYXNlLzxyZWxfdnNuPiBhbmQgcnVuIDxhcHBuYW1lPl9yZWwuc2guICAKLQotSW4gdGhlIGNhc2Ugd2hlcmUgeW91IHdhbnQgdG8gY3JlYXRlIGEgcHJvZHVjdGlvbiByZWFkeSByZWxlYXNlIG9uIG9uZSBtYWNoaW5lIGFuZCB0aGVuIGRlcGxveSBpdAotb24gbXVsdGlwbGUgaWRlbnRpY2FsIG1hY2hpbmVzIHlvdSBtYXkgY3JlYXRlIGEgcHJvZHVjdGlvbiB0YXIgYXJjaGl2ZS4gIFRvIGRvIHRoaXMgcnVuIAotbWFrZSAmIG1ha2UgdGFyIGZyb20gdGhlIG90cC9yZWxlYXNlLzxhcHBuYW1lPl9yZWwvIGRpcmVjdG9yeS4gVGhpcyB3aWxsIGNyZWF0ZSBhIHRhciBmaWxlIGNvbmF0YWluaW5nIAotdGhlIHJlbGVhc2UgbmFtZSBhbmQgdmVyc2lvbiBudW1iZXIgaW4gdGhlIGZpbGUgbmFtZS4gIFRoaXMgdGFyIGNhbiBiZSBzaGlwcGVkIHRvIGl0cyBkZXN0aW5hdGlvbiBhbmQgCi11bnRhcnJlZC4gIFdpdGhpbiB0aGUgdW50YXJyZWQgZGlyZWN0b3J5IHRoZXJlIGlzIGEgc2hlbGwgc2NyaXB0IGVudGl0bGVkIGluc3RhbGwuc2guICBSdW5uaW5nIHRoaXMKLXNjcmlwdCB3aWxsIGluc3RhbGwgdGhlIHJlbGVhc2UgYnkgZGVmYXVsdCBpbiAvdXNyL2xvY2FsL2xpYi88YXBwbmFtZT5fcmVsLiAgQW4gb3B0aW9uYWwgYXJndW1lbnQKLWNhbiBiZSBwcm92aWRlZCB0aGF0IHdpbGwgZGlyZWN0IHRoZSBpbnN0YWxsYXRpb24gdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LgotCi1FeGFtcGxlIGluc3RhbGwuc2ggL29wdC9saWIgCi0KLVRoaXMgd2lsbCBpbnN0YWxsIHRoZSByZWxlYXNlIGluIC9vcHQvbGliLzxhcHBuYW1lPl9yZWwKLSAgCi0KLSAKLQorVGhpcyBiaW5kaW5nIGlzIGEgd29yayBpbiBwcm9ncmVzcy4gIEl0J3MgY2VydGFpbmx5IGxlc3MgdGhvcm91Z2hseQordGVzdGVkIHRoYW4gdGhlIG90aGVyLCBvbGRlciBiaW5kaW5ncy4gIERlc3BpdGUgdXNpbmcgcGFydHMgZnJvbQorb3RwX2Jhc2UgaXQgaXMgbm90IHBhY2thZ2VkIHdlbGwsIG5vciBpcyBpdCBhbiBPVFAgYXBwbGljYXRpb24gKG5vdCB0bworbWVudGlvbiBpdHMgbWFueSBzbWFsbGVyIHRyYW5zZ3Jlc3Npb25zKS4gIFRoaXMgaW1wbGVtZW50YXRpb24KK2ludGVudGlvbmFsbHkgcGF0dGVybnMgYWZ0ZXIgdGhlIG90aGVyIGJpbmRpbmdzICh3aGljaCBpcyB3aHkgdGhlcmUncworb29wLmVybCBhbmQgdGhyaWZ0X29vcF9zZXJ2ZXIpLCBidXQgcmVncmV0ZnVsbHkgaXQgZGVwYXJ0cyBmcm9tCitpZGlvbWF0aWMgRXJsYW5nLiAgUGxlYXNlIHNlZSB0aGUgaW5jbHVkZWQgVE9ETyBhbmQgY29udHJpYnV0ZSB5b3VyCitpbXByb3ZlbWVudHMgYmFjayB0byB0aGUgcHJvamVjdC4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvVE9ETyBiL2xpYi9lcmwvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzM4NGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9UT0RPCkBAIC0wLDAgKzEsMzUgQEAKK21ha2UgdGhyaWZ0IGEgcHJvcGVyIE9UUCBhcHBsaWNhdGlvbgorICogYXBwLXdpZGUgY29uZmlndXJhdGlvbiAoZG8gRE5TIGxvb2t1cHM/KQorICogZGVmYXVsdCBwcm90b2NvbHMgLyB0cmFuc3BvcnRzIChmb3JnZXQgdGhpcyBmYWN0b3J5IGJ1c2luZXNzKQorICogZmFjdG9yIGZvciBlbGVnYW5jZQorCit0dXRvcmlhbCBjbGllbnQKKworbWFrZSBhbGwgbWV0aG9kcyBlZmZlY3RmdWwsIHJlbW92ZSB0aGUgc3BlY2lhbCBjYXNpbmcgKG9wdGlvbmFsbHksIGltcGxlbWVudCBtb25hZHMgZm9yIEVybGFuZykKKworY2hhbmdlIG9iamVjdHMgZnJvbSB7cmVjb3JkX3RhZywgLi4ufSB0byB7b29wX29iamVjdCwge3JlY29yZF90YWcsIC4uLn0sIG90aGVyX3VzZWZ1bF9zdHVmZn0KK3NvIDEpIHdlIGtub3cgZXhhY3RseSB3aGF0J3MgYW4gb2JqZWN0IChjYW4gd3JpdGUgaXNfb2JqZWN0LzEpIGUuZy4KKyAgICAgIGlzIHRoZSB0dXBsZSB7dFRyYW5zcG9ydEV4Y2VwdGlvbiwgLi4ufSBhbiBvYmplY3Qgb3IgYSB0dXBsZSB0aGF0IGhhcHBlbnMgdG8gc3RhcnQgd2l0aCB0aGF0IGF0b20/CisgICAgICB3ZSBjYW4ndCBjaGVjayB0aGlzIHVzaW5nIGlzX3JlY29yZC8yIHdpdGhvdXQgaW5jbHVkZSBldmVyeSBoZWFkZXIgZmlsZQorICAgICAgYWxzbywgdGhpcyBtYWtlcyBpdCBlYXN5IHRvIHBpY2sgb2JqZWN0cyBvdXQgb2YgZGVlcCB0dXBsZXMKKyAgIDIpIHdlIGNhbiBidWlsZCBtb3JlIGZ1bmN0aW9uYWxpdHkgaW50byBvb3AgbGF0ZXIgaWYgbmVlZCBiZQorICAgICAgY2FycnkgYXJvdW5kIHRoZSBjbGFzcy9zdXBlcmNsYXNzZXMgc28gaXNfYShPYmplY3QsIENsYXNzT3JTdXBlcmNsYXNzKSBpcyBlYXN5CisgICAzKSBtYXliZSBoYWNrIHVwIGlvOmZvcm1hdCBhbmQgZnJpZW5kcyB0byBydW4gb2JqZWN0cyB0aHJvdWdoIG9vcDppbnNwZWN0IGF1dG9tYXRpY2FsbHkKKworQ3VycmVudGx5IHdlIGNhbid0IGRpc3Rpbmdpc2ggYSBtZXRob2QgZXhpdGluZyBpbiB0aGUgbWlkZGxlIHdpdGggYW4gdW5kZWYgb3IgZnVuY3Rpb25fY2xhdXNlIGZyb20gYSBtZXRob2Qgbm90IGJlaW5nIGRlZmluZWQgaW4gYSBtb2R1bGUuICBCaWcgZXhhbXBsZTogaWYgdGhlIGdlbmVyYXRlZCBjb2RlIGNhbid0IGJlIGNhbGxlZCBhdCB0RXJsUHJvY2Vzc29yLmVybDo2MywgaXQgd2lsbCBleGl0IHdpdGggYSBtaXNzaW5nX21ldGhvZCBub3QgYmVjYXVzZSB0RXJsUHJvY2Vzc29yOnByb2Nlc3MvMyBpcyB1bmRlZmluZWQsIGJ1dCBiZWNhdXNlIEdQOnByb2Nlc3MvMyBpcyB1bmRlZmluZWQsIGJ1dCB0aGUgZXJyb3IgbWFrZXMgaXQgc2VlbSBsaWtlIHRoZSBmb3JtZXIgaGFwcGVuZWQuICBUaGUgb29wIGNvZGUgbmVlZHMgdG8gYmUgc21hcnRlciAtLSBJIHRoaW5rIGl0J3MgcG9zc2libGUgdG8gZWl0aGVyIGEpIGhvb2sgaW50byBFcmxhbmcncyBtaXNzaW5nIGZ1bmN0aW9uIGhhbmRsZXIgb3IgYikgZG8gc29tZSBpbnRyb3NwZWN0aW9uIHRvIGRldGVybWluZSBkaXJlY3RseSB3aGV0aGVyIGEgZnVuY3Rpb24gaXMgZGVmaW5lZCwgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGluZmVyIGZyb20gdGhlIGV4aXQuCisKK3Rlc3Qgc3VpdGVzCisKK21vdmUgYXMgbXVjaCAocHJvZ3JhbSBsb2dpYykgYXMgcG9zc2libGUgb3V0IG9mIHRocmlmdF9sb2dnZXIKKworbWFrZSB0aHJpZnRfbG9nZ2VyIDEwMCUgcm9idXN0CisKK3RocmlmdF9sb2dnZXIgZGV0ZWN0cyB0ZXJtIHdpZHRoPworCit1bmRpc2d1c3RpZnkgY29kZWdlbgorCittb3ZlIGF3YXkgZnJvbSB0aHJpZnRfb29wX3NlcnZlciBzaGltIHRvIHN0cmFpZ2h0LXVwIGdlbl9zZXJ2ZXJzCisKK21vdmUgYXdheSBmcm9tIEZhY3RvcmllcworCittb3ZlIGF3YXkgZnJvbSA/TDAsID9NMCwgYW5kIGZyaWVuZHMgLi4uIG1ha2UgY2FsbHMgaW4gb29wIG9yIGluZGl2aWR1YWwgbW9kdWxlcyAobGlrZSBnZW5fc2VydmVycyBzaG91bGQgYmUpCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS9vb3AuaHJsIGIvbGliL2VybC9pbmNsdWRlL29vcC5ocmwKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvb29wLmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL29vcC5ocmwKaW5kZXggYjQ4ZTFjZS4uODRkODFlMSAxMDA2NDQKLS0tIGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvb29wLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvb29wLmhybApAQCAtNiwyMCArNiwxOSBAQAogCiAtZGVmaW5lKENMQVNTKE9iaiksIGVsZW1lbnQoMSwgT2JqKSkuCiAKLS1kZWZpbmUoREVGSU5FX0FUVFIoQXR0ciksIGF0dHIoVGhpcywgZ2V0LCBBdHRyLCBfVmFsdWUpIC0+IFRoaXMjP01PRFVMRS5BdHRyOyAKKy1kZWZpbmUoREVGSU5FX0FUVFIoQXR0ciksIGF0dHIoVGhpcywgZ2V0LCBBdHRyLCBfVmFsdWUpIC0+IFRoaXMjP01PRFVMRS5BdHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cihUaGlzLCBzZXQsIEF0dHIsIFZhbHVlKSAgLT4gVGhpcyM/TU9EVUxFe0F0dHI9VmFsdWV9CiApLgotCSAgICAgICAKKwogJSUlIHN0YXRpYzogdXNlIG9ubHkgaWYgeW91J3JlIHN1cmUgVGhpcyBpcyBjbGFzcyA/TU9EVUxFIGFuZCBub3QgYSBzdXBlci9zdWJjbGFzcwogLWRlZmluZShBVFRSKEF0dHIpLCBUaGlzIz9NT0RVTEUuQXR0cikuCiAKICUlJSBjb252ZW5pZW5jZSBmb3IgaW1wbGVtZW50aW5nIGluc3BlY3QvMQogJSUlIGUuZy4gLT4gImZvbz01IgotLWRlZmluZShGT1JNQVRfQVRUUihBdHRyKSwgICAgIAorLWRlZmluZShGT1JNQVRfQVRUUihBdHRyKSwKIAlpb19saWI6d3JpdGVfYXRvbShBdHRyKSArKyAiPSIgKysgaW9fbGliOnByaW50KD9BVFRSKEF0dHIpKQogKS4KIAotCiAtZGVmaW5lKEFUVFJfRFVNTVksIAogCWF0dHIoZHVtbXksIGR1bW15LCBkdW1teSwgZHVtbXkpIC0+CiAJICAgICAgIHRocm93KGR1bW15X2F0dHJfdXNlZCkKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbC5ocmwgYi9saWIvZXJsL2luY2x1ZGUvcHJvdG9jb2wvdEJpbmFyeVByb3RvY29sLmhybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvcHJvdG9jb2wvdEJpbmFyeVByb3RvY29sLmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbC5ocmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHJsIGIvbGliL2VybC9pbmNsdWRlL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS9wcm90b2NvbC90QmluYXJ5UHJvdG9jb2xGYWN0b3J5LmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS9wcm90b2NvbC90UHJvdG9jb2wuaHJsIGIvbGliL2VybC9pbmNsdWRlL3Byb3RvY29sL3RQcm90b2NvbC5ocmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3Byb3RvY29sL3RQcm90b2NvbC5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS9wcm90b2NvbC90UHJvdG9jb2wuaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS9wcm90b2NvbC90UHJvdG9jb2xFeGNlcHRpb24uaHJsIGIvbGliL2VybC9pbmNsdWRlL3Byb3RvY29sL3RQcm90b2NvbEV4Y2VwdGlvbi5ocmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3Byb3RvY29sL3RQcm90b2NvbEV4Y2VwdGlvbi5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS9wcm90b2NvbC90UHJvdG9jb2xFeGNlcHRpb24uaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS9wcm90b2NvbC90UHJvdG9jb2xGYWN0b3J5LmhybCBiL2xpYi9lcmwvaW5jbHVkZS9wcm90b2NvbC90UHJvdG9jb2xGYWN0b3J5LmhybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvcHJvdG9jb2wvdFByb3RvY29sRmFjdG9yeS5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS9wcm90b2NvbC90UHJvdG9jb2xGYWN0b3J5LmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvc2VydmVyL3RFcmxTZXJ2ZXIuaHJsIGIvbGliL2VybC9pbmNsdWRlL3NlcnZlci90RXJsU2VydmVyLmhybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvc2VydmVyL3RFcmxTZXJ2ZXIuaHJsCnJlbmFtZSB0byBsaWIvZXJsL2luY2x1ZGUvc2VydmVyL3RFcmxTZXJ2ZXIuaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS9zZXJ2ZXIvdFNlcnZlci5ocmwgYi9saWIvZXJsL2luY2x1ZGUvc2VydmVyL3RTZXJ2ZXIuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS9zZXJ2ZXIvdFNlcnZlci5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS9zZXJ2ZXIvdFNlcnZlci5ocmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3NlcnZlci90U2ltcGxlU2VydmVyLmhybCBiL2xpYi9lcmwvaW5jbHVkZS9zZXJ2ZXIvdFNpbXBsZVNlcnZlci5ocmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3NlcnZlci90U2ltcGxlU2VydmVyLmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3NlcnZlci90U2ltcGxlU2VydmVyLmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdEFwcGxpY2F0aW9uRXhjZXB0aW9uLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90QXBwbGljYXRpb25FeGNlcHRpb24uaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90QXBwbGljYXRpb25FeGNlcHRpb24uaHJsCnJlbmFtZSB0byBsaWIvZXJsL2luY2x1ZGUvdEFwcGxpY2F0aW9uRXhjZXB0aW9uLmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdEVybFByb2Nlc3Nvci5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdEVybFByb2Nlc3Nvci5ocmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RFcmxQcm9jZXNzb3IuaHJsCnJlbmFtZSB0byBsaWIvZXJsL2luY2x1ZGUvdEVybFByb2Nlc3Nvci5ocmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RFeGNlcHRpb24uaHJsIGIvbGliL2VybC9pbmNsdWRlL3RFeGNlcHRpb24uaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90RXhjZXB0aW9uLmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3RFeGNlcHRpb24uaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90UHJvY2Vzc29yLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90UHJvY2Vzc29yLmhybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdFByb2Nlc3Nvci5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS90UHJvY2Vzc29yLmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdGhyaWZ0LmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnQuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90aHJpZnQuaHJsCnJlbmFtZSB0byBsaWIvZXJsL2luY2x1ZGUvdGhyaWZ0LmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdGhyaWZ0X2xvZ2dlci5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2xvZ2dlci5ocmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RocmlmdF9sb2dnZXIuaHJsCnJlbmFtZSB0byBsaWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2xvZ2dlci5ocmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RyYW5zcG9ydC90QnVmZmVyZWRUcmFuc3BvcnQuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RyYW5zcG9ydC90QnVmZmVyZWRUcmFuc3BvcnQuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdEJ1ZmZlcmVkVHJhbnNwb3J0LmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3RyYW5zcG9ydC90QnVmZmVyZWRUcmFuc3BvcnQuaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdHJhbnNwb3J0L3RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS90cmFuc3BvcnQvdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5ocmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RyYW5zcG9ydC90RXJsQWNjZXB0b3IuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RyYW5zcG9ydC90RXJsQWNjZXB0b3IuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdEVybEFjY2VwdG9yLmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3RyYW5zcG9ydC90RXJsQWNjZXB0b3IuaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdFNlcnZlclNvY2tldC5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdHJhbnNwb3J0L3RTZXJ2ZXJTb2NrZXQuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdFNlcnZlclNvY2tldC5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS90cmFuc3BvcnQvdFNlcnZlclNvY2tldC5ocmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RyYW5zcG9ydC90U2VydmVyVHJhbnNwb3J0LmhybCBiL2xpYi9lcmwvaW5jbHVkZS90cmFuc3BvcnQvdFNlcnZlclRyYW5zcG9ydC5ocmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RyYW5zcG9ydC90U2VydmVyVHJhbnNwb3J0LmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3RyYW5zcG9ydC90U2VydmVyVHJhbnNwb3J0LmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdHJhbnNwb3J0L3RTb2NrZXQuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RyYW5zcG9ydC90U29ja2V0LmhybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdHJhbnNwb3J0L3RTb2NrZXQuaHJsCnJlbmFtZSB0byBsaWIvZXJsL2luY2x1ZGUvdHJhbnNwb3J0L3RTb2NrZXQuaHJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdFRyYW5zcG9ydC5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdHJhbnNwb3J0L3RUcmFuc3BvcnQuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdFRyYW5zcG9ydC5ocmwKcmVuYW1lIHRvIGxpYi9lcmwvaW5jbHVkZS90cmFuc3BvcnQvdFRyYW5zcG9ydC5ocmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RyYW5zcG9ydC90VHJhbnNwb3J0RXhjZXB0aW9uLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90cmFuc3BvcnQvdFRyYW5zcG9ydEV4Y2VwdGlvbi5ocmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9pbmNsdWRlL3RyYW5zcG9ydC90VHJhbnNwb3J0RXhjZXB0aW9uLmhybApyZW5hbWUgdG8gbGliL2VybC9pbmNsdWRlL3RyYW5zcG9ydC90VHJhbnNwb3J0RXhjZXB0aW9uLmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L2luY2x1ZGUvdHJhbnNwb3J0L3RUcmFuc3BvcnRGYWN0b3J5LmhybCBiL2xpYi9lcmwvaW5jbHVkZS90cmFuc3BvcnQvdFRyYW5zcG9ydEZhY3RvcnkuaHJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvaW5jbHVkZS90cmFuc3BvcnQvdFRyYW5zcG9ydEZhY3RvcnkuaHJsCnJlbmFtZSB0byBsaWIvZXJsL2luY2x1ZGUvdHJhbnNwb3J0L3RUcmFuc3BvcnRGYWN0b3J5LmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvTWFrZWZpbGUgYi9saWIvZXJsL2xpYi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzYmZkYS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2xpYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWluY2x1ZGUgLi4vYnVpbGQvY29sb3JzLm1rCi0KLU1PRFVMRVM9JChzaGVsbCBscyAuIHwgZ3JlcCAiW14oTWFrZWZpbGUpXSIpCi0KLWFsbCBjbGVhbiBkb2NzOgotCUBmb3IgZGlyIGluICQoTU9EVUxFUyk7IGRvIFwKLQkJKGNkICQkZGlyOyBpZiBbIC1lICJTS0lQIiBdOyB0aGVuICBlY2hvICQke01ZX0xSRUQ6LSQoTFJFRCl9InNraXBwaW5nIFwibWFrZSAkQFwiIGZvciAkJGRpciI7IGVsc2UgJHtNQUtFfSAkQDsgZmkpOyBcCi0JCWlmIFsgIiQkPyIgLW5lICIwIiBdOyB0aGVuIEVSUk9SPSQkPzsgZWNobyAiRXJyb3IgQ29kZSAkJEVSUk9SIjsgZXhpdCAkJEVSUk9SOyBmaTsgXAotCQllY2hvIC1uICQoT0ZGKSQoTk9fQ09MT1IpOyBcCi0JZG9uZQpkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L0hFQURFUiBiL2xpYi9lcmwvbGliL3RocmlmdC9IRUFERVIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDNlZmIuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9saWIvdGhyaWZ0L0hFQURFUgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotJSUlIENvcHlyaWdodCAoYykgMjAwNy0gRmFjZWJvb2sKLSUlJSBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKLSUlJSAKLSUlJSBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6Ci0lJSUgaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KLQpkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L01ha2VmaWxlIGIvbGliL2VybC9saWIvdGhyaWZ0L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJjOGE4Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvbGliL3RocmlmdC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTU9EVUxFUyA9IFwKLQlzcmMKLQotYWxsIGNsZWFuIGRvY3M6Ci0JZm9yIGRpciBpbiAkKE1PRFVMRVMpOyBkbyBcCi0JCShjZCAkJGRpcjsgJHtNQUtFfSAkQCk7IFwKLQlkb25lCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvUkVBRE1FIGIvbGliL2VybC9saWIvdGhyaWZ0L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZmQ2ZC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2xpYi90aHJpZnQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotWU1NVgotZW1haWwgY3Bpcm9AZmFjZWJvb2suY29tCi0tLQotCi1UTyBTVEFSVCBBIFNFUlZFUjoKLQotJCBjZCBsaWIvZXJsL2xpYi90aHJpZnQvCi0kIGNkIHR1dG9yaWFsCi0kIHRocmlmdCAtY3BwIC1qYXZhIC1weSAtcGhwIC1yYiAtcGVybCAtZXJsIC14c2QgLXIgdHV0b3JpYWwudGhyaWZ0Ci0kIGNkIC4uCi0kIG1ha2UKLSQgLi9zZXJ2ZXIuc2gKLT4gUGlkID0gc2VydmVyOnN0YXJ0KCkuCi0gICoqIEdBWkUgSU4gQU1BWkVNRU5UICoqCi0+IHNlcnZlcjpzdG9wKFBpZCkuCi0KLU5PVEVTOgotCi1nZXQvc2V0IG5ldmVyIG1lYW5zIHByb2Nlc3MgZGljdGlvbmFyeQotCi10RXhlY3B0aW9ucyBhbmQgdCpGYWN0b3J5cyBhcmUgc3RyYWlnaHQgIm5ldyIgLS0gZS5nLiBURiA9IHRUcmFuc3BvcnRGYWN0b3J5Om5ldygpCi1ldmVyeXRoaW5nIGVsc2UgaXMgc3RhcnRfbmV3IChpLmUuIGdlbl9zZXJ2ZXI6c3RhcnRfbGluaykgLS0gdGhpcyBzcGF3bnMgYSBwcm9jZXNzIGFuZCByZXR1cm5zIGEgcGlkCi0KLW5vdGFibGUgY2hhbmdlIGZyb20gdGhlIFJ1Ynk6Ci1pbiB0KlNlcnZlcjpuZXcsIHRoZSBwYXJhbWV0ZXJzIG5vdyBpbmNsdWRlIGEgaGFuZGxlciwgaS5lLiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSBuYW1lLiAgRm9yIGV4YW1wbGUgaWYgeW91ciBpbnRlcmZhY2UgaXMgY2FsbGVkIGNhbGN1bGF0b3IsIHRoZW4gdG8gc3Bhd24gYSBUU2ltcGxlU2VydmVyIHRyeTogb29wOnN0YXJ0X25ldyh0U2ltcGxlU2VydmVyLCBbY2FsY3VsYXRvciwgY2FsY3VsYXRvckhhbmRsZXIsIFRyYW5zcG9ydCwgVEZdKQotCi10RXJsUHJvY2Vzc29yIGlzIGEgc2hpbSBhcm91bmQgdGhlIGdlbmVyYXRlZCBjb2RlICh3aGljaCBpcyBub3QgYWN0dWFsbHkgYSBnZW5fc2VydmVyKS4gIE9mIGNvdXJzZSB0RXJsUHJvY2Vzc29yIGlzbid0IGEgZ2VuX3NlcnZlciBlaXRoZXIgLi4uIHRocmlmdF9vb3Bfc2VydmVyIGlzIGEgc2hpbSB0byBtYWtlIG91ciAiVGhyaWZ0IG9iamVjdHMiIGdlbl9zZXJ2ZXJzLiAgTWF5YmUgd2Ugc2hvdWxkIHJlbW92ZSBzb21lIGxheWVycz8KLQotVXNlIHRFcmxTZXJ2ZXIgYW5kIHRFcmxBY2NlcHRvci4gIHRTaW1wbGVTZXJ2ZXIgYW5kIHRTZXJ2ZXJTb2NrZXQgYXJlIGluY29tcGF0aWJsZSBieSBkZXNpZ24gLi4uIHRoZSBjYWxsIHRyYWNlIGlzIHNwYXN0aWMgYWNyb3NzIHRoZSBwcm9jZXNzIHRyZWUuICB0RXJsU2VydmVyIGFuZCB0RXJsQWNjZXB0b3IgZm9sbG93IHRoZSBzYW1lIG1vZGVsIGFzIGlzZXJ2ZTogCi0gKiB0aGUgdG9wIGxldmVsIGNvZGUgc3Bhd25zIGEgdEVybFNlcnZlciwgd2hpY2ggbGlzdGVucyBvbiBhIHNvY2tldAotICogYSB0RXJsQWNjZXB0b3IgaXMgc3Bhd25lZCBhbmQgY2FsbHMgYWNjZXB0KCkgb24gdGhlIGxpc3RlbmluZyBzb2NrZXQKLSAqIHdoZW4gYWNjZXB0KCkgZmluaXNoZXMsIHRoZSB0RXJsQWNjZXB0b3IgCi0gICAqIHRlbGxzIHRoZSB0RXJsU2VydmVyIHRvIHNwYXduIGEgbmV3IGFjY2VwdG9yCi0gICAqIGhhbmRsZXMgdGhlIHJlcXVlc3RzIGJ5IHNwYXduaW5nIGEgcHJvY2Vzc29yLCBhIHRyYW5zcG9ydCwgYW5kIGEgcHJvdG9jb2wKLSAqICh0aGUgdHJpY2t5IHBhcnQpIHdoZW4gdGhlIHNvY2tldCBjbG9zZXMsIHRoZSBwcm90b2NvbCBleGl0cywgc286Ci0gICAqIHRoZSB0cmFuc3BvcnQgZXhpdHMgYmVjYXVzZSBpdCdzIHRoZSBvbmUgY2FsbGVyIG9mIHRoZSBwcm90b2NvbAotICAgKiBsaWtld2lzZSwgdGhlIHByb2Nlc3NvciBleGl0cyBiZWNhdXNlIGl0J3MgdGhlIGNhbGxlciBvZiB0aGUgdHJhbnNwb3J0Ci0gICAqIHRoZSB0RXJsQWNjZXB0b3IgdHJhcHMgdGhlIHByb3RvY29sJ3MgZXhpdCBhbmQgZXhpdHMgd2l0aCBhbiBhY2NlcHRvcl9kb25lCi0gICAqIHRoZSB0RXJsU2VydmVyIHNlZXMgdGhhdCB0aGUgYWNjZXB0b3IgZXhpdGVkIGFuZCBkb2VzIG5vdGhpbmcgc2luY2UgdGhlcmUgaXMgYWxyZWFkeSBhbm90aGVyIGFjY2VwdG9yIGFjY2VwdCgpaW5nIG9uIHRoZSBsaXN0ZW4gc29ja2V0CmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvVE9ETyBiL2xpYi9lcmwvbGliL3RocmlmdC9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2EyMTg0Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvbGliL3RocmlmdC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotbWFrZSB0aHJpZnQgYSBwcm9wZXIgT1RQIGFwcGxpY2F0aW9uCi0gKiBhcHAtd2lkZSBjb25maWd1cmF0aW9uIChkbyBETlMgbG9va3Vwcz8pCi0gKiBkZWZhdWx0IHByb3RvY29scyAvIHRyYW5zcG9ydHMgKGZvcmdldCB0aGlzIGZhY3RvcnkgYnVzaW5lc3MpCi0gKiBmYWN0b3IgZm9yIGVsZWdhbmNlCi0KLXR1dG9yaWFsIGNsaWVudAotCi1maW5kIFRPRE8oY3Bpcm8pcwotbWFrZSBhbGwgbWV0aG9kcyBlZmZlY3RmdWwsIHJlbW92ZSB0aGUgc3BlY2lhbCBjYXNpbmcgKG9wdGlvbmFsbHksIGltcGxlbWVudCBtb25hZHMgZm9yIEVybGFuZykKLQotY2hhbmdlIG9iamVjdHMgZnJvbSB7cmVjb3JkX3RhZywgLi4ufSB0byB7b29wX29iamVjdCwge3JlY29yZF90YWcsIC4uLn0sIG90aGVyX3VzZWZ1bF9zdHVmZn0KLXNvIDEpIHdlIGtub3cgZXhhY3RseSB3aGF0J3MgYW4gb2JqZWN0IChjYW4gd3JpdGUgaXNfb2JqZWN0LzEpIGUuZy4KLSAgICAgIGlzIHRoZSB0dXBsZSB7dFRyYW5zcG9ydEV4Y2VwdGlvbiwgLi4ufSBhbiBvYmplY3Qgb3IgYSB0dXBsZSB0aGF0IGhhcHBlbnMgdG8gc3RhcnQgd2l0aCB0aGF0IGF0b20/Ci0gICAgICB3ZSBjYW4ndCBjaGVjayB0aGlzIHVzaW5nIGlzX3JlY29yZC8yIHdpdGhvdXQgaW5jbHVkZSBldmVyeSBoZWFkZXIgZmlsZQotICAgICAgYWxzbywgdGhpcyBtYWtlcyBpdCBlYXN5IHRvIHBpY2sgb2JqZWN0cyBvdXQgb2YgZGVlcCB0dXBsZXMKLSAgIDIpIHdlIGNhbiBidWlsZCBtb3JlIGZ1bmN0aW9uYWxpdHkgaW50byBvb3AgbGF0ZXIgaWYgbmVlZCBiZQotICAgICAgY2FycnkgYXJvdW5kIHRoZSBjbGFzcy9zdXBlcmNsYXNzZXMgc28gaXNfYShPYmplY3QsIENsYXNzT3JTdXBlcmNsYXNzKSBpcyBlYXN5Ci0gICAzKSBtYXliZSBoYWNrIHVwIGlvOmZvcm1hdCBhbmQgZnJpZW5kcyB0byBydW4gb2JqZWN0cyB0aHJvdWdoIG9vcDppbnNwZWN0IGF1dG9tYXRpY2FsbHkKLQotdGVzdCBzdWl0ZXMKLQotbW92ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIG91dCBvZiB0aHJpZnRfbG9nZ2VyCi0KLW1ha2UgdGhyaWZ0X2xvZ2dlciAxMDAlIHJvYnVzdAotCi10aHJpZnRfbG9nZ2VyIGRldGVjdHMgdGVybSB3aWR0aD8KLQotdW5kaXNndXN0aWZ5IGNvZGVnZW4KLQotbW92ZSBhd2F5IGZyb20gdGhyaWZ0X29vcF9zZXJ2ZXIgc2hpbSB0byBzdHJhaWdodC11cCBnZW5fc2VydmVycwotCi1tb3ZlIGF3YXkgZnJvbSBGYWN0b3JpZXMKLQotbW92ZSBhd2F5IGZyb20gP0wwLCA/TTAsIGFuZCBmcmllbmRzIC4uLiBtYWtlIGNhbGxzIGluIG9vcAotYmV0dGVyL3dvcnNlIHlldCwgbWFrZSBhbiBhYnN5biB0cmFuc2Zvcm1lciBhbmQgaW50cm9kdWNlIHNvbWUgc2xpY2sgc3ludGF4IHRvIG1ha2UgaXQgbGVzcyBwYWluZnVsIGFuZCBtb3JlIG9idmlvdXMgd2hhdCdzIGdvaW5nIG9uCi1PTkxZIElGIG91ciBnZW50bGUgbnVkZ2luZyBhd2F5IGZyb20gb29wIGFuZCB0aHJpZnRfb29wX3NlcnZlciBpc24ndCBnb29kIGVub3VnaApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NlcnZlci5zaCBiL2xpYi9lcmwvbGliL3RocmlmdC9zZXJ2ZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZTJmZTQuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9saWIvdGhyaWZ0L3NlcnZlci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMhL2Jpbi9zaAotaWYgISBbIC1kIHR1dG9yaWFsL2dlbi1lcmwgXTsgdGhlbgotICAgIGVjaG8gZ2VuZXJhdGluZyBnZW4tZXJsCi0gICAgY2QgdHV0b3JpYWwKLSAgICB0aHJpZnQgLWVybCAtcmIgLXIgdHV0b3JpYWwudGhyaWZ0Ci0gICAgY2QgLi4KLWZpCi1lY2hvICJDb21waWxpbmcgdXNlci8gYW5kIHR1dG9yaWFsL2dlbi1lcmwvLi4uIgotbWtkaXIgZWJpbi11c2VyCi1lcmxjIC1JIGluY2x1ZGUgLUkgdHV0b3JpYWwvZ2VuLWVybCAtbyBlYmluLXVzZXIgdXNlci8qLmVybCB0dXRvcmlhbC9nZW4tZXJsLyouZXJsICYmCi1lcmwgK0sgdHJ1ZSAtcGEgZWJpbiAtcGEgZWJpbi11c2VyCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvdHV0b3JpYWwgYi9saWIvZXJsL2xpYi90aHJpZnQvdHV0b3JpYWwKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDk3MjBhNGMuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9saWIvdGhyaWZ0L3R1dG9yaWFsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vdHV0b3JpYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvdXNlciBiL2xpYi9lcmwvbGliL3RocmlmdC91c2VyCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhNWFhYzZlLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvbGliL3RocmlmdC91c2VyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vdHV0b3JpYWwvZXJsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC9saWNlbmNlLnR4dCBiL2xpYi9lcmwvbGljZW5jZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTI5OTIuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9saWNlbmNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLVR1ZSBPY3QgMjQgMTI6Mjg6NDQgQ0RUIDIwMDYKLQotQ29weXJpZ2h0IChjKSA8MjAwNj4gPE1hcnRpbiBKLiBMb2dhbiwgRXJsd2FyZT4gCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgCi1vZiB0aGlzIHNvZnR3YXJlIChPVFAgQmFzZSwgZnNsaWIsIEcuQS5TKSAgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byAKLXVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIAotb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIAotc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCAKLUlOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIAotUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCAKLUhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiAKLU9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSAKLU9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL01ha2VmaWxlIGIvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI3NGNkLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWluY2x1ZGUgLi4vYnVpbGQvY29sb3JzLm1rCi0KLU1PRFVMRVM9JChzaGVsbCBscyAuIHwgZ3JlcCAiW14oTWFrZWZpbGUpXSIpCi0KLWFsbCBjbGVhbjoKLQlAZm9yIGRpciBpbiAkKE1PRFVMRVMpOyBkbyBcCi0JCShjZCAkJGRpcjsgaWYgWyAtZSAiU0tJUCIgXTsgdGhlbiAgZWNobyAkJHtNWV9MUkVEOi0kKExSRUQpfSJza2lwcGluZyBcIm1ha2UgJEBcIiBmb3IgJCRkaXIiOyBlbHNlICR7TUFLRX0gJEA7IGZpKTsgXAotCQlpZiBbICIkJD8iIC1uZSAiMCIgXTsgdGhlbiBFUlJPUj0kJD87IGVjaG8gIkVycm9yIENvZGUgJCRFUlJPUiI7IGV4aXQgJCRFUlJPUjsgZmk7IFwKLQkJZWNobyAtbiAkKE9GRikkKE5PX0NPTE9SKTsgXAotCWRvbmUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL01ha2VmaWxlIGIvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkMzU5NTYuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE1ha2UgZmlsZSBmb3IgY3JlYXRpbmcgYW4gb3RwIHJlbGVhc2UuIAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMjCi0jIEJhc2VuYW1lIG9mIHRoaXMgcmVsZWFzZS4KLSMjCi1SRUxTPSQoc2hlbGwgYmFzZW5hbWUgYHB3ZGApCi1BUFBfTkFNRT0kKHNoZWxsIGVjaG8gJChSRUxTKSB8IHNlZCBzL19yZWwkJC8vKQotCi1pbmNsdWRlIC4uLy4uL2J1aWxkL290cC5tawotCi1pbmNsdWRlIC4vdnNuLm1rCi0KLSNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS90YXJnZXQubWsKLSNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS8kKFRBUkdFVCkvb3RwLm1rCi0KLVVTUl9MSUJQQVRIPS4uLy4uL2xpYgotSU5TVEFMTF9ESVI9L3Vzci9sb2NhbC9saWIKLUFCU19VU0VSX0xJQlBBVEg9JChzaGVsbCBjZCAuLi8uLi9saWI7cHdkKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ1JFQVRFIERJUiBTVFJVQ1RVUkUgSEVSRQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhURE9DUz0kKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyouaHRtbCkgXAotCSQod2lsZGNhcmQgJChBQlNfVVNFUl9MSUJQQVRIKS8kKEFQUF9OQU1FKS9odGRvY3MvKi5odG0pIFwKLQkkKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyoueWF3cykKLUJVSUxEX0ZJTEVTPWZzX2Jvb3Rfc21pdGhlLmJlYW0gZnNfbGlzdHMuYmVhbSBmc19saWIuYmVhbQotCi1MT0NBTF9ESVI9bG9jYWwKLSNMT0NBTF9ESVI9JChzaGVsbCBjYXQgJChSRUxTKS5yZWwuc3JjIHxncmVwIC1tIDEgJyQoQVBQX05BTUUpJyB8YXdrIC1GICciJyAne3ByaW50ZiAiJXMtJXMiLCAkJDIsJCQ0fScpCi0KLURJUl9TVFJVQ1RVUkU9IFwKLQkkKExPQ0FMX0RJUikgXAotCSQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKSBcCi0JJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pIFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYgXAotCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvaHRkb2NzIAotCi1QUk9EVUNUSU9OX0RJUl9TVFJVQ1RVUkU9IFwKLQkkKFJFTFMpIFwKLQkkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKSBcCi0JJChSRUxTKS9zdGFnZSBcCi0JJChSRUxTKS9sb2cvJChSRUxfVlNOKSBcCi0JJChSRUxTKS92YXIvJChSRUxfVlNOKSBcCi0JJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cgXAotCSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcyBcCi0JJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNDUklQVF9BTkRfQk9PVF9GSUxFUz0gXAotCSQoUkVMUykuc2NyaXB0IFwKLQkkKFJFTFMpLmJvb3QKLQotTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTPSBcCi0JJChMT0NBTF9ESVIpLyQoUkVMUykuc2NyaXB0IFwKLQkkKExPQ0FMX0RJUikvJChSRUxTKS5ib290Ci0KLUxPQ0FMX0hUVFBfQ09ORj0gXAotCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi95YXdzLmNvbmYgXAotCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzICAKLQotUFJPRFVDVElPTl9IVFRQX0NPTkY9IFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mIFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlcyAgCi0KLUxPQ0FMX1RBUkdFVF9GSUxFUz0kKExPQ0FMX0hUVFBfQ09ORikgJChMT0NBTF9ESVIpLyQoUkVMUykuY29uZmlnICQoTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTKQotCi1MT0NBTF9UQVJHRVRTPSQoTE9DQUxfRElSKS8kKFJFTFMpLnNoIHZzbml0ICQoTE9DQUxfVEFSR0VUX0ZJTEVTKSAKLQotUFJPRFVDVElPTl9UQVJHRVRTPSQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCi0JICAgICAgICAgICAkKFJFTFMpL2xpYiBcCi0gICAgICAgICAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmMgXAotCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLmNvbmZpZy5zcmMgXAotCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjIFwKLQkJICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnNoLnNyYyAgXAotCQkgICAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3MgXAotCQkgICAkKFJFTFMpL2luc3RhbGwuc2ggXAotCQkgICAkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlIAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVEFSR0VUUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbCBkZWJ1ZyBvcHQgaW5zdHIgc2NyaXB0OiAgJChESVJfU1RSVUNUVVJFKSAkKExPQ0FMX1RBUkdFVFMpICQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKSAkKFBST0RVQ1RJT05fVEFSR0VUUykKLQlAZWNobyAkKEhURE9DUykKLQotaW5zdGFsbDogIHN0YWdlCi0KLXRhcjogJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnegotCi0kKERJUl9TVFJVQ1RVUkUpOgotCW1rZGlyIC1wICRACi0KLSQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKToKLQlta2RpciAtcCAkQAotCQotY2xlYW46Ci0JJChSTSkgJChSRUxfU0NSSVBUUykgJChUQVJHRVRfRklMRVMpCi0JJChSTSkgLXIgJChMT0NBTF9ESVIpICQoUFJPRE5fRElSKQotCSQoUk0pICQoUkVMUykucmVsCi0JJChSTSkgLXIgJChSRUxTKQotCSQoUk0pICQoUkVMUykqLnRnegotCSQoUk0pICQoUkVMUykucmVsLnNyYy50bXAKLQkkKFJNKSAkKFNDUklQVF9BTkRfQk9PVF9GSUxFUykKLQotZG9jczoKLQkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUQVJHRVRTIEZPUiBMT0NBTCBNT0RFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBzdGFydHVwIHNjcmlwdCBmb3IgbG9jYWwgbW9kZQotJChMT0NBTF9ESVIpLyQoUkVMUykuc2g6IAotCUBlY2hvICcjIS9iaW4vc2gnID4gJEAKLQlAZWNobyAiY2QgJChDVVJESVIpLyQoTE9DQUxfRElSKSIgPj4gJEAKLQlAZWNobyAiZXJsIC1uYW1lICQke1VTRVJ9XyQoUkVMUykgLWJvb3QgJChSRUxTKSAtY29uZmlnICQoUkVMUykuY29uZmlnIFwkJEAiID4+ICRACi0JY2htb2QgK3ggJEAKLQlAZWNobwotCUBlY2hvICI9PT09IFN0YXJ0IGxvY2FsIG5vZGUgd2l0aCBcInNoICRAXCIgPT09PSIKLQlAZWNobwotCi0jIENyZWF0ZSB0aGUgY29uZmlnIGZpbGUgZm9yIGxvY2FsIG1vZGUuCi0kKExPQ0FMX0RJUikvJChSRUxTKS5jb25maWc6ICQoUkVMUykuY29uZmlnLnNyYwotCXNlZCAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKLQkgICAgLWUgJ3M7JVZBUl9PVFAlOyQoQ1VSRElSKS8kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTik7JyBcCi0gICAgICAgICAgICAtZSAnczslUkVMUyU7JChSRUxTKTtnJyBcCi0gICAgICAgICAgICAtZSAnczslSE9NRSU7JChIT01FKTtnJyBcCi0gICAgICAgICAgICAtZSAnczslQlJPQURDQVNUX0FERFJFU1MlOyQoQlJPQURDQVNUX0FERFJFU1MpO2cnIFwKLSAgICAgICAgICAgIC1lICdzOyVDT05UQUNUX05PREUlOyQoQ09OVEFDVF9OT0RFKTtnJyBcCi0JICAgIC1lICJzOyVIT1NUTkFNRSU7YGhvc3RuYW1lIC0tbG9uZ2A7IiBcCi0gICAgICAgICAgICAtZSAnczslQVBQX05BTUUlOyQoQVBQX05BTUUpOycgXAotCSAgICAtZSAnczslQVBQX1ZFUlNJT04lOyQoQVBQX1ZFUlNJT04pO2cnIFwKLSAgICAgICAgICAgICAkPCA+ICRACi0KLSMgQ3JlYXRlIHRoZSBodHRwZCBjb25mIGZpbGUgZm9yIGxvY2FsIG1vZGUuCi0kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mOiB5YXdzLmNvbmYuc3JjCi0Jc2VkIC1lICdzOyVWQVJfT1RQJTskKENVUkRJUikvJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pOycgXAotCSAgICAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKLQkgICAgLWUgJ3M7JUhURE9DX1JPT1QlOyQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzOycgXAotICAgICAgICAgICAgLWUgJ3M7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTsnIFwKLSAgICAgICAgICAgIC1lICdzOyVSRUxTJTskKFJFTFMpOycgXAotICAgICAgICAgICAgLWUgJ3M7JVVTRVIlOyQoVVNFUik7JyBcCi0JICAgIC1lICdzOyVIVERPQ19ST09UJTskKEFCU19VU0VSX0xJQlBBVEgpOycgXAotICAgICAgICAgICAgLWUgJ3M7JU1IT1NUJTskKE1IT1NUKTsnIFwKLSAgICAgICAgICAgICQ8ID4gJEAKLQotIyBDcmVhdGUgdGhlIGNvbmZpZyBmaWxlIGZvciBsb2NhbCBtb2RlLgotdnNuaXQ6ICQoUkVMUykucmVsLnNyYyAKLQlzZWQgLWUgJ3M7JVJFTF9WU04lOyQoUkVMX1ZTTik7JyBcCi0JICAgICAgICQ8ID4gJDwudG1wCi0KLSMgQ3JlYXRlIGFuZCBwb3NpdGlvbiBzY3JpcHQgYW5kIGJvb3QgZmlsZXMgZm9yIGxvY2FsIG1vZGUuCi0kKExPQ0FMX1NDUklQVF9BTkRfQk9PVF9GSUxFUyk6IAotCUAgZXJsIC1weiAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluIFwKLQkgICAgICAtbm9zaGVsbCBcCi0JICAgICAgLXMgZnNfbGliIHNfYXBwbHkgZnNfYm9vdF9zbWl0aGUgbWFrZV9zY3JpcHRfYW5kX2Jvb3QgIltcIiQoRVJMX1JVTl9UT1ApLypcIiwgIFwiJChVU1JfTElCUEFUSClcIl0uICIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkJChiYXNlbmFtZSBgcHdkYCkiLnJlbC5zcmMudG1wXCIuICIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltsb2NhbF0uICIgXAotCSAgICAgIC1zIGluaXQgc3RvcAotCWNwICQoU0NSSVBUX0FORF9CT09UX0ZJTEVTKSAkKExPQ0FMX0RJUikvIAotCi0kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlczogLi4vLi4vYnVpbGQvbWltZS50eXBlcwotCWNwICQ8ICRACi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUQVJHRVRTIEZPUiBQUk9EVUNUSU9OIE1PREUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJChSRUxTKS9saWI6IAotCSMgRm9yIHNvbWUgcmVhc29uIHRoaXMgd2lsbCBub3QgaGFwcGVuIGlmIGFkZGVkIHRvIFBST0RVQ1RJT05fRElSX1NUUlVDVFVSRQotCW1rZGlyICRACi0JQCBlcmwgLXB6ICQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCi0JICAgICAgLW5vc2hlbGwgXAotCSAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIHN0YWdlX2Zyb21fcmVsc3JjICJbXCIkKFVTUl9MSUJQQVRIKVwiXS4gIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiJCQoYmFzZW5hbWUgYHB3ZGApIi5yZWwuc3JjXCIuICIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiRAXCIiLiAiIFwKLQkgICAgICAtcyBpbml0IHN0b3AKLQotIyBNb3ZlIHRoZSBodGRvY3MgZnJvbSB0aGUgbG9jYWwgYXBwcyB0byB0aGUgcHJvZHVjdGlvbiBodGRvYyByb290IGRpcmVjdG9yeS4KLSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcy86ICQoSFRET0NTKQotCUBta2RpciAtcCAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7IFwKLQlmb3IgeCBpbiAkKEhURE9DUyk7ZG8gXAotIAkJY3AgICQkeCAkQDsgXAotCWRvbmUKLQotIyBzdGFydHVwIHNjcmlwdCBmb3IgcHJvZHVjdGlvbiBtb2RlCi0kKFJFTFMpL3N0YWdlLyQoUkVMUykuc2guc3JjOiAKLQlAZWNobyAnIyEvYmluL3NoJyA+ICRACi0JQGVjaG8gImNkICVJTlNUQUxMX0RJUiUvJChSRUxTKS9yZWxlYXNlLyQoUkVMX1ZTTikiID4+ICRACi0JQGVjaG8gImVybCAtbmFtZSAkKFJFTFMpIC1ib290ICQoUkVMUykgLWNvbmZpZyAkKFJFTFMpLmNvbmZpZyAtZGV0YWNoZWQgXCQkQCIgPj4gJEAKLQljaG1vZCAreCAkQAotCi0kKFJFTFMpL2J1aWxkLyQoUkVMX1ZTTik6ICAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluCi0JbWtkaXIgLXAgJChSRUxTKS9idWlsZC8kKFJFTF9WU04pIAotCWNwICQ8L2ZzX2Jvb3Rfc21pdGhlLmJlYW0gJEAKLQljcCAkPC9mc19saWIuYmVhbSAkQAotCWNwICQ8L2ZzX2xpc3RzLmJlYW0gJEAKLQotJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmM6ICQoUkVMUykucmVsLnNyYy50bXAKLQljcCAkPCAkQAotCi0kKFJFTFMpL3N0YWdlLyQoUkVMUykuY29uZmlnLnNyYzogJChSRUxTKS5jb25maWcuc3JjCi0JY3AgJDwgJEAKLQotJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjOiB5YXdzLmNvbmYuc3JjCi0JY3AgJDwgJEAKLQotJChSRUxTKS9pbnN0YWxsLnNoOiAKLQlAZWNobyAnIyEvYmluL3NoJyA+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiaWYgWyBcJCQjIC1lcSAxIF07dGhlbiIgPj4gJEAKLQlAZWNobyAiICAgIElOU1RBTExfRElSPVwkJDE7IiA+PiAkQAotCUBlY2hvICJlbHNlIiA+PiAkQAotCUBlY2hvICIgICAgSU5TVEFMTF9ESVI9JChJTlNUQUxMX0RJUik7IiA+PiAkQAotCUBlY2hvICJmaSIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJmdW5jdGlvbiBtdW5nZSgpIHsiID4+ICRACi0JQGVjaG8gIiAgICBzZWQgLWUgXCJzOyVMT0dfT1RQJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2xvZy8kKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JVZBUl9PVFAlO1wkJElOU1RBTExfRElSLyQoUkVMUykvdmFyLyQoUkVMX1ZTTik7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslUkVMUyU7JChSRUxTKTtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVSRUxfVlNOJTskKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JVVTRVIlOyQkVVNFUjtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVIVERPQ19ST09UJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslTUhPU1QlO1xgaG9zdG5hbWVcYDtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVCUk9BRENBU1RfQUREUkVTUyU7JChCUk9BRENBU1RfQUREUkVTUyk7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslSU5TVEFMTF9ESVIlO1wkJElOU1RBTExfRElSO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JUNPTlRBQ1RfTk9ERSU7JChDT05UQUNUX05PREUpO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JUhPU1ROQU1FJTtcYGhvc3RuYW1lIC0tbG9uZ1xgO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVBUFBfVkVSU0lPTiU7JChBUFBfVkVSU0lPTik7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICcgICAgICAgICQkMSA+ICQkMicgPj4gJEAKLQlAZWNobyAifSIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJtdW5nZSBzdGFnZS95YXdzLmNvbmYuc3JjIHZhci8kKFJFTF9WU04pL3d3dy9jb25mL3lhd3MuY29uZjsiID4+ICRACi0JQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykuY29uZmlnLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5jb25maWc7IiA+PiAkQAotCUBlY2hvICJtdW5nZSBzdGFnZS8kKFJFTFMpLnNoLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACi0JQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykucmVsLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5yZWw7IiA+PiAkQAotCUBlY2hvICJjaG1vZCAreCByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiY2QgLi47IiA+PiAkQAotCUBlY2hvICJmaW5kICQoUkVMUykgfCBjcGlvIC1vID4gXCQkSU5TVEFMTF9ESVIvJChSRUxTKS5jcGlvOyIgPj4gJEAKLQlAZWNobyAiY2QgLTsiID4+ICRACi0JQGVjaG8gImNkIFwkJElOU1RBTExfRElSOyAiID4+ICRACi0JQGVjaG8gImVjaG8gLW4gXCJVbnBhY2tlZDogXCIiID4+ICRACi0JQGVjaG8gImNwaW8gLXVpZCA8ICQoUkVMUykuY3BpbzsiID4+ICRACi0JQGVjaG8gInJtICQoUkVMUykuY3BpbzsiID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiZWNobyBcInB3ZCBpcyBcYHB3ZFxgXCI7IiA+PiAkQAotCUBlY2hvICJjZCAkKFJFTFMpOyIgPj4gJEAKLQlAZWNobyAiIGVybCAtcHogYnVpbGQvJChSRUxfVlNOKSBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgLW5vc2hlbGwgXFwiID4+ICRACi0JQGVjaG8gLW4gIiAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIG1ha2Vfc2NyaXB0X2FuZF9ib290IFwiW1xcXCIkKEVSTF9SVU5fVE9QKS8qXFxcIiwgIFxcXCJsaWIvXFxcIl0uIFwiICIgPj4gJEAKLQlAZWNobyAtbiAgICAgICAgIlwiXFxcInN0YWdlLyQkKGJhc2VuYW1lIGBwd2RgKS5yZWwuc3JjXFxcIi4gXCIgIiA+PiAkQAotCUBlY2hvIC1uICAgICAgICAiXCJbbG9jYWxdLiBcIiAiID4+ICRACi0JQGVjaG8gICAgICAgICAgICItcyBpbml0IHN0b3AgfCBlZ3JlcCAnKnRlcm1pbmF0ZSp8RVJST1InIiA+PiAkQAotCUBlY2hvICJpZiBbIFwkJD8gLWVxIDAgXTsgdGhlbiIgPj4gJEAKLQlAZWNobyAiZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCI7IiA+PiAkQAotCUBlY2hvICJlY2hvIFwiU1RBR0UgRkFJTFVSRSBcJCQ/ICAtIFNpbGVuY2UgdGhlIGRpc2NvcmQuXCI7IiA+PiAkQAotCUBlY2hvICJlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIjsiID4+ICRACi0JQGVjaG8gImV4aXQgMTsiID4+ICRACi0JQGVjaG8gImZpIiA+PiAkQAotCUBlY2hvICIiID4+ICRACi0JQGVjaG8gIm12ICQoUkVMUykucmVsICQoUkVMUykuc2NyaXB0ICQoUkVMUykuYm9vdCByZWxlYXNlLyQoUkVMX1ZTTik7IiA+PiAkQAotCUBlY2hvICIiID4+ICRACi0JQGVjaG8gInJtIC1yIHN0YWdlOyIgPj4gJEAKLQlAZWNobyAicm0gLXIgYnVpbGQ7IiA+PiAkQAotCUBlY2hvICJjZCAtOyIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJjaGdycCAtUiBlcnRzICQoUkVMUyk7ICIgPj4gJEAKLQlAZWNobyAiY2htb2QgLVIgNzc1ICQoUkVMUyk7ICIgPj4gJEAKLQlAZWNobyAiY2QgLSIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJybSAtZiAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsiID4+ICRACi0JQGVjaG8gImxuIC1zIFwkJElOU1RBTExfRElSLyQoUkVMUykvcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykuc2ggL3Vzci9sb2NhbC9iaW4vJChBUFBfTkFNRSk7IiA+PiAkQAotCUBlY2hvICJjaGdycCAtUiBlcnRzIC91c3IvbG9jYWwvYmluLyQoQVBQX05BTUUpOyAiID4+ICRACi0JQGVjaG8gImNobW9kIC1SIDc3NSAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsgIiA+PiAkQAotCUBlY2hvICJybSBcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2luc3RhbGwuc2g7IiA+PiAkQAotCUBlY2hvICJlY2hvIC1uICQkJ1xlWzA7MzJtJyIgPj4gJEAKLQlAZWNobyAiZWNobyBcIiQoQVBQX05BTUUpIGluc3RhbGxhdGlvbiB0byBcJCRJTlNUQUxMX0RJUiBjb21wbGV0ZS5cIiIgPj4gJEAKLQlAZWNobyAiZWNobyAtbiAkJCdcZVswbSciID4+ICRACi0JY2htb2QgK3ggJEAKLQkJCi0KLXN0YWdlOiAkKFJFTFMpCi0JY2QgJChSRUxTKTsgXAotCS4vaW5zdGFsbC5zaDsgXAotCWNkIC0KLQotJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzOiAuLi8uLi9idWlsZC9taW1lLnR5cGVzCi0JY3AgJDwgJEAKLQotJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnejogJChSRUxTKQotCXRhciAtemN2ZiAkQCAkPAotCi0kKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlOiAuLi8uLi90b29scy91dGlsaXRpZXMvY2xlYW5fcmVsZWFzZQotCWNwICQ8ICRACi0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL2xvY2FsL3RocmlmdF9yZWwuY29uZmlnIGIvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvbG9jYWwvdGhyaWZ0X3JlbC5jb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDkxZWYuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvbG9jYWwvdGhyaWZ0X3JlbC5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0lJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQotJSUlIFBhcmFtZXRlciBzZXR0aW5ncyBmb3IgYXBwcyBvbiB0aHJpZnQKLSUlJSBXYXJuaW5nIC0gdGhpcyBjb25maWcgZmlsZSAqbXVzdCogZW5kIHdpdGggPGRvdD48d2hpdGVzcGFjZT4KLQotJSUgd3JpdGUgbG9nIGZpbGVzIHRvIHNhc2xfZGlyCi1bCi0ge3Nhc2wsCi0gIFsKLSAgIHtzYXNsX2Vycm9yX2xvZ2dlciwge2ZpbGUsICIvZGF0YS91c2Vycy9jcGlyby90aHJpZnQvdHJ1bmsvbGliL2VybC9yZWxlYXNlL3RocmlmdF9yZWwvbG9jYWwvbG9nLzEuMC9zYXNsX2xvZyJ9fQotICBdfSwKLQotCi0ge2dhcywKLSAgWwotICAge21vZF9zcGVjcywgW3tlbHdyYXAsIHtmc19lbHdyYXBfaCwgc3RhcnRfbGlua319XX0sCi0KLSAgICUgZWx3cmFwIGNvbmZpZy4KLSAgIHtlcnJfbG9nLCAiL2RhdGEvdXNlcnMvY3Bpcm8vdGhyaWZ0L3RydW5rL2xpYi9lcmwvcmVsZWFzZS90aHJpZnRfcmVsL2xvY2FsL2xvZy8xLjAvZXJyX2xvZyJ9LAotICAge2Vycl9sb2dfd3JhcF9pbmZvLCB7e2Vyciw1MDAwMDAwLDEwfSx7c2FzbCw1MDAwMDAwLDEwfX19LCAKLSAgIHtlcnJfbG9nX3R0eSwgdHJ1ZX0gJSBMb2cgdG8gdGhlIHNjcmVlbgotICAgXX0sCi0KLSB7dGhyaWZ0LAotICBbCi0gIF19Ci1dLiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL2xvY2FsL3RocmlmdF9yZWwuc2ggYi9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC9sb2NhbC90aHJpZnRfcmVsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzBhNDNjLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL2xvY2FsL3RocmlmdF9yZWwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMhL2Jpbi9zaAotY2QgL2RhdGEvdXNlcnMvY3Bpcm8vdGhyaWZ0L3RydW5rL2xpYi9lcmwvcmVsZWFzZS90aHJpZnRfcmVsL2xvY2FsCi1lcmwgLW5hbWUgY3Bpcm9fdGhyaWZ0X3JlbCAtYm9vdCB0aHJpZnRfcmVsIC1jb25maWcgdGhyaWZ0X3JlbC5jb25maWcgJEAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL2xvY2FsL3Zhci8xLjAvd3d3L2NvbmYvbWltZS50eXBlcyBiL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL2xvY2FsL3Zhci8xLjAvd3d3L2NvbmYvbWltZS50eXBlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlM2MwZC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC9sb2NhbC92YXIvMS4wL3d3dy9jb25mL21pbWUudHlwZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0KLWFwcGxpY2F0aW9uL2FjdGl2ZW1lc3NhZ2UKLWFwcGxpY2F0aW9uL2FuZHJldy1pbnNldAotYXBwbGljYXRpb24vYXBwbGVmaWxlCi1hcHBsaWNhdGlvbi9hdG9taWNtYWlsCi1hcHBsaWNhdGlvbi9kY2EtcmZ0Ci1hcHBsaWNhdGlvbi9kZWMtZHgKLWFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MAlocXgKLWFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvCWNwdAotYXBwbGljYXRpb24vbWFjd3JpdGVpaQotYXBwbGljYXRpb24vbXN3b3JkCQlkb2MKLWFwcGxpY2F0aW9uL25ld3MtbWVzc2FnZS1pZAotYXBwbGljYXRpb24vbmV3cy10cmFuc21pc3Npb24KLWFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQliaW4gZG1zIGxoYSBsemggZXhlIGNsYXNzCi1hcHBsaWNhdGlvbi9vZGEJCQlvZGEKLWFwcGxpY2F0aW9uL3BkZgkJCXBkZgotYXBwbGljYXRpb24vcG9zdHNjcmlwdAkJYWkgZXBzIHBzCi1hcHBsaWNhdGlvbi9wb3dlcnBvaW50CQlwcHQKLWFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZwotYXBwbGljYXRpb24vcnRmCQkJcnRmCi1hcHBsaWNhdGlvbi9zbGF0ZQotYXBwbGljYXRpb24vd2l0YQotYXBwbGljYXRpb24vd29yZHBlcmZlY3Q1LjEKLWFwcGxpY2F0aW9uL3gtYmNwaW8JCWJjcGlvCi1hcHBsaWNhdGlvbi94LWNkbGluawkJdmNkCi1hcHBsaWNhdGlvbi94LWNvbXByZXNzCQlaCi1hcHBsaWNhdGlvbi94LWNwaW8JCWNwaW8KLWFwcGxpY2F0aW9uL3gtY3NoCQljc2gKLWFwcGxpY2F0aW9uL3gtZGlyZWN0b3IJCWRjciBkaXIgZHhyCi1hcHBsaWNhdGlvbi94LWR2aQkJZHZpCi1hcHBsaWNhdGlvbi94LWd0YXIJCWd0YXIKLWFwcGxpY2F0aW9uL3gtZ3ppcAkJZ3oKLWFwcGxpY2F0aW9uL3gtaGRmCQloZGYKLWFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpCQljZ2kKLWFwcGxpY2F0aW9uL3gta29hbgkJc2twIHNrZCBza3Qgc2ttCi1hcHBsaWNhdGlvbi94LWxhdGV4CQlsYXRleAotYXBwbGljYXRpb24veC1taWYJCW1pZgotYXBwbGljYXRpb24veC1uZXRjZGYJCW5jIGNkZgotYXBwbGljYXRpb24veC1zaAkJc2gKLWFwcGxpY2F0aW9uL3gtc2hhcgkJc2hhcgotYXBwbGljYXRpb24veC1zdHVmZml0CQlzaXQKLWFwcGxpY2F0aW9uL3gtc3Y0Y3BpbwkJc3Y0Y3BpbwotYXBwbGljYXRpb24veC1zdjRjcmMJCXN2NGNyYwotYXBwbGljYXRpb24veC10YXIJCXRhcgotYXBwbGljYXRpb24veC10Y2wJCXRjbAotYXBwbGljYXRpb24veC10ZXgJCXRleAotYXBwbGljYXRpb24veC10ZXhpbmZvCQl0ZXhpbmZvIHRleGkKLWFwcGxpY2F0aW9uL3gtdHJvZmYJCXQgdHIgcm9mZgotYXBwbGljYXRpb24veC10cm9mZi1tYW4JCW1hbgotYXBwbGljYXRpb24veC10cm9mZi1tZQkJbWUKLWFwcGxpY2F0aW9uL3gtdHJvZmYtbXMJCW1zCi1hcHBsaWNhdGlvbi94LXVzdGFyCQl1c3RhcgotYXBwbGljYXRpb24veC13YWlzLXNvdXJjZQlzcmMKLWFwcGxpY2F0aW9uL3ppcAkJCXppcAotYXVkaW8vYmFzaWMJCQlhdSBzbmQKLWF1ZGlvL21wZWcJCQltcGdhIG1wMgotYXVkaW8veC1haWZmCQkJYWlmIGFpZmYgYWlmYwotYXVkaW8veC1wbi1yZWFsYXVkaW8JCXJhbQotYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luCXJwbQotYXVkaW8veC1yZWFsYXVkaW8JCXJhCi1hdWRpby94LXdhdgkJCXdhdgotY2hlbWljYWwveC1wZGIJCQlwZGIgeHl6Ci1pbWFnZS9naWYJCQlnaWYKLWltYWdlL2llZgkJCWllZgotaW1hZ2UvanBlZwkJCWpwZWcganBnIGpwZQotaW1hZ2UvcG5nCQkJcG5nCi1pbWFnZS90aWZmCQkJdGlmZiB0aWYKLWltYWdlL3gtY211LXJhc3RlcgkJcmFzCi1pbWFnZS94LXBvcnRhYmxlLWFueW1hcAkJcG5tCi1pbWFnZS94LXBvcnRhYmxlLWJpdG1hcAkJcGJtCi1pbWFnZS94LXBvcnRhYmxlLWdyYXltYXAJcGdtCi1pbWFnZS94LXBvcnRhYmxlLXBpeG1hcAkJcHBtCi1pbWFnZS94LXJnYgkJCXJnYgotaW1hZ2UveC14Yml0bWFwCQkJeGJtCi1pbWFnZS94LXhwaXhtYXAJCQl4cG0KLWltYWdlL3gteHdpbmRvd2R1bXAJCXh3ZAotbWVzc2FnZS9leHRlcm5hbC1ib2R5Ci1tZXNzYWdlL25ld3MKLW1lc3NhZ2UvcGFydGlhbAotbWVzc2FnZS9yZmM4MjIKLW11bHRpcGFydC9hbHRlcm5hdGl2ZQotbXVsdGlwYXJ0L2FwcGxlZG91YmxlCi1tdWx0aXBhcnQvZGlnZXN0Ci1tdWx0aXBhcnQvbWl4ZWQKLW11bHRpcGFydC9wYXJhbGxlbAotdGV4dC9odG1sCQkJaHRtbCBodG0KLXRleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwJc2h0bWwKLXRleHQvcGxhaW4JCQl0eHQKLXRleHQvcmljaHRleHQJCQlydHgKLXRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMJdHN2Ci10ZXh0L3gtc2V0ZXh0CQkJZXR4Ci10ZXh0L3gtc2dtbAkJCXNnbWwgc2dtCi12aWRlby9tcGVnCQkJbXBlZyBtcGcgbXBlCi12aWRlby9xdWlja3RpbWUJCQlxdCBtb3YKLXZpZGVvL3gtbXN2aWRlbwkJCWF2aQotdmlkZW8veC1zZ2ktbW92aWUJCW1vdmllCi14LWNvbmZlcmVuY2UveC1jb29sdGFsawkJaWNlCi14LXdvcmxkL3gtdnJtbAkJCXdybCB2cm1sCmRpZmYgLS1naXQgYS9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC9sb2NhbC92YXIvMS4wL3d3dy9jb25mL3lhd3MuY29uZiBiL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL2xvY2FsL3Zhci8xLjAvd3d3L2NvbmYveWF3cy5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU3YWFjLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL2xvY2FsL3Zhci8xLjAvd3d3L2NvbmYveWF3cy5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLQotIyBjb25mIGZvciB5YXdzCi0KLQotIyBmaXJzdCB3ZSBoYXZlIGEgc2V0IG9mIGdsb2JhbHMKLSMgVGhhdCBhcHBseSB0byBhbGwgdmlydHVhbCBzZXJ2ZXJzCi0KLQotIyBUaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxvZ2ZpbGVzIGZvcgotIyBhbGwgdmlydHVhbCBzZXJ2ZXJzIHdpbGwgYmUgd3JpdHRlbgotCi1sb2dkaXIgPSAvdmFyL2xvZy95YXdzCi0KLSMgVGhpcyB0aGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGVyZSBhZGRpdGlvbmFsCi0jIGJlYW0gY29kZSBjYW4gYmUgcGxhY2VkLiBUaGUgZGFlbW9uIHdpbGwgYWRkIHRoaXMKLSMgZGlyZWN0b3J5IHRvIGl0cyBzZWFyY2ggcGF0aAotCi1lYmluX2RpciA9IC92YXIveWF3cy9lYmluCi0KLQotIyBUaGlzIGlzIGEgZGlyZWN0b3J5IHdoZXJlIGFwcGxpY2F0aW9uIHNwZWNpZmljIC5ocmwKLSMgZmlsZXMgY2FuIGJlIHBsYWNlZC4gYXBwbGljYXRpb24gc3BlY2lmaWcgLnlhd3MgY29kZSBjYW4KLSMgdGhlbiBpbmNsdWRlIHRoZXNlIC5ocmwgZmlsZXMKLQotaW5jbHVkZV9kaXIgPSAvdmFyL3lhd3MvaW5jbHVkZQotCi0KLQotCi0KLSMgVGhpcyBpcyBhIGRlYnVnIHZhcmlhYmxlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIGh0dHAgfCB0cmFmZmljIHwgZmFsc2UKLSMgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZXQgdGhlIHRyYWNlIChwb3NzaWJseSB0byB0aGUgdHR5KSB3aGlsZQotIyBpbnZva2luZyB5YXdzIGZyb20gdGhlIHNoZWxsIGFzIGluCi0jIHlhd3MgLWkgLVQgLXggKHNlZSBtYW4geWF3cykKLQotdHJhY2UgPSBmYWxzZQotCi0KLQotCi0KLSMgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSB5YXdzIHN0YXJ0IGFkZGl0aW9uYWwgCi0jIGFwcGxpY2F0aW9uIHNwZWNpZmljIGNvZGUgYXQgc3RhcnR1cAotIyAKLSMgcnVubW9kID0gbXltb2R1bGUKLQotCi0jIEJ5IGRlZmF1bHQgeWF3cyB3aWxsIGNvcHkgdGhlIGVybGFuZyBlcnJvcl9sb2cgYW5kCi0jIGVuZCB3cml0ZSBpdCB0byBhIHdyYXAgbG9nIGNhbGxlZCByZXBvcnQubG9nIChpbiB0aGUgbG9nZGlyKQotIyB0aGlzIGZlYXR1cmUgY2FuIGJlIHR1cm5lZCBvZmYuIFRoaXMgd291bGQgdHlwaWNhbGx5Ci0jIGJlIHRoZSBjYXNlIHdoZW4geWF3cyBydW5zIHdpdGhpbiBhbm90aGVyIGxhcmdlciBhcHAKLQotY29weV9lcnJvcl9sb2cgPSB0cnVlCi0KLQotIyBMb2dzIGFyZSB3cmFwIGxvZ3MKLQotbG9nX3dyYXBfc2l6ZSA9IDEwMDAwMDAKLQotCi0jIFBvc3NpYmx5IHJlc29sdmUgYWxsIGhvc3RuYW1lcyBpbiBsb2dmaWxlcyBzbyB3ZWJhbGl6ZXIKLSMgY2FuIHByb2R1Y2UgdGhlIG5pY2UgZ2VvZ3JhcGh5IHBpZWNoYXJ0Ci0KLWxvZ19yZXNvbHZlX2hvc3RuYW1lID0gZmFsc2UKLQotCi0KLSMgZmFpbCBjb21wbGV0ZWx5IG9yIG5vdCBpZiB5YXdzIGZhaWxzIAotIyB0byBiaW5kIGEgbGlzdGVuIHNvY2tldAotZmFpbF9vbl9iaW5kX2VyciA9IHRydWUKLQotCi0KLSMgSWYgeWF3cyBpcyBzdGFydGVkIGFzIHJvb3QsIGl0IGNhbiwgb25jZSBpdCBoYXMgb3BlbmVkCi0jIGFsbCByZWxldmFudCBzb2NrZXRzIGZvciBsaXN0ZW5pbmcsIGNoYW5nZSB0aGUgdWlkIHRvIGEgCi0jIHVzZXIgd2l0aCBsb3dlciBhY2Nlc3NyaWdodHMgdGhhbiByb290IAotCi0jIHVzZXJuYW1lID0gbm9ib2R5Ci0KLQotIyBJZiBIVFRQIGF1dGggaXMgdXNlZCwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHNwZWNpZmljCi0jIGF1dGggbG9nLgotCi1hdXRoX2xvZyA9IHRydWUKLQotCi0jIFdoZW4gd2UncmUgcnVubmluZyBtdWx0aXBsZSB5YXdzIHN5c3RlbXMgb24gdGhlIHNhbWUgCi0jIGhvc3QsIHdlIG5lZWQgdG8gZ2l2ZSBlYWNoIHlhd3Mgc3lzdGVtIGFuIGluZGl2aWR1YWwKLSMgbmFtZS4gWWF3cyB3aWxsIHdyaXRlIGEgbnVtYmVyIG9mIHJ1bnRpbWUgZmlsZXMgdW5kZXIKLSMgL3RtcC95YXdzLyR7aWR9Ci0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJkZWZhdWx0IgotCi0KLSMgaWQgPSBteW5hbWUKLQotCi0jIGVhcmxpZXIgdmVyc2lvbnMgb2YgWWF3cyBwaWNrZWQgdGhlIGZpcnN0IHZpcnR1YWwgaG9zdAotIyBpbiBhIGxpc3Qgb2YgaG9zdHMgd2l0aCB0aGUgc2FtZSBJUC9QT1JUIHdoZW4gdGhlIEhvc3Q6Ci0jIGhlYWRlciBkb2Vzbid0IG1hdGNoIGFueSBuYW1lIG9uIGFueSBIb3N0Ci0jIFRoaXMgaXMgb2Z0ZW4gbmljZSBpbiB0ZXN0aW5nIGVudmlyb25tZW50cyBidXQgbm90Ci0jIGFjY2VwdGFibGUgaW4gcmVhbCBsaXZlIGhvc3Rpbmcgc2NlbmFyaW9zCi0KLXBpY2tfZmlyc3RfdmlydGhvc3Rfb25fbm9tYXRjaCA9IHRydWUKLQotCi0jIEFsbCB1bmljZXMgYXJlIGJyb2tlbiBzaW5jZSBpdCdzIG5vdCBwb3NzaWJsZSB0byBiaW5kIHRvCi0jIGEgcHJpdmlsZWdlZCBwb3J0ICg8IDEwMjQpIHVubGVzcyB1aWQ9PTAKLSMgVGhlcmUgaXMgYSBjb250cmliIGluIGp1bmdlcmwgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgYnkgbWVhbnMgCi0jIG9mIGFuIGV4dGVybmFsIHNldHVpZCByb290IHByb2dyYW1tIGNhbGxlZCBmZHNydiB0byBsaXN0ZW4gdG8KLSMgdG8gcHJpdmlsZWdlZCBwb3J0LgotIyBJZiB3ZSB1c2UgdGhpcyBmZWF0dXJlLCBpdCByZXF1aXJlcyBmZHNydiB0byBiZSBwcm9wZXJseSBpbnN0YWxsZWQuCi0jIERvZXNuJ3QgeWV0IHdvcmsgd2l0aCBTU0wuCi0KLXVzZV9mZHNydiA9IGZhbHNlCi0KLQotCi0KLSMgZW5kIHRoZW4gYSBzZXQgb2YgdmlydHVhbCBzZXJ2ZXJzCi0jIEZpcnN0IHR3byB2aXJ0aG9zdGVkIHNlcnZlcnMgb24gdGhlIHNhbWUgSVAgKDAuMC4wLjApCi0jIGluIHRoaXMgY2FzZSwgYnV0IGFuIGV4cGxpY2l0IElQIGNhbiBiZSBnaXZlbiBhcyB3ZWxsCi0KLTxzZXJ2ZXIgY29yZS5tYXJ0aW5qbG9nYW4uY29tPgotCXBvcnQgPSA4MAotCWxpc3RlbiA9IDAuMC4wLjAKLQlkb2Nyb290ID0gL3Zhci95YXdzL3d3dwotCWFyZ19yZXdyaXRlX21vZCA9IHB3cl9hcmdfcmV3cml0ZV9tb2QKLQlhcHBtb2RzID0gPHB3ciwgcHdyX21haW5fY29udHJvbGxlcl9hcHBtb2Q+Ci08L3NlcnZlcj4KLQotPHNlcnZlciBsb2NhbGhvc3Q+Ci0JcG9ydCA9IDgwCi0JbGlzdGVuID0gMC4wLjAuMAotCWRvY3Jvb3QgPSAvdG1wCi0JZGlyX2xpc3RpbmdzID0gdHJ1ZQotCWRhdiA9IHRydWUKLQk8YXV0aD4KLQkJcmVhbG0gPSBmb29iYXIKLQkJZGlyID0gLwotCQl1c2VyID0gZm9vOmJhcgotCQl1c2VyID0gYmF6OmJhcgotCTwvYXV0aD4KLTwvc2VydmVyPgotCi0KLQotIyBBbmQgdGhlbiBhbiBzc2wgc2VydmVyCi0KLTxzZXJ2ZXIgY29yZS5tYXJ0aW5qbG9nYW4uY29tPgotCXBvcnQgPSA0NDMKLQlkb2Nyb290ID0gL3RtcAotCWxpc3RlbiA9IDAuMC4wLjAKLQlkaXJfbGlzdGluZ3MgPSB0cnVlCi0JPHNzbD4gIAotCSAgICAgICAga2V5ZmlsZSA9IC91c3IvbG9jYWwveWF3cy9ldGMveWF3cy1rZXkucGVtCi0JICAgICAgICBjZXJ0ZmlsZSA9IC91c3IvbG9jYWwveWF3cy9ldGMveWF3cy1jZXJ0LnBlbQotCTwvc3NsPgotPC9zZXJ2ZXI+Ci0JCQkJCi0JCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC90aHJpZnRfcmVsLmNvbmZpZy5zcmMgYi9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC90aHJpZnRfcmVsLmNvbmZpZy5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3MDFjNWEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5jb25maWcuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotJSUlIC0qLSBtb2RlOmVybGFuZyAtKi0KLSUlJSBQYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIGFwcHMgb24gJUFQUF9OQU1FJQotJSUlIFdhcm5pbmcgLSB0aGlzIGNvbmZpZyBmaWxlICptdXN0KiBlbmQgd2l0aCA8ZG90Pjx3aGl0ZXNwYWNlPgotCi0lJSB3cml0ZSBsb2cgZmlsZXMgdG8gc2FzbF9kaXIKLVsKLSB7c2FzbCwKLSAgWwotICAge3Nhc2xfZXJyb3JfbG9nZ2VyLCB7ZmlsZSwgIiVMT0dfT1RQJS9zYXNsX2xvZyJ9fQotICBdfSwKLQotCi0ge2dhcywKLSAgWwotICAge21vZF9zcGVjcywgW3tlbHdyYXAsIHtmc19lbHdyYXBfaCwgc3RhcnRfbGlua319XX0sCi0KLSAgICUgZWx3cmFwIGNvbmZpZy4KLSAgIHtlcnJfbG9nLCAiJUxPR19PVFAlL2Vycl9sb2cifSwKLSAgIHtlcnJfbG9nX3dyYXBfaW5mbywge3tlcnIsNTAwMDAwMCwxMH0se3Nhc2wsNTAwMDAwMCwxMH19fSwgCi0gICB7ZXJyX2xvZ190dHksIHRydWV9ICUgTG9nIHRvIHRoZSBzY3JlZW4KLSAgIF19LAotCi0geyVBUFBfTkFNRSUsCi0gIFsKLSAgXX0KLV0uIApkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5yZWwuc3JjIGIvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5yZWwuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTFkMjQwLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL3RocmlmdF9yZWwucmVsLnNyYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSUlJSAtKi0gbW9kZTplcmxhbmcgLSotCi17cmVsZWFzZSwgCi0geyJ0aHJpZnRfcmVsIiwgIiVSRUxfVlNOJSJ9LAotIGVydHMsCi0gWwotICBrZXJuZWwsCi0gIHN0ZGxpYiwKLSAgc2FzbCwKLSAgZnNsaWIsCi0gIGdhcywKLSAgdGhyaWZ0Ci0gXQotfS4gCi0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL3RocmlmdF9yZWwucmVsLnNyYy50bXAgYi9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC90aHJpZnRfcmVsLnJlbC5zcmMudG1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzM0ZjcwLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL3RocmlmdF9yZWwucmVsLnNyYy50bXAKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0lJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQote3JlbGVhc2UsIAotIHsidGhyaWZ0X3JlbCIsICIxLjAifSwKLSBlcnRzLAotIFsKLSAga2VybmVsLAotICBzdGRsaWIsCi0gIHNhc2wsCi0gIGZzbGliLAotICBnYXMsCi0gIHRocmlmdAotIF0KLX0uIAotCmRpZmYgLS1naXQgYS9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC92c24ubWsgYi9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC92c24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhYzhlMDcuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9yZWxlYXNlX0RJU0FCTEVEL3RocmlmdF9yZWwvdnNuLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUkVMX1ZTTj0xLjAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL3lhd3MuY29uZi5zcmMgYi9saWIvZXJsL3JlbGVhc2VfRElTQUJMRUQvdGhyaWZ0X3JlbC95YXdzLmNvbmYuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU3YWFjLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvcmVsZWFzZV9ESVNBQkxFRC90aHJpZnRfcmVsL3lhd3MuY29uZi5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotCi0jIGNvbmYgZm9yIHlhd3MKLQotCi0jIGZpcnN0IHdlIGhhdmUgYSBzZXQgb2YgZ2xvYmFscwotIyBUaGF0IGFwcGx5IHRvIGFsbCB2aXJ0dWFsIHNlcnZlcnMKLQotCi0jIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgbG9nZmlsZXMgZm9yCi0jIGFsbCB2aXJ0dWFsIHNlcnZlcnMgd2lsbCBiZSB3cml0dGVuCi0KLWxvZ2RpciA9IC92YXIvbG9nL3lhd3MKLQotIyBUaGlzIHRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoZXJlIGFkZGl0aW9uYWwKLSMgYmVhbSBjb2RlIGNhbiBiZSBwbGFjZWQuIFRoZSBkYWVtb24gd2lsbCBhZGQgdGhpcwotIyBkaXJlY3RvcnkgdG8gaXRzIHNlYXJjaCBwYXRoCi0KLWViaW5fZGlyID0gL3Zhci95YXdzL2ViaW4KLQotCi0jIFRoaXMgaXMgYSBkaXJlY3Rvcnkgd2hlcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgLmhybAotIyBmaWxlcyBjYW4gYmUgcGxhY2VkLiBhcHBsaWNhdGlvbiBzcGVjaWZpZyAueWF3cyBjb2RlIGNhbgotIyB0aGVuIGluY2x1ZGUgdGhlc2UgLmhybCBmaWxlcwotCi1pbmNsdWRlX2RpciA9IC92YXIveWF3cy9pbmNsdWRlCi0KLQotCi0KLQotIyBUaGlzIGlzIGEgZGVidWcgdmFyaWFibGUsIHBvc3NpYmxlIHZhbHVlcyBhcmUgaHR0cCB8IHRyYWZmaWMgfCBmYWxzZQotIyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNldCB0aGUgdHJhY2UgKHBvc3NpYmx5IHRvIHRoZSB0dHkpIHdoaWxlCi0jIGludm9raW5nIHlhd3MgZnJvbSB0aGUgc2hlbGwgYXMgaW4KLSMgeWF3cyAtaSAtVCAteCAoc2VlIG1hbiB5YXdzKQotCi10cmFjZSA9IGZhbHNlCi0KLQotCi0KLQotIyBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIHlhd3Mgc3RhcnQgYWRkaXRpb25hbCAKLSMgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSBhdCBzdGFydHVwCi0jIAotIyBydW5tb2QgPSBteW1vZHVsZQotCi0KLSMgQnkgZGVmYXVsdCB5YXdzIHdpbGwgY29weSB0aGUgZXJsYW5nIGVycm9yX2xvZyBhbmQKLSMgZW5kIHdyaXRlIGl0IHRvIGEgd3JhcCBsb2cgY2FsbGVkIHJlcG9ydC5sb2cgKGluIHRoZSBsb2dkaXIpCi0jIHRoaXMgZmVhdHVyZSBjYW4gYmUgdHVybmVkIG9mZi4gVGhpcyB3b3VsZCB0eXBpY2FsbHkKLSMgYmUgdGhlIGNhc2Ugd2hlbiB5YXdzIHJ1bnMgd2l0aGluIGFub3RoZXIgbGFyZ2VyIGFwcAotCi1jb3B5X2Vycm9yX2xvZyA9IHRydWUKLQotCi0jIExvZ3MgYXJlIHdyYXAgbG9ncwotCi1sb2dfd3JhcF9zaXplID0gMTAwMDAwMAotCi0KLSMgUG9zc2libHkgcmVzb2x2ZSBhbGwgaG9zdG5hbWVzIGluIGxvZ2ZpbGVzIHNvIHdlYmFsaXplcgotIyBjYW4gcHJvZHVjZSB0aGUgbmljZSBnZW9ncmFwaHkgcGllY2hhcnQKLQotbG9nX3Jlc29sdmVfaG9zdG5hbWUgPSBmYWxzZQotCi0KLQotIyBmYWlsIGNvbXBsZXRlbHkgb3Igbm90IGlmIHlhd3MgZmFpbHMgCi0jIHRvIGJpbmQgYSBsaXN0ZW4gc29ja2V0Ci1mYWlsX29uX2JpbmRfZXJyID0gdHJ1ZQotCi0KLQotIyBJZiB5YXdzIGlzIHN0YXJ0ZWQgYXMgcm9vdCwgaXQgY2FuLCBvbmNlIGl0IGhhcyBvcGVuZWQKLSMgYWxsIHJlbGV2YW50IHNvY2tldHMgZm9yIGxpc3RlbmluZywgY2hhbmdlIHRoZSB1aWQgdG8gYSAKLSMgdXNlciB3aXRoIGxvd2VyIGFjY2Vzc3JpZ2h0cyB0aGFuIHJvb3QgCi0KLSMgdXNlcm5hbWUgPSBub2JvZHkKLQotCi0jIElmIEhUVFAgYXV0aCBpcyB1c2VkLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3BlY2lmaWMKLSMgYXV0aCBsb2cuCi0KLWF1dGhfbG9nID0gdHJ1ZQotCi0KLSMgV2hlbiB3ZSdyZSBydW5uaW5nIG11bHRpcGxlIHlhd3Mgc3lzdGVtcyBvbiB0aGUgc2FtZSAKLSMgaG9zdCwgd2UgbmVlZCB0byBnaXZlIGVhY2ggeWF3cyBzeXN0ZW0gYW4gaW5kaXZpZHVhbAotIyBuYW1lLiBZYXdzIHdpbGwgd3JpdGUgYSBudW1iZXIgb2YgcnVudGltZSBmaWxlcyB1bmRlcgotIyAvdG1wL3lhd3MvJHtpZH0KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXMgImRlZmF1bHQiCi0KLQotIyBpZCA9IG15bmFtZQotCi0KLSMgZWFybGllciB2ZXJzaW9ucyBvZiBZYXdzIHBpY2tlZCB0aGUgZmlyc3QgdmlydHVhbCBob3N0Ci0jIGluIGEgbGlzdCBvZiBob3N0cyB3aXRoIHRoZSBzYW1lIElQL1BPUlQgd2hlbiB0aGUgSG9zdDoKLSMgaGVhZGVyIGRvZXNuJ3QgbWF0Y2ggYW55IG5hbWUgb24gYW55IEhvc3QKLSMgVGhpcyBpcyBvZnRlbiBuaWNlIGluIHRlc3RpbmcgZW52aXJvbm1lbnRzIGJ1dCBub3QKLSMgYWNjZXB0YWJsZSBpbiByZWFsIGxpdmUgaG9zdGluZyBzY2VuYXJpb3MKLQotcGlja19maXJzdF92aXJ0aG9zdF9vbl9ub21hdGNoID0gdHJ1ZQotCi0KLSMgQWxsIHVuaWNlcyBhcmUgYnJva2VuIHNpbmNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGJpbmQgdG8KLSMgYSBwcml2aWxlZ2VkIHBvcnQgKDwgMTAyNCkgdW5sZXNzIHVpZD09MAotIyBUaGVyZSBpcyBhIGNvbnRyaWIgaW4ganVuZ2VybCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSBieSBtZWFucyAKLSMgb2YgYW4gZXh0ZXJuYWwgc2V0dWlkIHJvb3QgcHJvZ3JhbW0gY2FsbGVkIGZkc3J2IHRvIGxpc3RlbiB0bwotIyB0byBwcml2aWxlZ2VkIHBvcnQuCi0jIElmIHdlIHVzZSB0aGlzIGZlYXR1cmUsIGl0IHJlcXVpcmVzIGZkc3J2IHRvIGJlIHByb3Blcmx5IGluc3RhbGxlZC4KLSMgRG9lc24ndCB5ZXQgd29yayB3aXRoIFNTTC4KLQotdXNlX2Zkc3J2ID0gZmFsc2UKLQotCi0KLQotIyBlbmQgdGhlbiBhIHNldCBvZiB2aXJ0dWFsIHNlcnZlcnMKLSMgRmlyc3QgdHdvIHZpcnRob3N0ZWQgc2VydmVycyBvbiB0aGUgc2FtZSBJUCAoMC4wLjAuMCkKLSMgaW4gdGhpcyBjYXNlLCBidXQgYW4gZXhwbGljaXQgSVAgY2FuIGJlIGdpdmVuIGFzIHdlbGwKLQotPHNlcnZlciBjb3JlLm1hcnRpbmpsb2dhbi5jb20+Ci0JcG9ydCA9IDgwCi0JbGlzdGVuID0gMC4wLjAuMAotCWRvY3Jvb3QgPSAvdmFyL3lhd3Mvd3d3Ci0JYXJnX3Jld3JpdGVfbW9kID0gcHdyX2FyZ19yZXdyaXRlX21vZAotCWFwcG1vZHMgPSA8cHdyLCBwd3JfbWFpbl9jb250cm9sbGVyX2FwcG1vZD4KLTwvc2VydmVyPgotCi08c2VydmVyIGxvY2FsaG9zdD4KLQlwb3J0ID0gODAKLQlsaXN0ZW4gPSAwLjAuMC4wCi0JZG9jcm9vdCA9IC90bXAKLQlkaXJfbGlzdGluZ3MgPSB0cnVlCi0JZGF2ID0gdHJ1ZQotCTxhdXRoPgotCQlyZWFsbSA9IGZvb2JhcgotCQlkaXIgPSAvCi0JCXVzZXIgPSBmb286YmFyCi0JCXVzZXIgPSBiYXo6YmFyCi0JPC9hdXRoPgotPC9zZXJ2ZXI+Ci0KLQotCi0jIEFuZCB0aGVuIGFuIHNzbCBzZXJ2ZXIKLQotPHNlcnZlciBjb3JlLm1hcnRpbmpsb2dhbi5jb20+Ci0JcG9ydCA9IDQ0MwotCWRvY3Jvb3QgPSAvdG1wCi0JbGlzdGVuID0gMC4wLjAuMAotCWRpcl9saXN0aW5ncyA9IHRydWUKLQk8c3NsPiAgCi0JICAgICAgICBrZXlmaWxlID0gL3Vzci9sb2NhbC95YXdzL2V0Yy95YXdzLWtleS5wZW0KLQkgICAgICAgIGNlcnRmaWxlID0gL3Vzci9sb2NhbC95YXdzL2V0Yy95YXdzLWNlcnQucGVtCi0JPC9zc2w+Ci08L3NlcnZlcj4KLQkJCQkKLQkKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvTWFrZWZpbGUgYi9saWIvZXJsL3NyYy9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL01ha2VmaWxlCnJlbmFtZSB0byBsaWIvZXJsL3NyYy9NYWtlZmlsZQppbmRleCAyOTM1MmM4Li4xYTA3YjBhIDEwMDY0NAotLS0gYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL01ha2VmaWxlCisrKyBiL2xpYi9lcmwvc3JjL01ha2VmaWxlCkBAIC0xLDggKzEsOCBAQAogIyAkSWQ6IE1ha2VmaWxlLHYgMS4zIDIwMDQvMDgvMTMgMTY6MzU6NTkgbWxvZ2FuIEV4cCAkCiAjCi1pbmNsdWRlIC4uLy4uLy4uL2J1aWxkL290cC5tawotaW5jbHVkZSAuLi8uLi8uLi9idWlsZC9jb2xvcnMubWsKLWluY2x1ZGUgLi4vLi4vLi4vYnVpbGQvYnVpbGR0YXJnZXRzLm1rCitpbmNsdWRlIC4uL2J1aWxkL290cC5taworaW5jbHVkZSAuLi9idWlsZC9jb2xvcnMubWsKK2luY2x1ZGUgLi4vYnVpbGQvYnVpbGR0YXJnZXRzLm1rCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBBcHBsaWNhdGlvbiB2ZXJzaW9uCkBAIC02MSw3ICs2MSw3IEBACiBhbGwgZGVidWcgb3B0OiAkKEVCSU4pICQoVEFSR0VUX0ZJTEVTKSAKIAogIyQoRUJJTikvcm1fbG9nZ2VyLmJlYW06ICQoQVBQX05BTUUpLmhybAotaW5jbHVkZSAuLi8uLi8uLi9idWlsZC9kb2NzLm1rCitpbmNsdWRlIC4uL2J1aWxkL2RvY3MubWsKIAogIyBOb3RlOiBJbiB0aGUgb3Blbi1zb3VyY2UgYnVpbGQgY2xlYW4gbXVzdCBub3QgZGVzdHJveSB0aGUgcHJlbG9hZGVkCiAjIGJlYW0gZmlsZXMuCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL29vcC5lcmwgYi9saWIvZXJsL3NyYy9vb3AuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL29vcC5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL29vcC5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvcHJvdG9jb2wvdEJpbmFyeVByb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbC5lcmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9zcmMvcHJvdG9jb2wvdEJpbmFyeVByb3RvY29sLmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvcHJvdG9jb2wvdEJpbmFyeVByb3RvY29sLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy9wcm90b2NvbC90QmluYXJ5UHJvdG9jb2xGYWN0b3J5LmVybCBiL2xpYi9lcmwvc3JjL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbEZhY3RvcnkuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3Byb3RvY29sL3RCaW5hcnlQcm90b2NvbEZhY3RvcnkuZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy9wcm90b2NvbC90QmluYXJ5UHJvdG9jb2xGYWN0b3J5LmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy9wcm90b2NvbC90UHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvcHJvdG9jb2wvdFByb3RvY29sLmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy9wcm90b2NvbC90UHJvdG9jb2wuZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy9wcm90b2NvbC90UHJvdG9jb2wuZXJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL3Byb3RvY29sL3RQcm90b2NvbEV4Y2VwdGlvbi5lcmwgYi9saWIvZXJsL3NyYy9wcm90b2NvbC90UHJvdG9jb2xFeGNlcHRpb24uZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3Byb3RvY29sL3RQcm90b2NvbEV4Y2VwdGlvbi5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL3Byb3RvY29sL3RQcm90b2NvbEV4Y2VwdGlvbi5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvcHJvdG9jb2wvdFByb3RvY29sRmFjdG9yeS5lcmwgYi9saWIvZXJsL3NyYy9wcm90b2NvbC90UHJvdG9jb2xGYWN0b3J5LmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy9wcm90b2NvbC90UHJvdG9jb2xGYWN0b3J5LmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvcHJvdG9jb2wvdFByb3RvY29sRmFjdG9yeS5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvc2VydmVyL3RFcmxTZXJ2ZXIuZXJsIGIvbGliL2VybC9zcmMvc2VydmVyL3RFcmxTZXJ2ZXIuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3NlcnZlci90RXJsU2VydmVyLmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvc2VydmVyL3RFcmxTZXJ2ZXIuZXJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL3NlcnZlci90U2VydmVyLmVybCBiL2xpYi9lcmwvc3JjL3NlcnZlci90U2VydmVyLmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy9zZXJ2ZXIvdFNlcnZlci5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL3NlcnZlci90U2VydmVyLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy9zZXJ2ZXIvdFNpbXBsZVNlcnZlci5lcmwgYi9saWIvZXJsL3NyYy9zZXJ2ZXIvdFNpbXBsZVNlcnZlci5lcmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9zcmMvc2VydmVyL3RTaW1wbGVTZXJ2ZXIuZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy9zZXJ2ZXIvdFNpbXBsZVNlcnZlci5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvdEFwcGxpY2F0aW9uRXhjZXB0aW9uLmVybCBiL2xpYi9lcmwvc3JjL3RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5lcmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9zcmMvdEFwcGxpY2F0aW9uRXhjZXB0aW9uLmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvdEFwcGxpY2F0aW9uRXhjZXB0aW9uLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy90RXJsUHJvY2Vzc29yLmVybCBiL2xpYi9lcmwvc3JjL3RFcmxQcm9jZXNzb3IuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RFcmxQcm9jZXNzb3IuZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy90RXJsUHJvY2Vzc29yLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy90RXhjZXB0aW9uLmVybCBiL2xpYi9lcmwvc3JjL3RFeGNlcHRpb24uZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RFeGNlcHRpb24uZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy90RXhjZXB0aW9uLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy90UHJvY2Vzc29yLmVybCBiL2xpYi9lcmwvc3JjL3RQcm9jZXNzb3IuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RQcm9jZXNzb3IuZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy90UHJvY2Vzc29yLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy90aHJpZnQuYXBwLnNyYyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RocmlmdC5hcHAuc3JjCnJlbmFtZSB0byBsaWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwpkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy90aHJpZnQuYXBwdXAuc3JjIGIvbGliL2VybC9zcmMvdGhyaWZ0LmFwcHVwLnNyYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy90aHJpZnQuYXBwdXAuc3JjCnJlbmFtZSB0byBsaWIvZXJsL3NyYy90aHJpZnQuYXBwdXAuc3JjCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL3RocmlmdC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnQuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RocmlmdC5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL3RocmlmdC5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvdGhyaWZ0X2xvZ2dlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbG9nZ2VyLmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy90aHJpZnRfbG9nZ2VyLmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvdGhyaWZ0X2xvZ2dlci5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvdGhyaWZ0X29vcF9zZXJ2ZXIuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X29vcF9zZXJ2ZXIuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RocmlmdF9vb3Bfc2VydmVyLmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvdGhyaWZ0X29vcF9zZXJ2ZXIuZXJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL3RocmlmdF91dGlscy5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfdXRpbHMuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RocmlmdF91dGlscy5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL3RocmlmdF91dGlscy5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RCdWZmZXJlZFRyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90cmFuc3BvcnQvdEJ1ZmZlcmVkVHJhbnNwb3J0LmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy90cmFuc3BvcnQvdEJ1ZmZlcmVkVHJhbnNwb3J0LmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvdHJhbnNwb3J0L3RCdWZmZXJlZFRyYW5zcG9ydC5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuZXJsIGIvbGliL2VybC9zcmMvdHJhbnNwb3J0L3RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RyYW5zcG9ydC90QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvdHJhbnNwb3J0L3RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuZXJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL3RyYW5zcG9ydC90RXJsQWNjZXB0b3IuZXJsIGIvbGliL2VybC9zcmMvdHJhbnNwb3J0L3RFcmxBY2NlcHRvci5lcmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RFcmxBY2NlcHRvci5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL3RyYW5zcG9ydC90RXJsQWNjZXB0b3IuZXJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL3RyYW5zcG9ydC90U2VydmVyU29ja2V0LmVybCBiL2xpYi9lcmwvc3JjL3RyYW5zcG9ydC90U2VydmVyU29ja2V0LmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy90cmFuc3BvcnQvdFNlcnZlclNvY2tldC5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL3RyYW5zcG9ydC90U2VydmVyU29ja2V0LmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy90cmFuc3BvcnQvdFNlcnZlclRyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90cmFuc3BvcnQvdFNlcnZlclRyYW5zcG9ydC5lcmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RTZXJ2ZXJUcmFuc3BvcnQuZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy90cmFuc3BvcnQvdFNlcnZlclRyYW5zcG9ydC5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RTb2NrZXQuZXJsIGIvbGliL2VybC9zcmMvdHJhbnNwb3J0L3RTb2NrZXQuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvZXJsL2xpYi90aHJpZnQvc3JjL3RyYW5zcG9ydC90U29ja2V0LmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvdHJhbnNwb3J0L3RTb2NrZXQuZXJsCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvc3JjL3RyYW5zcG9ydC90VHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RyYW5zcG9ydC90VHJhbnNwb3J0LmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2VybC9saWIvdGhyaWZ0L3NyYy90cmFuc3BvcnQvdFRyYW5zcG9ydC5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvc3JjL3RyYW5zcG9ydC90VHJhbnNwb3J0LmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC9saWIvdGhyaWZ0L3NyYy90cmFuc3BvcnQvdFRyYW5zcG9ydEV4Y2VwdGlvbi5lcmwgYi9saWIvZXJsL3NyYy90cmFuc3BvcnQvdFRyYW5zcG9ydEV4Y2VwdGlvbi5lcmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RUcmFuc3BvcnRFeGNlcHRpb24uZXJsCnJlbmFtZSB0byBsaWIvZXJsL3NyYy90cmFuc3BvcnQvdFRyYW5zcG9ydEV4Y2VwdGlvbi5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RUcmFuc3BvcnRGYWN0b3J5LmVybCBiL2xpYi9lcmwvc3JjL3RyYW5zcG9ydC90VHJhbnNwb3J0RmFjdG9yeS5lcmwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC9zcmMvdHJhbnNwb3J0L3RUcmFuc3BvcnRGYWN0b3J5LmVybApyZW5hbWUgdG8gbGliL2VybC9zcmMvdHJhbnNwb3J0L3RUcmFuc3BvcnRGYWN0b3J5LmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9NYWtlZmlsZSBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmMmM4YTguLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTU9EVUxFUyA9IFwKLQlzcmMKLQotYWxsIGNsZWFuIGRvY3M6Ci0JZm9yIGRpciBpbiAkKE1PRFVMRVMpOyBkbyBcCi0JCShjZCAkJGRpcjsgJHtNQUtFfSAkQCk7IFwKLQlkb25lCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL2luY2x1ZGUvYmxhbmtfYXBwLmhybCBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvaW5jbHVkZS9ibGFua19hcHAuaHJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvaW5jbHVkZS9ibGFua19hcHAuaHJsCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL01ha2VmaWxlIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzYjA2ZjAuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyAkSWQ6IE1ha2VmaWxlLHYgMS4zIDIwMDQvMDgvMTMgMTY6MzU6NTkgbWxvZ2FuIEV4cCAkCi0jCi1pbmNsdWRlIC4uLy4uLy4uL2J1aWxkL290cC5tawotaW5jbHVkZSAuLi8uLi8uLi9idWlsZC9jb2xvcnMubWsKLWluY2x1ZGUgLi4vLi4vLi4vYnVpbGQvYnVpbGR0YXJnZXRzLm1rCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBcHBsaWNhdGlvbiB2ZXJzaW9uCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5jbHVkZSAuLi92c24ubWsKLUFQUF9OQU1FPSUlQVBQX05BTUUlJQotUEZYPSUlUEZYJSUKLVZTTj0kKCUlQVBQX05BTUVfVVBQRVJfQ0FTRSUlX1ZTTikKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEluc3RhbGwgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24KLSMgV0FSTklORzogSU5TVEFMTF9ESVIgdGhlIGNvbW1hbmQgdG8gaW5zdGFsbCBhIGRpcmVjdG9yeS4KLSMgICAgICAgICAgSU5TVEFMTF9EU1QgaXMgdGhlIHRhcmdldCBkaXJlY3RvcnkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSU5TVEFMTF9EU1QgPSAkKEVSTEFOR19PVFApL2xpYi8kKEFQUF9OQU1FKS0kKFZTTikKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRhcmdldCBTcGVjcwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotTU9EVUxFUyA9ICQoc2hlbGwgbHMgKi5lcmwgfCBzZWQgcy8uZXJsLy8pCi1NT0RVTEVTX0NPTU1BID0gJChzaGVsbCBscyAqLmVybCB8IHNlZCBzL1xcLmVybC8sLykKLQotSFJMX0ZJTEVTPQotSU5URVJOQUxfSFJMX0ZJTEVTPSAkKEFQUF9OQU1FKS5ocmwKLUVSTF9GSUxFUz0gJChNT0RVTEVTOiU9JS5lcmwpCi1ET0NfRklMRVM9JChFUkxfRklMRVMpCi0KLUFQUF9GSUxFPSAkKEFQUF9OQU1FKS5hcHAKLUFQUFVQX0ZJTEU9ICQoQVBQX05BTUUpLmFwcHVwCi0KLUFQUF9TUkM9ICQoQVBQX0ZJTEUpLnNyYwotQVBQVVBfU1JDPSAkKEFQUFVQX0ZJTEUpLnNyYwotCi1BUFBfVEFSR0VUPSAkKEVCSU4pLyQoQVBQX0ZJTEUpCi1BUFBVUF9UQVJHRVQ9ICQoRUJJTikvJChBUFBVUF9GSUxFKQotCi1CRUFNUz0gJChNT0RVTEVTOiU9JChFQklOKS8lLiQoRU1VTEFUT1IpKQotVEFSR0VUX0ZJTEVTPSAkKEJFQU1TKSAkKEFQUF9UQVJHRVQpICQoQVBQVVBfVEFSR0VUKQotCi1XRUJfVEFSR0VUPS92YXIveWF3cy93d3cvJChBUFBfTkFNRSkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEZMQUdTCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRVJMX0ZMQUdTICs9Ci1FUkxfQ09NUElMRV9GTEFHUyArPSAtSS4uL2luY2x1ZGUgLUkuLi8uLi9mc2xpYi9pbmNsdWRlIC1JLi4vLi4vc3lzdGVtX3N0YXR1cy9pbmNsdWRlIAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGFyZ2V0cwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbCBkZWJ1ZyBvcHQ6ICQoRUJJTikgJChUQVJHRVRfRklMRVMpIAotCi0jJChFQklOKS9ybV9sb2dnZXIuYmVhbTogJChBUFBfTkFNRSkuaHJsCi1pbmNsdWRlIC4uLy4uLy4uL2J1aWxkL2RvY3MubWsKLQotIyBOb3RlOiBJbiB0aGUgb3Blbi1zb3VyY2UgYnVpbGQgY2xlYW4gbXVzdCBub3QgZGVzdHJveSB0aGUgcHJlbG9hZGVkCi0jIGJlYW0gZmlsZXMuCi1jbGVhbjoKLQlybSAtZiAkKFRBUkdFVF9GSUxFUykKLQlybSAtZiBjb3JlCi0Jcm0gLXJmICQoRUJJTikKLQlybSAtcmYgKmh0bWwKLQotJChFQklOKToKLQlta2RpciAkKEVCSU4pCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTcGVjaWFsIEJ1aWxkIFRhcmdldHMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0kKEFQUF9UQVJHRVQpOiAkKEFQUF9TUkMpIC4uL3Zzbi5tayAkKEJFQU1TKQotCXNlZCAtZSAnczslVlNOJTskKFZTTik7JyBcCi0JCS1lICdzOyVQRlglOyQoUEZYKTsnIFwKLQkJLWUgJ3M7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTsnIFwKLQkJLWUgJ3M7JU1PRFVMRVMlOyVNT0RVTEVTJSQoTU9EVUxFU19DT01NQSk7JyBcCi0JCSQ8ID4gJDwiLnRtcCIgCi0Jc2VkIC1lICdzLyVNT0RVTEVTJVwoLipcKSwvXDEvJyBcCi0JCSQ8Ii50bXAiID4gJEAgCi0Jcm0gJDwiLnRtcCIKLQotCi0kKEFQUFVQX1RBUkdFVCk6ICQoQVBQVVBfU1JDKSAuLi92c24ubWsKLQlzZWQgLWUgJ3M7JVZTTiU7JChWU04pOycgJDwgPiAkQAotCi0kKFdFQl9UQVJHRVQpOiAuLi9tYXJrdXAvKiAKLQlybSAtcmYgJChXRUJfVEFSR0VUKSAKLQlta2RpciAkKFdFQl9UQVJHRVQpIAotCWNwIC1yIC4uL21hcmt1cC8gJChXRUJfVEFSR0VUKQotCWNwIC1yIC4uL3NraW5zLyAkKFdFQl9UQVJHRVQpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJbnN0YWxsIFRhcmdldAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAotCi1pbnN0YWxsOiBhbGwgJChXRUJfVEFSR0VUKQotIwkkKElOU1RBTExfRElSKSAkKElOU1RBTExfRFNUKS9zcmMKLSMJJChJTlNUQUxMX0RBVEEpICQoRVJMX0ZJTEVTKSAkKElOU1RBTExfRFNUKS9zcmMKLSMJJChJTlNUQUxMX0RBVEEpICQoSU5URVJOQUxfSFJMX0ZJTEVTKSAkKElOU1RBTExfRFNUKS9zcmMKLSMJJChJTlNUQUxMX0RJUikgJChJTlNUQUxMX0RTVCkvaW5jbHVkZQotIwkkKElOU1RBTExfREFUQSkgJChIUkxfRklMRVMpICQoSU5TVEFMTF9EU1QpL2luY2x1ZGUKLSMJJChJTlNUQUxMX0RJUikgJChJTlNUQUxMX0RTVCkvZWJpbgotIwkkKElOU1RBTExfREFUQSkgJChUQVJHRVRfRklMRVMpICQoSU5TVEFMTF9EU1QpL2ViaW4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JhX3NlcnZlci5lcmwgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9iYV9zZXJ2ZXIuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTk4ZjFjLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JhX3NlcnZlci5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotJSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUlIEBkb2MgIAotJSUlIEBlbmQKLSUlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS1tb2R1bGUoJSVQRlglJV9zZXJ2ZXIpLgotCi0tYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgSW5jbHVkZSBmaWxlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLWluY2x1ZGUoIiUlQVBQX05BTUUlJS5ocmwiKS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRXh0ZXJuYWwgZXhwb3J0cwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLWV4cG9ydChbCi0JIHN0YXJ0X2xpbmsvMCwKLQkgc3RvcC8wCi0JIF0pLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBnZW5fc2VydmVyIGNhbGxiYWNrcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfY2FsbC8zLCBoYW5kbGVfY2FzdC8yLCBoYW5kbGVfaW5mby8yLCB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvM10pLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSByZWNvcmQgZGVmaW5pdGlvbnMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS1yZWNvcmQoc3RhdGUsIHt9KS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgbWFjcm8gZGVmaW5pdGlvbnMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgRXh0ZXJuYWwgZnVuY3Rpb25zCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBAZG9jIFN0YXJ0cyB0aGUgc2VydmVyLgotJSUgQHNwZWMgc3RhcnRfbGluaygpIC0+IHtvaywgcGlkKCl9IHwge2Vycm9yLCBSZWFzb259Ci0lJSBAZW5kCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGFydF9saW5rKCkgLT4KLSAgICBnZW5fc2VydmVyOnN0YXJ0X2xpbmsoe2xvY2FsLCA/U0VSVkVSfSwgP01PRFVMRSwgW10sIFtdKS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgQGRvYyBTdG9wcyB0aGUgc2VydmVyLgotJSUgQHNwZWMgc3RvcCgpIC0+IG9rCi0lJSBAZW5kCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdG9wKCkgLT4KLSAgICBnZW5fc2VydmVyOmNhc3QoP1NFUlZFUiwgc3RvcCkuCi0KLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIFNlcnZlciBmdW5jdGlvbnMKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGluaXQvMQotJSUgRGVzY3JpcHRpb246IEluaXRpYXRlcyB0aGUgc2VydmVyCi0lJSBSZXR1cm5zOiB7b2ssIFN0YXRlfSAgICAgICAgICB8Ci0lJSAgICAgICAgICB7b2ssIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICB8Ci0lJSAgICAgICAgICB7c3RvcCwgUmVhc29ufQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW5pdChbXSkgLT4KLSAgICB7b2ssICNzdGF0ZXt9fS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9jYWxsLzMKLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYWxsIG1lc3NhZ2VzCi0lJSBSZXR1cm5zOiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gICAgICAgICAgfAotJSUgICAgICAgICAge3JlcGx5LCBSZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZX0gICAgICAgICAgICAgICB8Ci0lJSAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9ICAgICAgfAotJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIFN0YXRlfSAgIHwgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkKLSUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4KLSAgICBSZXBseSA9IG9rLAotICAgIHtyZXBseSwgUmVwbHksIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0LzIKLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYXN0IG1lc3NhZ2VzCi0lJSBSZXR1cm5zOiB7bm9yZXBseSwgU3RhdGV9ICAgICAgICAgIHwKLSUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9ICAgICAgICAgICAgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9jYXN0KHN0b3AsIFN0YXRlKSAtPgotICAgIHtzdG9wLCBub3JtYWwsIFN0YXRlfTsKLWhhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvLzIKLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcwotJSUgUmV0dXJuczoge25vcmVwbHksIFN0YXRlfSAgICAgICAgICB8Ci0lJSAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4KLSAgICB7bm9yZXBseSwgU3RhdGV9LgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogdGVybWluYXRlLzIKLSUlIERlc2NyaXB0aW9uOiBTaHV0ZG93biB0aGUgc2VydmVyCi0lJSBSZXR1cm5zOiBhbnkgKGlnbm9yZWQgYnkgZ2VuX3NlcnZlcikKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPgotICAgIG9rLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jOiBjb2RlX2NoYW5nZS8zCi0lJSBQdXJwb3NlOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQKLSUlIFJldHVybnM6IHtvaywgTmV3U3RhdGV9Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4KLSAgICB7b2ssIFN0YXRlfS4KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUlIEludGVybmFsIGZ1bmN0aW9ucwotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmFfc3VwLmVybCBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JhX3N1cC5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZjQ4ZDEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmFfc3VwLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSUlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlJSBAZG9jICAKLSUlJSBAZW5kCi0lJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tbW9kdWxlKCUlUEZYJSVfc3VwKS4KLQotLWJlaGF2aW91cihzdXBlcnZpc29yKS4KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEluY2x1ZGUgZmlsZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRXh0ZXJuYWwgZXhwb3J0cwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLWV4cG9ydChbCi0JIHN0YXJ0X2xpbmsvMQotICAgICAgICBdKS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgSW50ZXJuYWwgZXhwb3J0cwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLWV4cG9ydChbCi0JIGluaXQvMQotICAgICAgICBdKS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgTWFjcm9zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tZGVmaW5lKFNFUlZFUiwgP01PRFVMRSkuCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIFJlY29yZHMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgRXh0ZXJuYWwgZnVuY3Rpb25zCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBAZG9jIFN0YXJ0cyB0aGUgc3VwZXJ2aXNvci4KLSUlIEBzcGVjIHN0YXJ0X2xpbmsoU3RhcnRBcmdzKSAtPiB7b2ssIHBpZCgpfSB8IEVycm9yCi0lJSBAZW5kCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGFydF9saW5rKFN0YXJ0QXJncykgLT4KLSAgICBzdXBlcnZpc29yOnN0YXJ0X2xpbmsoe2xvY2FsLCA/U0VSVkVSfSwgP01PRFVMRSwgW10pLgotCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBTZXJ2ZXIgZnVuY3Rpb25zCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jOiBpbml0LzEKLSUlIFJldHVybnM6IHtvaywgIHtTdXBGbGFncywgIFtDaGlsZFNwZWNdfX0gfAotJSUgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0lJSAgICAgICAgICB7ZXJyb3IsIFJlYXNvbn0gICAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWluaXQoW10pIC0+Ci0gICAgUmVzdGFydFN0cmF0ZWd5ICAgID0gb25lX2Zvcl9vbmUsCi0gICAgTWF4UmVzdGFydHMgICAgICAgID0gMTAwMCwKLSAgICBNYXhUaW1lQmV0UmVzdGFydHMgPSAzNjAwLAotICAgIAotICAgIFN1cEZsYWdzID0ge1Jlc3RhcnRTdHJhdGVneSwgTWF4UmVzdGFydHMsIE1heFRpbWVCZXRSZXN0YXJ0c30sCi0gICAgCi0gICAgQ2hpbGRTcGVjcyA9Ci0JWwotCSB7JSVQRlglJV9zZXJ2ZXIsCi0JICB7JSVQRlglJV9zZXJ2ZXIsIHN0YXJ0X2xpbmssIFtdfSwKLQkgIHBlcm1hbmVudCwKLQkgIDEwMDAsCi0JICB3b3JrZXIsCi0JICBbJSVQRlglJV9zZXJ2ZXJdfQotCSBdLAotICAgIHtvayx7U3VwRmxhZ3MsIENoaWxkU3BlY3N9fS4KLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIEludGVybmFsIGZ1bmN0aW9ucwotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmxhbmtfYXBwLmFwcC5zcmMgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuYXBwLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE1MTNmYi4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuYXBwLnNyYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSUlJSAtKi0gbW9kZTplcmxhbmcgLSotCi17YXBwbGljYXRpb24sICVBUFBfTkFNRSUsCi0gWwotICAlIEEgcXVpY2sgZGVzY3JpcHRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLgotICB7ZGVzY3JpcHRpb24sICJBbiBFcmxhbmcgQXBwbGljYXRpb24uIn0sCi0KLSAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgotICB7dnNuLCAiJVZTTiUifSwKLQotICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAKLSAge21vZHVsZXMsCi0gICBbCi0JJU1PRFVMRVMlCi0gICBdfSwKLQotICAlIEFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBuYW1lcyB0aGUgYXBwbGljYXRpb24gdXNlcy4gVGhpcyBjYW4gYmUgaWdub3JlZC4KLSAge3JlZ2lzdGVyZWQsIFtdfSwKLQotICAlIEFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0byBiZSBzdGFydGVkIHByaW9yIHRvIHRoaXMgb25lLiBUaGlzIGNhbiBiZSBpZ25vcmVkCi0gICUgbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIGl0IHdlbGwgYW5kIGxldCB0aGUgLnJlbCBmaWxlcyBpbiAKLSAgJSB5b3VyIHJlbGVhc2UgaGFuZGxlIHRoaXMuIAotICB7YXBwbGljYXRpb25zLAotICAgWwotICAgIGtlcm5lbCwgCi0gICAgc3RkbGliCi0gICBdfSwKLQotICAlIE9UUCBhcHBsaWNhdGlvbiBsb2FkZXIgd2lsbCBsb2FkLCBidXQgbm90IHN0YXJ0LCBpbmNsdWRlZCBhcHBzLiBBZ2FpbgotICAlIHRoaXMgY2FuIGJlIGlnbm9yZWQgYXMgd2VsbC4gIFRvIGxvYWQgYnV0IG5vdCBzdGFydCBhbiBhcHBsaWNhdGlvbiBpdAotICAlIGlzIGVhc2llciB0byBpbmNsdWRlIGl0IGluIHRoZSAucmVsIGZpbGUgZm9sbG93ZWQgYnkgdGhlIGF0b20gJ25vbmUnCi0gIHtpbmNsdWRlZF9hcHBsaWNhdGlvbnMsIFtdfSwKLQotICAlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzaW1pbGFyIHRvIHRob3NlIGluIHRoZSBjb25maWcgZmlsZSBzcGVjaWZpZWQKLSAgJSBvbiB0aGUgY29tbWFuZCBsaW5lLiBjYW4gYmUgZmV0Y2hlZCB3aXRoIGdhczpnZXRfZW52Ci0gIHtlbnYsIFtdfSwKLQotICAlIFRoZSBNb2R1bGUgYW5kIEFyZ3MgdXNlZCB0byBzdGFydCB0aGlzIGFwcGxpY2F0aW9uLgotICB7bW9kLCB7JUFQUF9OQU1FJSwgW119fQotIF0KLX0uCi0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JsYW5rX2FwcC5hcHB1cC5zcmMgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuYXBwdXAuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NGE2MzgzLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JsYW5rX2FwcC5hcHB1cC5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi17IiVWU04lIixbXSxbXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuZXJsIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmxhbmtfYXBwLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRiNmZlMC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotJSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUlIEBkb2MgIAotJSUlIEBlbmQKLSUlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS1tb2R1bGUoJSVBUFBfTkFNRSUlKS4KLQotLWJlaGF2aW91cihhcHBsaWNhdGlvbikuCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBJbmNsdWRlIGZpbGVzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0taW5jbHVkZSgiJSVBUFBfTkFNRSUlLmhybCIpLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBFeHRlcm5hbCBleHBvcnRzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tZXhwb3J0KFsKLQkgc3RhcnQvMiwKLQkgc2h1dGRvd24vMCwKLQkgc3RvcC8xCi0JIF0pLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBNYWNyb3MKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgUmVjb3JkcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBFeHRlcm5hbCBmdW5jdGlvbnMKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEBkb2MgVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBhbiBlcmxhbmcgYXBwbGljYXRpb24uCi0lJSBAc3BlYyBzdGFydChUeXBlLCBTdGFydEFyZ3MpIC0+IHtvaywgUGlkfSB8IHtvaywgUGlkLCBTdGF0ZX0gfCB7ZXJyb3IsIFJlYXNvbn0KLSUlIEBlbmQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXJ0KFR5cGUsIFN0YXJ0QXJncykgLT4KLSAgICBjYXNlICUlUEZYJSVfc3VwOnN0YXJ0X2xpbmsoU3RhcnRBcmdzKSBvZgotCXtvaywgUGlkfSAtPiAKLQkgICAge29rLCBQaWR9OwotCUVycm9yIC0+Ci0JICAgIEVycm9yCi0gICAgZW5kLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBAZG9jIENhbGxlZCB0byBzaHVkb3duIHRoZSAlJUFQUF9OQU1FJSUgYXBwbGljYXRpb24uCi0lJSBAc3BlYyBzaHV0ZG93bigpIC0+IG9rIAotJSUgQGVuZAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2h1dGRvd24oKSAtPgotICAgIGFwcGxpY2F0aW9uOnN0b3AoJSVBUFBfTkFNRSUlKS4KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIENhbGxlZCB1cG9uIHRoZSB0ZXJtaW50aW9uIG9mIGFuIGFwcGxpY2F0aW9uLgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RvcChTdGF0ZSkgLT4KLSAgICBvay4KLQpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC92c24ubWsgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3Zzbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWJhMTc0Yi4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3Zzbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSUlQVBQX05BTUVfVVBQRVJfQ0FTRSUlX1ZTTj0xLjAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL01ha2VmaWxlIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkMzU5NTYuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE1ha2UgZmlsZSBmb3IgY3JlYXRpbmcgYW4gb3RwIHJlbGVhc2UuIAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMjCi0jIEJhc2VuYW1lIG9mIHRoaXMgcmVsZWFzZS4KLSMjCi1SRUxTPSQoc2hlbGwgYmFzZW5hbWUgYHB3ZGApCi1BUFBfTkFNRT0kKHNoZWxsIGVjaG8gJChSRUxTKSB8IHNlZCBzL19yZWwkJC8vKQotCi1pbmNsdWRlIC4uLy4uL2J1aWxkL290cC5tawotCi1pbmNsdWRlIC4vdnNuLm1rCi0KLSNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS90YXJnZXQubWsKLSNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS8kKFRBUkdFVCkvb3RwLm1rCi0KLVVTUl9MSUJQQVRIPS4uLy4uL2xpYgotSU5TVEFMTF9ESVI9L3Vzci9sb2NhbC9saWIKLUFCU19VU0VSX0xJQlBBVEg9JChzaGVsbCBjZCAuLi8uLi9saWI7cHdkKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ1JFQVRFIERJUiBTVFJVQ1RVUkUgSEVSRQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhURE9DUz0kKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyouaHRtbCkgXAotCSQod2lsZGNhcmQgJChBQlNfVVNFUl9MSUJQQVRIKS8kKEFQUF9OQU1FKS9odGRvY3MvKi5odG0pIFwKLQkkKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyoueWF3cykKLUJVSUxEX0ZJTEVTPWZzX2Jvb3Rfc21pdGhlLmJlYW0gZnNfbGlzdHMuYmVhbSBmc19saWIuYmVhbQotCi1MT0NBTF9ESVI9bG9jYWwKLSNMT0NBTF9ESVI9JChzaGVsbCBjYXQgJChSRUxTKS5yZWwuc3JjIHxncmVwIC1tIDEgJyQoQVBQX05BTUUpJyB8YXdrIC1GICciJyAne3ByaW50ZiAiJXMtJXMiLCAkJDIsJCQ0fScpCi0KLURJUl9TVFJVQ1RVUkU9IFwKLQkkKExPQ0FMX0RJUikgXAotCSQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKSBcCi0JJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pIFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYgXAotCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvaHRkb2NzIAotCi1QUk9EVUNUSU9OX0RJUl9TVFJVQ1RVUkU9IFwKLQkkKFJFTFMpIFwKLQkkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKSBcCi0JJChSRUxTKS9zdGFnZSBcCi0JJChSRUxTKS9sb2cvJChSRUxfVlNOKSBcCi0JJChSRUxTKS92YXIvJChSRUxfVlNOKSBcCi0JJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cgXAotCSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcyBcCi0JJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNDUklQVF9BTkRfQk9PVF9GSUxFUz0gXAotCSQoUkVMUykuc2NyaXB0IFwKLQkkKFJFTFMpLmJvb3QKLQotTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTPSBcCi0JJChMT0NBTF9ESVIpLyQoUkVMUykuc2NyaXB0IFwKLQkkKExPQ0FMX0RJUikvJChSRUxTKS5ib290Ci0KLUxPQ0FMX0hUVFBfQ09ORj0gXAotCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi95YXdzLmNvbmYgXAotCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzICAKLQotUFJPRFVDVElPTl9IVFRQX0NPTkY9IFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mIFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlcyAgCi0KLUxPQ0FMX1RBUkdFVF9GSUxFUz0kKExPQ0FMX0hUVFBfQ09ORikgJChMT0NBTF9ESVIpLyQoUkVMUykuY29uZmlnICQoTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTKQotCi1MT0NBTF9UQVJHRVRTPSQoTE9DQUxfRElSKS8kKFJFTFMpLnNoIHZzbml0ICQoTE9DQUxfVEFSR0VUX0ZJTEVTKSAKLQotUFJPRFVDVElPTl9UQVJHRVRTPSQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCi0JICAgICAgICAgICAkKFJFTFMpL2xpYiBcCi0gICAgICAgICAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmMgXAotCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLmNvbmZpZy5zcmMgXAotCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjIFwKLQkJICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnNoLnNyYyAgXAotCQkgICAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3MgXAotCQkgICAkKFJFTFMpL2luc3RhbGwuc2ggXAotCQkgICAkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlIAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVEFSR0VUUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbCBkZWJ1ZyBvcHQgaW5zdHIgc2NyaXB0OiAgJChESVJfU1RSVUNUVVJFKSAkKExPQ0FMX1RBUkdFVFMpICQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKSAkKFBST0RVQ1RJT05fVEFSR0VUUykKLQlAZWNobyAkKEhURE9DUykKLQotaW5zdGFsbDogIHN0YWdlCi0KLXRhcjogJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnegotCi0kKERJUl9TVFJVQ1RVUkUpOgotCW1rZGlyIC1wICRACi0KLSQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKToKLQlta2RpciAtcCAkQAotCQotY2xlYW46Ci0JJChSTSkgJChSRUxfU0NSSVBUUykgJChUQVJHRVRfRklMRVMpCi0JJChSTSkgLXIgJChMT0NBTF9ESVIpICQoUFJPRE5fRElSKQotCSQoUk0pICQoUkVMUykucmVsCi0JJChSTSkgLXIgJChSRUxTKQotCSQoUk0pICQoUkVMUykqLnRnegotCSQoUk0pICQoUkVMUykucmVsLnNyYy50bXAKLQkkKFJNKSAkKFNDUklQVF9BTkRfQk9PVF9GSUxFUykKLQotZG9jczoKLQkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUQVJHRVRTIEZPUiBMT0NBTCBNT0RFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBzdGFydHVwIHNjcmlwdCBmb3IgbG9jYWwgbW9kZQotJChMT0NBTF9ESVIpLyQoUkVMUykuc2g6IAotCUBlY2hvICcjIS9iaW4vc2gnID4gJEAKLQlAZWNobyAiY2QgJChDVVJESVIpLyQoTE9DQUxfRElSKSIgPj4gJEAKLQlAZWNobyAiZXJsIC1uYW1lICQke1VTRVJ9XyQoUkVMUykgLWJvb3QgJChSRUxTKSAtY29uZmlnICQoUkVMUykuY29uZmlnIFwkJEAiID4+ICRACi0JY2htb2QgK3ggJEAKLQlAZWNobwotCUBlY2hvICI9PT09IFN0YXJ0IGxvY2FsIG5vZGUgd2l0aCBcInNoICRAXCIgPT09PSIKLQlAZWNobwotCi0jIENyZWF0ZSB0aGUgY29uZmlnIGZpbGUgZm9yIGxvY2FsIG1vZGUuCi0kKExPQ0FMX0RJUikvJChSRUxTKS5jb25maWc6ICQoUkVMUykuY29uZmlnLnNyYwotCXNlZCAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKLQkgICAgLWUgJ3M7JVZBUl9PVFAlOyQoQ1VSRElSKS8kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTik7JyBcCi0gICAgICAgICAgICAtZSAnczslUkVMUyU7JChSRUxTKTtnJyBcCi0gICAgICAgICAgICAtZSAnczslSE9NRSU7JChIT01FKTtnJyBcCi0gICAgICAgICAgICAtZSAnczslQlJPQURDQVNUX0FERFJFU1MlOyQoQlJPQURDQVNUX0FERFJFU1MpO2cnIFwKLSAgICAgICAgICAgIC1lICdzOyVDT05UQUNUX05PREUlOyQoQ09OVEFDVF9OT0RFKTtnJyBcCi0JICAgIC1lICJzOyVIT1NUTkFNRSU7YGhvc3RuYW1lIC0tbG9uZ2A7IiBcCi0gICAgICAgICAgICAtZSAnczslQVBQX05BTUUlOyQoQVBQX05BTUUpOycgXAotCSAgICAtZSAnczslQVBQX1ZFUlNJT04lOyQoQVBQX1ZFUlNJT04pO2cnIFwKLSAgICAgICAgICAgICAkPCA+ICRACi0KLSMgQ3JlYXRlIHRoZSBodHRwZCBjb25mIGZpbGUgZm9yIGxvY2FsIG1vZGUuCi0kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mOiB5YXdzLmNvbmYuc3JjCi0Jc2VkIC1lICdzOyVWQVJfT1RQJTskKENVUkRJUikvJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pOycgXAotCSAgICAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKLQkgICAgLWUgJ3M7JUhURE9DX1JPT1QlOyQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzOycgXAotICAgICAgICAgICAgLWUgJ3M7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTsnIFwKLSAgICAgICAgICAgIC1lICdzOyVSRUxTJTskKFJFTFMpOycgXAotICAgICAgICAgICAgLWUgJ3M7JVVTRVIlOyQoVVNFUik7JyBcCi0JICAgIC1lICdzOyVIVERPQ19ST09UJTskKEFCU19VU0VSX0xJQlBBVEgpOycgXAotICAgICAgICAgICAgLWUgJ3M7JU1IT1NUJTskKE1IT1NUKTsnIFwKLSAgICAgICAgICAgICQ8ID4gJEAKLQotIyBDcmVhdGUgdGhlIGNvbmZpZyBmaWxlIGZvciBsb2NhbCBtb2RlLgotdnNuaXQ6ICQoUkVMUykucmVsLnNyYyAKLQlzZWQgLWUgJ3M7JVJFTF9WU04lOyQoUkVMX1ZTTik7JyBcCi0JICAgICAgICQ8ID4gJDwudG1wCi0KLSMgQ3JlYXRlIGFuZCBwb3NpdGlvbiBzY3JpcHQgYW5kIGJvb3QgZmlsZXMgZm9yIGxvY2FsIG1vZGUuCi0kKExPQ0FMX1NDUklQVF9BTkRfQk9PVF9GSUxFUyk6IAotCUAgZXJsIC1weiAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluIFwKLQkgICAgICAtbm9zaGVsbCBcCi0JICAgICAgLXMgZnNfbGliIHNfYXBwbHkgZnNfYm9vdF9zbWl0aGUgbWFrZV9zY3JpcHRfYW5kX2Jvb3QgIltcIiQoRVJMX1JVTl9UT1ApLypcIiwgIFwiJChVU1JfTElCUEFUSClcIl0uICIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkJChiYXNlbmFtZSBgcHdkYCkiLnJlbC5zcmMudG1wXCIuICIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltsb2NhbF0uICIgXAotCSAgICAgIC1zIGluaXQgc3RvcAotCWNwICQoU0NSSVBUX0FORF9CT09UX0ZJTEVTKSAkKExPQ0FMX0RJUikvIAotCi0kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlczogLi4vLi4vYnVpbGQvbWltZS50eXBlcwotCWNwICQ8ICRACi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBUQVJHRVRTIEZPUiBQUk9EVUNUSU9OIE1PREUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJChSRUxTKS9saWI6IAotCSMgRm9yIHNvbWUgcmVhc29uIHRoaXMgd2lsbCBub3QgaGFwcGVuIGlmIGFkZGVkIHRvIFBST0RVQ1RJT05fRElSX1NUUlVDVFVSRQotCW1rZGlyICRACi0JQCBlcmwgLXB6ICQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCi0JICAgICAgLW5vc2hlbGwgXAotCSAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIHN0YWdlX2Zyb21fcmVsc3JjICJbXCIkKFVTUl9MSUJQQVRIKVwiXS4gIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiJCQoYmFzZW5hbWUgYHB3ZGApIi5yZWwuc3JjXCIuICIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiRAXCIiLiAiIFwKLQkgICAgICAtcyBpbml0IHN0b3AKLQotIyBNb3ZlIHRoZSBodGRvY3MgZnJvbSB0aGUgbG9jYWwgYXBwcyB0byB0aGUgcHJvZHVjdGlvbiBodGRvYyByb290IGRpcmVjdG9yeS4KLSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcy86ICQoSFRET0NTKQotCUBta2RpciAtcCAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7IFwKLQlmb3IgeCBpbiAkKEhURE9DUyk7ZG8gXAotIAkJY3AgICQkeCAkQDsgXAotCWRvbmUKLQotIyBzdGFydHVwIHNjcmlwdCBmb3IgcHJvZHVjdGlvbiBtb2RlCi0kKFJFTFMpL3N0YWdlLyQoUkVMUykuc2guc3JjOiAKLQlAZWNobyAnIyEvYmluL3NoJyA+ICRACi0JQGVjaG8gImNkICVJTlNUQUxMX0RJUiUvJChSRUxTKS9yZWxlYXNlLyQoUkVMX1ZTTikiID4+ICRACi0JQGVjaG8gImVybCAtbmFtZSAkKFJFTFMpIC1ib290ICQoUkVMUykgLWNvbmZpZyAkKFJFTFMpLmNvbmZpZyAtZGV0YWNoZWQgXCQkQCIgPj4gJEAKLQljaG1vZCAreCAkQAotCi0kKFJFTFMpL2J1aWxkLyQoUkVMX1ZTTik6ICAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluCi0JbWtkaXIgLXAgJChSRUxTKS9idWlsZC8kKFJFTF9WU04pIAotCWNwICQ8L2ZzX2Jvb3Rfc21pdGhlLmJlYW0gJEAKLQljcCAkPC9mc19saWIuYmVhbSAkQAotCWNwICQ8L2ZzX2xpc3RzLmJlYW0gJEAKLQotJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmM6ICQoUkVMUykucmVsLnNyYy50bXAKLQljcCAkPCAkQAotCi0kKFJFTFMpL3N0YWdlLyQoUkVMUykuY29uZmlnLnNyYzogJChSRUxTKS5jb25maWcuc3JjCi0JY3AgJDwgJEAKLQotJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjOiB5YXdzLmNvbmYuc3JjCi0JY3AgJDwgJEAKLQotJChSRUxTKS9pbnN0YWxsLnNoOiAKLQlAZWNobyAnIyEvYmluL3NoJyA+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiaWYgWyBcJCQjIC1lcSAxIF07dGhlbiIgPj4gJEAKLQlAZWNobyAiICAgIElOU1RBTExfRElSPVwkJDE7IiA+PiAkQAotCUBlY2hvICJlbHNlIiA+PiAkQAotCUBlY2hvICIgICAgSU5TVEFMTF9ESVI9JChJTlNUQUxMX0RJUik7IiA+PiAkQAotCUBlY2hvICJmaSIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJmdW5jdGlvbiBtdW5nZSgpIHsiID4+ICRACi0JQGVjaG8gIiAgICBzZWQgLWUgXCJzOyVMT0dfT1RQJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2xvZy8kKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JVZBUl9PVFAlO1wkJElOU1RBTExfRElSLyQoUkVMUykvdmFyLyQoUkVMX1ZTTik7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslUkVMUyU7JChSRUxTKTtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVSRUxfVlNOJTskKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JVVTRVIlOyQkVVNFUjtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVIVERPQ19ST09UJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslTUhPU1QlO1xgaG9zdG5hbWVcYDtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVCUk9BRENBU1RfQUREUkVTUyU7JChCUk9BRENBU1RfQUREUkVTUyk7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslSU5TVEFMTF9ESVIlO1wkJElOU1RBTExfRElSO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JUNPTlRBQ1RfTk9ERSU7JChDT05UQUNUX05PREUpO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JUhPU1ROQU1FJTtcYGhvc3RuYW1lIC0tbG9uZ1xgO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVBUFBfVkVSU0lPTiU7JChBUFBfVkVSU0lPTik7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICcgICAgICAgICQkMSA+ICQkMicgPj4gJEAKLQlAZWNobyAifSIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJtdW5nZSBzdGFnZS95YXdzLmNvbmYuc3JjIHZhci8kKFJFTF9WU04pL3d3dy9jb25mL3lhd3MuY29uZjsiID4+ICRACi0JQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykuY29uZmlnLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5jb25maWc7IiA+PiAkQAotCUBlY2hvICJtdW5nZSBzdGFnZS8kKFJFTFMpLnNoLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACi0JQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykucmVsLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5yZWw7IiA+PiAkQAotCUBlY2hvICJjaG1vZCAreCByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiY2QgLi47IiA+PiAkQAotCUBlY2hvICJmaW5kICQoUkVMUykgfCBjcGlvIC1vID4gXCQkSU5TVEFMTF9ESVIvJChSRUxTKS5jcGlvOyIgPj4gJEAKLQlAZWNobyAiY2QgLTsiID4+ICRACi0JQGVjaG8gImNkIFwkJElOU1RBTExfRElSOyAiID4+ICRACi0JQGVjaG8gImVjaG8gLW4gXCJVbnBhY2tlZDogXCIiID4+ICRACi0JQGVjaG8gImNwaW8gLXVpZCA8ICQoUkVMUykuY3BpbzsiID4+ICRACi0JQGVjaG8gInJtICQoUkVMUykuY3BpbzsiID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiZWNobyBcInB3ZCBpcyBcYHB3ZFxgXCI7IiA+PiAkQAotCUBlY2hvICJjZCAkKFJFTFMpOyIgPj4gJEAKLQlAZWNobyAiIGVybCAtcHogYnVpbGQvJChSRUxfVlNOKSBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgLW5vc2hlbGwgXFwiID4+ICRACi0JQGVjaG8gLW4gIiAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIG1ha2Vfc2NyaXB0X2FuZF9ib290IFwiW1xcXCIkKEVSTF9SVU5fVE9QKS8qXFxcIiwgIFxcXCJsaWIvXFxcIl0uIFwiICIgPj4gJEAKLQlAZWNobyAtbiAgICAgICAgIlwiXFxcInN0YWdlLyQkKGJhc2VuYW1lIGBwd2RgKS5yZWwuc3JjXFxcIi4gXCIgIiA+PiAkQAotCUBlY2hvIC1uICAgICAgICAiXCJbbG9jYWxdLiBcIiAiID4+ICRACi0JQGVjaG8gICAgICAgICAgICItcyBpbml0IHN0b3AgfCBlZ3JlcCAnKnRlcm1pbmF0ZSp8RVJST1InIiA+PiAkQAotCUBlY2hvICJpZiBbIFwkJD8gLWVxIDAgXTsgdGhlbiIgPj4gJEAKLQlAZWNobyAiZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCI7IiA+PiAkQAotCUBlY2hvICJlY2hvIFwiU1RBR0UgRkFJTFVSRSBcJCQ/ICAtIFNpbGVuY2UgdGhlIGRpc2NvcmQuXCI7IiA+PiAkQAotCUBlY2hvICJlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIjsiID4+ICRACi0JQGVjaG8gImV4aXQgMTsiID4+ICRACi0JQGVjaG8gImZpIiA+PiAkQAotCUBlY2hvICIiID4+ICRACi0JQGVjaG8gIm12ICQoUkVMUykucmVsICQoUkVMUykuc2NyaXB0ICQoUkVMUykuYm9vdCByZWxlYXNlLyQoUkVMX1ZTTik7IiA+PiAkQAotCUBlY2hvICIiID4+ICRACi0JQGVjaG8gInJtIC1yIHN0YWdlOyIgPj4gJEAKLQlAZWNobyAicm0gLXIgYnVpbGQ7IiA+PiAkQAotCUBlY2hvICJjZCAtOyIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJjaGdycCAtUiBlcnRzICQoUkVMUyk7ICIgPj4gJEAKLQlAZWNobyAiY2htb2QgLVIgNzc1ICQoUkVMUyk7ICIgPj4gJEAKLQlAZWNobyAiY2QgLSIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJybSAtZiAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsiID4+ICRACi0JQGVjaG8gImxuIC1zIFwkJElOU1RBTExfRElSLyQoUkVMUykvcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykuc2ggL3Vzci9sb2NhbC9iaW4vJChBUFBfTkFNRSk7IiA+PiAkQAotCUBlY2hvICJjaGdycCAtUiBlcnRzIC91c3IvbG9jYWwvYmluLyQoQVBQX05BTUUpOyAiID4+ICRACi0JQGVjaG8gImNobW9kIC1SIDc3NSAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsgIiA+PiAkQAotCUBlY2hvICJybSBcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2luc3RhbGwuc2g7IiA+PiAkQAotCUBlY2hvICJlY2hvIC1uICQkJ1xlWzA7MzJtJyIgPj4gJEAKLQlAZWNobyAiZWNobyBcIiQoQVBQX05BTUUpIGluc3RhbGxhdGlvbiB0byBcJCRJTlNUQUxMX0RJUiBjb21wbGV0ZS5cIiIgPj4gJEAKLQlAZWNobyAiZWNobyAtbiAkJCdcZVswbSciID4+ICRACi0JY2htb2QgK3ggJEAKLQkJCi0KLXN0YWdlOiAkKFJFTFMpCi0JY2QgJChSRUxTKTsgXAotCS4vaW5zdGFsbC5zaDsgXAotCWNkIC0KLQotJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzOiAuLi8uLi9idWlsZC9taW1lLnR5cGVzCi0JY3AgJDwgJEAKLQotJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnejogJChSRUxTKQotCXRhciAtemN2ZiAkQCAkPAotCi0kKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlOiAuLi8uLi90b29scy91dGlsaXRpZXMvY2xlYW5fcmVsZWFzZQotCWNwICQ8ICRACi0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL2JsYW5rX2FwcF9yZWwuY29uZmlnLnNyYyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL2JsYW5rX2FwcF9yZWwuY29uZmlnLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzcwMWM1YS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC9ibGFua19hcHBfcmVsLmNvbmZpZy5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0lJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQotJSUlIFBhcmFtZXRlciBzZXR0aW5ncyBmb3IgYXBwcyBvbiAlQVBQX05BTUUlCi0lJSUgV2FybmluZyAtIHRoaXMgY29uZmlnIGZpbGUgKm11c3QqIGVuZCB3aXRoIDxkb3Q+PHdoaXRlc3BhY2U+Ci0KLSUlIHdyaXRlIGxvZyBmaWxlcyB0byBzYXNsX2RpcgotWwotIHtzYXNsLAotICBbCi0gICB7c2FzbF9lcnJvcl9sb2dnZXIsIHtmaWxlLCAiJUxPR19PVFAlL3Nhc2xfbG9nIn19Ci0gIF19LAotCi0KLSB7Z2FzLAotICBbCi0gICB7bW9kX3NwZWNzLCBbe2Vsd3JhcCwge2ZzX2Vsd3JhcF9oLCBzdGFydF9saW5rfX1dfSwKLQotICAgJSBlbHdyYXAgY29uZmlnLgotICAge2Vycl9sb2csICIlTE9HX09UUCUvZXJyX2xvZyJ9LAotICAge2Vycl9sb2dfd3JhcF9pbmZvLCB7e2Vyciw1MDAwMDAwLDEwfSx7c2FzbCw1MDAwMDAwLDEwfX19LCAKLSAgIHtlcnJfbG9nX3R0eSwgdHJ1ZX0gJSBMb2cgdG8gdGhlIHNjcmVlbgotICAgXX0sCi0KLSB7JUFQUF9OQU1FJSwKLSAgWwotICBdfQotXS4gCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC9ibGFua19hcHBfcmVsLnJlbC5zcmMgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC9ibGFua19hcHBfcmVsLnJlbC5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2OTU3OGUuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvYmxhbmtfYXBwX3JlbC5yZWwuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotJSUlIC0qLSBtb2RlOmVybGFuZyAtKi0KLXtyZWxlYXNlLCAKLSB7IiUlQVBQX05BTUUlJV9yZWwiLCAiJVJFTF9WU04lIn0sCi0gZXJ0cywKLSBbCi0gIGtlcm5lbCwKLSAgc3RkbGliLAotICBzYXNsLAotICBmc2xpYiwKLSAgZ2FzLAotICAlJUFQUF9OQU1FJSUKLSBdCi19LiAKLQpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvdnNuLm1rIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvdnNuLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWM4ZTA3Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL3Zzbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVJFTF9WU049MS4wCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC95YXdzLmNvbmYuc3JjIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwveWF3cy5jb25mLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1N2FhYy4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC95YXdzLmNvbmYuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLQotIyBjb25mIGZvciB5YXdzCi0KLQotIyBmaXJzdCB3ZSBoYXZlIGEgc2V0IG9mIGdsb2JhbHMKLSMgVGhhdCBhcHBseSB0byBhbGwgdmlydHVhbCBzZXJ2ZXJzCi0KLQotIyBUaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxvZ2ZpbGVzIGZvcgotIyBhbGwgdmlydHVhbCBzZXJ2ZXJzIHdpbGwgYmUgd3JpdHRlbgotCi1sb2dkaXIgPSAvdmFyL2xvZy95YXdzCi0KLSMgVGhpcyB0aGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGVyZSBhZGRpdGlvbmFsCi0jIGJlYW0gY29kZSBjYW4gYmUgcGxhY2VkLiBUaGUgZGFlbW9uIHdpbGwgYWRkIHRoaXMKLSMgZGlyZWN0b3J5IHRvIGl0cyBzZWFyY2ggcGF0aAotCi1lYmluX2RpciA9IC92YXIveWF3cy9lYmluCi0KLQotIyBUaGlzIGlzIGEgZGlyZWN0b3J5IHdoZXJlIGFwcGxpY2F0aW9uIHNwZWNpZmljIC5ocmwKLSMgZmlsZXMgY2FuIGJlIHBsYWNlZC4gYXBwbGljYXRpb24gc3BlY2lmaWcgLnlhd3MgY29kZSBjYW4KLSMgdGhlbiBpbmNsdWRlIHRoZXNlIC5ocmwgZmlsZXMKLQotaW5jbHVkZV9kaXIgPSAvdmFyL3lhd3MvaW5jbHVkZQotCi0KLQotCi0KLSMgVGhpcyBpcyBhIGRlYnVnIHZhcmlhYmxlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIGh0dHAgfCB0cmFmZmljIHwgZmFsc2UKLSMgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZXQgdGhlIHRyYWNlIChwb3NzaWJseSB0byB0aGUgdHR5KSB3aGlsZQotIyBpbnZva2luZyB5YXdzIGZyb20gdGhlIHNoZWxsIGFzIGluCi0jIHlhd3MgLWkgLVQgLXggKHNlZSBtYW4geWF3cykKLQotdHJhY2UgPSBmYWxzZQotCi0KLQotCi0KLSMgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSB5YXdzIHN0YXJ0IGFkZGl0aW9uYWwgCi0jIGFwcGxpY2F0aW9uIHNwZWNpZmljIGNvZGUgYXQgc3RhcnR1cAotIyAKLSMgcnVubW9kID0gbXltb2R1bGUKLQotCi0jIEJ5IGRlZmF1bHQgeWF3cyB3aWxsIGNvcHkgdGhlIGVybGFuZyBlcnJvcl9sb2cgYW5kCi0jIGVuZCB3cml0ZSBpdCB0byBhIHdyYXAgbG9nIGNhbGxlZCByZXBvcnQubG9nIChpbiB0aGUgbG9nZGlyKQotIyB0aGlzIGZlYXR1cmUgY2FuIGJlIHR1cm5lZCBvZmYuIFRoaXMgd291bGQgdHlwaWNhbGx5Ci0jIGJlIHRoZSBjYXNlIHdoZW4geWF3cyBydW5zIHdpdGhpbiBhbm90aGVyIGxhcmdlciBhcHAKLQotY29weV9lcnJvcl9sb2cgPSB0cnVlCi0KLQotIyBMb2dzIGFyZSB3cmFwIGxvZ3MKLQotbG9nX3dyYXBfc2l6ZSA9IDEwMDAwMDAKLQotCi0jIFBvc3NpYmx5IHJlc29sdmUgYWxsIGhvc3RuYW1lcyBpbiBsb2dmaWxlcyBzbyB3ZWJhbGl6ZXIKLSMgY2FuIHByb2R1Y2UgdGhlIG5pY2UgZ2VvZ3JhcGh5IHBpZWNoYXJ0Ci0KLWxvZ19yZXNvbHZlX2hvc3RuYW1lID0gZmFsc2UKLQotCi0KLSMgZmFpbCBjb21wbGV0ZWx5IG9yIG5vdCBpZiB5YXdzIGZhaWxzIAotIyB0byBiaW5kIGEgbGlzdGVuIHNvY2tldAotZmFpbF9vbl9iaW5kX2VyciA9IHRydWUKLQotCi0KLSMgSWYgeWF3cyBpcyBzdGFydGVkIGFzIHJvb3QsIGl0IGNhbiwgb25jZSBpdCBoYXMgb3BlbmVkCi0jIGFsbCByZWxldmFudCBzb2NrZXRzIGZvciBsaXN0ZW5pbmcsIGNoYW5nZSB0aGUgdWlkIHRvIGEgCi0jIHVzZXIgd2l0aCBsb3dlciBhY2Nlc3NyaWdodHMgdGhhbiByb290IAotCi0jIHVzZXJuYW1lID0gbm9ib2R5Ci0KLQotIyBJZiBIVFRQIGF1dGggaXMgdXNlZCwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHNwZWNpZmljCi0jIGF1dGggbG9nLgotCi1hdXRoX2xvZyA9IHRydWUKLQotCi0jIFdoZW4gd2UncmUgcnVubmluZyBtdWx0aXBsZSB5YXdzIHN5c3RlbXMgb24gdGhlIHNhbWUgCi0jIGhvc3QsIHdlIG5lZWQgdG8gZ2l2ZSBlYWNoIHlhd3Mgc3lzdGVtIGFuIGluZGl2aWR1YWwKLSMgbmFtZS4gWWF3cyB3aWxsIHdyaXRlIGEgbnVtYmVyIG9mIHJ1bnRpbWUgZmlsZXMgdW5kZXIKLSMgL3RtcC95YXdzLyR7aWR9Ci0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJkZWZhdWx0IgotCi0KLSMgaWQgPSBteW5hbWUKLQotCi0jIGVhcmxpZXIgdmVyc2lvbnMgb2YgWWF3cyBwaWNrZWQgdGhlIGZpcnN0IHZpcnR1YWwgaG9zdAotIyBpbiBhIGxpc3Qgb2YgaG9zdHMgd2l0aCB0aGUgc2FtZSBJUC9QT1JUIHdoZW4gdGhlIEhvc3Q6Ci0jIGhlYWRlciBkb2Vzbid0IG1hdGNoIGFueSBuYW1lIG9uIGFueSBIb3N0Ci0jIFRoaXMgaXMgb2Z0ZW4gbmljZSBpbiB0ZXN0aW5nIGVudmlyb25tZW50cyBidXQgbm90Ci0jIGFjY2VwdGFibGUgaW4gcmVhbCBsaXZlIGhvc3Rpbmcgc2NlbmFyaW9zCi0KLXBpY2tfZmlyc3RfdmlydGhvc3Rfb25fbm9tYXRjaCA9IHRydWUKLQotCi0jIEFsbCB1bmljZXMgYXJlIGJyb2tlbiBzaW5jZSBpdCdzIG5vdCBwb3NzaWJsZSB0byBiaW5kIHRvCi0jIGEgcHJpdmlsZWdlZCBwb3J0ICg8IDEwMjQpIHVubGVzcyB1aWQ9PTAKLSMgVGhlcmUgaXMgYSBjb250cmliIGluIGp1bmdlcmwgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgYnkgbWVhbnMgCi0jIG9mIGFuIGV4dGVybmFsIHNldHVpZCByb290IHByb2dyYW1tIGNhbGxlZCBmZHNydiB0byBsaXN0ZW4gdG8KLSMgdG8gcHJpdmlsZWdlZCBwb3J0LgotIyBJZiB3ZSB1c2UgdGhpcyBmZWF0dXJlLCBpdCByZXF1aXJlcyBmZHNydiB0byBiZSBwcm9wZXJseSBpbnN0YWxsZWQuCi0jIERvZXNuJ3QgeWV0IHdvcmsgd2l0aCBTU0wuCi0KLXVzZV9mZHNydiA9IGZhbHNlCi0KLQotCi0KLSMgZW5kIHRoZW4gYSBzZXQgb2YgdmlydHVhbCBzZXJ2ZXJzCi0jIEZpcnN0IHR3byB2aXJ0aG9zdGVkIHNlcnZlcnMgb24gdGhlIHNhbWUgSVAgKDAuMC4wLjApCi0jIGluIHRoaXMgY2FzZSwgYnV0IGFuIGV4cGxpY2l0IElQIGNhbiBiZSBnaXZlbiBhcyB3ZWxsCi0KLTxzZXJ2ZXIgY29yZS5tYXJ0aW5qbG9nYW4uY29tPgotCXBvcnQgPSA4MAotCWxpc3RlbiA9IDAuMC4wLjAKLQlkb2Nyb290ID0gL3Zhci95YXdzL3d3dwotCWFyZ19yZXdyaXRlX21vZCA9IHB3cl9hcmdfcmV3cml0ZV9tb2QKLQlhcHBtb2RzID0gPHB3ciwgcHdyX21haW5fY29udHJvbGxlcl9hcHBtb2Q+Ci08L3NlcnZlcj4KLQotPHNlcnZlciBsb2NhbGhvc3Q+Ci0JcG9ydCA9IDgwCi0JbGlzdGVuID0gMC4wLjAuMAotCWRvY3Jvb3QgPSAvdG1wCi0JZGlyX2xpc3RpbmdzID0gdHJ1ZQotCWRhdiA9IHRydWUKLQk8YXV0aD4KLQkJcmVhbG0gPSBmb29iYXIKLQkJZGlyID0gLwotCQl1c2VyID0gZm9vOmJhcgotCQl1c2VyID0gYmF6OmJhcgotCTwvYXV0aD4KLTwvc2VydmVyPgotCi0KLQotIyBBbmQgdGhlbiBhbiBzc2wgc2VydmVyCi0KLTxzZXJ2ZXIgY29yZS5tYXJ0aW5qbG9nYW4uY29tPgotCXBvcnQgPSA0NDMKLQlkb2Nyb290ID0gL3RtcAotCWxpc3RlbiA9IDAuMC4wLjAKLQlkaXJfbGlzdGluZ3MgPSB0cnVlCi0JPHNzbD4gIAotCSAgICAgICAga2V5ZmlsZSA9IC91c3IvbG9jYWwveWF3cy9ldGMveWF3cy1rZXkucGVtCi0JICAgICAgICBjZXJ0ZmlsZSA9IC91c3IvbG9jYWwveWF3cy9ldGMveWF3cy1jZXJ0LnBlbQotCTwvc3NsPgotPC9zZXJ2ZXI+Ci0JCQkJCi0JCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vcmVuYW1lLnNoIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3JlbmFtZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmYwNzdjMi4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vcmVuYW1lLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyEvYmluL3NoCi0KLWlmIFsgJCMgLWVxIDMgXTsgdGhlbgotCU9MRF9QUkVGSVg9JDEKLQlORVdfUFJFRklYPSQyCi0JRklMRU5BTUU9JDMKLQlORVdfRklMRU5BTUU9JChlY2hvICRGSUxFTkFNRSB8IHNlZCAtZSAicy8kT0xEX1BSRUZJWC8kTkVXX1BSRUZJWC8iKQotCWVjaG8gIm1vdmluZyAkRklMRU5BTUUgdG8gJE5FV19GSUxFTkFNRSIKLQltdiAkRklMRU5BTUUgJE5FV19GSUxFTkFNRQotCWV4aXQgMDsKLWZpCi0KLQotaWYgWyAkIyAtZXEgMiBdOyB0aGVuCi0Jd2hpbGUgcmVhZCBsaW5lOyAKLQlkbyAKLQkJT0xEX1BSRUZJWD0kMQotCQlORVdfUFJFRklYPSQyCi0JCU5FV19GSUxFTkFNRT0kKGVjaG8gJHtsaW5lfSB8IHNlZCAtZSAicy8kT0xEX1BSRUZJWC8kTkVXX1BSRUZJWC8iKQotCQllY2hvICJtb3ZpbmcgJHtsaW5lfSB0byAkTkVXX0ZJTEVOQU1FIgotCQltdiAke2xpbmV9ICRORVdfRklMRU5BTUUKLQlkb25lCi0JZXhpdCAwCi1maQotCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vc3Vic3RpdHV0ZS5zaCBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9zdWJzdGl0dXRlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzA1Yjc1Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9zdWJzdGl0dXRlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyEvYmluL3NoCi0KLQotaWYgWyAkIyAtbHQgMiBdOyB0aGVuCi0JZWNobyAidXNhZ2U6IHN1YnN0aXR1dGUuc2ggPHZhcmlhYmxlIHRvIHJlcGxhY2U+IDx2YWx1ZSB0byByZXBsYWNlIHdpdGg+IDxmaWxlbmFtZSB8IFNURElOPiIKLQlleGl0IDEKLWZpCi0KLWlmIFsgJCMgLWVxIDMgXTsgdGhlbgotCVZBUklBQkxFPSQxCi0JVkFMVUU9JDIKLQlGSUxFTkFNRT0kMwotCQotCWVjaG8gInJlcGxhY2luZyAkVkFSSUFCTEUgd2l0aCAkVkFMVUUgaW4gJEZJTEVOQU1FIgotCXNlZCAtZSAicy8kVkFSSUFCTEUvJFZBTFVFLyIgJEZJTEVOQU1FID4gIiRGSUxFTkFNRSJfdG1wIAotCW12ICIkRklMRU5BTUUiX3RtcCAkRklMRU5BTUUKLQlleGl0IDAKLWZpCi0KLWlmIFsgJCMgLWVxIDIgXTsgdGhlbgotICAgIHdoaWxlIHJlYWQgbGluZTsgCi0gICAgZG8KLQkJVkFSSUFCTEU9JDEKLQkJVkFMVUU9JDIKLQkJRklMRU5BTUU9JHtsaW5lfQotCQotCQllY2hvICJyZXBsYWNpbmcgJFZBUklBQkxFIHdpdGggJFZBTFVFIGluICRGSUxFTkFNRSIKLQkJc2VkIC1lICJzLyRWQVJJQUJMRS8kVkFMVUUvIiAkRklMRU5BTUUgPiAiJEZJTEVOQU1FIl90bXAgCi0JCW12ICIkRklMRU5BTUUiX3RtcCAkRklMRU5BTUUKLSAgICBkb25lCi0gICAgZXhpdCAwCi1maQotCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vdGhyaWZ0X3JlbC9NYWtlZmlsZSBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDM1OTU2Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBNYWtlIGZpbGUgZm9yIGNyZWF0aW5nIGFuIG90cCByZWxlYXNlLiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIwotIyBCYXNlbmFtZSBvZiB0aGlzIHJlbGVhc2UuCi0jIwotUkVMUz0kKHNoZWxsIGJhc2VuYW1lIGBwd2RgKQotQVBQX05BTUU9JChzaGVsbCBlY2hvICQoUkVMUykgfCBzZWQgcy9fcmVsJCQvLykKLQotaW5jbHVkZSAuLi8uLi9idWlsZC9vdHAubWsKLQotaW5jbHVkZSAuL3Zzbi5tawotCi0jaW5jbHVkZSAkKEVSTF9UT1ApL21ha2UvdGFyZ2V0Lm1rCi0jaW5jbHVkZSAkKEVSTF9UT1ApL21ha2UvJChUQVJHRVQpL290cC5tawotCi1VU1JfTElCUEFUSD0uLi8uLi9saWIKLUlOU1RBTExfRElSPS91c3IvbG9jYWwvbGliCi1BQlNfVVNFUl9MSUJQQVRIPSQoc2hlbGwgY2QgLi4vLi4vbGliO3B3ZCkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENSRUFURSBESVIgU1RSVUNUVVJFIEhFUkUKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVERPQ1M9JCh3aWxkY2FyZCAkKEFCU19VU0VSX0xJQlBBVEgpLyQoQVBQX05BTUUpL2h0ZG9jcy8qLmh0bWwpIFwKLQkkKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyouaHRtKSBcCi0JJCh3aWxkY2FyZCAkKEFCU19VU0VSX0xJQlBBVEgpLyQoQVBQX05BTUUpL2h0ZG9jcy8qLnlhd3MpCi1CVUlMRF9GSUxFUz1mc19ib290X3NtaXRoZS5iZWFtIGZzX2xpc3RzLmJlYW0gZnNfbGliLmJlYW0KLQotTE9DQUxfRElSPWxvY2FsCi0jTE9DQUxfRElSPSQoc2hlbGwgY2F0ICQoUkVMUykucmVsLnNyYyB8Z3JlcCAtbSAxICckKEFQUF9OQU1FKScgfGF3ayAtRiAnIicgJ3twcmludGYgIiVzLSVzIiwgJCQyLCQkNH0nKQotCi1ESVJfU1RSVUNUVVJFPSBcCi0JJChMT0NBTF9ESVIpIFwKLQkkKExPQ0FMX0RJUikvbG9nLyQoUkVMX1ZTTikgXAotCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKSBcCi0JJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pL3d3dy9jb25mIFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcyAKLQotUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFPSBcCi0JJChSRUxTKSBcCi0JJChSRUxTKS9yZWxlYXNlLyQoUkVMX1ZTTikgXAotCSQoUkVMUykvc3RhZ2UgXAotCSQoUkVMUykvbG9nLyQoUkVMX1ZTTikgXAotCSQoUkVMUykvdmFyLyQoUkVMX1ZTTikgXAotCSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3IFwKLQkkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3MgXAotCSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TQ1JJUFRfQU5EX0JPT1RfRklMRVM9IFwKLQkkKFJFTFMpLnNjcmlwdCBcCi0JJChSRUxTKS5ib290Ci0KLUxPQ0FMX1NDUklQVF9BTkRfQk9PVF9GSUxFUz0gXAotCSQoTE9DQUxfRElSKS8kKFJFTFMpLnNjcmlwdCBcCi0JJChMT0NBTF9ESVIpLyQoUkVMUykuYm9vdAotCi1MT0NBTF9IVFRQX0NPTkY9IFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mIFwKLQkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlcyAgCi0KLVBST0RVQ1RJT05fSFRUUF9DT05GPSBcCi0JJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pL3d3dy9jb25mL3lhd3MuY29uZiBcCi0JJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pL3d3dy9jb25mL21pbWUudHlwZXMgIAotCi1MT0NBTF9UQVJHRVRfRklMRVM9JChMT0NBTF9IVFRQX0NPTkYpICQoTE9DQUxfRElSKS8kKFJFTFMpLmNvbmZpZyAkKExPQ0FMX1NDUklQVF9BTkRfQk9PVF9GSUxFUykKLQotTE9DQUxfVEFSR0VUUz0kKExPQ0FMX0RJUikvJChSRUxTKS5zaCB2c25pdCAkKExPQ0FMX1RBUkdFVF9GSUxFUykgCi0KLVBST0RVQ1RJT05fVEFSR0VUUz0kKFJFTFMpL2J1aWxkLyQoUkVMX1ZTTikgXAotCSAgICAgICAgICAgJChSRUxTKS9saWIgXAotICAgICAgICAgICAgICAgICAgICQoUkVMUykvc3RhZ2UvJChSRUxTKS5yZWwuc3JjIFwKLQkgICAgICAgICAgICQoUkVMUykvc3RhZ2UvJChSRUxTKS5jb25maWcuc3JjIFwKLQkgICAgICAgICAgICQoUkVMUykvc3RhZ2UveWF3cy5jb25mLnNyYyBcCi0JCSAgICQoUkVMUykvc3RhZ2UvJChSRUxTKS5zaC5zcmMgIFwKLQkJICAgJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvaHRkb2NzIFwKLQkJICAgJChSRUxTKS9pbnN0YWxsLnNoIFwKLQkJICAgJChSRUxTKS9yZWxlYXNlLyQoUkVMX1ZTTikvY2xlYW5fcmVsZWFzZSAKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRBUkdFVFMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hbGwgZGVidWcgb3B0IGluc3RyIHNjcmlwdDogICQoRElSX1NUUlVDVFVSRSkgJChMT0NBTF9UQVJHRVRTKSAkKFBST0RVQ1RJT05fRElSX1NUUlVDVFVSRSkgJChQUk9EVUNUSU9OX1RBUkdFVFMpCi0JQGVjaG8gJChIVERPQ1MpCi0KLWluc3RhbGw6ICBzdGFnZQotCi10YXI6ICQoUkVMUyktJChMT0NBVElPTiktJChSRUxfVlNOKS50Z3oKLQotJChESVJfU1RSVUNUVVJFKToKLQlta2RpciAtcCAkQAotCi0kKFBST0RVQ1RJT05fRElSX1NUUlVDVFVSRSk6Ci0JbWtkaXIgLXAgJEAKLQkKLWNsZWFuOgotCSQoUk0pICQoUkVMX1NDUklQVFMpICQoVEFSR0VUX0ZJTEVTKQotCSQoUk0pIC1yICQoTE9DQUxfRElSKSAkKFBST0ROX0RJUikKLQkkKFJNKSAkKFJFTFMpLnJlbAotCSQoUk0pIC1yICQoUkVMUykKLQkkKFJNKSAkKFJFTFMpKi50Z3oKLQkkKFJNKSAkKFJFTFMpLnJlbC5zcmMudG1wCi0JJChSTSkgJChTQ1JJUFRfQU5EX0JPT1RfRklMRVMpCi0KLWRvY3M6Ci0JCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVEFSR0VUUyBGT1IgTE9DQUwgTU9ERQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgc3RhcnR1cCBzY3JpcHQgZm9yIGxvY2FsIG1vZGUKLSQoTE9DQUxfRElSKS8kKFJFTFMpLnNoOiAKLQlAZWNobyAnIyEvYmluL3NoJyA+ICRACi0JQGVjaG8gImNkICQoQ1VSRElSKS8kKExPQ0FMX0RJUikiID4+ICRACi0JQGVjaG8gImVybCAtbmFtZSAkJHtVU0VSfV8kKFJFTFMpIC1ib290ICQoUkVMUykgLWNvbmZpZyAkKFJFTFMpLmNvbmZpZyBcJCRAIiA+PiAkQAotCWNobW9kICt4ICRACi0JQGVjaG8KLQlAZWNobyAiPT09PSBTdGFydCBsb2NhbCBub2RlIHdpdGggXCJzaCAkQFwiID09PT0iCi0JQGVjaG8KLQotIyBDcmVhdGUgdGhlIGNvbmZpZyBmaWxlIGZvciBsb2NhbCBtb2RlLgotJChMT0NBTF9ESVIpLyQoUkVMUykuY29uZmlnOiAkKFJFTFMpLmNvbmZpZy5zcmMKLQlzZWQgLWUgJ3M7JUxPR19PVFAlOyQoQ1VSRElSKS8kKExPQ0FMX0RJUikvbG9nLyQoUkVMX1ZTTik7JyBcCi0JICAgIC1lICdzOyVWQVJfT1RQJTskKENVUkRJUikvJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pOycgXAotICAgICAgICAgICAgLWUgJ3M7JVJFTFMlOyQoUkVMUyk7ZycgXAotICAgICAgICAgICAgLWUgJ3M7JUhPTUUlOyQoSE9NRSk7ZycgXAotICAgICAgICAgICAgLWUgJ3M7JUJST0FEQ0FTVF9BRERSRVNTJTskKEJST0FEQ0FTVF9BRERSRVNTKTtnJyBcCi0gICAgICAgICAgICAtZSAnczslQ09OVEFDVF9OT0RFJTskKENPTlRBQ1RfTk9ERSk7ZycgXAotCSAgICAtZSAiczslSE9TVE5BTUUlO2Bob3N0bmFtZSAtLWxvbmdgOyIgXAotICAgICAgICAgICAgLWUgJ3M7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTsnIFwKLQkgICAgLWUgJ3M7JUFQUF9WRVJTSU9OJTskKEFQUF9WRVJTSU9OKTtnJyBcCi0gICAgICAgICAgICAgJDwgPiAkQAotCi0jIENyZWF0ZSB0aGUgaHR0cGQgY29uZiBmaWxlIGZvciBsb2NhbCBtb2RlLgotJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pL3d3dy9jb25mL3lhd3MuY29uZjogeWF3cy5jb25mLnNyYwotCXNlZCAtZSAnczslVkFSX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKTsnIFwKLQkgICAgLWUgJ3M7JUxPR19PVFAlOyQoQ1VSRElSKS8kKExPQ0FMX0RJUikvbG9nLyQoUkVMX1ZTTik7JyBcCi0JICAgIC1lICdzOyVIVERPQ19ST09UJTskKEFCU19VU0VSX0xJQlBBVEgpLyQoQVBQX05BTUUpL2h0ZG9jczsnIFwKLSAgICAgICAgICAgIC1lICdzOyVBUFBfTkFNRSU7JChBUFBfTkFNRSk7JyBcCi0gICAgICAgICAgICAtZSAnczslUkVMUyU7JChSRUxTKTsnIFwKLSAgICAgICAgICAgIC1lICdzOyVVU0VSJTskKFVTRVIpOycgXAotCSAgICAtZSAnczslSFRET0NfUk9PVCU7JChBQlNfVVNFUl9MSUJQQVRIKTsnIFwKLSAgICAgICAgICAgIC1lICdzOyVNSE9TVCU7JChNSE9TVCk7JyBcCi0gICAgICAgICAgICAkPCA+ICRACi0KLSMgQ3JlYXRlIHRoZSBjb25maWcgZmlsZSBmb3IgbG9jYWwgbW9kZS4KLXZzbml0OiAkKFJFTFMpLnJlbC5zcmMgCi0Jc2VkIC1lICdzOyVSRUxfVlNOJTskKFJFTF9WU04pOycgXAotCSAgICAgICAkPCA+ICQ8LnRtcAotCi0jIENyZWF0ZSBhbmQgcG9zaXRpb24gc2NyaXB0IGFuZCBib290IGZpbGVzIGZvciBsb2NhbCBtb2RlLgotJChMT0NBTF9TQ1JJUFRfQU5EX0JPT1RfRklMRVMpOiAKLQlAIGVybCAtcHogJChVU1JfTElCUEFUSCkvZnNsaWIvZWJpbiBcCi0JICAgICAgLW5vc2hlbGwgXAotCSAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIG1ha2Vfc2NyaXB0X2FuZF9ib290ICJbXCIkKEVSTF9SVU5fVE9QKS8qXCIsICBcIiQoVVNSX0xJQlBBVEgpXCJdLiAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiJCQoYmFzZW5hbWUgYHB3ZGApIi5yZWwuc3JjLnRtcFwiLiAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbbG9jYWxdLiAiIFwKLQkgICAgICAtcyBpbml0IHN0b3AKLQljcCAkKFNDUklQVF9BTkRfQk9PVF9GSUxFUykgJChMT0NBTF9ESVIpLyAKLQotJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pL3d3dy9jb25mL21pbWUudHlwZXM6IC4uLy4uL2J1aWxkL21pbWUudHlwZXMKLQljcCAkPCAkQAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVEFSR0VUUyBGT1IgUFJPRFVDVElPTiBNT0RFCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSQoUkVMUykvbGliOiAKLQkjIEZvciBzb21lIHJlYXNvbiB0aGlzIHdpbGwgbm90IGhhcHBlbiBpZiBhZGRlZCB0byBQUk9EVUNUSU9OX0RJUl9TVFJVQ1RVUkUKLQlta2RpciAkQAotCUAgZXJsIC1weiAkKFJFTFMpL2J1aWxkLyQoUkVMX1ZTTikgXAotCSAgICAgIC1ub3NoZWxsIFwKLQkgICAgICAtcyBmc19saWIgc19hcHBseSBmc19ib290X3NtaXRoZSBzdGFnZV9mcm9tX3JlbHNyYyAiW1wiJChVU1JfTElCUEFUSClcIl0uICIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiQkKGJhc2VuYW1lIGBwd2RgKSIucmVsLnNyY1wiLiAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkQFwiIi4gIiBcCi0JICAgICAgLXMgaW5pdCBzdG9wCi0KLSMgTW92ZSB0aGUgaHRkb2NzIGZyb20gdGhlIGxvY2FsIGFwcHMgdG8gdGhlIHByb2R1Y3Rpb24gaHRkb2Mgcm9vdCBkaXJlY3RvcnkuCi0kKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3MvOiAkKEhURE9DUykKLQlAbWtkaXIgLXAgJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvaHRkb2NzOyBcCi0JZm9yIHggaW4gJChIVERPQ1MpO2RvIFwKLSAJCWNwICAkJHggJEA7IFwKLQlkb25lCi0KLSMgc3RhcnR1cCBzY3JpcHQgZm9yIHByb2R1Y3Rpb24gbW9kZQotJChSRUxTKS9zdGFnZS8kKFJFTFMpLnNoLnNyYzogCi0JQGVjaG8gJyMhL2Jpbi9zaCcgPiAkQAotCUBlY2hvICJjZCAlSU5TVEFMTF9ESVIlLyQoUkVMUykvcmVsZWFzZS8kKFJFTF9WU04pIiA+PiAkQAotCUBlY2hvICJlcmwgLW5hbWUgJChSRUxTKSAtYm9vdCAkKFJFTFMpIC1jb25maWcgJChSRUxTKS5jb25maWcgLWRldGFjaGVkIFwkJEAiID4+ICRACi0JY2htb2QgK3ggJEAKLQotJChSRUxTKS9idWlsZC8kKFJFTF9WU04pOiAgJChVU1JfTElCUEFUSCkvZnNsaWIvZWJpbgotCW1rZGlyIC1wICQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSAKLQljcCAkPC9mc19ib290X3NtaXRoZS5iZWFtICRACi0JY3AgJDwvZnNfbGliLmJlYW0gJEAKLQljcCAkPC9mc19saXN0cy5iZWFtICRACi0KLSQoUkVMUykvc3RhZ2UvJChSRUxTKS5yZWwuc3JjOiAkKFJFTFMpLnJlbC5zcmMudG1wCi0JY3AgJDwgJEAKLQotJChSRUxTKS9zdGFnZS8kKFJFTFMpLmNvbmZpZy5zcmM6ICQoUkVMUykuY29uZmlnLnNyYwotCWNwICQ8ICRACi0KLSQoUkVMUykvc3RhZ2UveWF3cy5jb25mLnNyYzogeWF3cy5jb25mLnNyYwotCWNwICQ8ICRACi0KLSQoUkVMUykvaW5zdGFsbC5zaDogCi0JQGVjaG8gJyMhL2Jpbi9zaCcgPiAkQAotCUBlY2hvICIiID4+ICRACi0JQGVjaG8gImlmIFsgXCQkIyAtZXEgMSBdO3RoZW4iID4+ICRACi0JQGVjaG8gIiAgICBJTlNUQUxMX0RJUj1cJCQxOyIgPj4gJEAKLQlAZWNobyAiZWxzZSIgPj4gJEAKLQlAZWNobyAiICAgIElOU1RBTExfRElSPSQoSU5TVEFMTF9ESVIpOyIgPj4gJEAKLQlAZWNobyAiZmkiID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiZnVuY3Rpb24gbXVuZ2UoKSB7IiA+PiAkQAotCUBlY2hvICIgICAgc2VkIC1lIFwiczslTE9HX09UUCU7XCQkSU5TVEFMTF9ESVIvJChSRUxTKS9sb2cvJChSRUxfVlNOKTtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVWQVJfT1RQJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL3Zhci8kKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JVJFTFMlOyQoUkVMUyk7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslUkVMX1ZTTiU7JChSRUxfVlNOKTtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVVU0VSJTskJFVTRVI7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslSFRET0NfUk9PVCU7XCQkSU5TVEFMTF9ESVIvJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvaHRkb2NzO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JU1IT1NUJTtcYGhvc3RuYW1lXGA7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslQlJPQURDQVNUX0FERFJFU1MlOyQoQlJPQURDQVNUX0FERFJFU1MpO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAiICAgICAgICAtZSBcInM7JUlOU1RBTExfRElSJTtcJCRJTlNUQUxMX0RJUjtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVDT05UQUNUX05PREUlOyQoQ09OVEFDVF9OT0RFKTtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVIT1NUTkFNRSU7XGBob3N0bmFtZSAtLWxvbmdcYDtnXCIgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgICAgLWUgXCJzOyVBUFBfTkFNRSU7JChBUFBfTkFNRSk7Z1wiIFxcIiA+PiAkQAotCUBlY2hvICIgICAgICAgIC1lIFwiczslQVBQX1ZFUlNJT04lOyQoQVBQX1ZFUlNJT04pO2dcIiBcXCIgPj4gJEAKLQlAZWNobyAnICAgICAgICAkJDEgPiAkJDInID4+ICRACi0JQGVjaG8gIn0iID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAibXVuZ2Ugc3RhZ2UveWF3cy5jb25mLnNyYyB2YXIvJChSRUxfVlNOKS93d3cvY29uZi95YXdzLmNvbmY7IiA+PiAkQAotCUBlY2hvICJtdW5nZSBzdGFnZS8kKFJFTFMpLmNvbmZpZy5zcmMgcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykuY29uZmlnOyIgPj4gJEAKLQlAZWNobyAibXVuZ2Ugc3RhZ2UvJChSRUxTKS5zaC5zcmMgcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykuc2g7IiA+PiAkQAotCUBlY2hvICJtdW5nZSBzdGFnZS8kKFJFTFMpLnJlbC5zcmMgcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykucmVsOyIgPj4gJEAKLQlAZWNobyAiY2htb2QgK3ggcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykuc2g7IiA+PiAkQAotCUBlY2hvICIiID4+ICRACi0JQGVjaG8gImNkIC4uOyIgPj4gJEAKLQlAZWNobyAiZmluZCAkKFJFTFMpIHwgY3BpbyAtbyA+IFwkJElOU1RBTExfRElSLyQoUkVMUykuY3BpbzsiID4+ICRACi0JQGVjaG8gImNkIC07IiA+PiAkQAotCUBlY2hvICJjZCBcJCRJTlNUQUxMX0RJUjsgIiA+PiAkQAotCUBlY2hvICJlY2hvIC1uIFwiVW5wYWNrZWQ6IFwiIiA+PiAkQAotCUBlY2hvICJjcGlvIC11aWQgPCAkKFJFTFMpLmNwaW87IiA+PiAkQAotCUBlY2hvICJybSAkKFJFTFMpLmNwaW87IiA+PiAkQAotCUBlY2hvICIiID4+ICRACi0JQGVjaG8gImVjaG8gXCJwd2QgaXMgXGBwd2RcYFwiOyIgPj4gJEAKLQlAZWNobyAiY2QgJChSRUxTKTsiID4+ICRACi0JQGVjaG8gIiBlcmwgLXB6IGJ1aWxkLyQoUkVMX1ZTTikgXFwiID4+ICRACi0JQGVjaG8gIiAgICAgIC1ub3NoZWxsIFxcIiA+PiAkQAotCUBlY2hvIC1uICIgICAgICAtcyBmc19saWIgc19hcHBseSBmc19ib290X3NtaXRoZSBtYWtlX3NjcmlwdF9hbmRfYm9vdCBcIltcXFwiJChFUkxfUlVOX1RPUCkvKlxcXCIsICBcXFwibGliL1xcXCJdLiBcIiAiID4+ICRACi0JQGVjaG8gLW4gICAgICAgICJcIlxcXCJzdGFnZS8kJChiYXNlbmFtZSBgcHdkYCkucmVsLnNyY1xcXCIuIFwiICIgPj4gJEAKLQlAZWNobyAtbiAgICAgICAgIlwiW2xvY2FsXS4gXCIgIiA+PiAkQAotCUBlY2hvICAgICAgICAgICAiLXMgaW5pdCBzdG9wIHwgZWdyZXAgJyp0ZXJtaW5hdGUqfEVSUk9SJyIgPj4gJEAKLQlAZWNobyAiaWYgWyBcJCQ/IC1lcSAwIF07IHRoZW4iID4+ICRACi0JQGVjaG8gImVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiOyIgPj4gJEAKLQlAZWNobyAiZWNobyBcIlNUQUdFIEZBSUxVUkUgXCQkPyAgLSBTaWxlbmNlIHRoZSBkaXNjb3JkLlwiOyIgPj4gJEAKLQlAZWNobyAiZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCI7IiA+PiAkQAotCUBlY2hvICJleGl0IDE7IiA+PiAkQAotCUBlY2hvICJmaSIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJtdiAkKFJFTFMpLnJlbCAkKFJFTFMpLnNjcmlwdCAkKFJFTFMpLmJvb3QgcmVsZWFzZS8kKFJFTF9WU04pOyIgPj4gJEAKLQlAZWNobyAiIiA+PiAkQAotCUBlY2hvICJybSAtciBzdGFnZTsiID4+ICRACi0JQGVjaG8gInJtIC1yIGJ1aWxkOyIgPj4gJEAKLQlAZWNobyAiY2QgLTsiID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAiY2hncnAgLVIgZXJ0cyAkKFJFTFMpOyAiID4+ICRACi0JQGVjaG8gImNobW9kIC1SIDc3NSAkKFJFTFMpOyAiID4+ICRACi0JQGVjaG8gImNkIC0iID4+ICRACi0JQGVjaG8gIiIgPj4gJEAKLQlAZWNobyAicm0gLWYgL3Vzci9sb2NhbC9iaW4vJChBUFBfTkFNRSk7IiA+PiAkQAotCUBlY2hvICJsbiAtcyBcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS8kKFJFTFMpLnNoIC91c3IvbG9jYWwvYmluLyQoQVBQX05BTUUpOyIgPj4gJEAKLQlAZWNobyAiY2hncnAgLVIgZXJ0cyAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsgIiA+PiAkQAotCUBlY2hvICJjaG1vZCAtUiA3NzUgL3Vzci9sb2NhbC9iaW4vJChBUFBfTkFNRSk7ICIgPj4gJEAKLQlAZWNobyAicm0gXCQkSU5TVEFMTF9ESVIvJChSRUxTKS9pbnN0YWxsLnNoOyIgPj4gJEAKLQlAZWNobyAiZWNobyAtbiAkJCdcZVswOzMybSciID4+ICRACi0JQGVjaG8gImVjaG8gXCIkKEFQUF9OQU1FKSBpbnN0YWxsYXRpb24gdG8gXCQkSU5TVEFMTF9ESVIgY29tcGxldGUuXCIiID4+ICRACi0JQGVjaG8gImVjaG8gLW4gJCQnXGVbMG0nIiA+PiAkQAotCWNobW9kICt4ICRACi0JCQotCi1zdGFnZTogJChSRUxTKQotCWNkICQoUkVMUyk7IFwKLQkuL2luc3RhbGwuc2g7IFwKLQljZCAtCi0KLSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlczogLi4vLi4vYnVpbGQvbWltZS50eXBlcwotCWNwICQ8ICRACi0KLSQoUkVMUyktJChMT0NBVElPTiktJChSRUxfVlNOKS50Z3o6ICQoUkVMUykKLQl0YXIgLXpjdmYgJEAgJDwKLQotJChSRUxTKS9yZWxlYXNlLyQoUkVMX1ZTTikvY2xlYW5fcmVsZWFzZTogLi4vLi4vdG9vbHMvdXRpbGl0aWVzL2NsZWFuX3JlbGVhc2UKLQljcCAkPCAkQAotCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vdGhyaWZ0X3JlbC90aHJpZnRfcmVsLmNvbmZpZy5zcmMgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vdGhyaWZ0X3JlbC90aHJpZnRfcmVsLmNvbmZpZy5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3MDFjNWEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5jb25maWcuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotJSUlIC0qLSBtb2RlOmVybGFuZyAtKi0KLSUlJSBQYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIGFwcHMgb24gJUFQUF9OQU1FJQotJSUlIFdhcm5pbmcgLSB0aGlzIGNvbmZpZyBmaWxlICptdXN0KiBlbmQgd2l0aCA8ZG90Pjx3aGl0ZXNwYWNlPgotCi0lJSB3cml0ZSBsb2cgZmlsZXMgdG8gc2FzbF9kaXIKLVsKLSB7c2FzbCwKLSAgWwotICAge3Nhc2xfZXJyb3JfbG9nZ2VyLCB7ZmlsZSwgIiVMT0dfT1RQJS9zYXNsX2xvZyJ9fQotICBdfSwKLQotCi0ge2dhcywKLSAgWwotICAge21vZF9zcGVjcywgW3tlbHdyYXAsIHtmc19lbHdyYXBfaCwgc3RhcnRfbGlua319XX0sCi0KLSAgICUgZWx3cmFwIGNvbmZpZy4KLSAgIHtlcnJfbG9nLCAiJUxPR19PVFAlL2Vycl9sb2cifSwKLSAgIHtlcnJfbG9nX3dyYXBfaW5mbywge3tlcnIsNTAwMDAwMCwxMH0se3Nhc2wsNTAwMDAwMCwxMH19fSwgCi0gICB7ZXJyX2xvZ190dHksIHRydWV9ICUgTG9nIHRvIHRoZSBzY3JlZW4KLSAgIF19LAotCi0geyVBUFBfTkFNRSUsCi0gIFsKLSAgXX0KLV0uIApkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5yZWwuc3JjIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5yZWwuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTFkMjQwLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3RocmlmdF9yZWwucmVsLnNyYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSUlJSAtKi0gbW9kZTplcmxhbmcgLSotCi17cmVsZWFzZSwgCi0geyJ0aHJpZnRfcmVsIiwgIiVSRUxfVlNOJSJ9LAotIGVydHMsCi0gWwotICBrZXJuZWwsCi0gIHN0ZGxpYiwKLSAgc2FzbCwKLSAgZnNsaWIsCi0gIGdhcywKLSAgdGhyaWZ0Ci0gXQotfS4gCi0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3Zzbi5tayBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3Zzbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFjOGUwNy4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vdGhyaWZ0X3JlbC92c24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1SRUxfVlNOPTEuMApkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwveWF3cy5jb25mLnNyYyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3lhd3MuY29uZi5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTdhYWMuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwveWF3cy5jb25mLnNyYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0KLSMgY29uZiBmb3IgeWF3cwotCi0KLSMgZmlyc3Qgd2UgaGF2ZSBhIHNldCBvZiBnbG9iYWxzCi0jIFRoYXQgYXBwbHkgdG8gYWxsIHZpcnR1YWwgc2VydmVycwotCi0KLSMgVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsb2dmaWxlcyBmb3IKLSMgYWxsIHZpcnR1YWwgc2VydmVycyB3aWxsIGJlIHdyaXR0ZW4KLQotbG9nZGlyID0gL3Zhci9sb2cveWF3cwotCi0jIFRoaXMgdGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hlcmUgYWRkaXRpb25hbAotIyBiZWFtIGNvZGUgY2FuIGJlIHBsYWNlZC4gVGhlIGRhZW1vbiB3aWxsIGFkZCB0aGlzCi0jIGRpcmVjdG9yeSB0byBpdHMgc2VhcmNoIHBhdGgKLQotZWJpbl9kaXIgPSAvdmFyL3lhd3MvZWJpbgotCi0KLSMgVGhpcyBpcyBhIGRpcmVjdG9yeSB3aGVyZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyAuaHJsCi0jIGZpbGVzIGNhbiBiZSBwbGFjZWQuIGFwcGxpY2F0aW9uIHNwZWNpZmlnIC55YXdzIGNvZGUgY2FuCi0jIHRoZW4gaW5jbHVkZSB0aGVzZSAuaHJsIGZpbGVzCi0KLWluY2x1ZGVfZGlyID0gL3Zhci95YXdzL2luY2x1ZGUKLQotCi0KLQotCi0jIFRoaXMgaXMgYSBkZWJ1ZyB2YXJpYWJsZSwgcG9zc2libGUgdmFsdWVzIGFyZSBodHRwIHwgdHJhZmZpYyB8IGZhbHNlCi0jIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IHRoZSB0cmFjZSAocG9zc2libHkgdG8gdGhlIHR0eSkgd2hpbGUKLSMgaW52b2tpbmcgeWF3cyBmcm9tIHRoZSBzaGVsbCBhcyBpbgotIyB5YXdzIC1pIC1UIC14IChzZWUgbWFuIHlhd3MpCi0KLXRyYWNlID0gZmFsc2UKLQotCi0KLQotCi0jIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgeWF3cyBzdGFydCBhZGRpdGlvbmFsIAotIyBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb2RlIGF0IHN0YXJ0dXAKLSMgCi0jIHJ1bm1vZCA9IG15bW9kdWxlCi0KLQotIyBCeSBkZWZhdWx0IHlhd3Mgd2lsbCBjb3B5IHRoZSBlcmxhbmcgZXJyb3JfbG9nIGFuZAotIyBlbmQgd3JpdGUgaXQgdG8gYSB3cmFwIGxvZyBjYWxsZWQgcmVwb3J0LmxvZyAoaW4gdGhlIGxvZ2RpcikKLSMgdGhpcyBmZWF0dXJlIGNhbiBiZSB0dXJuZWQgb2ZmLiBUaGlzIHdvdWxkIHR5cGljYWxseQotIyBiZSB0aGUgY2FzZSB3aGVuIHlhd3MgcnVucyB3aXRoaW4gYW5vdGhlciBsYXJnZXIgYXBwCi0KLWNvcHlfZXJyb3JfbG9nID0gdHJ1ZQotCi0KLSMgTG9ncyBhcmUgd3JhcCBsb2dzCi0KLWxvZ193cmFwX3NpemUgPSAxMDAwMDAwCi0KLQotIyBQb3NzaWJseSByZXNvbHZlIGFsbCBob3N0bmFtZXMgaW4gbG9nZmlsZXMgc28gd2ViYWxpemVyCi0jIGNhbiBwcm9kdWNlIHRoZSBuaWNlIGdlb2dyYXBoeSBwaWVjaGFydAotCi1sb2dfcmVzb2x2ZV9ob3N0bmFtZSA9IGZhbHNlCi0KLQotCi0jIGZhaWwgY29tcGxldGVseSBvciBub3QgaWYgeWF3cyBmYWlscyAKLSMgdG8gYmluZCBhIGxpc3RlbiBzb2NrZXQKLWZhaWxfb25fYmluZF9lcnIgPSB0cnVlCi0KLQotCi0jIElmIHlhd3MgaXMgc3RhcnRlZCBhcyByb290LCBpdCBjYW4sIG9uY2UgaXQgaGFzIG9wZW5lZAotIyBhbGwgcmVsZXZhbnQgc29ja2V0cyBmb3IgbGlzdGVuaW5nLCBjaGFuZ2UgdGhlIHVpZCB0byBhIAotIyB1c2VyIHdpdGggbG93ZXIgYWNjZXNzcmlnaHRzIHRoYW4gcm9vdCAKLQotIyB1c2VybmFtZSA9IG5vYm9keQotCi0KLSMgSWYgSFRUUCBhdXRoIGlzIHVzZWQsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzcGVjaWZpYwotIyBhdXRoIGxvZy4KLQotYXV0aF9sb2cgPSB0cnVlCi0KLQotIyBXaGVuIHdlJ3JlIHJ1bm5pbmcgbXVsdGlwbGUgeWF3cyBzeXN0ZW1zIG9uIHRoZSBzYW1lIAotIyBob3N0LCB3ZSBuZWVkIHRvIGdpdmUgZWFjaCB5YXdzIHN5c3RlbSBhbiBpbmRpdmlkdWFsCi0jIG5hbWUuIFlhd3Mgd2lsbCB3cml0ZSBhIG51bWJlciBvZiBydW50aW1lIGZpbGVzIHVuZGVyCi0jIC90bXAveWF3cy8ke2lkfQotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZGVmYXVsdCIKLQotCi0jIGlkID0gbXluYW1lCi0KLQotIyBlYXJsaWVyIHZlcnNpb25zIG9mIFlhd3MgcGlja2VkIHRoZSBmaXJzdCB2aXJ0dWFsIGhvc3QKLSMgaW4gYSBsaXN0IG9mIGhvc3RzIHdpdGggdGhlIHNhbWUgSVAvUE9SVCB3aGVuIHRoZSBIb3N0OgotIyBoZWFkZXIgZG9lc24ndCBtYXRjaCBhbnkgbmFtZSBvbiBhbnkgSG9zdAotIyBUaGlzIGlzIG9mdGVuIG5pY2UgaW4gdGVzdGluZyBlbnZpcm9ubWVudHMgYnV0IG5vdAotIyBhY2NlcHRhYmxlIGluIHJlYWwgbGl2ZSBob3N0aW5nIHNjZW5hcmlvcwotCi1waWNrX2ZpcnN0X3ZpcnRob3N0X29uX25vbWF0Y2ggPSB0cnVlCi0KLQotIyBBbGwgdW5pY2VzIGFyZSBicm9rZW4gc2luY2UgaXQncyBub3QgcG9zc2libGUgdG8gYmluZCB0bwotIyBhIHByaXZpbGVnZWQgcG9ydCAoPCAxMDI0KSB1bmxlc3MgdWlkPT0wCi0jIFRoZXJlIGlzIGEgY29udHJpYiBpbiBqdW5nZXJsIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIGJ5IG1lYW5zIAotIyBvZiBhbiBleHRlcm5hbCBzZXR1aWQgcm9vdCBwcm9ncmFtbSBjYWxsZWQgZmRzcnYgdG8gbGlzdGVuIHRvCi0jIHRvIHByaXZpbGVnZWQgcG9ydC4KLSMgSWYgd2UgdXNlIHRoaXMgZmVhdHVyZSwgaXQgcmVxdWlyZXMgZmRzcnYgdG8gYmUgcHJvcGVybHkgaW5zdGFsbGVkLgotIyBEb2Vzbid0IHlldCB3b3JrIHdpdGggU1NMLgotCi11c2VfZmRzcnYgPSBmYWxzZQotCi0KLQotCi0jIGVuZCB0aGVuIGEgc2V0IG9mIHZpcnR1YWwgc2VydmVycwotIyBGaXJzdCB0d28gdmlydGhvc3RlZCBzZXJ2ZXJzIG9uIHRoZSBzYW1lIElQICgwLjAuMC4wKQotIyBpbiB0aGlzIGNhc2UsIGJ1dCBhbiBleHBsaWNpdCBJUCBjYW4gYmUgZ2l2ZW4gYXMgd2VsbAotCi08c2VydmVyIGNvcmUubWFydGluamxvZ2FuLmNvbT4KLQlwb3J0ID0gODAKLQlsaXN0ZW4gPSAwLjAuMC4wCi0JZG9jcm9vdCA9IC92YXIveWF3cy93d3cKLQlhcmdfcmV3cml0ZV9tb2QgPSBwd3JfYXJnX3Jld3JpdGVfbW9kCi0JYXBwbW9kcyA9IDxwd3IsIHB3cl9tYWluX2NvbnRyb2xsZXJfYXBwbW9kPgotPC9zZXJ2ZXI+Ci0KLTxzZXJ2ZXIgbG9jYWxob3N0PgotCXBvcnQgPSA4MAotCWxpc3RlbiA9IDAuMC4wLjAKLQlkb2Nyb290ID0gL3RtcAotCWRpcl9saXN0aW5ncyA9IHRydWUKLQlkYXYgPSB0cnVlCi0JPGF1dGg+Ci0JCXJlYWxtID0gZm9vYmFyCi0JCWRpciA9IC8KLQkJdXNlciA9IGZvbzpiYXIKLQkJdXNlciA9IGJhejpiYXIKLQk8L2F1dGg+Ci08L3NlcnZlcj4KLQotCi0KLSMgQW5kIHRoZW4gYW4gc3NsIHNlcnZlcgotCi08c2VydmVyIGNvcmUubWFydGluamxvZ2FuLmNvbT4KLQlwb3J0ID0gNDQzCi0JZG9jcm9vdCA9IC90bXAKLQlsaXN0ZW4gPSAwLjAuMC4wCi0JZGlyX2xpc3RpbmdzID0gdHJ1ZQotCTxzc2w+ICAKLQkgICAgICAgIGtleWZpbGUgPSAvdXNyL2xvY2FsL3lhd3MvZXRjL3lhd3Mta2V5LnBlbQotCSAgICAgICAgY2VydGZpbGUgPSAvdXNyL2xvY2FsL3lhd3MvZXRjL3lhd3MtY2VydC5wZW0KLQk8L3NzbD4KLTwvc2VydmVyPgotCQkJCQotCQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy9lbWFjcy9lcmxhbmctc3RhcnQuZWwgYi9saWIvZXJsL3Rvb2xzL2VtYWNzL2VybGFuZy1zdGFydC5lbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTE4MWI5YS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzL2VtYWNzL2VybGFuZy1zdGFydC5lbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi07OyBlcmxhbmctc3RhcnQuZWwgLS0tIExvYWQgdGhpcyBmaWxlIHRvIGluaXRpYWxpemUgdGhlIEVybGFuZyBwYWNrYWdlLgotCi07OyBDb3B5cmlnaHQgKEMpIDE5OTggIEVyaWNzc29uIFRlbGVjb20gQUIKLQotOzsgQXV0aG9yOiAgIEFuZGVycyBMaW5kZ3JlbgotOzsgVmVyc2lvbjogIDIuMwotOzsgS2V5d29yZHM6IGVybGFuZywgbGFuZ3VhZ2VzLCBwcm9jZXNzZXMKLTs7IENyZWF0ZWQ6ICAxOTk2LTA5LTE4Ci07OyBEYXRlOiAgICAgMTk5OC0wMy0xNgotCi07OzsgQ29tbWVudGFyeToKLQotOzsgSW50cm9kdWN0aW9uOgotOzsgLS0tLS0tLS0tLS0tCi07OwotOzsgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBFcmxhbmcuCi07OyBUaGUgcGFja2FnZSBwcm92aWRlcyBhbiBlZGl0aW5nIG1vZGUgd2l0aCBsb3RzIG9mIGJlbGxzIGFuZAotOzsgd2hpc3RsZXMsIGNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBpdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhlCi07OyB1c2VyIHRvIHN0YXJ0IEVybGFuZyBzaGVsbHMgdGhhdCBydW4gaW5zaWRlIEVtYWNzLgotOzsKLTs7IFNlZSB0aGUgRXJsYW5nIGRpc3RyaWJ1dGlvbiBmb3IgZnVsbCBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcGFja2FnZS4KLQotOzsgSW5zdGFsbGF0aW9uOgotOzsgLS0tLS0tLS0tLS0tCi07OwotOzsgUGxhY2UgdGhpcyBmaWxlIGluIEVtYWNzIGxvYWQgcGF0aCwgYnl0ZS1jb21waWxlIGl0LCBhbmQgYWRkIHRoZQotOzsgZm9sbG93aW5nIGxpbmUgdG8gdGhlIGFwcHJvcHJpYXRlIGluaXQgZmlsZToKLTs7Ci07OyAgICAocmVxdWlyZSAnZXJsYW5nLXN0YXJ0KQotOzsKLTs7IFRoZSBmdWxsIGRvY3VtZW50YXRpb24gY29udGFpbnMgbXVjaCBtb3JlIGV4dGVuc2l2ZSBkZXNjcmlwdGlvbiBvZgotOzsgdGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUuCi0KLTs7IFJlcG9ydGluZyBCdWdzOgotOzsgLS0tLS0tLS0tLS0tLS0KLTs7Ci07OyBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgZm9sbG93aW5nIGVtYWlsIGFkZHJlc3M6Ci07OyAgICAgc3VwcG9ydEBlcmxhbmcuZXJpY3Nzb24uc2UKLTs7Ci07OyBQbGVhc2Ugc3RhdGUgYXMgZXhhY3RseSBhcyBwb3NzaWJsZToKLTs7ICAgIC0gVmVyc2lvbiBudW1iZXIgb2YgRXJsYW5nIE1vZGUgKHNlZSB0aGUgbWVudSksIEVtYWNzLCBFcmxhbmcsCi07OwlhbmQgb2YgYW55IG90aGVyIHJlbGV2YW50IHNvZnR3YXJlLgotOzsgICAgLSBXaGF0IHRoZSBleHBlY3RlZCByZXN1bHQgd2FzLgotOzsgICAgLSBXaGF0IHlvdSBkaWQsIHByZWZlcmFibHkgaW4gYSByZXBlYXRhYmxlIHN0ZXAtYnktc3RlcCBmb3JtLgotOzsgICAgLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSB1bmV4cGVjdGVkIHJlc3VsdC4KLTs7ICAgIC0gUmVsZXZhbnQgcGllY2VzIG9mIEVybGFuZyBjb2RlIGNhdXNpbmcgdGhlIHByb2JsZW0uCi07OyAgICAtIFBlcnNvbmFsIEVtYWNzIGN1c3RvbWlzYXRpb25zLCBpZiBhbnkuCi07OwotOzsgU2hvdWxkIHRoZSBFbWFjcyBnZW5lcmF0ZSBhbiBlcnJvciwgcGxlYXNlIHNldCB0aGUgZW1hY3MgdmFyaWFibGUKLTs7IGBkZWJ1Zy1vbi1lcnJvcicgdG8gYHQnLiAgUmVwZWF0IHRoZSBlcnJvciBhbmQgZW5jbG9zZSB0aGUgZGVidWcKLTs7IGluZm9ybWF0aW9uIGluIHlvdXIgYnVnLXJlcG9ydC4KLTs7Ci07OyBUbyBzZXQgdGhlIHZhcmlhYmxlIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLTs7ICAgICBNLXggc2V0LXZhcmlhYmxlIFJFVCBkZWJ1Zy1vbi1lcnJvciBSRVQgdCBSRVQKLTs7OyBDb2RlOgotCi07OwotOzsgRGVjbGFyZSBmdW5jdGlvbnMgaW4gImVybGFuZy5lbCIuCi07OwotCi0oYXV0b2xvYWQgJ2VybGFuZy1tb2RlICJlcmxhbmciICJNYWpvciBtb2RlIGZvciBlZGl0aW5nIEVybGFuZyBjb2RlLiIgdCkKLShhdXRvbG9hZCAnZXJsYW5nLXZlcnNpb24gImVybGFuZyIgCi0gICJSZXR1cm4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBFcmxhbmcgbW9kZS4iIHQpCi0oYXV0b2xvYWQgJ2VybGFuZy1zaGVsbCAiZXJsYW5nIiAiU3RhcnQgYSBuZXcgRXJsYW5nIHNoZWxsLiIgdCkKLShhdXRvbG9hZCAncnVuLWVybGFuZyAiZXJsYW5nIiAiU3RhcnQgYSBuZXcgRXJsYW5nIHNoZWxsLiIgdCkKLQotKGF1dG9sb2FkICdlcmxhbmctY29tcGlsZSAiZXJsYW5nIgotICAiQ29tcGlsZSBFcmxhbmcgbW9kdWxlIGluIGN1cnJlbnQgYnVmZmVyLiIgdCkKLQotKGF1dG9sb2FkICdlcmxhbmctbWFuLW1vZHVsZSAiZXJsYW5nIiAKLSAgIkZpbmQgbWFudWFsIHBhZ2UgZm9yIE1PRFVMRS4iIHQpCi0oYXV0b2xvYWQgJ2VybGFuZy1tYW4tZnVuY3Rpb24gImVybGFuZyIKLSAgIkZpbmQgbWFudWFsIHBhZ2UgZm9yIE5BTUUsIHdoZXJlIE5BTUUgaXMgbW9kdWxlOmZ1bmN0aW9uLiIgdCkKLQotKGF1dG9sb2FkICdlcmxhbmctZmluZC10YWcgImVybGFuZyIKLSAgIkxpa2UgYGZpbmQtdGFnJy4gIENhcGFibGUgb2YgcmV0cmVpdmluZyBFcmxhbmcgbW9kdWxlcy4iKQotKGF1dG9sb2FkICdlcmxhbmctZmluZC10YWctb3RoZXItd2luZG93ICJlcmxhbmciCi0gICJMaWtlIGBmaW5kLXRhZy1vdGhlci13aW5kb3cnLiAgQ2FwYWJsZSBvZiByZXRyZWl2aW5nIEVybGFuZyBtb2R1bGVzLiIpCi0KLQotOzsKLTs7IEFzc29jaWF0ZSBmaWxlcyBleHRlbnNpb25zICIuZXJsIiBhbmQgIi5ocmwiIHdpdGggRXJsYW5nIG1vZGUuCi07OwotCi0obGV0ICgoYSAnKCJcXC5lcmxcXCciIC4gZXJsYW5nLW1vZGUpKQotICAgICAgKGIgJygiXFwuaHJsXFwnIiAuIGVybGFuZy1tb2RlKSkpCi0gIChvciAoYXNzb2MgKGNhciBhKSBhdXRvLW1vZGUtYWxpc3QpCi0gICAgICAoc2V0cSBhdXRvLW1vZGUtYWxpc3QgKGNvbnMgYSBhdXRvLW1vZGUtYWxpc3QpKSkKLSAgKG9yIChhc3NvYyAoY2FyIGIpIGF1dG8tbW9kZS1hbGlzdCkKLSAgICAgIChzZXRxIGF1dG8tbW9kZS1hbGlzdCAoY29ucyBiIGF1dG8tbW9kZS1hbGlzdCkpKSkKLQotCi07OwotOzsgSWdub3JlIGZpbGVzIGVuZGluZyBpbiAiLmphbSIsICIudmVlIiwgYW5kICIuYmVhbSIgd2hlbiBwZXJmb3JtaW5nCi07OyBmaWxlIGNvbXBsZXRpb24uCi07OwotCi0obGV0ICgoZXJsLWV4dCAnKCIuamFtIiAiLnZlZSIgIi5iZWFtIikpKQotICAod2hpbGUgZXJsLWV4dAotICAgIChsZXQgKChjaWUgY29tcGxldGlvbi1pZ25vcmVkLWV4dGVuc2lvbnMpKQotICAgICAgKHdoaWxlIChhbmQgY2llIChub3QgKHN0cmluZy1lcXVhbCAoY2FyIGNpZSkgKGNhciBlcmwtZXh0KSkpKQotCShzZXRxIGNpZSAoY2RyIGNpZSkpKQotICAgICAgKGlmIChudWxsIGNpZSkKLQkgIChzZXRxIGNvbXBsZXRpb24taWdub3JlZC1leHRlbnNpb25zCi0JCShjb25zIChjYXIgZXJsLWV4dCkgY29tcGxldGlvbi1pZ25vcmVkLWV4dGVuc2lvbnMpKSkpCi0gICAgKHNldHEgZXJsLWV4dCAoY2RyIGVybC1leHQpKSkpCi0KLQotOzsKLTs7IFRoZSBlbmQuCi07OwotCi0ocHJvdmlkZSAnZXJsYW5nLXN0YXJ0KQotCi07OyBlcmxhbmctc3RhcnQuZWwgZW5kcyBoZXJlLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy9lbWFjcy9lcmxhbmcuZWwgYi9saWIvZXJsL3Rvb2xzL2VtYWNzL2VybGFuZy5lbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTkxNmY3My4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rvb2xzL2VtYWNzL2VybGFuZy5lbAorKysgL2Rldi9udWxsCkBAIC0xLDYyOTEgKzAsMCBAQAotOzsgJElkOiBlcmxhbmcuZWwsdiAxLjIxIDIwMDQvMDgvMDMgMjA6Mzg6NDMgbWxvZ2FuIEV4cCAkCi07OyBlcmxhbmcuZWwgLS0tIE1ham9yIG1vZGVzIGZvciBlZGl0aW5nIGFuZCBydW5uaW5nIEVybGFuZwotCi07OyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwyMDAwICBFcmljc3NvbiBUZWxlY29tIEFCCi0KLTs7IEF1dGhvcjogICBBbmRlcnMgTGluZGdyZW4KLTs7IFZlcnNpb246ICAyLjQKLTs7IEtleXdvcmRzOiBlcmxhbmcsIGxhbmd1YWdlcywgcHJvY2Vzc2VzCi07OyBEYXRlOiAgICAgMjAwMC0wOS0xMQotCi07OyBMYXJzIFRob3Jz6W4ncyBtb2RpZmljYXRpb25zIG9mIDIwMDAtMDYtMDcgaW5jbHVkZWQuCi0gCi07OyBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2Ugd2FzIHdyaXR0ZW4gYnkgUm9iZXJ0IFZpcmRpbmcuCi07OwotOzsgTW9zdCBza2VsZXRvbnMgaGFzIGJlZW4gd3JpdHRlbiBhdCBFcmljc3NvbiBUZWxlY29tIGJ5Ci07OyBtYWdudXNAZXJpeC5lcmljc3Nvbi5zZSBhbmQgamFubmVAZXJpeC5lcmljc3Nvbi5zZQotCi07OzsgQ29tbWVudGFyeToKLQotOzsgSW50cm9kdWN0aW9uOgotOzsgLS0tLS0tLS0tLS0tCi07OwotOzsgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBFcmxhbmcuCi07OyBUaGUgcGFja2FnZSBwcm92aWRlcyBhbiBlZGl0aW5nIG1vZGUgd2l0aCBsb3RzIG9mIGJlbGxzIGFuZAotOzsgd2hpc3RsZXMsIGNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBpdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhlCi07OyB1c2VyIHRvIHN0YXJ0IEVybGFuZyBzaGVsbHMgdGhhdCBydW4gaW5zaWRlIEVtYWNzLgotOzsKLTs7IFNlZSB0aGUgRXJsYW5nIGRpc3RyaWJ1dGlvbiBmb3IgZnVsbCBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcGFja2FnZS4KLQotOzsgSW5zdGFsbGF0aW9uOgotOzsgLS0tLS0tLS0tLS0tCi07OwotOzsgUGxhY2UgdGhpcyBmaWxlIGluIEVtYWNzIGxvYWQgcGF0aCwgYnl0ZS1jb21waWxlIGl0LCBhbmQgYWRkIHRoZQotOzsgZm9sbG93aW5nIGxpbmUgdG8gdGhlIGFwcHJvcHJpYXRlIGluaXQgZmlsZToKLTs7Ci07OyAgICAocmVxdWlyZSAnZXJsYW5nLXN0YXJ0KQotOzsKLTs7IFRoZSBmdWxsIGRvY3VtZW50YXRpb24gY29udGFpbnMgbXVjaCBtb3JlIGV4dGVuc2l2ZSBkZXNjcmlwdGlvbiBvZgotOzsgdGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUuCi0KLTs7IFJlcG9ydGluZyBCdWdzOgotOzsgLS0tLS0tLS0tLS0tLS0KLTs7Ci07OyBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgZm9sbG93aW5nIGVtYWlsIGFkZHJlc3M6Ci07OyAgICAgc3VwcG9ydEBlcmxhbmcuZXJpY3Nzb24uc2UKLTs7Ci07OyBQbGVhc2Ugc3RhdGUgYXMgZXhhY3RseSBhcyBwb3NzaWJsZToKLTs7ICAgIC0gVmVyc2lvbiBudW1iZXIgb2YgRXJsYW5nIE1vZGUgKHNlZSB0aGUgbWVudSksIEVtYWNzLCBFcmxhbmcsCi07OwlhbmQgb2YgYW55IG90aGVyIHJlbGV2YW50IHNvZnR3YXJlLgotOzsgICAgLSBXaGF0IHRoZSBleHBlY3RlZCByZXN1bHQgd2FzLgotOzsgICAgLSBXaGF0IHlvdSBkaWQsIHByZWZlcmFibHkgaW4gYSByZXBlYXRhYmxlIHN0ZXAtYnktc3RlcCBmb3JtLgotOzsgICAgLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSB1bmV4cGVjdGVkIHJlc3VsdC4KLTs7ICAgIC0gUmVsZXZhbnQgcGllY2VzIG9mIEVybGFuZyBjb2RlIGNhdXNpbmcgdGhlIHByb2JsZW0uCi07OyAgICAtIFBlcnNvbmFsIEVtYWNzIGN1c3RvbWlzYXRpb25zLCBpZiBhbnkuCi07OwotOzsgU2hvdWxkIHRoZSBFbWFjcyBnZW5lcmF0ZSBhbiBlcnJvciwgcGxlYXNlIHNldCB0aGUgZW1hY3MgdmFyaWFibGUKLTs7IGBkZWJ1Zy1vbi1lcnJvcicgdG8gYHQnLiAgUmVwZWF0IHRoZSBlcnJvciBhbmQgZW5jbG9zZSB0aGUgZGVidWcKLTs7IGluZm9ybWF0aW9uIGluIHlvdXIgYnVnLXJlcG9ydC4KLTs7Ci07OyBUbyBzZXQgdGhlIHZhcmlhYmxlIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLTs7ICAgICBNLXggc2V0LXZhcmlhYmxlIFJFVCBkZWJ1Zy1vbi1lcnJvciBSRVQgdCBSRVQKLQwKLTs7OyBDb2RlOgotCi07OyBWYXJpYWJsZXM6Ci0KLShkZWZjb25zdCBlcmxhbmctdmVyc2lvbiAiMi40IgotICAiVGhlIHZlcnNpb24gbnVtYmVyIG9mIEVybGFuZyBtb2RlLiIpCi0KLShkZWZ2YXIgZXJsYW5nLXJvb3QtZGlyIG5pbAotICAiVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgRXJsYW5nIHN5c3RlbSBpcyBpbnN0YWxsZWQuCi1UaGUgbmFtZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIGVuZGluZyBzbGFzaC4KLQotU2hvdWxkIHRoaXMgdmFyaWFibGUgYmUgbmlsLCBubyBtYW51YWwgcGFnZXMgd2lsbCBzaG93IHVwIGluIHRoZQotRXJsYW5nIG1vZGUgbWVudS4iKQotCi0oZGVmdmFyIGVybGFuZy1tZW51LWl0ZW1zICcoZXJsYW5nLW1lbnUtYmFzZS1pdGVtcwotCQkJICAgIGVybGFuZy1tZW51LXNrZWwtaXRlbXMKLQkJCSAgICBlcmxhbmctbWVudS1zaGVsbC1pdGVtcwotCQkJICAgIGVybGFuZy1tZW51LWNvbXBpbGUtaXRlbXMKLQkJCSAgICBlcmxhbmctbWVudS1tYW4taXRlbXMKLQkJCSAgICBlcmxhbmctbWVudS1wZXJzb25hbC1pdGVtcwotCQkJICAgIGVybGFuZy1tZW51LXZlcnNpb24taXRlbXMpCi0gICIqTGlzdCBvZiBtZW51IGl0ZW0gbGlzdCB0byBjb21iaW5lIHRvIGNyZWF0ZSBFcmxhbmQgbW9kZSBtZW51LgotCi1FeHRlcm5hbCBwcm9ncmFtcyB3aGljaCB0ZW1wb3JhcnkgYWRkcyBtZW51IGl0ZW1zIHRvIHRoZSBFcmxhbmQgbW9kZQotbWVudSB1c2UgdGhpcyB2YXJpYWJsZS4gIFBsZWFzZSB1c2UgdGhlIGZ1bmN0aW9uIGBhZGQtaG9vaycgdG8gYWRkCi1pdGVtcy4KLQotUGxlYXNlIGNhbGwgdGhlIGZ1bmN0aW9uIGBlcmxhbmctbWVudS1pbml0JyBhZnRlciBldmVyeSBjaGFuZ2UgdG8gdGhpcwotdmFyaWFibGUuIikKLQotKGRlZnZhciBlcmxhbmctbWVudS1iYXNlLWl0ZW1zCi0gICcoKCJJbmRlbnQiCi0gICAgICgoIkluZGVudCBMaW5lIiBlcmxhbmctaW5kZW50LWNvbW1hbmQpCi0gICAgICAoIkluZGVudCBSZWdpb24gIiBlcmxhbmctaW5kZW50LXJlZ2lvbgotICAgICAgIChpZiBlcmxhbmcteGVtYWNzLXAgKG1hcmspIG1hcmstYWN0aXZlKSkKLSAgICAgICgiSW5kZW50IENsYXVzZSIgZXJsYW5nLWluZGVudC1jbGF1c2UpCi0gICAgICAoIkluZGVudCBGdW5jdGlvbiIgZXJsYW5nLWluZGVudC1mdW5jdGlvbikKLSAgICAgICgiSW5kZW50IEJ1ZmZlciIgZXJsYW5nLWluZGVudC1jdXJyZW50LWJ1ZmZlcikpKQotICAgICgiRWRpdCIKLSAgICAgKCgiRmlsbCBDb21tZW50IiBlcmxhbmctZmlsbC1wYXJhZ3JhcGgpCi0gICAgICAoIkNvbW1lbnQgUmVnaW9uIiBjb21tZW50LXJlZ2lvbgotICAgICAgIChpZiBlcmxhbmcteGVtYWNzLXAgKG1hcmspIG1hcmstYWN0aXZlKSkKLSAgICAgICgiVW5jb21tZW50IFJlZ2lvbiIgZXJsYW5nLXVuY29tbWVudC1yZWdpb24KLSAgICAgICAoaWYgZXJsYW5nLXhlbWFjcy1wIChtYXJrKSBtYXJrLWFjdGl2ZSkpCi0gICAgICBuaWwKLSAgICAgICgiQmVnaW5uaW5nIG9mIEZ1bmN0aW9uIiBlcmxhbmctYmVnaW5uaW5nLW9mLWZ1bmN0aW9uKQotICAgICAgKCJFbmQgb2YgRnVuY3Rpb24iIGVybGFuZy1lbmQtb2YtZnVuY3Rpb24pCi0gICAgICAoIk1hcmsgRnVuY3Rpb24iIGVybGFuZy1tYXJrLWZ1bmN0aW9uKQotICAgICAgbmlsCi0gICAgICAoIkJlZ2lubmluZyBvZiBDbGF1c2UiIGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlKQotICAgICAgKCJFbmQgb2YgQ2xhdXNlIiBlcmxhbmctZW5kLW9mLWNsYXVzZSkKLSAgICAgICgiTWFyayBDbGF1c2UiIGVybGFuZy1tYXJrLWNsYXVzZSkKLSAgICAgIG5pbAotICAgICAgKCJOZXcgQ2xhdXNlIiBlcmxhbmctZ2VuZXJhdGUtbmV3LWNsYXVzZSkKLSAgICAgICgiQ2xvbmUgQXJndW1lbnRzIiBlcmxhbmctY2xvbmUtYXJndW1lbnRzKSkpCi0gICAgKCJTeW50YXggSGlnaGxpZ2h0aW5nIgotICAgICAoKCJMZXZlbCAzIiBlcmxhbmctZm9udC1sb2NrLWxldmVsLTMpCi0gICAgICAoIkxldmVsIDIiIGVybGFuZy1mb250LWxvY2stbGV2ZWwtMikKLSAgICAgICgiTGV2ZWwgMSIgZXJsYW5nLWZvbnQtbG9jay1sZXZlbC0xKQotICAgICAgKCJPZmYiIGVybGFuZy1mb250LWxvY2stbGV2ZWwtMCkpKQotICAgICgiVEFHUyIKLSAgICAgKCgiRmluZCBUYWciIGZpbmQtdGFnKQotICAgICAgKCJGaW5kIE5leHQgVGFnIiBlcmxhbmctZmluZC1uZXh0LXRhZykKLSAgICAgIDsoIkZpbmQgUmVnZXhwIiBmaW5kLXRhZy1yZWdleHApCi0gICAgICAoIkNvbXBsZXRlIFdvcmQiIGVybGFuZy1jb21wbGV0ZS10YWcpCi0gICAgICAoIlRhZ3MgQXByb3BvcyIgdGFncy1hcHJvcG9zKQotICAgICAgKCJTZWFyY2ggRmlsZXMiIHRhZ3Mtc2VhcmNoKSkpKQotICAiKkRlc2NyaXB0aW9uIG9mIG1lbnUgdXNlZCBpbiBFcmxhbmcgbW9kZS4KLQotVGhpcyB2YXJpYWJsZSBtdXN0IGJlIGEgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBlaXRoZXIgbmlsIHJlcHJlc2VudGluZwotYSBob3Jpc29udGFsIGxpbmUgb3IgYSBsaXN0IHdpdGggdHdvIG9yIHRocmVlIGVsZW1lbnRzLiAgVGhlIGZpcnN0IGlzCi10aGUgbmFtZSBvZiB0aGUgbWVudSBpdGVtLCB0aGUgc2Vjb25kIGlzIHRoZSBmdW5jdGlvbiB0byBjYWxsLCBvciBhCi1zdWJtZW51LCBvbiB0aGUgc2FtZSBzYW1lIGZvcm0gYXMgSVRFTVMuICBUaGUgdGhpcmQgb3B0aW9uYWwgYXJndW1lbnQKLWlzIGFuIGV4cHJlc3Npb24gd2hpY2ggaXMgZXZhbHVhdGVkIGV2ZXJ5IHRpbWUgdGhlIG1lbnUgaXMgZGlzcGxheWVkLgotU2hvdWxkIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlIHRvIG5pbCB0aGUgbWVudSBpdGVtIGlzIGdob3N0ZWQuCi0KLUV4YW1wbGU6Ci0gICAgJygoXCJGdW5jMVwiIGZ1bmN0aW9uLW9uZSkKLSAgICAgIChcIlN1Ykl0ZW1cIgotICAgICAgICgoXCJZZWxsb3dcIiBmdW5jdGlvbi15ZWxsb3cpCi0gICAgICAgIChcIkJsdWVcIiBmdW5jdGlvbi1ibHVlKSkpCi0gICAgICBuaWwKLSAgICAgIChcIlJlZ2lvbiBGdW50aW9uXCIgc3Bvb2stZnVuY3Rpb24gbWlkbmlnaHQtdmFyaWFibGUpKQotCi1DYWxsIHRoZSBmdW5jdGlvbiBgZXJsYW5nLW1lbnUtaW5pdCcgYWZ0ZXIgbW9kaWZ5aW5nIHRoaXMgdmFyaWFibGUuIikKLQotKGRlZnZhciBlcmxhbmctbWVudS1zaGVsbC1pdGVtcwotICAnKG5pbAotICAgICgiU2hlbGwiCi0gICAgICgoIlN0YXJ0IE5ldyBTaGVsbCIgZXJsYW5nLXNoZWxsKQotICAgICAgKCJEaXNwbGF5IFNoZWxsIiAgIGVybGFuZy1zaGVsbC1kaXNwbGF5KSkpKQotICAiKkRlc2NyaXB0aW9uIG9mIHRoZSBTaGVsbCBtZW51IHVzZWQgYnkgRXJsYW5nIG1vZGUuCi0KLVBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgYGVybGFuZy1tZW51LWJhc2UtaXRlbXMnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLW1lbnUtY29tcGlsZS1pdGVtcwotICAnKCgiQ29tcGlsZSIKLSAgICAgKCgiQ29tcGlsZSBCdWZmZXIiIGVybGFuZy1jb21waWxlKQotICAgICAgKCJEaXNwbGF5IFJlc3VsdCIgZXJsYW5nLWNvbXBpbGUtZGlzcGxheSkKLSAgICAgICgiTmV4dCBFcnJvciIgICAgIGVybGFuZy1uZXh0LWVycm9yKSkpKQotICAiKkRlc2NyaXB0aW9uIG9mIHRoZSBDb21waWxlIG1lbnUgdXNlZCBieSBFcmxhbmcgbW9kZS4KLQotUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBgZXJsYW5nLW1lbnUtYmFzZS1pdGVtcycuIikKLQotKGRlZnZhciBlcmxhbmctbWVudS12ZXJzaW9uLWl0ZW1zCi0gICcobmlsCi0gICAgKCJWZXJzaW9uIiBlcmxhbmctdmVyc2lvbikpCi0gICIqRGVzY3JpcHRpb24gb2YgdGhlIHZlcnNpb24gbWVudSB1c2VkIGluIEVybGFuZyBtb2RlLiIpCi0KLShkZWZ2YXIgZXJsYW5nLW1lbnUtcGVyc29uYWwtaXRlbXMgbmlsCi0gICIqRGVzY3JpcHRpb24gb2YgcGVyc29uYWwgbWVudSBpdGVtcyB1c2VkIGluIEVybGFuZyBtb2RlLgotCi1QbGVhc2Ugc2VlIHRoZSB2YXJpYWJsZSBgZXJsYW5nLW1lbnUtYmFzZS1pdGVtcycgZm9yIGEgZGVzY3JpcHRpb24KLW9mIHRoZSBmb3JtYXQuIikKLQotKGRlZnZhciBlcmxhbmctbWVudS1tYW4taXRlbXMgbmlsCi0gICJUaGUgbWVudSBjb250YWluaW5nIG1hbiBwYWdlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgbWVudSBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIGBlcmxhbmctbWVudS1iYXNlLWl0ZW1zJy4KLVRoaXMgdmFyaWFibGUgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgRXJsYW5nIG1lbnVzIHN0b3JlZCBpbgotYGVybGFuZy1tZW51LWl0ZW1zJy4iKQotCi0oZGVmdmFyIGVybGFuZy1tZW51LXNrZWwtaXRlbXMgJygpCi0gICJEZXNjcmlwdGlvbiBvZiB0aGUgbWVudSBjb250YWluaW5nIHRoZSBza2VsZXRvbiBlbnRyaWVzLgotVGhlIG1lbnUgaXMgaW4gdGhlIGZvcm0gZGVzY3JpYmVkIGJ5IHRoZSB2YXJpYWJsZSBgZXJsYW5nLW1lbnUtYmFzZS1pdGVtcycuIikKLQotKGRlZnZhciBlcmxhbmctbW9kZS1ob29rIG5pbAotICAiKkZ1bmN0aW9ucyB0byBydW4gd2hlbiBFcmxhbmcgbW9kZSBpcyBhY3RpdmF0ZWQuCi0KLVRoaXMgaG9vayBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIEVybGFuZyBtb2RlLiAgSXQgaXMKLW5vcm1hbGx5IHVzZWQgYnkgdGhlIHVzZXIgdG8gcGVyc29uYWxpc2UgdGhlIHByb2dyYW1taW5nIGVudmlyb25tZW50LgotV2hlbiB1c2VkIGluIGEgc2l0ZSBpbml0IGZpbGUsIGl0IGNvdWxkIGJlIHVzZWQgdG8gY3VzdG9taXNlIEVybGFuZwotbW9kZSBmb3IgYWxsIHVzZXJzIG9uIHRoZSBzeXN0ZW0uCi0KLVRoZSBmdW5jdGlvbnMgYWRkZWQgdG8gdGhpcyBob29rIGlzIHJ1bmVkIGV2ZXJ5IHRpbWUgRXJsYW5nIG1vZGUgaXMKLXN0YXJ0ZWQuICBTZWUgYWxzbyBgZXJsYW5nLWxvYWQtaG9vaycsIGEgaG9vayB3aGljaCBpcyBydW5lZCBvbmNlLAotd2hlbiBFcmxhbmcgbW9kZSBpcyBsb2FkZWQgaW50byBFbWFjcywgYW5kIGBlcmxhbmctc2hlbGwtbW9kZS1ob29rJwotd2hpY2ggaXMgcnVuIGV2ZXJ5IHRpbWUgYSBuZXcgaW5mZXJpb3IgRXJsYW5nIHNoZWxsIGlzIHN0YXJ0ZWQuCi0KLVRvIHVzZSBhIGhvb2ssIGNyZWF0ZSBhbiBFbWFjcyBsaXNwIGZ1bmN0aW9uIHRvIHBlcmZvcm0geW91ciBhY3Rpb25zCi1hbmQgYWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgaG9vayBieSBjYWxsaW5nIGBhZGQtaG9vaycuCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBiaW5kcyB0aGUga2V5IHNlcXVlbmNlIEMtYyBDLWMgdG8gdGhlIGNvbW1hbmQKLWBlcmxhbmctY29tcGlsZScgKG5vcm1hbGx5IGJvdW5kIHRvIEMtYyBDLWspLiAgVGhlIGV4YW1wbGUgYWxzbwotYWN0aXZhdGVzIEZvbnQgTG9jayBtb2RlIHRvIGZvbnRpZnkgdGhlIGJ1ZmZlciBhbmQgYWRkcyBhIG1lbnUKLWNvbnRhaW5pbmcgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KLQotVG8gdXNlIHRoZSBleGFtcGxlLCBjb3B5IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8geW91ciBgfi8uZW1hY3MnIGZpbGU6Ci0KLSAgICAoYWRkLWhvb2sgJ2VybGFuZy1tb2RlLWhvb2sgJ215LWVybGFuZy1tb2RlLWhvb2spCi0KLSAgICAoZGVmdW4gbXktZXJsYW5nLW1vZGUtaG9vayAoKQotICAgICAgKGxvY2FsLXNldC1rZXkgXCJcXEMtY1xcQy1jXCIgJ2VybGFuZy1jb21waWxlKQotICAgICAgKGlmIHdpbmRvdy1zeXN0ZW0KLSAgICAgICAgICAocHJvZ24KLSAgICAgICAgICAgIChzZXRxIGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24gdCkKLSAgICAgICAgICAgIChmb250LWxvY2stbW9kZSAxKSkpCi0gICAgICAoaWYgKGFuZCB3aW5kb3ctc3lzdGVtIChmYm91bmRwICdpbWVudS1hZGQtdG8tbWVudWJhcikpCi0gICAgICAgICAgKGltZW51LWFkZC10by1tZW51YmFyIFwiSW1lbnVcIikpKSIpCi0KLShkZWZ2YXIgZXJsYW5nLWxvYWQtaG9vayBuaWwKLSAgIipGdW5jdGlvbnMgdG8gcnVuIHdoZW4gRXJsYW5nIG1vZGUgaXMgbG9hZGVkLgotCi1UaGlzIGhvb2sgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ciBvZiBFcmxhbmcgbW9kZS4gIEl0IGlzCi1ub3JtYWxseSB1c2VkIGJ5IHRoZSB1c2VyIHRvIHBlcnNvbmFsaXNlIHRoZSBwcm9ncmFtbWluZyBlbnZpcm9ubWVudC4KLVdoZW4gdXNlZCBpbiBhIHNpdGUgaW5pdCBmaWxlLCBpdCBjb3VsZCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBFcmxhbmcKLW1vZGUgZm9yIGFsbCB1c2VycyBvbiB0aGUgc3lzdGVtLgotCi1UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgaG9vayBhbmQgYGVybGFuZy1tb2RlLWhvb2snIGFuZAotYGVybGFuZy1zaGVsbC1tb2RlLWhvb2snIGlzIHRoYXQgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGhvb2sKLWlzIG9ubHkgY2FsbGVkIG9uY2UsIHdoZW4gdGhlIEVybGFuZyBtb2RlIGlzIGxvYWRlZCBpbnRvIEVtYWNzCi10aGUgZmlyc3QgdGltZS4KLQotTmF0dXJhbCBhY3Rpb25zIGZvciB0aGUgZnVuY3Rpb25zIGFkZGVkIHRvIHRoaXMgaG9vayBhcmUgYWN0aW9ucyB3aGljaAotb25seSBzaG91bGQgYmUgcGVyZm9ybWVkIG9uY2UsIGFuZCBhY3Rpb25zIHdoaWNoIHNob3VsZCBiZSBwZXJmb3JtZWQKLWJlZm9yZSBzdGFydGluZyBFcmxhbmcgbW9kZS4gIEZvciBleGFtcGxlLCBhIG51bWJlciBvZiB2YXJpYWJsZXMgYXJlCi11c2VkIGJ5IEVybGFuZyBtb2RlIGJlZm9yZSBgZXJsYW5nLW1vZGUtaG9vaycgaXMgcnVuZWQuCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIHRoZSB2YXJpYWJsZSBgZXJsYW5nLXJvb3QtZGlyJyBzbyB0aGF0IHRoZQotbWFudWFsIHBhZ2VzIGNhbiBiZSByZXRyaWV2ZWQgKG5vdGUgdGhhdCB5b3UgbXVzdCBzZXQgdGhlIHZhbHVlIG9mCi1gZXJsYW5nLXJvb3QtZGlyJyB0byBtYXRjaCB0aGUgbG9hdGlvbiBvZiBFcmxhbmcgb24geW91ciBzeXN0ZW0pOgotCi0gICAgKGFkZC1ob29rICdlcmxhbmctbG9hZC1ob29rICdteS1lcmxhbmctbG9hZC1ob29rKQotCi0gICAgKGRlZnVuIG15LWVybGFuZy1sb2FkLWhvb2sgKCkKLSAgICAgICAoc2V0cSBlcmxhbmctcm9vdC1kaXIgXCIvdXNyL2xvY2FsL2VybGFuZ1wiKSkiKQotCi0oZGVmdmFyIGVybGFuZy1uZXctZmlsZS1ob29rIG5pbAotICAiRnVuY3Rpb25zIHRvIHJ1biB3aGVuIGEgbmV3IEVybGFuZyBzb3VyY2UgZmlsZSBpcyBiZWluZyBlZGl0ZWQuCi0KLUEgdXNlZnVsIGZ1bmN0aW9uIGlzIGB0ZW1wby10ZW1wbGF0ZS1lcmxhbmctbm9ybWFsLWhlYWRlcicuCi1cKFRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgd2hlbiB0aGUgYHRlbXBvJyBwYWNrYWdzIGlzIGF2YWlsYWJsZS4pIikKLQotKGRlZnZhciBlcmxhbmctY2hlY2stbW9kdWxlLW5hbWUgJ2FzawotICAiKk5vbi1uaWwgbWVhbnMgY2hlY2sgdGhhdCBtb2R1bGUgbmFtZSBhbmQgZmlsZSBuYW1lIGFncmVlcyB3aGVuIHNhdmluZy4KLQotSWYgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgdGhlIGF0b20gYGFzaycsIHRoZSB1c2VyIGlzCi1wcm9tcHRlZC4gIElmIHRoZSB2YWx1ZSBpcyB0IHRoZSBzb3VyY2UgaXMgc2lsZW50bHkgY2hhbmdlZC4iKQotCi0oZGVmdmFyIGVybGFuZy1lbGVjdHJpYy1jb21tYW5kcwotICAnKGVybGFuZy1lbGVjdHJpYy1jb21tYQotICAgIGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24KLSAgICBlcmxhbmctZWxlY3RyaWMtZ3QpCi0gICIqTGlzdCBvZiBhY3RpdmF0ZWQgZWxlY3RyaWMgY29tbWFuZHMuCi0KLVRoZSBsaXN0IHNob3VsZCBjb250YWluIHRoZSBlbGVjdHJpYyBjb21tYW5kcyB3aGljaCBzaG91bGQgYmUgYWN0aXZlLgotQ3VycmVudGx5LCB0aGUgYXZhaWxhYmxlIGVsZWN0cmljIGNvbW1hbmRzIGFyZToKLSAgICBlcmxhbmctZWxlY3RyaWMtY29tbWEKLSAgICBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uCi0gICAgZXJsYW5nLWVsZWN0cmljLWd0Ci0gICAgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUKLQotU2hvdWxkIHRoZSB2YXJpYWJsZSBiZSBib3VuZCB0byB0LCBhbGwgZWxlY3RyaWMgY29tbWFuZHMKLWFyZSBhY3RpdmF0ZWQuCi0KLVRvIGRlYWN0aXZhdGUgYWxsIGVsZWN0cmljIGNvbW1hbmRzLCBzZXQgdGhpcyB2YXJpYWJsZSB0byBuaWwuIikKLQotKGRlZnZhciBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1pbmhpYml0IHQKLSAgIipTZXQgdG8gbm9uLW5pbCB0byBpbmhpYml0IG5ld2xpbmUgYWZ0ZXIgZWxlY3RyaWMgY29tbWFuZC4KLQotVGhpcyBpcyB1c2VmdWwgc2luY2UgYSBsb3Qgb2YgcGVvcGxlIHByZXNzIHJldHVybiBhZnRlciBleGVjdXRpbmcgYW4KLWVsZWN0cmljIGNvbW1hbmQuCi0KLUluIG9yZGVyIHRvIHdvcmssIHRoZSBjb21tYW5kIG11c3QgYWxzbyBiZSBpbiB0aGUKLWxpc3QgYGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQtbGlzdCcuCi0KLU5vdGUgdGhhdCBjb21tYW5kcyBpbiB0aGlzIGxpc3QgYXJlIHJlcXVpcmVkIHRvIHNldCB0aGUgdmFyaWFibGUKLWBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1pbmhpYml0JyB0byBuaWwgd2hlbiB0aGUgbmV3bGluZSBzaG91bGRuJ3QgYmUKLWluaGliaXRlZC4iKQotCi0oZGVmdmFyIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQtbGlzdAotICAnKGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24KLSAgICBlcmxhbmctZWxlY3RyaWMtY29tbWEKLSAgICBlcmxhbmctZWxlY3RyaWMtZ3QpCi0gICIqQ29tbWFuZCB3aGljaCBjYW4gaW5oaWJpdCB0aGUgbmV4dCBuZXdsaW5lLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbi1pbnNlcnQtYmxhbmstbGluZXMgbmlsCi0gICIqTnVtYmVyIG9mIGJsYW5rIGxpbmVzIGluc2VydGVkIGJlZm9yZSBoZWFkZXIsIG9yIG5pbC4KLQotVGhpcyB2YXJpYWJsZSBjb250cm9scyB0aGUgYmVoYXZpb3VyIG9mIGBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uJwotd2hlbiBhIG5ldyBmdW5jdGlvbiBoZWFkZXIgaXMgZ2VuZXJhdGVkLiAgV2hlbiBuaWwsIG5vIGJsYW5rIGxpbmUgaXMKLWluc2VydGVkIGJldHdlZW4gdGhlIGN1cnJlbnQgbGluZSBhbmQgdGhlIG5ldyBoZWFkZXIuICBXaGVuIGJvdW5kIHRvIGEKLW51bWJlciBpdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYmxhbmsgbGluZXMgd2hpY2ggc2hvdWxkIGJlCi1pbnNlcnRlZC4iKQotCi0oZGVmdmFyIGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24tY3JpdGVyaWEKLSAgJyhlcmxhbmctbmV4dC1saW5lcy1lbXB0eS1wCi0gICAgZXJsYW5nLWF0LWtleXdvcmQtZW5kLXAKLSAgICBlcmxhbmctYXQtZW5kLW9mLWZ1bmN0aW9uLXApCi0gICIqTGlzdCBvZiBmdW5jdGlvbnMgY29udHJvbGxpbmcgYGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24nLgotVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGxpc3QgYXJlIGNhbGxlZCwgaW4gb3JkZXIsIHdoZW5ldmVyIGEgc2VtaWNvbG9uCi1pcyB0eXBlZC4gIEVhY2ggZnVuY3Rpb24gaW4gdGhlIGxpc3QgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLAotYW5kIHNob3VsZCByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi0gIG5pbCAgICAgICAgICAgICAtLSBubyBkZXRlcm1pbmF0aW9uIG1hZGUsIGNvbnRpbnVlIGNoZWNraW5nCi0gICdzdG9wICAgICAgICAgICAtLSBkbyBub3QgY3JlYXRlIHByb3RvdHlwZSBmb3IgbmV4dCBsaW5lCi0gIChhbnl0aGluZyBlbHNlKSAtLSBpbnNlcnQgcHJvdG90eXBlLCBhbmQgc3RvcCBjaGVja2luZwotCi1JZiBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbGlzdCBpcyBjYWxsZWQgd2l0aCBubyBkZXRlcm1pbmF0aW9uIG1hZGUsCi10aGVuIG5vIHByb3RvdHlwZSBpcyBpbnNlcnRlZC4KLQotVGhlIHRlc3QgaXMgcGVyZm9ybWVkIGJ5IHRoZSBmdW5jdGlvbiBgZXJsYW5nLXRlc3QtY3JpdGVyaWEtbGlzdCcuIikKLQotKGRlZnZhciBlcmxhbmctZWxlY3RyaWMtY29tbWEtY3JpdGVyaWEKLSAgJyhlcmxhbmctc3RvcC13aGVuLWluc2lkZS1hcmd1bWVudC1saXN0Ci0gICAgZXJsYW5nLXN0b3Atd2hlbi1hdC1ndWFyZAotICAgIGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXAKLSAgICBlcmxhbmctYXQta2V5d29yZC1lbmQtcAotICAgIGVybGFuZy1hdC1lbmQtb2YtZnVuY3Rpb24tcCkKLSAgIipMaXN0IG9mIGZ1bmN0aW9ucyBjb250cm9sbGluZyBgZXJsYW5nLWVsZWN0cmljLWNvbW1hJy4KLVRoZSBmdW5jdGlvbnMgaW4gdGhpcyBsaXN0IGFyZSBjYWxsZWQsIGluIG9yZGVyLCB3aGVuZXZlciBhIGNvbW1hCi1pcyB0eXBlZC4gIEVhY2ggZnVuY3Rpb24gaW4gdGhlIGxpc3QgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLAotYW5kIHNob3VsZCByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi0gIG5pbCAgICAgICAgICAgICAtLSBubyBkZXRlcm1pbmF0aW9uIG1hZGUsIGNvbnRpbnVlIGNoZWNraW5nCi0gICdzdG9wICAgICAgICAgICAtLSBkbyBub3QgY3JlYXRlIHByb3RvdHlwZSBmb3IgbmV4dCBsaW5lCi0gIChhbnl0aGluZyBlbHNlKSAtLSBpbnNlcnQgcHJvdG90eXBlLCBhbmQgc3RvcCBjaGVja2luZwotCi1JZiBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbGlzdCBpcyBjYWxsZWQgd2l0aCBubyBkZXRlcm1pbmF0aW9uIG1hZGUsCi10aGVuIG5vIHByb3RvdHlwZSBpcyBpbnNlcnRlZC4KLQotVGhlIHRlc3QgaXMgcGVyZm9ybWVkIGJ5IHRoZSBmdW5jdGlvbiBgZXJsYW5nLXRlc3QtY3JpdGVyaWEtbGlzdCcuIikKLQotKGRlZnZhciBlcmxhbmctZWxlY3RyaWMtYXJyb3ctY3JpdGVyaWEKLSAgJyhlcmxhbmctbmV4dC1saW5lcy1lbXB0eS1wCi0gICAgZXJsYW5nLWF0LWVuZC1vZi1mdW5jdGlvbi1wKQotICAiKkxpc3Qgb2YgZnVuY3Rpb25zIGNvbnRyb2xsaW5nIHRoZSBhcnJvdyBhc3BlY3Qgb2YgYGVybGFuZy1lbGVjdHJpYy1ndCcuCi1UaGUgZnVuY3Rpb25zIGluIHRoaXMgbGlzdCBhcmUgY2FsbGVkLCBpbiBvcmRlciwgd2hlbmV2ZXIgYSBgPicKLWlzIHR5cGVkLiAgRWFjaCBmdW5jdGlvbiBpbiB0aGUgbGlzdCBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsCi1hbmQgc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLSAgbmlsICAgICAgICAgICAgIC0tIG5vIGRldGVybWluYXRpb24gbWFkZSwgY29udGludWUgY2hlY2tpbmcKLSAgJ3N0b3AgICAgICAgICAgIC0tIGRvIG5vdCBjcmVhdGUgcHJvdG90eXBlIGZvciBuZXh0IGxpbmUKLSAgKGFueXRoaW5nIGVsc2UpIC0tIGluc2VydCBwcm90b3R5cGUsIGFuZCBzdG9wIGNoZWNraW5nCi0KLUlmIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaXN0IGlzIGNhbGxlZCB3aXRoIG5vIGRldGVybWluYXRpb24gbWFkZSwKLXRoZW4gbm8gcHJvdG90eXBlIGlzIGluc2VydGVkLgotCi1UaGUgdGVzdCBpcyBwZXJmb3JtZWQgYnkgdGhlIGZ1bmN0aW9uIGBlcmxhbmctdGVzdC1jcml0ZXJpYS1saXN0Jy4iKQotCi0oZGVmdmFyIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWNyaXRlcmlhCi0gICcodCkKLSAgIipMaXN0IG9mIGZ1bmN0aW9ucyBjb250cm9sbGluZyBgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUnLgotCi1UaGUgZWxlY3RyaWMgbmV3bGluZSBjb21tYW5kcyBpbmRlbnRzIHRoZSBuZXh0IGxpbmUuICBTaG91bGQgdGhlCi1jdXJyZW50IGxpbmUgYmVnaW4gd2l0aCBhIGNvbW1lbnQgdGhlIGNvbW1lbnQgc3RhcnQgaXMgY29waWVkIHRvCi10aGUgbmV3bHkgY3JlYXRlZCBsaW5lLgotCi1UaGUgZnVuY3Rpb25zIGluIHRoaXMgbGlzdCBhcmUgY2FsbGVkLCBpbiBvcmRlciwgd2hlbmV2ZXIgYSBjb21tYQotaXMgdHlwZWQuICBFYWNoIGZ1bmN0aW9uIGluIHRoZSBsaXN0IGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywKLWFuZCBzaG91bGQgcmV0dXJuIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQotICBuaWwgICAgICAgICAgICAgLS0gbm8gZGV0ZXJtaW5hdGlvbiBtYWRlLCBjb250aW51ZSBjaGVja2luZwotICAnc3RvcCAgICAgICAgICAgLS0gZG8gbm90IGNyZWF0ZSBwcm90b3R5cGUgZm9yIG5leHQgbGluZQotICAoYW55dGhpbmcgZWxzZSkgLS0gdHJpZ2dlciB0aGUgZWxlY3RyaWMgY29tbWFuZC4KLQotSWYgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QgaXMgY2FsbGVkIHdpdGggbm8gZGV0ZXJtaW5hdGlvbiBtYWRlLAotdGhlbiBubyBwcm90b3R5cGUgaXMgaW5zZXJ0ZWQuICBTaG91bGQgdGhlIGF0b20gdCBiZSBhIG1lbWJlciBvZiB0aGUKLWxpc3QsIGl0IGlzIHRyZWF0ZWQgYXMgYSBmdW5jdGlvbiB0cmlnZ2VyaW5nIHRoZSBlbGVjdHJpYyBjb21tYW5kLgotCi1UaGUgdGVzdCBpcyBwZXJmb3JtZWQgYnkgdGhlIGZ1bmN0aW9uIGBlcmxhbmctdGVzdC1jcml0ZXJpYS1saXN0Jy4iKQotCi0oZGVmdmFyIGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXRocmVzaG9sZCAyCi0gICIqTnVtYmVyIG9mIGJsYW5rIGxpbmVzIHJlcXVpcmVkIHRvIGFjdGl2YXRlIGFuIGVsZWN0cmljIGNvbW1hbmQuCi0KLUFjdHVhbGx5LCB0aGlzIHZhbHVlIGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGZ1bmN0aW9uCi1gZXJsYW5nLW5leHQtbGluZXMtZW1wdHktcCcgd2hpY2ggbm9ybWFsbHkgaXMgYSBtZW1iZXIgb2YgdGhlCi1jcml0ZXJpYSBsaXN0cyBjb250cm9sbGluZyB0aGUgZWxlY3RyaWMgY29tbWFuZHMuICAoUGxlYXNlIHNlZQotdGhlIHZhcmlhYmxlcyBgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbi1jcml0ZXJpYScgYW5kCi1gZXJsYW5nLWVsZWN0cmljLWNvbW1hLWNyaXRlcmlhJy4pCi0KLVRoZSB2YXJpYWJsZSBpcyBib3VuZCB0byBhIHRocmVzaG9sZCB2YWx1ZSwgYSBudW1iZXIsIHJlcHJlc2VudGluZyB0aGUKLW51bWJlciBvZiBsaW5lcyB3aGljaCBtdXN0IGJlIGVtcHR5LgotCi1TZXR0aW5nIHRoaXMgdmFyaWFibGUgdG8gemVybywgZWxlY3RyaWMgY29tbWFuZHMgd2lsbCBhbHdheXMgYmUKLXRyaWdnZXJlZCBieSBgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktcCcsIHVubGVzcyBpbmhpYml0ZWQgYnkgb3RoZXIKLXJ1bGVzLgotCi1TaG91bGQgdGhpcyB2YXJpYWJsZSBiZSBgbmlsJywgYGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXAnIHdpbGwgbmV2ZXIKLXRyaWdnZXIgYW4gZWxlY3RyaWMgY29tbWFuZC4gIFRoZSBzYW1lIGVmZmVjdCB3b3VsZCBiZSByZWFjaGVkIGlmIHRoZQotZnVuY3Rpb24gYGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXAnIHdvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgY3JpdGVyaWEKLWxpc3RzLgotCi1Ob3RlIHRoYXQgZXZlbiBpZiBgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktcCcgc2hvdWxkIG5vdCB0cmlnZ2VyIGFuCi1lbGVjdHJpYyBjb21tYW5kLCBvdGhlciBmdW5jdGlvbnMgaW4gdGhlIGNyaXRlcmlhIGxpc3QgY291bGQuIikKLQotKGRlZnZhciBlcmxhbmctbmV3LWNsYXVzZS13aXRoLWFyZ3VtZW50cyBuaWwKLSAgIipOb24tbmlsIG1lYW5zIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgY2xvbmVkIHdoZW4gYSBjbGF1c2UgaXMgZ2VuZXJhdGVkLgotCi1BIG5ldyBmdW5jdGlvbiBoZWFkZXIgY2FuIGJlIGdlbmVyYXRlZCBieSBjYWxscyB0byB0aGUgZnVuY3Rpb24KLWBlcmxhbmctZ2VuZXJhdGUtbmV3LWNsYXVzZScgYW5kIGJ5IHVzZSBvZiB0aGUgZWxlY3RyaWMgc2VtaWNvbG9uLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWNvbXBpbGUtdXNlLW91dGRpciB0Ci0gICIqV2hlbiBuaWwsIGdvIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzb3VyY2UgZmlsZSB3aGVuIGNvbXBpbGluZy4KLQotVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIHRoZSBgb3V0ZGlyJyBvcHRpb24gb2YgY29tcGlsZS4gIElmIHRoZQotb3V0ZGlyIGlzIG5vdCBpbiB0aGUgY3VycmVudCBsb2FkIHBhdGgsIEVybGFuZyBkb2Vzbid0IGxvYWQgdGhlIG9iamVjdAotbW9kdWxlIGFmdGVyIGl0IGhhcyBiZWVuIGNvbXBpbGVkLgotCi1UbyBhY3RpdmF0ZSB0aGUgd29ya2Fyb3VuZCwgcGxhY2UgdGhlIGZvbGxvd2luZyBpbiB5b3VyIGB+Ly5lbWFjcycgZmlsZToKLSAgICAoc2V0cSBlcmxhbmctY29tcGlsZS11c2Utb3V0ZGlyIG5pbCkiKQotCi0oZGVmdmFyIGVybGFuZy1pbmRlbnQtbGV2ZWwgNAotICAiKkluZGVudGF0aW9uIG9mIEVybGFuZyBjYWxscy9jbGF1c2VzIHdpdGhpbiBibG9ja3MuIikKLQotKGRlZnZhciBlcmxhbmctaW5kZW50LWd1YXJkIDIKLSAgIipJbmRlbnRhdGlvbiBvZiBFcmxhbmcgZ3VhcmRzLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWFyZ3VtZW50LWluZGVudCAyCi0gICIqSW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IGFyZ3VtZW50IGluIGEgZnVuY3Rpb24gY2FsbC4KLVdoZW4gbmlsLCBpbmRlbnQgdG8gdGhlIGNvbHVtbiBhZnRlciB0aGUgYCgnIG9mIHRoZQotZnVuY3Rpb24uIikKLQotKGRlZnZhciBlcmxhbmctdGFiLWFsd2F5cy1pbmRlbnQgdAotICAiKk5vbi1uaWwgbWVhbnMgVEFCIGluIEVybGFuZyBtb2RlIHNob3VsZCBhbHdheXMgcmVpbmRlbnQgdGhlIGN1cnJlbnQgbGluZSwKLXJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaW4gdGhlIGxpbmUgcG9pbnQgaXMgd2hlbiB0aGUgVEFCIGNvbW1hbmQgaXMgdXNlZC4iKQotCi0oZGVmdmFyIGVybGFuZy1lcnJvci1yZWdleHAtYWxpc3QKLSAgJygoIl5cXChbXjooIFx0XG5dK1xcKVs6KF1bIFx0XSpcXChbMC05XStcXClbOikgXHRdIiAuICgxIDIpKSkKLSAgIipQYXR0ZXJucyBmb3IgbWF0Y2hpbmcgRXJsYW5nIGVycm9ycy4iKQotCi0oZGVmdmFyIGVybGFuZy1tYW4taW5oaWJpdCAoZXEgc3lzdGVtLXR5cGUgJ3dpbmRvd3MtbnQpCi0gICJJbmhpYml0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRXJsYW5nIE1hbnVhbCBQYWdlcyBtZW51LgotCi1UaGUgV2luZG93cyBkaXN0cmlidXRpb24gb2YgRXJsYW5nIGRvZXMgbm90IGluY2x1ZGUgbWFuIHBhZ2VzLCBoZW5jZQotdGhlcmUgaXMgbm8gaWRlYSB0byBjcmVhdGUgdGhlIG1lbnUuIikKLQotKGRlZnZhciBlcmxhbmctbWFuLWRpcnMKLSAgJygoIk1hbiAtIENvbW1hbmRzIiAiL21hbi9tYW4xIiB0KQotICAgICgiTWFuIC0gTW9kdWxlcyIgIi9tYW4vbWFuMyIgdCkKLSAgICAoIk1hbiAtIFVuc3VwcG9ydGVkIiAiL3VjL21hbi9tYW4zIiB0KSkKLSAgIipUaGUgbWFuIGRpcmVjdG9yaWVzIGRpc3BsYXllZCBpbiB0aGUgRXJsYW5nIG1lbnUuCi0KLUVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgYmUgYSBsaXN0IHdpdGggdGhyZWUgZWxlbWVudHMsIHRoZSBmaXJzdAotdGhlIG5hbWUgb2YgdGhlIG1lbnUsIHRoZSBzZWNvbmQgdGhlIGRpcmVjdG9yeSwgYW5kIHRoZSBsYXN0IGEgZmxhZy4KLVNob3VsZCB0aGUgZmxhZyB0aGUgbmlsLCB0aGUgZGlyZWN0b3J5IGlzIGFic29sdXRlLCBzaG91bGQgaXQgYmUgbm9uLW5pbAotdGhlIGRpcmVjdG9yeSBpcyByZWxhdGl2ZSB0byB0aGUgdmFyaWFibGUgYGVybGFuZy1yb290LWRpcicuIikKLQotKGRlZnZhciBlcmxhbmctbWFuLW1heC1tZW51LXNpemUgMjAKLSAgIipUaGUgbWF4aW11bSBudW1iZXIgb2YgbWVudSBpdGVtcyBpbiBvbmUgbWVudSBhbGxvd2VkLiIpCi0KLShkZWZ2YXIgZXJsYW5nLW1hbi1kaXNwbGF5LWZ1bmN0aW9uICdlcmxhbmctbWFuLWRpc3BsYXkKLSAgIipGdW5jdGlvbiB1c2VkIHRvIGRpc3BsYXkgbWFuIHBhZ2UuCi0KLVRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQsIHRoZSBuYW1lIG9mIHRoZSBmaWxlCi1jb250YWluaW5nIHRoZSBtYW4gcGFnZS4gIFVzZSB0aGlzIHZhcmlhYmxlIHdoZW4gdGhlIGRlZmF1bHQKLWZ1bmN0aW9uLCBlcmxhbmctbWFuLWRpc3BsYXksIGRvZXMgbm90IHdvcmsgb24geW91ciBzeXN0ZW0uIikKLQotKGRlZmNvbnN0IGVybGFuZy1hdG9tLXJlZ2V4cCAiXFwoW2Etel1bYS16QS1aMC05X10qXFx8J1teXG4nXSpbXlxcXSdcXCkiCi0gICJSZWdleHAgd2hpY2ggc2hvdWxkIG1hdGNoIGFuIEVybGFuZyBhdG9tLgotCi1UaGUgcmVnZXhwIG11c3QgYmUgc3Vycm91bmRlZCB3aXRoIGEgcGFpciBvZiByZWdleHAgcGFyZW50aGVzZXMuIikKLShkZWZjb25zdCBlcmxhbmctYXRvbS1yZWdleHAtbWF0Y2hlcyAxCi0gICJOdW1iZXIgb2YgcmVnZXhwIHBhcmVudGhlc2lzIHBhaXJzIGluIGBlcmxhbmctYXRvbS1yZWdleHAnLgotCi1UaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHBhcmVudGhlc2lzIG1hdGNoZXMgaW4gY29tcGxleCByZWdleHBzIHdoaWNoCi1jb250YWlucyBgZXJsYW5nLWF0b20tcmVnZXhwJy4iKQotCi0oZGVmY29uc3QgZXJsYW5nLXZhcmlhYmxlLXJlZ2V4cCAiXFwoW0EtWl9dW2EtekEtWjAtOV9dKlxcKSIKLSAgIlJlZ2V4cCB3aGljaCBzaG91bGQgbWF0Y2ggYW4gRXJsYW5nIHZhcmlhYmxlLgotCi1UaGUgcmVnZXhwIG11c3QgYmUgc3Vycm91bmRlZCB3aXRoIGEgcGFpciBvZiByZWdleHAgcGFyZW50aGVzaXMuIikKLShkZWZjb25zdCBlcmxhbmctdmFyaWFibGUtcmVnZXhwLW1hdGNoZXMgMQotICAiTnVtYmVyIG9mIHJlZ2V4cCBwYXJlbnRoZXNpcyBwYWlycyBpbiBgZXJsYW5nLXZhcmlhYmxlLXJlZ2V4cCcuCi0KLVRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgbWF0Y2hlcyBpbiBjb21wbGV4IHJleGVwcyB3aGljaCBjb250YWlucwotYGVybGFuZy12YXJpYWJsZS1yZWdleHAnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWRlZnVuLXByb21wdC1yZWdleHAgKGNvbmNhdCAiXiIgZXJsYW5nLWF0b20tcmVnZXhwICJcXHMgKigiKQotICAiKlJlZ2V4cCB3aGljaCBzaG91bGQgbWF0Y2ggYmVnaW5uaW5nIG9mIGEgY2xhdXNlLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWZpbGUtbmFtZS1leHRlbnNpb24tcmVnZXhwICJcXC5bZWhdcmwkIgotICAiKlJlZ2V4cCB3aGljaCBzaG91bGQgbWF0Y2ggYW4gZXJsYW5nIGZpbGUgbmFtZS4KLQotVGhpcyByZWdleHAgaXMgdXNlZCB3aGVuIGFuIEVybGFuZyBtb2R1bGUgbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUKLW5hbWUgb2YgYW4gRXJsYW5nIHNvdXJjZSBmaWxlLgotCi1UaGUgcmVnZXhwIHNob3VsZCBvbmx5IG1hdGNoIHRoZSBzZWN0aW9uIG9mIHRoZSBmaWxlIG5hbWUgd2hpY2ggc2hvdWxkCi1iZSBleGNsdWRlZCBmcm9tIHRoZSBtb2R1bGUgbmFtZS4KLQotVG8gbWF0Y2ggYWxsIGZpbGVzIHNldCB0aGlzIHZhcmlhYmxlIHRvIFwiXFxcXChcXFxcLi4qXFxcXHxcXFxcKSRcIi4KLVRoZSBtYXRjaGVzIGFsbCBleGNlcHQgdGhlIGV4dGVuc2lvbi4gIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBFcmxhbmcKLXRhZ3Mgc3lzdGVtIHNob3VsZCBpbnRlcnByZXRhdGUgdGFncyBvbiB0aGUgZm9ybSBgbW9kdWxlOnRhZycgZm9yCi1maWxlcyB3cml0dGVuIGluIG90aGVyIGxhbmd1YWdlcyB0aGFuIEVybGFuZy4iKQotCi0oZGVmdmFyIGVybGFuZy1tb2RlLW1hcCBuaWwKLSAgIipLZXltYXAgdXNlZCBpbiBFcmxhbmcgbW9kZS4iKQotKGRlZnZhciBlcmxhbmctbW9kZS1hYmJyZXYtdGFibGUgbmlsCi0gICJBYmJyZXYgdGFibGUgaW4gdXNlIGluIEVybGFuZy1tb2RlIGJ1ZmZlcnMuIikKLShkZWZ2YXIgZXJsYW5nLW1vZGUtc3ludGF4LXRhYmxlIG5pbAotICAiU3ludGF4IHRhYmxlIGluIHVzZSBpbiBFcmxhbmctbW9kZSBidWZmZXJzLiIpCi0KLShkZWZjb25zdCBlcmxhbmctZW1hY3MtbWFqb3ItdmVyc2lvbgotICAoaWYgKGJvdW5kcCAnZW1hY3MtbWFqb3ItdmVyc2lvbikKLSAgICAgIGVtYWNzLW1ham9yLXZlcnNpb24KLSAgICAoc3RyaW5nLW1hdGNoICJcXChbMC05XStcXClcXC5cXChbMC05XStcXCkiIGVtYWNzLXZlcnNpb24pCi0gICAgKHN0cmluZy10by1pbnQgKHN1YnN0cmluZyBlbWFjcy12ZXJzaW9uCi0JCQkgICAgICAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpKSkKLSAgIk1ham9yIHZlcnNpb24gbnVtYmVyIG9mIEVtYWNzLiIpCi0KLShkZWZjb25zdCBlcmxhbmctZW1hY3MtbWlub3ItdmVyc2lvbgotICAoaWYgKGJvdW5kcCAnZW1hY3MtbWlub3ItdmVyc2lvbikKLSAgICAgIGVtYWNzLW1pbm9yLXZlcnNpb24KLSAgICAoc3RyaW5nLW1hdGNoICJcXChbMC05XStcXClcXC5cXChbMC05XStcXCkiIGVtYWNzLXZlcnNpb24pCi0gICAgKHN0cmluZy10by1pbnQgKHN1YnN0cmluZyBlbWFjcy12ZXJzaW9uCi0JCQkgICAgICAobWF0Y2gtYmVnaW5uaW5nIDIpIChtYXRjaC1lbmQgMikpKSkKLSAgIk1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIEVtYWNzLiIpCi0KLShkZWZjb25zdCBlcmxhbmcteGVtYWNzLXAgKHN0cmluZy1tYXRjaCAiTHVjaWRcXHxYRW1hY3MiIGVtYWNzLXZlcnNpb24pCi0gICJOb24tbmlsIHdoZW4gcnVubmluZyB1bmRlciBYRW1hY3Mgb3IgTHVjaWQgRW1hY3MuIikKLQotKGRlZnZhciBlcmxhbmcteGVtYWNzLXBvcHVwLW1lbnUgJygiRXJsYW5nIE1vZGUgQ29tbWFuZHMiIC4gbmlsKQotICAiQ29tbW9uIHBvcHVwIG1lbnUgZm9yIGFsbCBidWZmZXJzIGluIEVybGFuZyBtb2RlLgotCi1UaGlzIHZhcmlhYmxlIGlzIGRlc3RydWN0aXZlbHkgbW9kaWZpZWQgZXZlcnkgdGltZSB0aGUgRXJsYW5nIG1lbnUKLWlzIG1vZGlmaWVkLiAgVGhlIGVmZmVjdCBpcyB0aGF0IGFsbCBjaGFuZ2VzIHRha2UgZWZmZWt0IGluIGFsbAotYnVmZmVycyBpbiBFcmxhbmcgbW9kZSwganVzdCBsaWtlIHVuZGVyIEdOVSBFbWFjcy4KLQotTmV2ZXIgRVZFUiBzZXQgdGhpcyB2YXJpYWJsZSEiKQotCi0MCi07OyBUZW1wbyBza2VsZXRvbiB0ZW1wbGF0ZXM6Ci0KLShkZWZ2YXIgZXJsYW5nLXNrZWwKLSAgJygoIklmIiAgICAgICAgICAgICJpZiIgICAgICAgICAgICBlcmxhbmctc2tlbC1pZikKLSAgICAoIkNhc2UiICAgICAgICAgICJjYXNlIiAgICAgICAgICBlcmxhbmctc2tlbC1jYXNlKQotICAgICgiUmVjZWl2ZSIgICAgICAgInJlY2VpdmUiICAgICAgIGVybGFuZy1za2VsLXJlY2VpdmUpCi0gICAgKCJSZWNlaXZlIEFmdGVyIiAiYWZ0ZXIiICAgICAgICAgZXJsYW5nLXNrZWwtcmVjZWl2ZS1hZnRlcikKLSAgICAoIlJlY2VpdmUgTG9vcCIgICJsb29wIiAgICAgICAgICBlcmxhbmctc2tlbC1yZWNlaXZlLWxvb3ApCi0gICAgKCJNb2R1bGUiICAgICAgICAibW9kdWxlIiAgICAgICAgZXJsYW5nLXNrZWwtbW9kdWxlKQotICAgICgiQXV0aG9yIiAgICAgICAgImF1dGhvciIgICAgICAgIGVybGFuZy1za2VsLWF1dGhvcikKLSAgICAoKQotICAgICgiU21hbGwgSGVhZGVyIiAgInNtYWxsLWhlYWRlciIKLSAgICAgZXJsYW5nLXNrZWwtc21hbGwtaGVhZGVyIGVybGFuZy1za2VsLWhlYWRlcikKLSAgICAoIk5vcm1hbCBIZWFkZXIiICJub3JtYWwtaGVhZGVyIgotICAgICBlcmxhbmctc2tlbC1ub3JtYWwtaGVhZGVyIGVybGFuZy1za2VsLWhlYWRlcikKLSAgICAoIkxhcmdlIEhlYWRlciIgICJsYXJnZS1oZWFkZXIiCi0gICAgIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlciBlcmxhbmctc2tlbC1oZWFkZXIpCi0gICAgKCkKLSAgICAoIlNtYWxsIFNlcnZlciIgICAic21hbGwtc2VydmVyIgotICAgICBlcmxhbmctc2tlbC1zbWFsbC1zZXJ2ZXIgZXJsYW5nLXNrZWwtaGVhZGVyKQotICAgICgpCi0gICAgKCJBcHBsaWNhdGlvbiIgImFwcGxpY2F0aW9uIgotICAgICBlcmxhbmctc2tlbC1hcHBsaWNhdGlvbiBlcmxhbmctc2tlbC1oZWFkZXIpCi0gICAgKCJHZW5lcmFsIFRjcCBSZWNlaXZlIiAiZnNfZ2VuX3RjcF9yZWN2IgotICAgICBlcmxhbmctc2tlbC1mcy1nZW4tdGNwLXJlY3YgZXJsYW5nLXNrZWwtaGVhZGVyKQotICAgICgiVGVzdCBTdWl0ZSIgInRlc3Qtc3VpdGUiCi0gICAgIGVybGFuZy1za2VsLXRlc3Qtc3VpdGUgZXJsYW5nLXNrZWwtaGVhZGVyKQotICAgICgiVGNwIEdhdGV3YXkiICJmc190Y3BfZ2F0ZXdheSIKLSAgICAgZXJsYW5nLXNrZWwtZnMtdGNwLWdhdGV3YXkgZXJsYW5nLXNrZWwtaGVhZGVyKQotICAgICgiRWRvYyBmdW5jdGlvbiIgImZzX2Vkb2NfaGVhZGVyIgotICAgICBlcmxhbmctc2tlbC1mcy1lZG9jLWhlYWRlciBlcmxhbmctc2tlbC1oZWFkZXIpCi0gICAgKCJEQiBJbml0aWFsaXplIiAiZnNfZGJfaW5pdCIKLSAgICAgZXJsYW5nLXNrZWwtZnMtZGItaW5pdCBlcmxhbmctc2tlbC1oZWFkZXIpCi0gICAgKCJnZW5fbGVhZGVyIiAiZ2VuZXJpYy1sZWFkZXIiCi0gICAgIGVybGFuZy1za2VsLWdlbmVyaWMtbGVhZGVyIGVybGFuZy1za2VsLWhlYWRlcikKLSAgICAoIlN1cGVydmlzb3IiICJzdXBlcnZpc29yIgotICAgICBlcmxhbmctc2tlbC1zdXBlcnZpc29yIGVybGFuZy1za2VsLWhlYWRlcikKLSAgICAoInN1cGVydmlzb3JfYnJpZGdlIiAic3VwZXJ2aXNvci1icmlkZ2UiCi0gICAgIGVybGFuZy1za2VsLXN1cGVydmlzb3ItYnJpZGdlIGVybGFuZy1za2VsLWhlYWRlcikKLSAgICAoImdlbl9zZXJ2ZXIiICJnZW5lcmljLXNlcnZlciIKLSAgICAgZXJsYW5nLXNrZWwtZ2VuZXJpYy1zZXJ2ZXIgZXJsYW5nLXNrZWwtaGVhZGVyKQotICAgICgiZ2VuX2V2ZW50IiAiZ2VuLWV2ZW50IgotICAgICBlcmxhbmctc2tlbC1nZW4tZXZlbnQgZXJsYW5nLXNrZWwtaGVhZGVyKQotICAgICgiZ2VuX2ZzbSIgImdlbi1mc20iCi0gICAgIGVybGFuZy1za2VsLWdlbi1mc20gZXJsYW5nLXNrZWwtaGVhZGVyKQotICAgICgiTGlicmFyeSBtb2R1bGUiICJnZW4tbGliIgotICAgICBlcmxhbmctc2tlbC1saWIgZXJsYW5nLXNrZWwtaGVhZGVyKQotCSgiQ29yYmEgY2FsbGJhY2siICJnZW4tY29yYmEtY2IiCi0gICAgIGVybGFuZy1za2VsLWNvcmJhLWNhbGxiYWNrIGVybGFuZy1za2VsLWhlYWRlcikpCi0gICIqRGVzY3JpcHRpb24gb2YgYWxsIHNrZWxldG9ucyB0ZW1wbGF0ZXMuCi1Cb3RoIGZ1bmN0aW9ucyBhbmQgbWVudSBlbnRyaWVzIHdpbGwgYmUgY3JlYXRlZC4KLQotRWFjaCBlbnRyeSBpbiBgZXJsYW5nLXNrZWwnIHNob3VsZCBiZSBhIGxpc3Qgd2l0aCB0aHJlZSBvciBmb3VyCi1lbGVtZW50cywgb3IgdGhlIGVtcHR5IGxpc3QuCi0KLVRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBuYW1lIHdoaWNoIHNob3dzIHVwIGluIHRoZSBtZW51LiAgVGhlIHNlY29uZAotaXMgdGhlIGB0ZW1wbycgaWRlbnRmaWVyIChUaGUgc3RyaW5nIFwiZXJsYW5nLVwiIHdpbGwgYmUgYWRkZWQgaW4KLWZyb250IG9mIGl0KS4gIFRoZSB0aGlyZCBpcyB0aGUgc2tlbGV0b24gZGVzY3JpcHRvciwgYSB2YXJpYWJsZQotY29udGFpbmluZyBgdGVtcG8nIGF0dHJpYnV0ZXMgYXMgZGVzY3JpYmVkIGluIHRoZSBmdW5jdGlvbgotYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuICBUaGUgb3B0aW9uYWwgZm91cnRoIGVsZW1lbnRzIGRlbm90ZXMgYQotZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBtZW51IGlzIHNlbGVjdGVkLgotCi1GdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byBldmVyeSB0ZW1wbGF0ZSB3aWxsIGJlIGNyZWF0ZWQuICBUaGUgbmFtZQotb2YgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgYHRlbXBvLXRlbXBsYXRlLWVybGFuZy1YJyB3aGVyZSBgWCcgaXMgdGhlCi10ZW1wbyBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBlbGVtZW50cwotaW4gdGhpcyBsaXN0LgotCi1BIGxpc3Qgd2l0aCB6ZXJvIGVsZW1lbnRzIG1lYW5zIHRoYXQgdGhlIGEgaG9yaXNvbnRhbCBsaW5lIHNob3VsZAotYmUgcGxhY2VkIGluIHRoZSBtZW51LiIpCi0KLTs7IEluIFhFbWFjcyBgdXNlci1tYWlsLWFkZHJlc3MnIHJldHVybnMgInhAeS56IChGb28gQmFyKSIgQVJHSCEKLTs7IFdoYXQncyB3cm9uZyB3aXRoIHRoYXQ/IFJGQyA4MjIgc2F5cyBpdCdzIGxlZ2FsLiAgIFtzdmVya2Vyd10KLShkZWZ2YXIgZXJsYW5nLXNrZWwtbWFpbC1hZGRyZXNzCi0gIChjb25jYXQgKHVzZXItbG9naW4tbmFtZSkgIkAiCi0JICAob3IgKGFuZCAoYm91bmRwICdtYWlsLWhvc3QtYWRkcmVzcykKLQkJICAgKHN5bWJvbC12YWx1ZSAnbWFpbC1ob3N0LWFkZHJlc3MpKQotCSAgICAgIChzeXN0ZW0tbmFtZSkpKQotICAiTWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLiIpCi0KLTs7IEV4cHJlc3Npb24gdGVtcGxhdGVzOgotKGRlZnZhciBlcmxhbmctc2tlbC1jYXNlCi0gICcoKGVybGFuZy1za2VsLXNraXAtYmxhbmspIG8gPgotICAgICJjYXNlICIgcCAiIG9mIiBuPiBwICJfIC0+IiBuPiBwICJvayIgbj4gImVuZCIgcCkKLSAgIipUaGUgc2tlbGV0b24gb2YgYSBgY2FzZScgZXhwcmVzc2lvbi4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLXNrZWwtaWYKLSAgJygoZXJsYW5nLXNrZWwtc2tpcC1ibGFuaykgbyA+Ci0gICAgImlmIiAgbj4gcCAiIC0+IiBuPiBwICJvayIgbj4gImVuZCIgcCkKLSAgIlRoZSBza2VsZXRvbiBvZiBhbiBgaWYnIGV4cHJlc3Npb24uCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi0oZGVmdmFyIGVybGFuZy1za2VsLXJlY2VpdmUKLSAgJygoZXJsYW5nLXNrZWwtc2tpcC1ibGFuaykgbyA+Ci0gICAgInJlY2VpdmUiIG4+IHAgIl8gLT4iIG4+IHAgIm9rIiBuPiAiZW5kIiBwKQotICAiKlRoZSBza2VsZXRvbiBvZiBhIGByZWNlaXZlJyBleHByZXNzaW9uLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1yZWNlaXZlLWFmdGVyCi0gICcoKGVybGFuZy1za2VsLXNraXAtYmxhbmspIG8gPgotICAgICJyZWNlaXZlIiBuPiBwICJfIC0+IiBuPiBwICJvayIgbj4gImFmdGVyICIgcCAiVCAtPiIgbj4KLSAgICBwICJvayIgbj4gImVuZCIgcCkKLSAgIipUaGUgc2tlbGV0b24gb2YgYSBgcmVjZWl2ZScgZXhwcmVzc2lvbiB3aXRoIGFuIGBhZnRlcicgY2xhdXNlLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1yZWNlaXZlLWxvb3AKLSAgJygmIG8gImxvb3AoIiBwICIpIC0+IiBuPiAicmVjZWl2ZSIgbj4gcCAiXyAtPiIgbj4KLSAgICAgICJsb29wKCIgcCAiKSIgbj4gImVuZC4iKQotICAiKlRoZSBza2VsZXRvbiBvZiBhIHNpbXBsZSBgcmVjaWV2ZScgbG9vcC4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLQotOzsgQXR0cmlidXRlIHRlbXBsYXRlcwotCi0oZGVmdmFyIGVybGFuZy1za2VsLW1vZHVsZQotICAnKCYgIi1tb2R1bGUoIgotICAgICAgKGVybGFuZy1hZGQtcXVvdGVzLWlmLW5lZWRlZCAoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUpKQotICAgICAgIikuIiBuKQotICAiKlRoZSBza2VsZXRvbiBvZiBhIGBtb2R1bGUnIGF0dHJpYnV0ZS4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLXNrZWwtYXV0aG9yCi0gICcoJiAiLWF1dGhvcignIiBlcmxhbmctc2tlbC1tYWlsLWFkZHJlc3MgIicpLiIgbikKLSAgIipUaGUgc2tlbGV0b24gb2YgYSBgYXV0aG9yJyBhdHRyaWJ1dGUuCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi0oZGVmdmFyIGVybGFuZy1za2VsLXZjIG5pbAotICAiKlRoZSBza2VsZXRvbiB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSBhIHZlcnNpb24gY29udHJvbCBhdHRyaWJ1dGUuCi1UaGUgZGVmYXVsdCBpcyB0byBpbnNlcnQgbm90aGluZy4gIEV4YW1wbGUgb2YgdXNhZ2U6Ci0KLSAgICAoc2V0cSBlcmxhbmctc2tlbC12YyAnKCYgXCItcmNzKFxcXCIkXElkOiAkIFxcXCIpLlwiKSBuKQotCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi0oZGVmdmFyIGVybGFuZy1za2VsLWV4cG9ydAotICAnKCYgIi1leHBvcnQoWyIgbj4gIl0pLiIgbikKLSAgIipUaGUgc2tlbGV0b24gb2YgYW4gYGV4cG9ydCcgYXR0cmlidXRlLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1pbXBvcnQKLSAgJygmICIlJS1pbXBvcnQoTW9kdWxlLCBbRnVuY3Rpb24vQXJpdHksIC4uLl0pLiIgbikKLSAgIipUaGUgc2tlbGV0b24gb2YgYW4gYGltcG9ydCcgYXR0cmlidXRlLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1jb21waWxlIG5pbAotOzsgICcoJiAiJSUtY29tcGlsZShleHBvcnRfYWxsKS4iIG4pCi0gICIqVGhlIHNrZWxldG9uIG9mIGEgYGNvbXBpbGUnIGF0dHJpYnV0ZS4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLQotOzsgQ29tbWVudCB0ZW1wbGF0ZXMuCi0KLShkZWZ2YXIgZXJsYW5nLXNrZWwtZGF0ZS1mdW5jdGlvbiAnZXJsYW5nLXNrZWwtZGQtbW1tLXl5eXkKLSAgIipGdW5jdGlvbiB3aGljaCByZXR1cm5zIGRhdGUgc3RyaW5nLgotTG9vayBpbiB0aGUgbW9kdWxlIGB0aW1lLXN0YW1wJyBmb3IgYSBiYXR0ZXJ5IG9mIGZ1bmN0aW9ucy4iKQotCi0oZGVmdmFyIGVybGFuZy1za2VsLWNvcHlyaWdodC1jb21tZW50ICcoKQotICAiKlRoZSB0ZW1wbGF0ZSBmb3IgYSBjb3B5cmlnaHQgbGluZSBpbiB0aGUgaGVhZGVyLCBub3JtYWxseSBlbXB0eS4KLVRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIGJvdW5kIHRvIGEgYHRlbXBvJyB0ZW1wbGF0ZSwgZm9yIGV4YW1wbGU6Ci0gICcoJiBcIiUlJSBDb3B5cmlnaHQgKEMpIDIwMDAsIFlveW9keW5lLCBJbmMuXCIgbikKLQotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1jcmVhdGVkLWNvbW1lbnQKLSAgJygmICIlJSUgQ3JlYXRlZCA6ICIgKGZ1bmNhbGwgZXJsYW5nLXNrZWwtZGF0ZS1mdW5jdGlvbikgIiBieSAiCi0gICAgICAodXNlci1mdWxsLW5hbWUpICIgPCIgZXJsYW5nLXNrZWwtbWFpbC1hZGRyZXNzICI+IiBuKQotICAiKlRoZSB0ZW1wbGF0ZSBmb3IgdGhlIFwiQ3JlYXRlZDpcIiBjb21tZW50IGxpbmUuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1hdXRob3ItY29tbWVudAotICAnKCYgIiUlJSBBdXRob3IgIDogIiAodXNlci1mdWxsLW5hbWUpICIgPCIgZXJsYW5nLXNrZWwtbWFpbC1hZGRyZXNzICI+IiBuKQotICAiKlRoZSB0ZW1wbGF0ZSBmb3IgY3JlYXRpbmcgdGhlIFwiQXV0aG9yOlwiIGxpbmUgaW4gdGhlIGhlYWRlci4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLXNrZWwtZmlsZS1jb21tZW50Ci0gICcoJiAiJSUlIEZpbGUgICAgOiAiIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGJ1ZmZlci1maWxlLW5hbWUpIG4pCi0gICIqVGhlIHRlbXBsYXRlIGZvciBjcmVhdGluZyB0aGUgXCJNb2R1bGU6XCIgbGluZSBpbiB0aGUgaGVhZGVyLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1zbWFsbC1oZWFkZXIKLSAgJyhvIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLW1vZHVsZSkKLTs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJsYW5nLXNrZWwtYXV0aG9yKQotICAgICAgbgotICAgICAgKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtY29tcGlsZQotOzsJCQkgICBlcmxhbmctc2tlbC1leHBvcnQKLQkJCSAgIGVybGFuZy1za2VsLXZjKSkKLSAgIipUaGUgdGVtcGxhdGUgb2YgYSBzbWFsbCBoZWFkZXIgd2l0aG91dCBhbnkgY29tbWVudHMuCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi0oZGVmdmFyIGVybGFuZy1za2VsLW5vcm1hbC1oZWFkZXIKLSAgJyhvIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWNvcHlyaWdodC1jb21tZW50Ci0JCQkgICBlcmxhbmctc2tlbC1maWxlLWNvbW1lbnQKLQkJCSAgIGVybGFuZy1za2VsLWF1dGhvci1jb21tZW50KQotICAgICAgIiUlJSBEZXNjcmlwdGlvbiA6ICIgcCBuCi0gICAgICAoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1jcmVhdGVkLWNvbW1lbnQpIG4KLSAgICAgIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLXNtYWxsLWhlYWRlcikgbikKLSAgIipUaGUgdGVtcGxhdGUgb2YgYSBub3JtYWwgaGVhZGVyLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIKLSAgJyhvICIlJSUgJElkOiBlcmxhbmcuZWwsdiAxLjIxIDIwMDQvMDgvMDMgMjA6Mzg6NDMgbWxvZ2FuIEV4cCAkIiBuIChlcmxhbmctc2tlbC1zZXBhcmF0b3IpCi0gICAgICAoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1jb3B5cmlnaHQtY29tbWVudAotCQkJICAgZXJsYW5nLXNrZWwtZmlsZS1jb21tZW50Ci0JCQkgICBlcmxhbmctc2tlbC1hdXRob3ItY29tbWVudCkKLQkgICIlJSUiIG4KLSAgICAgICIlJSUgQGRvYyAgIiBwIG4gCi0JICAiJSUlIEBlbmQiIG4KLQkgICIlJSUiIG4KLSAgICAgIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWNyZWF0ZWQtY29tbWVudCkKLSAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IpIAotICAgICAgKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtc21hbGwtaGVhZGVyKSApCi0gICIqVGhlIHRlbXBsYXRlIG9mIGEgbGFyZ2UgaGVhZGVyLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotCi07OyBTZXJ2ZXIgdGVtcGxhdGVzLgotCi0oZGVmdmFyIGVybGFuZy1za2VsLXNtYWxsLXNlcnZlcgotICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKLSAJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCSIlJSBJbmNsdWRlIGZpbGVzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLWV4cG9ydChbc3RhcnRfbGluay8wXSkuIiBuIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEludGVybmFsIGV4cG9ydHMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItZXhwb3J0KFtpbml0LzFdKS4iIG4gbgotICAgIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIE1hY3JvcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgIi1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4iIG4KLQluCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBSZWNvcmRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLQluCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIFRoZSBzdGFydGluZyBwb2ludC4iIG4KLSAgICAiJSUgQHNwZWMgc3RhcnRfbGluaygpIC0+IHtvaywgUGlkfSIgbgotICAgICIlJSBAZW5kIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJzdGFydF9saW5rKCkgLT4iIG4+Ci0gICAgInByb2NfbGliOnN0YXJ0X2xpbmsoP01PRFVMRSwgaW5pdCwgW3NlbGYoKV0pLiIgbiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgU2VydmVyIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBEZXNjcmlwdGlvbjogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIuIiBuCi0gICAgIiUlIFZhcmlhYmxlczoiIG4KLSAgICAiJSUgIEZyb20gLSBUaGUgcGlkIG9mIHRoZSBwYXJlbnQgcHJvY2Vzcy4iIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImluaXQoRnJvbSkgLT4iIG4+Ci0gICAgInJlZ2lzdGVyKD9TRVJWRVIsIHNlbGYoKSksIiBuPgotICAgICJwcm9jX2xpYjppbml0X2FjayhGcm9tLCB7b2ssIHNlbGYoKX0pLCIgbj4KLSAgICAibG9vcChGcm9tKS4iIG4gbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgImxvb3AoRnJvbSkgLT4iIG4+Ci0gICAgInJlY2VpdmUiIG4+Ci0gICAgcCAiXyAtPiIgbj4KLSAgICAibG9vcChGcm9tKSIgbj4KLSAgICAiZW5kLiIKLSAgICApCi0gICIqVGVtcGxhdGUgb2YgYSBzbWFsbCBzZXJ2ZXIuCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi07OyBCZWhhdmlvdXIgdGVtcGxhdGVzLgotCi0oZGVmdmFyIGVybGFuZy1za2VsLWFwcGxpY2F0aW9uCi0gICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQotICAgICItYmVoYXZpb3VyKGFwcGxpY2F0aW9uKS4iIG4KLSAJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCSIlJSBJbmNsdWRlIGZpbGVzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCW4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGV4cG9ydHMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItZXhwb3J0KFsiIG4+IAotICAgIAkic3RhcnQvMiwiIG4+Ci0JInNodXRkb3duLzAsIiBuPgotCSJzdG9wLzEiIG4+Ci0JIl0pLiIgbgotICAgIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIE1hY3JvcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0JbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgUmVjb3JkcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIFRoZSBzdGFydGluZyBwb2ludCBmb3IgYW4gZXJsYW5nIGFwcGxpY2F0aW9uLiIgbgotICAgICIlJSBAc3BlYyBzdGFydChUeXBlLCBTdGFydEFyZ3MpIC0+IHtvaywgUGlkfSB8IHtvaywgUGlkLCBTdGF0ZX0gfCB7ZXJyb3IsIFJlYXNvbn0iIG4KLSAgICAiJSUgQGVuZCIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAic3RhcnQoVHlwZSwgU3RhcnRBcmdzKSAtPiIgbj4KLSAgICAiY2FzZSAiKGVybGFuZy1nZXQtbW9kdWxlLWZyb20tZmlsZS1uYW1lKSJfc3VwOnN0YXJ0X2xpbmsoU3RhcnRBcmdzKSBvZiIgbj4KLSAgICAie29rLCBQaWR9IC0+ICIgbj4KLSAgICAie29rLCBQaWR9OyIgbj4KLSAgICAiRXJyb3IgLT4iIG4+Ci0gICAgIkVycm9yIiBuPgotICAgICJlbmQuIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgQGRvYyBDYWxsZWQgdG8gc2h1ZG93biB0aGUgIihlcmxhbmctZ2V0LW1vZHVsZS1mcm9tLWZpbGUtbmFtZSkiIGFwcGxpY2F0aW9uLiIgbgotICAgICIlJSBAc3BlYyBzaHV0ZG93bigpIC0+IG9rICJuCi0gICAgIiUlIEBlbmQibgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAic2h1dGRvd24oKSAtPiIgbj4KLSAgICAiYXBwbGljYXRpb246c3RvcCgiKGVybGFuZy1nZXQtbW9kdWxlLWZyb20tZmlsZS1uYW1lKSIpLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICIlJSBJbnRlcm5hbCBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIENhbGxlZCB1cG9uIHRoZSB0ZXJtaW50aW9uIG9mIGFuIGFwcGxpY2F0aW9uLiIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAic3RvcChTdGF0ZSkgLT4iIG4+Ci0gICAgIm9rLiIgbgotICAgIG4KLSAgICApCi0gICIqVGhlIHRlbXBsYXRlIG9mIGFuIGFwcGxpY2F0aW9uIGJlaGF2aW91ci4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLTs7IE1hcnRpbnMgd29yawotCi07OyB0ZXN0IHNlcnZlciB0ZXN0IHN1aXRlIHRlbXBsYXRlCi0oZGVmdmFyIGVybGFuZy1za2VsLXRlc3Qtc3VpdGUKLSAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1jb3B5cmlnaHQtY29tbWVudAotCQkJICAgZXJsYW5nLXNrZWwtZmlsZS1jb21tZW50Ci0JCQkgICBlcmxhbmctc2tlbC1hdXRob3ItY29tbWVudCkKLSAgICAiJSUlIiBuCi0gICAgIiUlJSBAZG9jICAiIHAgbiAKLSAgICAiJSUlIDxwPkEgdGVzdCBzcGVjIGNvbnNpc3RzIG9mIHRoZSB0ZXN0IHNlcnZlciByZXF1aXJlZCBmdW5jdGlvbnMgYXMgZGV0YWlsZWQiIG4KLSAgICAiJSUlIGJ5IHRoZSBjb21tZW50cyBmb3IgdGhlIGZ1bmN0aW9ucyB0aGVtc2VsdmVzIGZ1cnRoZXIgZG93biBpbiB0aGlzIiBuCi0gICAgIiUlJSBmaWxlLiBUaGUgcmVzdCBvZiBhIHRlc3Qgc3VpdGUgY29uc2lzdHMgb2YgdXNlciBkZWZpbmVkIENhc2UgZnVuY3Rpb25zIiBuCi0gICAgIiUlJSBhcyByZWZlcmVuY2VkIGJ5IHRoZSBzdWl0ZSBjbGF1c2Ugb2YgdGhlIGFsbC8xIGZ1bmN0aW9uIGFuZCAibgotICAgICIlJSUgZGVzY3JpYmVkIGJlbG93LjwvcD4ibgotICAgICIlJSUibgotICAgICIlJSUgPHN0cm9uZz4iCi0gICAgIiUlJSBDYXNlKGRvYykgICAgLT4gW0RlY3JpcHRpb25dIiBuCi0gICAgIiUlJSBDYXNlKHN1aXRlKSAgLT4gW10gfCBUZXN0U3BlYyB8IHtza2lwLCBDb21tZW50fSIgbgotICAgICIlJSUgQ2FzZShDb25maWcpIC0+IHtza2lwLCBDb21tZW50fSB8IHtjb21tZW50LCBDb21tZW50fSB8IE9rIiBuCi0gICAgIiUlJSA8L3N0cm9uZz48cHJlPiJuCi0gICAgIiUlJSJuCi0gICAgIiUlJSBWYXJpYWJsZXM6IiBuCi0gICAgIiUlJSAgRGVzY3JpcHRpb24gLSBTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdCBjYXNlIFRlc3RTcGVjIiBuCi0gICAgIiUlJSAgQ29tbWVudCAtIFRoaXMgY29tbWVudCB3aWxsIGJlIHByaW50ZWQgb24gdGhlIEhUTUwgcmVzdWx0IHBhZ2UgIiBuCi0gICAgIiUlJSJuCi0gICAgIiUlJSBUeXBlczoiIG4KLSAgICAiJSUlICBEZXNjcmlwdGlvbiA9IHN0cmluZygpIiBuCi0gICAgIiUlJSAgVGVzdFNwZWMgPSBsaXN0KCkiIG4KLSAgICAiJSUlICBPayA9IHRlcm0oKSIgbgotICAgICIlJSUgIENvbW1lbnQgPSBzdHJpbmcoKSIgbgotICAgICIlJSUgIENvbmZpZyA9IHRlcm0oKSIgbgotICAgICIlJSUgPC9wcmU+IiBuCi0gICAgIiUlJSA8cD5UaGUgZG9jdW1lbnRhdGlvbiBjbGF1c2UgKGFyZ3VtZW50IGRvYykgY2FuIGJlIHVzZWQgZm9yIiBuCi0gICAgIiUlJSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiB0ZXN0IGRvY3VtZW50YXRpb24gb3IgdGVzdCBkZXNjcmlwdGlvbnMuPC9wPiIgbgotICAgICIlJSUibgotICAgICIlJSUgPHA+VGhlIHNwZWNpZmljYXRpb24gY2xhdXNlIChhcmd1bWVudCBzcGVjKSBzaGFsbCByZXR1cm4gYW4gZW1wdHkiIG4gCi0gICAgIiUlJSBsaXN0LCB0aGUgdGVzdCBzcGVjaWZpY2F0aW9uIGZvciB0aGUgdGVzdCBjYXNlIG9yIHtza2lwLENvbW1lbnR9LiIgbgotICAgICIlJSUgVGhlIHN5bnRheCBvZiBhIHRlc3Qgc3BlY2lmaWNhdGlvbiBpcyBkZXNjcmliZWQgaW4gdGhlIHJlZmVyZW5jZSAiIG4KLSAgICAiJSUlIG1hbnVhbCBmb3IgdGhlIFRlc3QgU2VydmVyIGFwcGxpY2F0aW9uLjwvcD4iIG4KLSAgICAiJSUlIm4KLSAgICAiJSUlIDxwPk5vdGUgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbiBjbGF1c2UgYWx3YXlzIGlzIGV4ZWN1dGVkIG9uICJuCi0gICAgIiUlJSB0aGUgY29udHJvbGxlciBob3N0LjwvcD4ibgotICAgICIlJSUibgotICAgICIlJSUgPHA+VGhlIGV4ZWN1dGlvbiBjbGF1c2UgKGFyZ3VtZW50IENvbmZpZykgaXMgb25seSBjYWxsZWQgaWYgIm4KLSAgICAiJSUlIHRoZSBzcGVjaWZpY2F0aW9uIGNsYXVzZSByZXR1cm5zIGFuIGVtcHR5IGxpc3QuIFRoZSBleGVjdXRpb24gIm4KLSAgICAiJSUlIGNsYXVzZSBpcyB0aGUgcmVhbCB0ZXN0IGNhc2UuIEhlcmUgeW91IG11c3QgY2FsbCB0aGUgZnVuY3Rpb25zICJuCi0gICAgIiUlJSB5b3Ugd2FudCB0byB0ZXN0LCBhbmQgZG8gd2hhdGV2ZXIgeW91IG5lZWQgdG8gY2hlY2sgdGhlIHJlc3VsdC4gIm4KLSAgICAiJSUlIElmIHNvbWV0aW5nIGZhaWxzLCBtYWtlIHN1cmUgdGhlIHByb2Nlc3MgY3Jhc2hlcyBvciBjYWxsICJuCi0gICAgIiUlJSB0ZXN0X3NlcnZlcjpmYWlsLzAvMSAod2hpY2ggYWxzbyB3aWxsIGNhdXNlIHRoZSBwcm9jZXNzIHRvIGNyYXNoKS48L3A+Im4KLSAgICAiJSUlIm4KLSAgICAiJSUlIDxwPllvdSBjYW4gcmV0dXJuIHtza2lwLENvbW1lbnR9IGlmIHlvdSBkZWNpZGUgbm90IHRvIHJ1biB0aGUgIm4KLSAgICAiJSUlIHRlc3QgY2FzZSBhZnRlciBhbGwsIGUuZy4gaWYgaXQgaXMgbm90IGFwcGxpY2FibGUgb24gdGhpcyBwbGF0Zm9ybS48L3A+Im4KLSAgICAiJSUlIm4KLSAgICAiJSUlIDxwPllvdSBjYW4gcmV0dXJuIHtjb21tZW50LENvbW1lbnR9IGlmIHlvdSB3aXNoIHRvIHByaW50IHNvbWUgIm4KLSAgICAiJSUlIGluZm9ybWF0aW9uIGluIHRoZSAnQ29tbWVudCcgZmllbGQgb24gdGhlIEhUTUwgcmVzdWx0IHBhZ2UuPC9wPiJuCi0gICAgIiUlJSJuCi0gICAgIiUlJSA8cD5JZiB0aGUgZXhlY3V0aW9uIGNsYXVzZSByZXR1cm5zIGFueXRoaW5nIGVsc2UsIGl0IGlzIGNvbnNpZGVyZWQgIm4KLSAgICAiJSUlIGEgc3VjY2Vzcy4gPC9wPiJuCi0gICAgIiUlJSBAZW5kIiBuCi0gICAgIiUlJSIgbgotICAgIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWNyZWF0ZWQtY29tbWVudCkKLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yKSAKLSAgICAoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1zbWFsbC1oZWFkZXIpCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBJbmNsdWRlIGZpbGVzIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBNYWNybyBEZWZpbml0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgVGVzdCBTdWl0ZSBFeHBvcnRzIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLWV4cG9ydChbIm4+ImFsbC8xLCJuPiJpbml0X3Blcl90ZXN0Y2FzZS8yLCJuPiJmaW5fcGVyX3Rlc3RjYXNlLzIibj4iXSkuIiBuIAotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIEV4cG9ydHMgLSB0ZXN0IGNhc2VzIG11c3QgYmUgZXhwb3J0ZWQuIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLWV4cG9ydChbIm4+Il0pLiJuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIFRlc3QgU2VydmVyIEZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgQGRvYyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRlc3Qgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIHRlc3Qgc3VpdGUgbW9kdWxlLiJuCi0gICAgIiUlIDxwcmU+Im4KLSAgICAiJSUgVHlwZXM6Im4KLSAgICAiJSUgIFRlc3RTcGVjID0gbGlzdCgpIm4KLSAgICAiJSUgIENvbW1lbnQgPSBzdHJpbmcoKSJuCi0gICAgIiUlIm4KLSAgICAiJSUgPC9wcmU+Im4KLSAgICAiJSUgQHNwZWMgYWxsKHN1aXRlKSAtPiBUZXN0U3BlYyB8IHtza2lwLCBDb21tZW50fSJuCi0gICAgIiUlIEBlbmQibgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiYWxsKGRvYykgICAtPiBbXTsibiAKLSAgICAiYWxsKHN1aXRlKSAtPiBbXS4ibiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgQGRvYyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0IGNhc2UuIm4KLSAgICAiJSUgPHByZT4ibgotICAgICIlJSBUeXBlczoibgotICAgICIlJSAgQ2FzZSA9IGF0b20oKSJuCi0gICAgIiUlICBDb25maWcgPSBOZXdDb25maWcgPSB0ZXJtKCkibgotICAgICIlJSJuCi0gICAgIiUlIDwvcHJlPiJuCi0gICAgIiUlIEBzcGVjIGluaXRfcGVyX3Rlc3RjYXNlKENhc2UsIENvbmZpZykgLT4gTmV3Q29uZmlnIm4KLSAgICAiJSUgQGVuZCJuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJpbml0X3Blcl90ZXN0Y2FzZShDYXNlLCBDb25maWcpIC0+IFtdLiJuIG4gCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgQGRvYyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBlYWNoIHRlc3QgY2FzZS4ibgotICAgICIlJSA8cHJlPiJuCi0gICAgIiUlIFR5cGVzOiJuCi0gICAgIiUlICBDYXNlID0gYXRvbSgpIm4KLSAgICAiJSUgIENvbmZpZyA9IHRlcm0oKSJuCi0gICAgIiUlIm4KLSAgICAiJSUgPC9wcmU+Im4KLSAgICAiJSUgQHNwZWMgZmluX3Blcl90ZXN0Y2FzZShDYXNlLCBDb25maWcpIC0+IHZvaWQoKSJuCi0gICAgIiUlIEBlbmQibgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiZmluX3Blcl90ZXN0Y2FzZShDYXNlLCBDb25maWcpIC0+IG9rLiJuIG4gCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEluZGl2aWR1YWwgVGVzdCBDYXNlIEZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgQGRvYyAuIiBuCi0gICAgIiUlIEBlbmQiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIkNhc2UoZG9jKSAgICAgICAgICAgICAgICAgICAgICAtPiBbXTsibgotICAgICJDYXNlKHN1aXRlKSAgICAgICAgICAgICAgICAgICAgLT4gW107Im4KLSAgICAiQ2FzZShDb25maWcpIHdoZW4gbGlzdChDb25maWcpIC0+IG9rLiJuIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgSW50ZXJuYWwgRnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICApCi0gICIqVGhlIHRlbXBsYXRlIG9mIGFuIGFwcGxpY2F0aW9uIGJlaGF2aW91ci4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLQotOzsgZnNfdGNwX2dhdGV3YXkgdGVtcGxhdGUKLShkZWZ2YXIgZXJsYW5nLXNrZWwtZnMtdGNwLWdhdGV3YXkKLSAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCi0gICAgIiUlIFRPRE8gSW1wbGVtZW50IHRoaXMgYmVoYXZpb3VyIiBuCi0gICAgIiUlIC1iZWhhdmlvdXIodGNwX2dhdGV3YXkpLiIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgSW5jbHVkZSBmaWxlcyIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgIi1leHBvcnQoWyIgbj4gInN0YXJ0X2xpbmsvMSwgaW5pdC8wLCBzeW5jX3JlcXVlc3QvNSwgYXN5bmNfcmVxdWVzdC81LCB0ZXJtaW5hdGUvMiIgbgotICAgICIgICAgICAgIF0pLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIE1hY3JvcyIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIFJlY29yZHMiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItcmVjb3JkKHN0YXRlLCB7fSkuIm4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEBkb2MgU3RhcnRzIHRoZSBnYXRld2F5IHNlcnZlci4ibgotICAgICIlJSA8cHJlPiJuCi0gICAgIiUlIm4KLSAgICAiJSUgRXhwZWN0czoibgotICAgICIlJSAgUG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBiaW5kIHRvLiJuCi0gICAgIiUlIm4KLSAgICAiJSUgVHlwZXM6Im4KLSAgICAiJSUgIFBvcnQgPSBpbnRlZ2VyKCkibgotICAgICIlJSJuCi0gICAgIiUlIDwvcHJlPiJuCi0gICAgIiUlIm4KLSAgICAiJSUgQHNwZWMgc3RhcnRfbGluayhQb3J0KSAtPiB7b2ssIHBpZCgpfSJuCi0gICAgIiUlIEBlbmQibgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAic3RhcnRfbGluayhQb3J0KSAtPiIgbj4KLSAgICAiQ2FsbEJhY2tNb2R1bGUgPSA/TU9EVUxFLCJuPgotICAgICIgICAgZnNfdGNwX2dhdGV3YXk6c3RhcnRfbGluayhDYWxsQmFja01vZHVsZSwgUG9ydCkuIm4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgQ2FsbGJhY2tzIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEBkb2MgSW5pdGlhbGl6YXRpb24gc3RhZ2UgZm9yIGVhY2ggbmV3IGNvbm5lY3Rpb24gdG8gdGhlIGdhdGV3YXkgc2VydmVyLiJuCi0gICAgIiUlIDxwcmU+Im4KLSAgICAiJSUibgotICAgICIlJSBUeXBlczoibgotICAgICIlJSAgU3RhdGUgPSB0ZXJtKCkibgotICAgICIlJSJuCi0gICAgIiUlIDwvcHJlPiJuCi0gICAgIiUlIm4KLSAgICAiJSUgQHNwZWMgaW5pdCgpIC0+IHtvaywgU3RhdGV9Im4KLSAgICAiJSUgQGVuZCJuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJpbml0KCkgLT4ibj4KLSAgICAie29rLCAjc3RhdGV7fX0uIm4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSBzeW5jcm9ub3VzIHJlcXVlc3QgZnJvbSBhIGNsaWVudC4ibgotICAgICIlJSA8cHJlPiJuCi0gICAgIiUlIm4KLSAgICAiJSUgRXhwZWN0czoibgotICAgICIlJSAgSUQgLSBUaGUgcmVxdWVzdCBJRCBudW1iZXIibgotICAgICIlJSAgTSAtIG1vZHVsZSBuYW1lIm4KLSAgICAiJSUgIEYgLSBmdW5jdGlvbiBuYW1lIm4KLSAgICAiJSUgIEEgLSBMaXN0IG9mIGFyZ3VtZW50cyJuCi0gICAgIiUlICBSZXBseSAtIEEgbWVzc2FnZSBzZW50IGJhY2sgb3ZlciB0aGUgdGNwIHN0cmVhbSB0byB0aGUgY2xpZW50Im4KLSAgICAiJSUibgotICAgICIlJSBUeXBlczoibgotICAgICIlJSAgSUQgPSBNID0gRiA9IFJlcGx5ID0gc3RyaW5nKCkibgotICAgICIlJSAgQSA9IFtzdHJpbmcoKV0ibgotICAgICIlJSAgU3RhdGUgPSB0ZXJtKCkibgotICAgICIlJSAgUmVwbHkgPSBzdHJpbmcoKSJuCi0gICAgIiUlIm4KLSAgICAiJSUgPC9wcmU+Im4KLSAgICAiJSUibgotICAgICIlJSBAc3BlYyBzeW5jX3JlcXVlc3QoSUQsIE0sIEYsIEEsIFN0YXRlKSAtPiJuCi0gICAgIiUlIHtyZXBseSwgUmVwbHksIFN0YXRlfSB8IHtzdG9wLCBSZXBseSwgUmVhc29uLCBTdGF0ZX0gfCB7bm9yZXBseSwgU3RhdGV9Im4KLSAgICAiJSUgQGVuZCJuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJzeW5jX3JlcXVlc3QoSUQsIE0sIEYsIEEsIFN0YXRlKSAtPiJuPgotICAgICJ7cmVwbHksIFwic3luYyBva1wiLCBTdGF0ZX0uIm4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSBhc3luY3Jvbm91cyByZXF1ZXN0IGZyb20gYSBjbGllbnQuIm4KLSAgICAiJSUgPHByZT4ibgotICAgICIlJSJuCi0gICAgIiUlIEV4cGVjdHM6Im4KLSAgICAiJSUgIElEIC0gVGhlIHJlcXVlc3QgSUQgbnVtYmVyIm4KLSAgICAiJSUgIE0gLSBtb2R1bGUgbmFtZSJuCi0gICAgIiUlICBGIC0gZnVuY3Rpb24gbmFtZSJuCi0gICAgIiUlICBBIC0gTGlzdCBvZiBhcmd1bWVudHMibgotICAgICIlJSAgUmVwbHkgLSBBIG1lc3NhZ2Ugc2VudCBiYWNrIG92ZXIgdGhlIHRjcCBzdHJlYW0gdG8gdGhlIGNsaWVudCJuCi0gICAgIiUlIm4KLSAgICAiJSUgVHlwZXM6Im4KLSAgICAiJSUgIElEID0gTSA9IEYgPSBzdHJpbmcoKSJuCi0gICAgIiUlICBBID0gW3N0cmluZygpXSJuCi0gICAgIiUlICBTdGF0ZSA9IHRlcm0oKSJuCi0gICAgIiUlICBSZXBseSA9IHN0cmluZygpIm4KLSAgICAiJSUibgotICAgICIlJSA8L3ByZT4ibgotICAgICIlJSJuCi0gICAgIiUlIEBzcGVjIGFzeW5jX3JlcXVlc3QoSUQsIE0sIEYsIEEsIFN0YXRlKSAtPiJuIAotICAgICIlJSB7c3RvcCwgUmVhc29uLCBTdGF0ZX0gfCB7bm9yZXBseSwgU3RhdGV9Im4KLSAgICAiJSUgQGVuZCJuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJhc3luY19yZXF1ZXN0KElELCBNLCBGLCBBLCBTdGF0ZSkgLT4ibj4KLSAgICAie25vcmVwbHksIFN0YXRlfS4ibgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEBkb2MgQ2FsbGVkIHVwb24gdGhlIHNodXRkb3duIG9mIGEgY29ubmVjdGlvbi4ibgotICAgICIlJSBAc3BlYyB0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4gdm9pZCgpIm4KLSAgICAiJSUgQGVuZCJuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJ0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4ibj4KLSAgICAib2suIm4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICkKLSAgIipUaGUgdGVtcGxhdGUgb2YgYSBmc190Y3BfZ2F0ZXdheSBiZWhhdmlvdXIuCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi0KLTs7IGdlbl90Y3BfcmVjdiB0ZW1wbGF0ZQotKGRlZnZhciBlcmxhbmctc2tlbC1mcy1nZW4tdGNwLXJlY3YKLSAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCi0gICAgIiUlIFRPRE8gSW1wbGVtZW50IHRoaXMgYmVoYXZpb3VyIiBuCi0gICAgIiUlIC1iZWhhdmlvdXIoZ2VuX3RjcF9yZWN2KS4iIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGV4cG9ydHMiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItZXhwb3J0KFsiIG4+ICJzdGFydF9saW5rLzAiIG4+ICJdKS4iIG4gbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgU2VydmVyIENhbGxiYWNrcyIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgIi1leHBvcnQoWyIgbj4gImluaXQvMSwiIG4+ICJoYW5kbGVfcGFja2V0LzMsIiBuPiAiaGFuZGxlX2NhbGwvNCIgbj4gCi0gICAgImhhbmRsZV9pbmZvLzMiIG4+ICJ0ZXJtaW5hdGUvMiIgbj4gIl0pLiIgbiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBJbmNsdWRlIGZpbGVzIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBBUEkgLSBFeHRlcm5hbCBFeHBvcnRzIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLWV4cG9ydChbIiBuPiAKLSAgICAic3RhcnRfbGluay8xIiBuPgotICAgICJdKS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBNYWNyb3MiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIi1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBSZWNvcmRzIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgQGRvYyBTdGFydHMgdGhlIGZzX2dlbl90Y3BfcmVjdiBzZXJ2ZXIuIiBuCi0gICAgIiUlIEBzcGVjIHN0YXJ0X2xpbmsoKSAtPiB7b2ssIFBpZH0iIG4KLSAgICAiJSUgQGVuZCIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAic3RhcnRfbGluaygpIC0+IiBuPgotICAgICJmc19nZW5fdGNwX3JlY3Y6c3RhcnRfbGluayhDYWxsYmFja01vZHVsZSwgP1RDUF9QT1JULCBbXSwgW10sIFtdKS4iIG4gbiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgU2VydmVyIEZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEluaXRpYWxpemVzIHRoZSBzdGF0ZSBmb3IgYSBnZW5fdGNwX3JlY3Ygc2VydmVyLiIgbgotICAgICIlJSBSZXR1cm5zOiB7b2ssIFN0YXRlfSIgbgotICAgICIlJSBTdGF0ZSA9IHRlcm0oKSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaW5pdChbXSkgLT4iIG4+Ci0gICAgIntvaywgW119LiIgbiBuIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIFJlY2VpdmVzIHBhY2tldHMgZnJvbSB0aGUgc29ja2V0LiBBbHNvIHJlY2VpdmVzIHRpbW91dCBtZXNzYWdlcy4iIG4KLSAgICAiJSUgVHlwZXM6IiBuCi0gICAgIiUlICBTb2NrZXQgPSBzb2NrZXQoKSIgbgotICAgICIlJSAgUGFja2V0ID0gYmluYXJ5KCkgfCBzdHJpbmcoKS4gQ2FuIGJlIGFsdGVyZWQgaW4gVENQT3B0aW9ucyIgbgotICAgICIlJSAgUmVwbHkgPSBiaW5hcnkoKSB8IHN0cmluZygpLiBDYW4gYmUgYWx0ZXJlZCBpbiBUQ1BPcHRpb25zIiBuCi0gICAgIiUlICBTdGF0ZSA9IE5ld1N0YXRlID0gdGVybSgpIiBuCi0gICAgIiUlICBUaW1lb3V0ID0gaW50ZWdlcigpIGluIG1pbGlzZWNvbmRzLiIgbgotICAgICIlJSBSZXR1cm5zOiAiIG4KLSAgICAiJSUgIHtub3JlcGx5LCBOZXdTdGF0ZX0ge25vcmVwbHksIE5ld1N0YXRlLCBUaW1lb3V0fSIgbgotICAgICIlJSAge3JlcGx5LCBSZXBseSwgTmV3U3RhdGV9IHtyZXBseSwgUmVwbHksIE5ld1N0YXRlLCBUaW1lb3V0fSIgbgotICAgICIlJSAge3N0b3AsIFJlYXNvbiwgTmV3U3RhdGV9IiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJoYW5kbGVfcGFja2V0KFNvY2tldCwgUGFja2V0LCBTdGF0ZSkgLT4iIG4+Ci0gICAgIntub3JlcGx5LCBTdGF0ZX0uIiBuIG4gbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgUmVjZWl2ZXMgc3luYyBjYWxscyBmcm9tIGEgY2xpZW50LiIgbgotICAgICIlJSBWYXJpYWJsZXM6IiBuCi0gICAgIiUlICBSZXBseSAtIEEgbWVzc2FnZSBzZW50IGJhY2sgdG8gdGhlIGNhbGxlci4iIG4KLSAgICAiJSUgIiBuCi0gICAgIiUlIFR5cGVzOiIgbgotICAgICIlJSAgU29ja2V0ID0gc29ja2V0KCkiIG4KLSAgICAiJSUgIE1zZyA9IFJlcGx5ID0gdGVybSgpIiBuCi0gICAgIiUlICBTdGF0ZSA9IE5ld1N0YXRlID0gdGVybSgpIiBuCi0gICAgIiUlICBUaW1lb3V0ID0gaW50ZWdlcigpIGluIG1pbGlzZWNvbmRzLiIgbgotICAgICIlJSBSZXR1cm5zOiAiIG4KLSAgICAiJSUgIHtub3JlcGx5LCBOZXdTdGF0ZX0ge25vcmVwbHksIE5ld1N0YXRlLCBUaW1lb3V0fSIgbgotICAgICIlJSAge3JlcGx5LCBSZXBseSwgTmV3U3RhdGV9IHtyZXBseSwgUmVwbHksIE5ld1N0YXRlLCBUaW1lb3V0fSIgbgotICAgICIlJSAge3N0b3AsIFJlYXNvbiwgTmV3U3RhdGV9IHwge3N0b3AsIFJlYXNvbiwgUmVwbHksIE5ld1N0YXRlfSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaGFuZGxlX2NhbGwoU29ja2V0LCBGcm9tLCBNc2csIFN0YXRlKSAtPiIgbj4KLSAgICAie3JlcGx5LCBSZXBseSwgU3RhdGV9LiIgbiBuIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIFJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gb3RoZXIgcHJvY2Vzc2VzIGFuZCB0aW1lb3V0cy4iIG4KLSAgICAiJSUgVHlwZXM6IiBuCi0gICAgIiUlICBTb2NrZXQgPSBzb2NrZXQoKSIgbgotICAgICIlJSAgTXNnID0gdGVybSgpIHwgdGltZW91dCIgbgotICAgICIlJSAgU3RhdGUgPSBOZXdTdGF0ZSA9IHRlcm0oKSIgbgotICAgICIlJSAgVGltZW91dCA9IGludGVnZXIoKSBpbiBtaWxpc2Vjb25kcy4iIG4KLSAgICAiJSUgUmV0dXJuczogIiBuCi0gICAgIiUlICB7bm9yZXBseSwgTmV3U3RhdGV9IHtub3JlcGx5LCBOZXdTdGF0ZSwgVGltZW91dH0iIG4KLSAgICAiJSUgIHtzdG9wLCBSZWFzb24sIE5ld1N0YXRlfSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaGFuZGxlX2luZm8oU29ja2V0LCBNc2csIFN0YXRlKSAtPiIgbj4KLSAgICAie25vcmVwbHksIFN0YXRlfS4iIG4gbiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBDYWxsZWQgYWZ0ZXIgYSBzb2NrZXQgY2xvc2VzIG9yIHtzdG9wLCBSZWFzb24sIE5ld1N0YXRlfSIgbgotICAgICIlJSBUeXBlczoiIG4KLSAgICAiJSUgIFNvY2tldCA9IHNvY2tldCgpIiBuCi0gICAgIiUlICBTdGF0ZSA9IE5ld1N0YXRlID0gdGVybSgpIiBuCi0gICAgIiUlIFJldHVybnM6IHRlcm0oKSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAidGVybWluYXRlKFNvY2tldCwgU3RhdGUpIC0+IiBuPgotICAgICAgICAib2suIiBuIG4gbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlJSBJbnRlcm5hbCBGdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgKQotICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGZzX2dlbl90Y3BfcmVjdiBiZWhhdmlvdXIuCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi07OyBmc19lZG9jX2hlYWRlciB0ZW1wbGF0ZQotKGRlZnZhciBlcmxhbmctc2tlbC1mcy1lZG9jLWhlYWRlcgotICAnKChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgQGRvYyIgbgotICAgICIlJSA8cHJlPiIgbgotICAgICIlJSBWYXJpYWJsZXM6IiBuCi0gICAgIiUlIFR5cGVzOiIgbgotICAgICIlJSA8L3ByZT4gdGVybSgpIiBuCi0gICAgIiUlIEBzcGVjIiBuCi0gICAgIiUlIEBlbmQiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICApCi0gICIqVGhlIHRlbXBsYXRlIG9mIGFuIGVkb2MgZnVuY3Rpb24gaGVhZGVyLiAKLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLTs7IGZzX2RiX2luaXQgdGVtcGxhdGUKLShkZWZ2YXIgZXJsYW5nLXNrZWwtZnMtZGItaW5pdAotICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKLSAgICAiJSUgVE9ETyBJbXBsZW1lbnQgdGhpcyBiZWhhdmlvdXIiIG4KLSAgICAiJSUgLWJlaGF2aW91cihkYl9pbml0KS4iIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIiUlIEluY2x1ZGUgZmlsZXMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotCW4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGV4cG9ydHMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItZXhwb3J0KFsiIG4+ICJzdGFydF9saW5rLzEsIHN0YXJ0X2xpbmsvMywgaW5pdC8xLCBsb2NhbF9pbml0LzAsIHJlbW90ZV9pbml0LzAiIG4KLQkiICAgICAgICBdKS4iIG4KLSAgICBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBNYWNyb3MiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIi1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4iIG4KLQluCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBSZWNvcmRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIFN0YXJ0cyB0aGUgc2VydmVyLiAiIG4+Ci0gICAgIiUlIDxwcmU+IiBuPgotICAgICIlJSBWYXJpYWJsZXM6IiBuPgotICAgICIlJSAgQ2FsbEJhY2tNb2R1bGUgLSBUaGUgbW9kdWxlIHRoYXQgZXhoaWJpdHMgdGhlIGRiIGluaXQgYmVoYXZpb3VyLiIgbj4KLSAgICAiJSUgIEFyZ3MgLSBBIGxpc3Qgb2YgYXJndW1lbnRzIGRlbGl2ZXJlZCB0byB0aGUgQ2FsbEJhY2tNb2R1bGU6aW5pdC8xIGZ1bmN0aW9uLiIgbj4KLSAgICAiJSUgIE9wdGlvbnMgLSBBIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgZnNfZGJfaW5pdC4iIG4+Ci0gICAgIiUlIiBuPgotICAgICIlJSBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoiIG4+Ci0gICAgIiUlICB7c2NoZW1hX3R5cGUsIFR5cGV9IiBuPgotICAgICIlJSIgbj4KLSAgICAiJSUgVHlwZXM6IiBuPgotICAgICIlJSAgQXJncyA9IGxpc3QoKSIgbj4KLSAgICAiJSUgIE9wdGlvbnMgPSBsaXN0KCkiIG4+Ci0gICAgIiUlICBUeXBlID0gcmFtX2NvcGllcyB8IGRpc2NfY29waWVzIHwgZGlzY19vbmx5X2NvcGllcyIgbj4KLSAgICAiJSUiIG4+Ci0gICAgIiUlIDwvcHJlPiIgbj4KLSAgICAiJSUgQHNwZWMgc3RhcnRfbGluayhDYWxsQmFja01vZHVsZSwgQXJncywgT3B0aW9ucykgLT4ge29rLCBwaWQoKX0gfCB7ZXJyb3IsIFJlYXNvbn0iIG4+Ci0gICAgIiUlIEBlbmQiIG4+Ci0gICAgIihlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikiCi0gICAgInN0YXJ0X2xpbmsoQ2FsbEJhY2tNb2R1bGUsIEFyZ3MsIE9wdGlvbnMpIC0+IiBuPgotICAgICJwcm9jX2xpYjpzdGFydF9saW5rKD9NT0RVTEUsIGRiX2luaXQsIFtzZWxmKCksIENhbGxCYWNrTW9kdWxlLCBBcmdzLCBPcHRpb25zXSkuIiBuPgotICAgIG4KLSAgICAiJSUgQHNwZWMgc3RhcnRfbGluayhDYWxsQmFja01vZHVsZSkgLT4ge29rLCBwaWQoKX0gfCB7ZXJyb3IsIFJlYXNvbn0iIG4+Ci0gICAgIiUlIEBlcXVpdiBzdGFydF9saW5rKENhbGxCYWNrTW9kdWxlLCBbXSwgW10pIiBuPgotICAgICJzdGFydF9saW5rKENhbGxCYWNrTW9kdWxlKSAtPiIgbj4KLSAgICAic3RhcnRfbGluayhDYWxsQmFja01vZHVsZSwgW10sIFtdKS4iIG4+Ci0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIENhbGxiYWNrcyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIiBuCi0gICAgIiUlIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIHRoYXQgZGJfaW5pdCBzaG91bGQgdHJ5IHRvIHJlcGxpY2F0ZSB3aXRoLiIgbgotICAgICIlJSIgbgotICAgICIlJSA8cHJlPiIgIG4KLSAgICAiJSUgVHlwZXM6IiBuCi0gICAgIiUlICBEQk5vZGVzID0gW25vZGUoKV0iIG4KLSAgICAiJSUgPC9wcmU+IiAgbgotICAgICIlJSIgbgotICAgICIlJSBAc3BlYyBpbml0KEFyZ3MpIC0+IHtvaywgREJOb2Rlc30gfCBub19pbml0IiBuCi0gICAgIiUlIEBlbmQiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImluaXQoQXJncykgLT4iIG4KLSAgICAiICAgIHtvaywgREJOb2Rlc1RvUmVwbGljYXRlRnJvbSA9IFtdfS4iIG4gCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIiBuCi0gICAgIiUlIENyZWF0ZWQgYSBzY2hlbWEgYW5kIHNlZWRzIHRoZSBsb2NhbCBkYXRhYmFzZS4iIG4KLSAgICAiJSUgUmV0dXJucyBhIGxpc3Qgb2YgcmVjb3JkcyB3aXRoIHRoZWlyIGluaXRpYWwgZGF0YS4iIG4KLSAgICAiJSUgVGhlc2UgYXJlIHRvIGJlIHRoZSB0YWJsZXMgYW5kIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgZGF0YWJhc2UuIiBuCi0gICAgIiUlIiBuCi0gICAgIiUlIDxwcmU+IiBuCi0gICAgIiUlIFJlY2xpc3QgPSBbcmVjb3JkKCldIiBuCi0gICAgIiUlIFJlYXNvbiA9IGF0b20oKSIgbgotICAgICIlJSA8L3ByZT4iIG4KLSAgICAiJSUiIG4KLSAgICAiJSUgQHNwZWMgbG9jYWxfaW5pdCgpIC0+IHtvaywgUmVjTGlzdH0gfCB7ZXJyb3IsIFJlYXNvbn0iIG4KLSAgICAiJSUgQGVuZCIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAibG9jYWxfaW5pdCgpIC0+IiBuCi0gICAgIiAgICB7b2ssIFtdfS4iIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEBkb2MgUHVzaGVzIHRoZSBzY2hlbWEgYW5kIHRoZSB0YWJsZSBkZWZpbml0aW9ucyB0byB0aGUgbm9kZSIgbgotICAgICIlJSBzcGVjaWZpZWQgYnkgdGhlIHZhcmlhYmxlIG5vZGUuIiBuCi0gICAgIiUlIE5PVEU6IERvIG5vdCBpbmNsdWRlIHRoZSBzY2hlbWEgaW4gdGhpcyBsaXN0LiIgbgotICAgICIlJSIgbgotICAgICIlJSA8cHJlPiIgbgotICAgICIlJSBUeXBlcyAiIG4KLSAgICAiJSUgIE5vZGUgPSBub2RlKCkiIG4KLSAgICAiJSUgIFRhYmxlTGlzdCA9IFt7VGFibGUsIFR5cGV9XSIgbgotICAgICIlJSAgIFRhYmxlID0gYXRvbSgpIiBuCi0gICAgIiUlICAgVHlwZSA9IHJhbV9jb3BpZXMsIGRpc2NfY29waWVzIiBuCi0gICAgIiUlICBSZWFzb24gPSBhdG9tKCkiIG4KLSAgICAiJSUgPC9wcmU+IiBuCi0gICAgIiUlIiBuCi0gICAgIiUlIEBzcGVjIHJlbW90ZV9pbml0KCkgLT4ge29rLCBUYWJsZUxpc3R9IHwge2Vycm9yLCBSZWFzb259IiBuCi0gICAgIiUlIEBlbmQiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgInJlbW90ZV9pbml0KCkgLT4iIG4KLSAgICAiICAgIHtvaywgW3tpbmksIHJhbV9jb3BpZXN9XX0uIiBuCi0gICAgbgotICAgKQotICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGZzX2RiX2luaXQgYmVoYXZpb3VyLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1zdXBlcnZpc29yCi0gICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQotICAgICItYmVoYXZpb3VyKHN1cGVydmlzb3IpLiIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLQkiJSUgSW5jbHVkZSBmaWxlcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLQluCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLWV4cG9ydChbIiBuPiAic3RhcnRfbGluay8xIiBuCi0JIiAgICAgICAgXSkuIiBuCi0gICAgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgSW50ZXJuYWwgZXhwb3J0cyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgIi1leHBvcnQoWyIgbj4gImluaXQvMSIgbgotCSIgICAgICAgIF0pLiIgbgotCW4gCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBNYWNyb3MiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIi1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4iIG4KLQluCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBSZWNvcmRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEBkb2MgU3RhcnRzIHRoZSBzdXBlcnZpc29yLiIgbgotICAgICIlJSBAc3BlYyBzdGFydF9saW5rKFN0YXJ0QXJncykgLT4ge29rLCBwaWQoKX0gfCBFcnJvciIgbgotICAgICIlJSBAZW5kIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJzdGFydF9saW5rKFN0YXJ0QXJncykgLT4iIG4+Ci0gICAgInN1cGVydmlzb3I6c3RhcnRfbGluayh7bG9jYWwsID9TRVJWRVJ9LCA/TU9EVUxFLCBbXSkuIiBuIAotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICIlJSBTZXJ2ZXIgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmM6IGluaXQvMSIgbgotICAgICIlJSBSZXR1cm5zOiB7b2ssICB7U3VwRmxhZ3MsICBbQ2hpbGRTcGVjXX19IHwiIG4KLSAgICAiJSUgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgICAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtlcnJvciwgUmVhc29ufSAgICIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaW5pdChbXSkgLT4iIG4+Ci0gICAgIlJlc3RhcnRTdHJhdGVneSAgICA9IG9uZV9mb3Jfb25lLCIgbj4KLSAgICAiTWF4UmVzdGFydHMgICAgICAgID0gMTAwMCwiIG4+Ci0gICAgIk1heFRpbWVCZXRSZXN0YXJ0cyA9IDM2MDAsIiBuPgotICAgIG4+Ci0gICAgIlN1cEZsYWdzID0ge1Jlc3RhcnRTdHJhdGVneSwgTWF4UmVzdGFydHMsIE1heFRpbWVCZXRSZXN0YXJ0c30sIiBuPgotICAgIG4+Ci0gICAgIkNoaWxkU3BlY3MgPSIgbj4KLSAgICAiWyIgbj4KLSAgICAie0FwcE5hbWUsIiBuPgotICAgICJ7QXBwTmFtZSwgc3RhcnRfbGluaywgW119LCIgbj4KLSAgICAicGVybWFuZW50LCIgbj4KLSAgICAiMTAwMCwiIG4+Ci0gICAgIndvcmtlciwiIG4+Ci0gICAgIltBcHBOYW1lXX0iIG4+Ci0gICAgIl0sIiBuPgotICAgICJ7b2sse1N1cEZsYWdzLCBDaGlsZFNwZWNzfX0uIiBuCi0KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICIlJSBJbnRlcm5hbCBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICkKLSAgIipUaGUgdGVtcGxhdGUgb2YgYW4gc3VwZXJ2aXNvciBiZWhhdmlvdXIuCi1QbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQotCi0oZGVmdmFyIGVybGFuZy1za2VsLXN1cGVydmlzb3ItYnJpZGdlCi0gICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQotICAgICItYmVoYXZpb3VyKHN1cGVydmlzb3JfYnJpZGdlKS4iIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIiUlIEluY2x1ZGUgZmlsZXMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgIi1leHBvcnQoWyIgbj4gInN0YXJ0X2xpbmsvMCIgbgotCSIgICAgICAgIF0pLiIgbgotICAgIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEludGVybmFsIGV4cG9ydHMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItZXhwb3J0KFsiIG4+ICJpbml0LzEsICIgbj4gInRlcm1pbmF0ZS8yIiBuCi0JIiAgICAgICAgXSkuIiBuCi0JbiAKLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIE1hY3JvcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0JIi1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4iIG4KLQluCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBSZWNvcmRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLXJlY29yZChzdGF0ZSwge30pLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuY3Rpb246IHN0YXJ0X2xpbmsvMCIgbgotICAgICIlJSBEZXNjcmlwdGlvbjogU3RhcnRzIHRoZSBzdXBlcnZpc29yIGJyaWRnZSIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgInN0YXJ0X2xpbmsoKSAtPiIgbj4KLQkic3VwZXJ2aXNvcl9icmlkZ2U6c3RhcnRfbGluayh7bG9jYWwsID9TRVJWRVJ9LCA/TU9EVUxFLCBbXSkuIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIFNlcnZlciBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuYzogaW5pdC8xIiBuCi0gICAgIiUlIFJldHVybnM6IHtvaywgIFBpZCwgU3RhdGV9IHwiIG4KLSAgICAiJSUgICAgICAgICAgaWdub3JlICAgICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7ZXJyb3IsIFJlYXNvbn0gICAgIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJpbml0KFtdKSAtPiIgbj4KLSAgICAiY2FzZSAnQU1vZHVsZSc6c3RhcnRfbGluaygpIG9mIiBuPgotICAgICJ7b2ssIFBpZH0gLT4iIG4+Ci0gICAgIntvaywgUGlkLCAjc3RhdGV7fX07IiBuPgotICAgICJFcnJvciAtPiIgbj4KLSAgICAiRXJyb3IiIG4+Ci0gICAgImVuZC4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jOiB0ZXJtaW5hdGUvMiIgbgotICAgICIlJSBQdXJwb3NlOiBTeW5jaHJvbml6ZWQgc2h1dGRvd24gb2YgdGhlIHVuZGVybHlpbmcgc3ViIHN5c3RlbS4iIG4KLSAgICAiJSUgUmV0dXJuczogYW55IiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJ0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4iIG4+Ci0gICAgIidBTW9kdWxlJzpzdG9wKCksIiBuPgotICAgICJvay4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICApCi0gICIqVGhlIHRlbXBsYXRlIG9mIGFuIHN1cGVydmlzb3JfYnJpZGdlIGJlaGF2aW91ci4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLXNrZWwtZ2VuZXJpYy1zZXJ2ZXIKLSAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCi0gICAgIi1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCSIlJSBJbmNsdWRlIGZpbGVzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCW4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGV4cG9ydHMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIi1leHBvcnQoWyIgbj4ic3RhcnRfbGluay8wLCJuPiJzdG9wLzAibj4iXSkuIiBuCi0gICAgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIi1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgIgotICAgICJoYW5kbGVfaW5mby8yLCB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvM10pLiIgbiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSByZWNvcmQgZGVmaW5pdGlvbnMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIi1yZWNvcmQoc3RhdGUsIHt9KS4iIG4gbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgbWFjcm8gZGVmaW5pdGlvbnMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIi1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEBkb2MgU3RhcnRzIHRoZSBzZXJ2ZXIuIiBuCi0gICAgIiUlIEBzcGVjIHN0YXJ0X2xpbmsoKSAtPiB7b2ssIHBpZCgpfSB8IHtlcnJvciwgUmVhc29ufSIgbgotICAgICIlJSBAZW5kIm4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICJzdGFydF9saW5rKCkgLT4iIG4+Ci0gICAgImdlbl9zZXJ2ZXI6c3RhcnRfbGluayh7bG9jYWwsID9TRVJWRVJ9LCA/TU9EVUxFLCBbXSwgW10pLiIgbgotICAgIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEBkb2MgU3RvcHMgdGhlIHNlcnZlci4iIG4KLSAgICAiJSUgQHNwZWMgc3RvcCgpIC0+IG9rIiBuCi0gICAgIiUlIEBlbmQibgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgInN0b3AoKSAtPiIgbj4KLSAgICAiZ2VuX3NlcnZlcjpjYXN0KD9TRVJWRVIsIHN0b3ApLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICIlJSBTZXJ2ZXIgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLQluCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jdGlvbjogaW5pdC8xIiBuCi0gICAgIiUlIERlc2NyaXB0aW9uOiBJbml0aWF0ZXMgdGhlIHNlcnZlciIgbgotICAgICIlJSBSZXR1cm5zOiB7b2ssIFN0YXRlfSAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwiIG4KLSAgICAiJSUgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29ufSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaW5pdChbXSkgLT4iIG4+Ci0gICAgIntvaywgI3N0YXRle319LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmN0aW9uOiBoYW5kbGVfY2FsbC8zIiBuCi0gICAgIiUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYWxsIG1lc3NhZ2VzIiBuCi0gICAgIiUlIFJldHVybnM6IHtyZXBseSwgUmVwbHksIFN0YXRlfSAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtyZXBseSwgUmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8IiBuCi0gICAgIiUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZX0gICAgICAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBTdGF0ZX0gICB8ICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpIiBuCi0gICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJoYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4iIG4+Ci0gICAgIlJlcGx5ID0gb2ssIiBuPgotICAgICJ7cmVwbHksIFJlcGx5LCBTdGF0ZX0uIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0LzIiIG4KLSAgICAiJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhc3QgbWVzc2FnZXMiIG4KLSAgICAiJSUgUmV0dXJuczoge25vcmVwbHksIFN0YXRlfSAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfCIgbgotICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0gICAgICAgICAgICAodGVybWluYXRlLzIgaXMgY2FsbGVkKSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaGFuZGxlX2Nhc3Qoc3RvcCwgU3RhdGUpIC0+IiBuPgotICAgICJ7c3RvcCwgbm9ybWFsLCBTdGF0ZX07IiBuCi0gICAgImhhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0+IiBuPgotICAgICJ7bm9yZXBseSwgU3RhdGV9LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmN0aW9uOiBoYW5kbGVfaW5mby8yIiBuCi0gICAgIiUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcyIgbgotICAgICIlJSBSZXR1cm5zOiB7bm9yZXBseSwgU3RhdGV9ICAgICAgICAgIHwiIG4KLSAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8IiBuCi0gICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4iIG4+Ci0gICAgIntub3JlcGx5LCBTdGF0ZX0uIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuY3Rpb246IHRlcm1pbmF0ZS8yIiBuCi0gICAgIiUlIERlc2NyaXB0aW9uOiBTaHV0ZG93biB0aGUgc2VydmVyIiBuCi0gICAgIiUlIFJldHVybnM6IGFueSAoaWdub3JlZCBieSBnZW5fc2VydmVyKSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAidGVybWluYXRlKFJlYXNvbiwgU3RhdGUpIC0+IiBuPgotICAgICJvay4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jOiBjb2RlX2NoYW5nZS8zIiBuCi0gICAgIiUlIFB1cnBvc2U6IENvbnZlcnQgcHJvY2VzcyBzdGF0ZSB3aGVuIGNvZGUgaXMgY2hhbmdlZCIgbgotICAgICIlJSBSZXR1cm5zOiB7b2ssIE5ld1N0YXRlfSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0+IiBuPgotICAgICJ7b2ssIFN0YXRlfS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgKQotICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGdlbmVyaWMgc2VydmVyLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1nZW4tZXZlbnQKLSAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCi0gICAgIi1iZWhhdmlvdXIoZ2VuX2V2ZW50KS4iIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIiUlIEluY2x1ZGUgZmlsZXMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiLWV4cG9ydChbc3RhcnRfbGluay8wLCBhZGRfaGFuZGxlci8wXSkuIiBuCi0gICAgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgZ2VuX2V2ZW50IGNhbGxiYWNrcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfZXZlbnQvMiwgaGFuZGxlX2NhbGwvMiwgIgotICAgICJoYW5kbGVfaW5mby8yLCB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvM10pLiIgbiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCSIlJSBSZWNvcmQgRGVmaW5pdGlvbnMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIi1yZWNvcmQoc3RhdGUsIHt9KS4iIG4gbiAKLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIiUlIE1hY3JvIERlZmluaXRpb25zIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCSItZGVmaW5lKFNFUlZFUiwgP01PRFVMRSkuIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIFN0YXJ0cyB0aGUgc2VydmVyIiBuCi0gICAgIiUlIEBzcGVjIHN0YXJ0X2xpbmsoKSAtPiB7b2ssIFBpZH0gfCB7ZXJyb3IsIHthbHJlYWR5X3N0YXJ0ZWQsIFBpZH19IiBuCi0gICAgIiUlIEBlbmQiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICJzdGFydF9saW5rKCkgLT4iIG4+Ci0gICAgImdlbl9ldmVudDpzdGFydF9saW5rKHtsb2NhbCwgP1NFUlZFUn0pLiAiIG4KLSAgICBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIEFkZHMgYW4gZXZlbnQgaGFuZGxlciIgbgotICAgICIlJSBAc3BlYyBhZGRfaGFuZGxlcigpIC0+IG9rIHwgeydFWElUJywgUmVhc29ufSIgbgotICAgICIlJSBAZW5kIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiYWRkX2hhbmRsZXIoKSAtPiIgbj4KLSAgICAiZ2VuX2V2ZW50OmFkZF9oYW5kbGVyKD9TRVJWRVIsID9NT0RVTEUsIFtdKS4iIG4gCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIFNlcnZlciBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuYzogaW5pdC8xIiBuCi0gICAgIiUlIFJldHVybnM6IHtvaywgU3RhdGV9ICAgICAgICAgIHwiIG4KLSAgICAiJSUgICAgICAgICAgT3RoZXIiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImluaXQoW10pIC0+IiBuPgotICAgICJ7b2ssICNzdGF0ZXt9fS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jOiBoYW5kbGVfZXZlbnQvMiIgbgotICAgICIlJSBSZXR1cm5zOiB7b2ssIFN0YXRlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7c3dhcF9oYW5kbGVyLCBBcmdzMSwgU3RhdGUxLCBNb2QyLCBBcmdzMn0gfCIgbgotICAgICIlJSAgICAgICAgICByZW1vdmVfaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaGFuZGxlX2V2ZW50KEV2ZW50LCBTdGF0ZSkgLT4iIG4+Ci0gICAgIntvaywgU3RhdGV9LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmM6IGhhbmRsZV9jYWxsLzIiIG4KLSAgICAiJSUgUmV0dXJuczoge29rLCBSZXBseSwgU3RhdGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtzd2FwX2hhbmRsZXIsIFJlcGx5LCBBcmdzMSwgU3RhdGUxLCBNb2QyLCBBcmdzMn0gfCIgbgotICAgICIlJSAgICAgICAgICB7cmVtb3ZlX2hhbmRsZXIsIFJlcGx5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImhhbmRsZV9jYWxsKFJlcXVlc3QsIFN0YXRlKSAtPiIgbj4KLSAgICAiUmVwbHkgPSBvaywiIG4+Ci0gICAgIntvaywgUmVwbHksIFN0YXRlfS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jOiBoYW5kbGVfaW5mby8yIiBuCi0gICAgIiUlIFJldHVybnM6IHtvaywgU3RhdGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtzd2FwX2hhbmRsZXIsIEFyZ3MxLCBTdGF0ZTEsIE1vZDIsIEFyZ3MyfSB8IiBuCi0gICAgIiUlICAgICAgICAgIHJlbW92ZV9oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4iIG4+Ci0gICAgIntvaywgU3RhdGV9LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmM6IHRlcm1pbmF0ZS8yIiBuCi0gICAgIiUlIFB1cnBvc2U6IFNodXRkb3duIHRoZSBzZXJ2ZXIiIG4KLSAgICAiJSUgUmV0dXJuczogYW55IiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJ0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4iIG4+Ci0gICAgIm9rLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmM6IGNvZGVfY2hhbmdlLzMiIG4KLSAgICAiJSUgUHVycG9zZTogQ29udmVydCBwcm9jZXNzIHN0YXRlIHdoZW4gY29kZSBpcyBjaGFuZ2VkIiBuCi0gICAgIiUlIFJldHVybnM6IHtvaywgTmV3U3RhdGV9IiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4iIG4+Ci0gICAgIntvaywgU3RhdGV9LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlJSBJbnRlcm5hbCBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgKQotICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGdlbl9ldmVudC4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLXNrZWwtZ2VuLWZzbQotICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKLSAgICAiLWJlaGF2aW91cihnZW5fZnNtKS4iIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIiUlIEluY2x1ZGUgZmlsZXMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgotICAgICItZXhwb3J0KFtzdGFydF9saW5rLzBdKS4iIG4KLSAgICBuCi0gICAgIiUlIGdlbl9mc20gY2FsbGJhY2tzIiBuCi0gICAgIi1leHBvcnQoW2luaXQvMSwgc3RhdGVfbmFtZS8yLCBzdGF0ZV9uYW1lLzMsIGhhbmRsZV9ldmVudC8zLCIgbj4KLSAgICAiaGFuZGxlX3N5bmNfZXZlbnQvNCwgaGFuZGxlX2luZm8vMywgdGVybWluYXRlLzMsIGNvZGVfY2hhbmdlLzRdKS4iIG4gbgotICAgICItcmVjb3JkKHN0YXRlLCB7fSkuIiBuIAotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuY3Rpb246IHN0YXJ0X2xpbmsvMCIgbgotICAgICIlJSBEZXNjcmlwdGlvbjogU3RhcnRzIHRoZSBzZXJ2ZXIiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICJzdGFydF9saW5rKCkgLT4iIG4+Ci0gICAgImdlbl9mc206c3RhcnRfbGluayh7bG9jYWwsID9TRVJWRVJ9LCA/TU9EVUxFLCBbXSwgW10pLiIgbiAKLSAgICBuCi0gICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLSAgICAiJSUgU2VydmVyIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jOiBpbml0LzEiIG4KLSAgICAiJSUgUmV0dXJuczoge29rLCBTdGF0ZU5hbWUsIFN0YXRlRGF0YX0gICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7b2ssIFN0YXRlTmFtZSwgU3RhdGVEYXRhLCBUaW1lb3V0fSB8IiBuCi0gICAgIiUlICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiIG4KLSAgICAiJSUgICAgICAgICAge3N0b3AsIFN0b3BSZWFzb259ICAgICAgICAgICAgICAgICAgICIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaW5pdChbXSkgLT4iIG4+Ci0gICAgIntvaywgc3RhdGVfbmFtZSwgI3N0YXRle319LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmM6IFN0YXRlTmFtZS8yIiBuCi0gICAgIiUlIFJldHVybnM6IHtuZXh0X3N0YXRlLCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhfSAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtuZXh0X3N0YXRlLCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhLCBUaW1lb3V0fSB8IiBuCi0gICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIE5ld1N0YXRlRGF0YX0gICAgICAgICAgICAgICAgICAgICAgICAgIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJzdGF0ZV9uYW1lKEV2ZW50LCBTdGF0ZURhdGEpIC0+IiBuPgotICAgICJ7bmV4dF9zdGF0ZSwgc3RhdGVfbmFtZSwgU3RhdGVEYXRhfS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jOiBTdGF0ZU5hbWUvMyIgbgotICAgICIlJSBSZXR1cm5zOiB7bmV4dF9zdGF0ZSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YX0gICAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtuZXh0X3N0YXRlLCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhLCBUaW1lb3V0fSAgIHwiIG4KLSAgICAiJSUgICAgICAgICAge3JlcGx5LCBSZXBseSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YX0gICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7cmVwbHksIFJlcGx5LCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhLCBUaW1lb3V0fSB8IiBuCi0gICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIE5ld1N0YXRlRGF0YX0gICAgICAgICAgICAgICAgICAgICAgICAgIHwiIG4KLSAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIE5ld1N0YXRlRGF0YX0gICAgICAgICAgICAgICAgICAgICIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAic3RhdGVfbmFtZShFdmVudCwgRnJvbSwgU3RhdGVEYXRhKSAtPiIgbj4KLSAgICAiUmVwbHkgPSBvaywiIG4+Ci0gICAgIntyZXBseSwgUmVwbHksIHN0YXRlX25hbWUsIFN0YXRlRGF0YX0uIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuYzogaGFuZGxlX2V2ZW50LzMiIG4KLSAgICAiJSUgUmV0dXJuczoge25leHRfc3RhdGUsIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGF9ICAgICAgICAgIHwiIG4KLSAgICAiJSUgICAgICAgICAge25leHRfc3RhdGUsIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGEsIFRpbWVvdXR9IHwiIG4KLSAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgTmV3U3RhdGVEYXRhfSAgICAgICAgICAgICAgICAgICAgICAgICAiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImhhbmRsZV9ldmVudChFdmVudCwgU3RhdGVOYW1lLCBTdGF0ZURhdGEpIC0+IiBuPgotICAgICJ7bmV4dF9zdGF0ZSwgU3RhdGVOYW1lLCBTdGF0ZURhdGF9LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmM6IGhhbmRsZV9zeW5jX2V2ZW50LzQiIG4KLSAgICAiJSUgUmV0dXJuczoge25leHRfc3RhdGUsIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGF9ICAgICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7bmV4dF9zdGF0ZSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YSwgVGltZW91dH0gICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtyZXBseSwgUmVwbHksIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGF9ICAgICAgICAgIHwiIG4KLSAgICAiJSUgICAgICAgICAge3JlcGx5LCBSZXBseSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YSwgVGltZW91dH0gfCIgbgotICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBOZXdTdGF0ZURhdGF9ICAgICAgICAgICAgICAgICAgICAgICAgICB8IiBuCi0gICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBOZXdTdGF0ZURhdGF9ICAgICAgICAgICAgICAgICAgICAiIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImhhbmRsZV9zeW5jX2V2ZW50KEV2ZW50LCBGcm9tLCBTdGF0ZU5hbWUsIFN0YXRlRGF0YSkgLT4iIG4+Ci0gICAgIlJlcGx5ID0gb2ssIiBuPgotICAgICJ7cmVwbHksIFJlcGx5LCBTdGF0ZU5hbWUsIFN0YXRlRGF0YX0uIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuYzogaGFuZGxlX2luZm8vMyIgbgotICAgICIlJSBSZXR1cm5zOiB7bmV4dF9zdGF0ZSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YX0gICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7bmV4dF9zdGF0ZSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YSwgVGltZW91dH0gfCIgbgotICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBOZXdTdGF0ZURhdGF9ICAgICAgICAgICAgICAgICAgICAgICAgICIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiaGFuZGxlX2luZm8oSW5mbywgU3RhdGVOYW1lLCBTdGF0ZURhdGEpIC0+IiBuPgotICAgICJ7bmV4dF9zdGF0ZSwgU3RhdGVOYW1lLCBTdGF0ZURhdGF9LiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmM6IHRlcm1pbmF0ZS8zIiBuCi0gICAgIiUlIFB1cnBvc2U6IFNodXRkb3duIHRoZSBmc20iIG4KLSAgICAiJSUgUmV0dXJuczogYW55IiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJ0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZU5hbWUsIFN0YXREYXRhKSAtPiIgbj4KLSAgICAib2suIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuYzogY29kZV9jaGFuZ2UvNCIgbgotICAgICIlJSBQdXJwb3NlOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQiIG4KLSAgICAiJSUgUmV0dXJuczoge29rLCBOZXdTdGF0ZSwgTmV3U3RhdGVEYXRhfSIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZU5hbWUsIFN0YXRlRGF0YSwgRXh0cmEpIC0+IiBuPgotICAgICJ7b2ssIFN0YXRlTmFtZSwgU3RhdGVEYXRhfS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICkKLSAgIipUaGUgdGVtcGxhdGUgb2YgYSBnZW5fZnNtLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotKGRlZnZhciBlcmxhbmctc2tlbC1saWIKLSAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCSIlJSBJbmNsdWRlIGZpbGVzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotCW4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGV4cG9ydHMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItZXhwb3J0KFsiIG4KLQkiICAgICAgICBdKS4iIG4KLSAgICBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBJbnRlcm5hbCBleHBvcnRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLWV4cG9ydChbIiBuCi0JIiAgICAgICAgXSkuIiBuCi0JbiAKLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIE1hY3JvcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0JbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgUmVjb3JkcyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEV4dGVybmFsIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBAZG9jIiBuCi0gICAgIiUlIEBzcGVjICIgbgotICAgICIlJSBAZW5kICIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgKQotICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGxpYnJhcnkgbW9kdWxlLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotCi0oZGVmdmFyIGVybGFuZy1za2VsLWdlbmVyaWMtbGVhZGVyCi0gICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQotICAgICItYmVoYXZpb3VyKGZzX2dlbl9sZWFkZXIpLiIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgSW5jbHVkZSBmaWxlcyIgbgotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLQluCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICItZXhwb3J0KFsiIG4+InN0YXJ0X2xpbmsvMCwibj4ic3RvcC8wIm4+Il0pLiIgbgotICAgICAgICBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUgZ2VuX2xlYWRlciBjYWxsYmFja3MiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICItZXhwb3J0KFtpbml0LzEsIiBuPgotICAgICAgICAiZWxlY3RlZC8yLCIgbj4KLSAgICAgICAgInN1cnJlbmRlcmVkLzMsIiBuPgotICAgICAgICAiaGFuZGxlX0RPV04vMywiIG4+Ci0gICAgICAgICJoYW5kbGVfbGVhZGVyX2NhbGwvNCwiIG4+Ci0gICAgICAgICJoYW5kbGVfbGVhZGVyX2Nhc3QvMywiIG4+Ci0gICAgICAgICJmcm9tX2xlYWRlci8zLCIgbj4KLSAgICAgICAgImhhbmRsZV9jYWxsLzMsIiBuPgotICAgICAgICAiaGFuZGxlX2Nhc3QvMiwiIG4+Ci0gICAgICAgICJoYW5kbGVfaW5mby8yLCIgbj4KLSAgICAgICAgInRlcm1pbmF0ZS8yLCIgbj4KLSAgICAgICAgImNvZGVfY2hhbmdlLzQiIG4+Ci0gICAgICAgICJdKS4iIG4+Ci0gICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgIiUlIHJlY29yZCBkZWZpbml0aW9ucyIgbgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICItcmVjb3JkKHN0YXRlLCB7fSkuIiBuIG4KLSAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUgbWFjcm8gZGVmaW5pdGlvbnMiIG4KLSAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgotICAgICAgICBuCi0gICAgICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KLSAgICAgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICIlJSBAZG9jIFN0YXJ0cyB0aGUgZ2VuX2xlYWRlci4iIG4KLSAgICAgICAgIiUlIEBzcGVjIHN0YXJ0X2xpbmsoKSAtPiB7b2ssIHBpZCgpfSB8IHtlcnJvciwgUmVhc29ufSIgbgotICAgICAgICAiJSUgQGVuZCJuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAgICAgInN0YXJ0X2xpbmsoKSAtPiIgbj4KLSAgICAgICAgIkNhbmRpZGF0ZXMgPSBbbm9kZSgpfG5vZGVzKCldLCIgbj4KLSAgICAgICAgIldvcmtlcnMgICAgPSBbXSwiIG4+Ci0gICAgICAgICJnZW5fbGVhZGVyOnN0YXJ0X2xpbmsoe2xvY2FsLCA/U0VSVkVSfSwgQ2FuZGlkYXRlcywgV29ya2VycywgP01PRFVMRSwgW10sIFtdKS4iIG4KLSAgICAgICAgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgIiUlIEBkb2MgU3RvcHMgdGhlIGdlbl9sZWFkZXIuIiBuCi0gICAgICAgICIlJSBAc3BlYyBzdG9wKCkgLT4gb2siIG4KLSAgICAgICAgIiUlIEBlbmQibgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICAgICAic3RvcCgpIC0+IiBuPgotICAgICAgICAiZ2VuX2xlYWRlcjpjYXN0KD9TRVJWRVIsIHN0b3ApLiIgbgotICAgICAgICBuCi0gICAgICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgICAgICIlJSBTZXJ2ZXIgZnVuY3Rpb25zIiBuCi0gICAgICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgICAgIG4KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICIlJSBGdW5jdGlvbjogaW5pdC8xIiBuPgotICAgICAgICAiJSUgRGVzY3JpcHRpb246IEluaXRpYXRlcyB0aGUgc2VydmVyIiBuPgotICAgICAgICAiJSUgUmV0dXJuczoge29rLCBTdGF0ZX0gICAgICAgICAgfCIgbj4KLSAgICAgICAgIiUlICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwiIG4+Ci0gICAgICAgICIlJSAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICB8IiBuPgotICAgICAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbn0iIG4+Ci0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiaW5pdChbXSkgLT4iIG4+Ci0gICAgICAgICJ7b2ssICNzdGF0ZXt9fS4iIG4KLSAgICAgICAgbgotCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUgQ2FsbGVkIHdoZW4gd2UgYmVjb21lIHRoZSBsZWFkZXIuIiBuPgotICAgICAgICAiJSUiIG4+Ci0gICAgICAgICIlJSBlbGVjdGVkKFN0YXRlOjpzdGF0ZSgpLCBFOjplbGVjdGlvbigpKSAtPiB7b2ssIEJyb2FkY2FzdCwgTlN0YXRlfSIgbj4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICJlbGVjdGVkKFN0YXRlLCBFKSAtPiIgbj4KLSAgICAgICAgIkJyb2FkY2FzdFRvQWxsQ2FuZGlkYXRlcyA9IFtdLCJuPgotICAgICAgICAie29rLCBCcm9hZGNhc3RUb0FsbENhbmRpZGF0ZXMgLCBTdGF0ZX0uIiBuCi0gICAgICAgIG4KLQotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgIiUlIENhbGxlZCBieSBlYWNoIGNhbmRpZGF0ZSB3aGVuIGl0IHJlY29nbml6ZXMgYW5vdGhlciBpbnN0YW5jZSBhcyBsZWFkZXIuIiBuPgotICAgICAgICAiJSUgU3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNhbmRpZGF0ZSAiIG4+Ci0gICAgICAgICIlJSBhY2tub3dsZWRnZXMgYSBsZWFkZXIgYW5kIHJlY2VpdmVzIGEgU3luY2ggbWVzc2FnZSBpbiByZXR1cm4uIiBuPgotICAgICAgICAiJSUiIG4+Ci0gICAgICAgICIlJSBzdXJyZW5kZXJlZChTdGF0ZTo6c3RhdGUoKSwgU3luY2g6OmJyb2FkY2FzdCgpLCBFOjplbGVjdGlvbigpKSAtPiB7b2ssIE5TdGF0ZX0iIG4+Ci0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAic3VycmVuZGVyZWQoU3RhdGUsIEJDYXN0RnJvbUxlYWRlckVsZWN0ZWRDYWxsLCBFKSAtPiIgbj4KLSAgICAgICAgIntvaywgU3RhdGUjc3RhdGV7bGVhZGVyX25vZGUgPSBMZWFkZXJOb2RlfX0uIm4KLSAgICAgICAgbgotCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUgQ2FsbGVkIGJ5IHRoZSBsZWFkZXIgd2hlbiBpdCBkZXRlY3RzIGxvc3Mgb2YgYSBjYW5kaWRhdGUgbm9kZS4iIG4+Ci0gICAgICAgICIlJSBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGJyb2FkY2FzdCgpIG9iamVjdCwgdGhpcyB3aWxsIiBuPgotICAgICAgICAiJSUgYmUgc2VudCB0byBhbGwgY2FuZGlkYXRlcywgYW5kIHRoZXkgd2lsbCByZWNlaXZlIGl0IGluIHRoZSBmdW5jdGlvbiIgbj4KLSAgICAgICAgIiUlIGxpbmsgZnJvbV9sZWFkZXIvMy4gZnJvbV9sZWFkZXIvMyIgbj4KLSAgICAgICAgIiUlIiBuPgotICAgICAgICAiJSUgaGFuZGxlX0RPV04oTm9kZTo6bm9kZSgpLCBTdGF0ZTo6c3RhdGUoKSwgRTo6ZWxlY3Rpb24oKSkgLT4ge29rLCBOU3RhdGV9IHwge29rLCBCcm9hZGNhc3QsIE5TdGF0ZX0iIG4+Ci0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiaGFuZGxlX0RPV04oTm9kZSwgU3RhdGUsIF9FKSAtPiIgbj4KLSAgICAgICAgIntvaywgU3RhdGV9LiIgbj4KLQotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgIiUlICBoYW5kbGVfbGVhZGVyX2NhbGwoTXNnOjp0ZXJtKCksIEZyb206OmNhbGxlclJlZigpLCBTdGF0ZTo6c3RhdGUoKSwgRTo6ZWxlY3Rpb24oKSkgLT4gIiBuPgotICAgICAgICAiJSUgICAge3JlcGx5LCBSZXBseSwgTlN0YXRlfSB8IiBuPgotICAgICAgICAiJSUgICAge3JlcGx5LCBSZXBseSwgQnJvYWRjYXN0LCBOU3RhdGV9IHwiIG4+Ci0gICAgICAgICIlJSAgICB7bm9yZXBseSwgc3RhdGUoKX0gfCIgbj4KLSAgICAgICAgIiUlICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBOU3RhdGV9IHwiIG4+Ci0gICAgICAgICIlJSAgICBjb21tb25SZXBseSgpIiBuPgotICAgICAgICAiJSUiIG4+Ci0gICAgICAgICIlJSBDYWxsZWQgYnkgdGhlIGxlYWRlciBpbiByZXNwb25zZSB0byBhIGdlbl9sZWFkZXI6bGVhZGVyX2NhbGwvMi4gbGVhZGVyX2NhbGwoKS4iIG4+Ci0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiaGFuZGxlX2xlYWRlcl9jYWxsKE1zZywgX0Zyb20sIFN0YXRlLCBfRSkgLT4iIG4+Ci0gICAgICAgICJ7cmVwbHksIFJlcGx5ID0gW10sIFN0YXRlfS4iIG4KLSAgICAgICAgbgotCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUgQ2FsbGVkIGJ5IHRoZSBsZWFkZXIgaW4gcmVzcG9uc2UgdG8gYSBnZW5fbGVhZGVyOmxlYWRlcl9jYXN0LzIgbGVhZGVyX2Nhc3QoKSIgbj4KLSAgICAgICAgIiUlIGhhbmRsZV9sZWFkZXJfY2FzdChNc2c6OnRlcm0oKSwgU3RhdGU6OnRlcm0oKSwgRTo6ZWxlY3Rpb24oKSkgLT4gY29tbW9uUmVwbHkoKSIgbj4KLSAgICAgICAgIiUlIiBuPgotICAgICAgICAiJSUgQlVHOiBUaGlzIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQuIiBuPgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgImhhbmRsZV9sZWFkZXJfY2FzdChfTXNnLCBTdGF0ZSwgX0UpIC0+IiBuPgotICAgICAgICAie29rLCBTdGF0ZX0uIiBuCi0gICAgICAgIG4KLQotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgIiUlIENhbGxlZCBieSBlYWNoIGNhbmRpZGF0ZSBpbiByZXNwb25zZSB0byBhIG1lc3NhZ2UgZnJvbSB0aGUgbGVhZGVyLiAiIG4+Ci0gICAgICAgICIlJSBJbiB0aGlzIHBhcnRpY3VsYXIgbW9kdWxlLCB0aGUgbGVhZGVyIHBhc3NlcyBhbiB1cGRhdGUgZnVuY3Rpb24gdG8gYmUgIiBuPgotICAgICAgICAiJSUgYXBwbGllZCB0byB0aGUgY2FuZGlkYXRlJ3Mgc3RhdGUuICIgbj4KLSAgICAgICAgIiUlICIgbj4KLSAgICAgICAgIiUlIGZyb21fbGVhZGVyKE1zZzo6dGVybSgpLCBTdGF0ZTo6c3RhdGUoKSwgRTo6ZWxlY3Rpb24oKSkgLT4ge29rLCBOU3RhdGV9ICIgbj4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICJmcm9tX2xlYWRlcihNU0csIFN0YXRlLCBfRSkgLT4gIiBuPgotICAgICAgICAie29rLCBTdGF0ZX0uICIgbgotICAgICAgICBuCi0KLSAgICAgICAgbgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICIlJSBGdW5jdGlvbjogaGFuZGxlX2NhbGwvMyIgbgotICAgICAgICAiJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhbGwgbWVzc2FnZXMiIG4KLSAgICAgICAgIiUlIFJldHVybnM6IHtyZXBseSwgUmVwbHksIFN0YXRlfSAgICAgICAgICB8IiBuCi0gICAgICAgICIlJSAgICAgICAgICB7cmVwbHksIFJlcGx5LCBTdGF0ZSwgVGltZW91dH0gfCIgbgotICAgICAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlfSAgICAgICAgICAgICAgIHwiIG4KLSAgICAgICAgIiUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gICAgICB8IiBuCi0gICAgICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBSZXBseSwgU3RhdGV9ICAgfCAodGVybWluYXRlLzIgaXMgY2FsbGVkKSIgbgotICAgICAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9ICAgICAgICAgICAgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkiIG4KLSAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiaGFuZGxlX2NhbGwoUmVxdWVzdCwgRnJvbSwgU3RhdGUpIC0+IiBuPgotICAgICAgICAiUmVwbHkgPSBvaywiIG4+Ci0gICAgICAgICJ7cmVwbHksIFJlcGx5LCBTdGF0ZX0uIiBuCi0gICAgICAgIG4KLSAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0LzIiIG4KLSAgICAgICAgIiUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYXN0IG1lc3NhZ2VzIiBuCi0gICAgICAgICIlJSBSZXR1cm5zOiB7bm9yZXBseSwgU3RhdGV9ICAgICAgICAgIHwiIG4KLSAgICAgICAgIiUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfCIgbgotICAgICAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9ICAgICAgICAgICAgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkiIG4KLSAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiaGFuZGxlX2Nhc3Qoc3RvcCwgU3RhdGUpIC0+IiBuPgotICAgICAgICAie3N0b3AsIG5vcm1hbCwgU3RhdGV9OyIgbgotICAgICAgICAiaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZSkgLT4iIG4+Ci0gICAgICAgICJ7bm9yZXBseSwgU3RhdGV9LiIgbgotICAgICAgICBuCi0gICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgIiUlIEZ1bmN0aW9uOiBoYW5kbGVfaW5mby8yIiBuCi0gICAgICAgICIlJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgYWxsIG5vbiBjYWxsL2Nhc3QgbWVzc2FnZXMiIG4KLSAgICAgICAgIiUlIFJldHVybnM6IHtub3JlcGx5LCBTdGF0ZX0gICAgICAgICAgfCIgbgotICAgICAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8IiBuCi0gICAgICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0gICAgICAgICAgICAodGVybWluYXRlLzIgaXMgY2FsbGVkKSIgbgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICJoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4iIG4+Ci0gICAgICAgICJ7bm9yZXBseSwgU3RhdGV9LiIgbgotICAgICAgICBuCi0gICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgIiUlIEZ1bmN0aW9uOiB0ZXJtaW5hdGUvMiIgbgotICAgICAgICAiJSUgRGVzY3JpcHRpb246IFNodXRkb3duIHRoZSBzZXJ2ZXIiIG4KLSAgICAgICAgIiUlIFJldHVybnM6IGFueSAoaWdub3JlZCBieSBnZW5fc2VydmVyKSIgbgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICJ0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4iIG4+Ci0gICAgICAgICJvay4iIG4KLSAgICAgICAgbgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICIlJSBGdW5jOiBjb2RlX2NoYW5nZS8zIiBuCi0gICAgICAgICIlJSBQdXJwb3NlOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQiIG4KLSAgICAgICAgIiUlIFJldHVybnM6IHtvaywgTmV3U3RhdGV9IiBuCi0gICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAgICAgImNvZGVfY2hhbmdlKE9sZFZzbiwgU3RhdGUsIF9FLCBfRXh0cmEpIC0+IiBuPgotICAgICAgICAie29rLCBTdGF0ZX0uIiBuCi0gICAgICAgIG4KLSAgICAgICAgCi0gICAgICAgIG4KLSAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICAgICAiJSUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgotICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgICAgICkKLSAgIipUaGUgdGVtcGxhdGUgb2YgYSBnZW5lcmljIGxlYWRlci4KLVBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCi0KLQotKGRlZnZhciBlcmxhbmctc2tlbC1jb3JiYS1jYWxsYmFjawotICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JIiUlIEluY2x1ZGUgZmlsZXMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0JbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCi0gICAgIi1leHBvcnQoWyIgbj4gImluaXQvMSwgIiBuPiAidGVybWluYXRlLzIsIiBuPiAiY29kZV9jaGFuZ2UvMyIgbgotCSIgICAgICAgIF0pLiIgbgotICAgIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEludGVybmFsIGV4cG9ydHMiIG4KLQkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAotICAgICItZXhwb3J0KFsiIG4KLQkiICAgICAgICBdKS4iIG4KLQluIAotCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgTWFjcm9zIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLQluCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBSZWNvcmRzIiBuCi0JKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKLSAgICAiLXJlY29yZChzdGF0ZSwge30pLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KLSAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQotICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKLSAgICAiJSUgRnVuY3Rpb246IGluaXQvMSIgbgotICAgICIlJSBEZXNjcmlwdGlvbjogSW5pdGlhdGVzIHRoZSBzZXJ2ZXIiIG4KLSAgICAiJSUgUmV0dXJuczoge29rLCBTdGF0ZX0gICAgICAgICAgfCIgbgotICAgICIlJSAgICAgICAgICB7b2ssIFN0YXRlLCBUaW1lb3V0fSB8IiBuCi0gICAgIiUlICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgIHwiIG4KLSAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbn0iIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImluaXQoW10pIC0+IiBuPgotICAgICJ7b2ssICNzdGF0ZXt9fS4iIG4KLSAgICBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICIlJSBGdW5jdGlvbjogdGVybWluYXRlLzIiIG4KLSAgICAiJSUgRGVzY3JpcHRpb246IFNodXRkb3duIHRoZSBzZXJ2ZXIiIG4KLSAgICAiJSUgUmV0dXJuczogYW55IChpZ25vcmVkIGJ5IGdlbl9zZXJ2ZXIpIiBuCi0gICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQotICAgICJ0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4iIG4+Ci0gICAgIm9rLiIgbgotICAgIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEZ1bmN0aW9uOiBjb2RlX2NoYW5nZS8zIiBuCi0gICAgIiUlIERlc2NyaXB0aW9uOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQiIG4KLSAgICAiJSUgUmV0dXJuczoge29rLCBOZXdTdGF0ZX0iIG4KLSAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCi0gICAgImNvZGVfY2hhbmdlKE9sZFZzbiwgU3RhdGUsIEV4dHJhKSAtPiIgbj4KLSAgICAie29rLCBTdGF0ZX0uIiBuCi0gICAgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgIiUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgotICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCi0gICAgKQotICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGxpYnJhcnkgbW9kdWxlLgotUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKLQotCi0MCi07OyBGb250LWxvY2sgdmFyaWFibGVzCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1tb2Rlcm4tcAotICAoY29uZCAoKD49IGVybGFuZy1lbWFjcy1tYWpvci12ZXJzaW9uIDIwKSB0KQotCShlcmxhbmcteGVtYWNzLXAgKD49IGVybGFuZy1lbWFjcy1taW5vci12ZXJzaW9uIDE0KSkKLQkoKD0gZXJsYW5nLWVtYWNzLW1ham9yLXZlcnNpb24gMTkpICg+PSBlcmxhbmctZW1hY3MtbWlub3ItdmVyc2lvbiAyOSkpCi0JKHQgbmlsKSkKLSAgIk5vbi1uaWwgd2hlbiB0aGlzIHZlcnNpb24gb2YgRW1hY3MgdXNlcyBhIG1vZGVybiB2ZXJzaW9uIG9mIEZvbnQgTG9jay4KLQotVGhpcyBpcyBkZXRlcm1pbmF0ZWQgYnkgY2hlY2tpbmcgdGhlIHZlcnNpb24gb2YgRW1hY3MgdXNlZCwgdGhlIGFjdHVhbAotZm9udC1sb2NrIGNvZGUgaXMgbm90IGxvYWRlZC4iKQotCi0KLTs7IFRoZSBuZXh0IGZldyB2YXJpYWJsZXMgZGVmaW5lIGRpZmZlcmVudCBFcmxhbmcgZm9udC1sb2NrIHBhdHRlcm5zLgotOzsgVGhleSBjb3VsZCBiZSBhcHBlbmRlZCB0byBmb3JtIGEgY3VzdG9tIGZvbnQtbG9jayBhcHBlYXJlbmNlLgotOzsKLTs7IFRoZSBmdW5jdGlvbiBgZXJsYW5nLWZvbnQtbG9jay1zZXQtZmFjZScgY291bGQgYmUgdXNlZCB0byBjaGFuZ2UKLTs7IHRoZSBmYWNlIG9mIGEgcGF0dGVybi4KLTs7Ci07OyBOb3RlIHRoYXQgRXJsYW5nIHN0cmluZ3MgYW5kIGF0b21zIGFyZSBoaWdodGxpZ2h0ZWQgd2l0aCB1c2luZwotOzsgc3ludGFjdGl4IGFuYWx5c2lzLgotCi0oZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtZnVuYwotICAobGlzdAotICAgKGxpc3QgKGNvbmNhdCAiXiIgZXJsYW5nLWF0b20tcmVnZXhwICJcXHMgKigiKQotCSAxICdmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlIHQpKQotICAiRm9udCBsb2NrIGtleXdvcmQgaGlnaGxpZ2h0aW5nIGEgZnVuY3Rpb24gaGVhZGVyLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1kb2xsYXIKLSAgKGxpc3QKLSAgIChsaXN0ICJcXChcXCRcXChbXlxcXVxcfFxcXFxcXChbXjAtN15cbl1cXHxbMC03XStcXHxcXF5bYS16QS1aXVxcKVxcKVxcKSIKLQkgMSAnZm9udC1sb2NrLXN0cmluZy1mYWNlKSkKLSAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBudW1iZXJzIGluIGFzY2lpLWZvcm0gKGUuZy4gJEEpLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1hcnJvdwotICAobGlzdAotICAgKGxpc3QgIlxcKC0+XFx8Oi1cXClcXChcXHMgXFx8JFxcKSIgMiAnZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkpCi0gICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgY2xhdXNlIGFycm93LiIpCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1sYwotICAobGlzdAotICAgKGxpc3QgIlxcKDwtXFwpXFwoXFxzIFxcfCRcXCkiIDEgJ2ZvbnQtbG9jay1rZXl3b3JkLWZhY2UpCi0gICAobGlzdCAiXFwofHxcXClcXChcXHMgXFx8JFxcKSIgMSAnZm9udC1sb2NrLWtleXdvcmQtZmFjZSkpCi0gICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgbGlzdCBjb21wcmVoZW5zaW9uIG9wZXJhdG9ycy4iKQotCi0oZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMta2V5d29yZHMKLSAgKGxpc3QKLSAgIChsaXN0IChjb25jYXQgIlxcPFxcKGFmdGVyXFx8YmVnaW5cXHxjXFwoYXRjaFxcfGFzZVxcKVxcfGVuZFxcfGZ1blxcfGlmIgotCQkgIlxcfG9mXFx8cmVjZWl2ZVxcfHdoZW5cXHxxdWVyeVxcKVxcKFteYS16QS1aMC05X11cXHwkXFwpIikKLQkgMSAnZm9udC1sb2NrLWtleXdvcmQtZmFjZSkpCi0gICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgRXJsYW5nIGtleXdvcmRzLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1hdHRyCi0gIChsaXN0Ci0gICAgKGxpc3QgKGNvbmNhdCAiXlxcKC0iIGVybGFuZy1hdG9tLXJlZ2V4cCAiXFwpXFxzICpcXChcXC5cXHwoXFwpIikKLQkgIDEgJ2ZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UpKQotICAiRm9udCBsb2NrIGtleXdvcmQgaGlnaGxpZ2h0aW5nIGF0dHJpYnVlcy4iKQotCi0oZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtcXVvdGVzCi0gIChsaXN0Ci0gICAgKGxpc3QgImBcXChbLSthLXpBLVowLTlfOipdWy0rYS16QS1aMC05XzoqXStcXCknIgotCSAgMQotCSAgKGlmIGVybGFuZy1mb250LWxvY2stbW9kZXJuLXAKLQkgICAgICAnZm9udC1sb2NrLXJlZmVyZW5jZS1mYWNlCi0JICAgICdmb250LWxvY2sta2V5d29yZC1mYWNlKQotCSAgdCkpCi0gICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgd29yZHMgaW4gc2luZ2xlIHF1b3RlcyBpbiBjb21tZW50cy4KLQotVGhpcyBpcyBub3QgdGhlIGtleXdvcmQgaGlnaHRsaWdodGluZyBFcmxhbmcgc3RyaW5ncyBhbmQgYXRvbXMsIHRoZXkKLWFyZSBoaWdobGlnaHRlZCBieSBzeW50YWN0aWMgYW5hbHlzaXMuIikKLQotOzsgTm90ZTogVGhlIGd1YXJkIGBmbG9hdCcgY29sbGlkZXMgd2l0aCB0aGUgYmlmIGBmbG9hdCcuCi0oZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtZ3VhcmRzCi0gIChsaXN0Ci0gICAobGlzdAotCi0gICAgOzsgWFhYOiAKLTsgICAgIChjb25jYXQgIlxcPCIKLTsgCSAgICAocmVnZXhwLW9wdCAnKCJhdG9tIiAiYmluYXJ5IiAiY29uc3RhbnQiICJmbG9hdCIgImludGVnZXIiICJsaXN0IiAKLTsgCQkJICAibnVtYmVyIiAicGlkIiAicG9ydCIgInJlZmVyZW5jZSIgInJlY29yZCIgInR1cGxlIikgCi07IAkJCXQpCi07IAkgICAgIlxcPiIpCi0KLSAgICAoY29uY2F0ICJcXDxcXChhdG9tXFx8YmluYXJ5XFx8Y29uc3RhbnRcXHxmbG9hdFxcfGludGVnZXJcXHxsaXN0XFx8IgotCSAgICAibnVtYmVyXFx8cFxcKGlkXFx8b3J0XFwpXFx8cmVcXChmZXJlbmNlXFx8Y29yZFxcKVxcfHR1cGxlIgotCSAgICAiXFwpXFxzICooIikKLQotCSAxCi0JIChpZiBlcmxhbmctZm9udC1sb2NrLW1vZGVybi1wCi0JICAgICAnZm9udC1sb2NrLXJlZmVyZW5jZS1mYWNlCi0JICAgJ2ZvbnQtbG9jay1rZXl3b3JkLWZhY2UpKSkKLSAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBndWFyZHMuIikKLQotKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWJpZnMKLSAgKGxpc3QKLSAgICAobGlzdAotICAgICAoY29uY2F0Ci0gICAgICAiXFw8XFwoIgotICAgICAgImFcXChic1xcfGxpdmVcXHxwcGx5XFx8dG9tX3RvX2xpc3RcXClcXHwiCi0gICAgICAiYmluYXJ5X3RvX1xcKGxpc3RcXHx0ZXJtXFwpXFx8IgotICAgICAgImNvbmNhdF9iaW5hcnlcXHxkXFwoYXRlXFx8aXNjb25uZWN0X25vZGVcXClcXHwiCi0gICAgICAiZVxcKGxlbWVudFxcfHJhc2VcXHx4aXRcXClcXHwiCi0gICAgICAiZmxvYXRcXChcXHxfdG9fbGlzdFxcKVxcfCIKLSAgICAgICJnXFwoYXJiYWdlX2NvbGxlY3RcXHxldFxcKFxcfF9rZXlzXFwpXFx8cm91cF9sZWFkZXJcXClcXHwiCi0gICAgICAiaFxcKGFsdFxcfGRcXClcXHwiCi0gICAgICAiaVxcKG50ZVxcKGdlcl90b19saXN0XFx8cm5hbF9iaWZcXClcXHxzX2FsaXZlXFwpXFx8IgotICAgICAgImxcXChlbmd0aFxcfGlcXChua1xcfHN0X3RvX1xcKGF0b21cXHxiaW5hcnlcXHxmbG9hdFxcfGludGVnZXIiCi0gICAgICAiXFx8cGlkXFx8dHVwbGVcXClcXClcXClcXHwiCi0gICAgICAibWFrZV9yZWZcXHxub1xcKGRlXFwoXFx8X1xcKGxpbmtcXHx1bmxpbmtcXClcXHxzXFwpXFx8dGFsaXZlXFwpXFx8IgotICAgICAgIm9wZW5fcG9ydFxcfCIKLSAgICAgICJwXFwoaWRfdG9fbGlzdFxcfHJvY2Vzc1xcKF9cXChmbGFnXFx8aW5mb1xcKVxcfGVzXFwpXFx8dXRcXClcXHwiCi0gICAgICAiclxcKGVnaXN0ZXJcXChcXHxlZFxcKVxcfG91bmRcXClcXHwiCi0gICAgICAic1xcKGVcXChsZlxcfHRlbGVtZW50XFwpXFx8aXplXFx8IgotICAgICAgInBcXChhd25cXChcXHxfbGlua1xcKVxcfGxpdF9iaW5hcnlcXClcXHx0YXRpc3RpY3NcXClcXHwiCi0gICAgICAidFxcKGVybV90b19iaW5hcnlcXHxocm93XFx8aW1lXFx8bFxcfCIKLSAgICAgICJyXFwoYWNlXFx8dW5jXFwpXFx8dXBsZV90b19saXN0XFwpXFx8IgotICAgICAgInVuXFwobGlua1xcfHJlZ2lzdGVyXFwpXFx8d2hlcmVpcyIKLSAgICAgICJcXClcXHMgKigiKQotICAgICAxCi0gICAgICdmb250LWxvY2sta2V5d29yZC1mYWNlKSkKLSAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBidWlsdCBpbiBmdW5jdGlvbnMuIikKLQotKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLW1hY3JvcwotICAobGlzdAotICAgKGxpc3QgKGNvbmNhdCAiP1xccyAqXFwoIiBlcmxhbmctYXRvbS1yZWdleHAKLQkJICJcXHwiIGVybGFuZy12YXJpYWJsZS1yZWdleHAgIlxcKVxcPiIpCi0JIDEgKGlmIGVybGFuZy1mb250LWxvY2stbW9kZXJuLXAKLQkgICAgICAgJ2ZvbnQtbG9jay1yZWZlcmVuY2UtZmFjZQotCSAgICAgJ2ZvbnQtbG9jay10eXBlLWZhY2UpKQotICAgKGxpc3QgKGNvbmNhdCAiXi1cXChkZWZpbmVcXHxpZm4/ZGVmXFwpXFxzICooXFxzICpcXCgiIGVybGFuZy1hdG9tLXJlZ2V4cAotCQkgIlxcfCIgZXJsYW5nLXZhcmlhYmxlLXJlZ2V4cCAiXFwpXFw+IikKLQkgMiAoaWYgZXJsYW5nLWZvbnQtbG9jay1tb2Rlcm4tcAotCSAgICAgICAnZm9udC1sb2NrLXJlZmVyZW5jZS1mYWNlCi0JICAgICAnZm9udC1sb2NrLXR5cGUtZmFjZSkpKQotICAiRm9udCBsb2NrIGtleXdvcmQgaGlnaGxpZ2h0aW5nIG1hY3Jvcy4KLVRoaXMgbXVzdCBiZSBwbGFjZWQgaW4gZnJvbnQgb2YgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtdmFycycuIikKLQotKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLXJlY29yZHMKLSAgKGxpc3QKLSAgIChsaXN0IChjb25jYXQgIiNcXHMgKiIgZXJsYW5nLWF0b20tcmVnZXhwICJcXD4iKQotCSAxICdmb250LWxvY2stdHlwZS1mYWNlKQotICAgOzsgRG9uJ3QgaGlnaGxpZ2h0IG51bWVyaWNhbCBjb25zdGFudHMuCi0gICAobGlzdCAiXFw8WzAtOV1bMC05XT8jXFwoWzAtOWEtZkFfRl0rXFwpXFw+IgotCSAxIG5pbCB0KQotICAgKGxpc3QgKGNvbmNhdCAiXi1yZWNvcmQoXFxzICoiIGVybGFuZy1hdG9tLXJlZ2V4cCAiXFw+IikKLQkgMSAnZm9udC1sb2NrLXR5cGUtZmFjZSkpCi0gICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgRXJsYW5nIHJlY29yZHMuCi1UaGlzIG11c3QgYmUgcGxhY2VkIGluIGZyb250IG9mIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLXZhcnMnLiIpCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy12YXJzCi0gIChsaXN0Ci0gICAgKGxpc3QgKGNvbmNhdCAiXFw8IiBlcmxhbmctdmFyaWFibGUtcmVnZXhwICJcXD4iKQotCSAgMSAoaWYgZXJsYW5nLWZvbnQtbG9jay1tb2Rlcm4tcAotCQknZm9udC1sb2NrLXZhcmlhYmxlLW5hbWUtZmFjZQotCSAgICAgICdmb250LWxvY2stdHlwZS1mYWNlKSkpCi0gICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgRXJsYW5nIHZhcmlhYmxlcy4KLU11c3QgYmUgcHJlY2VkZWQgYnkgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtbWFjcm9zJyBhbmQgYC1yZWNvcmRzJwotdG8gd29yayBwcm9wZXJseS4iKQotCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0xCi0gIChhcHBlbmQgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1mdW5jCi0JICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWRvbGxhcgotCSAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1hcnJvdwotCSAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1rZXl3b3JkcykKLSAgOzsgRG9jU3RyaW5nT3JpZzogZXJsYW5nLWZvbnQtbG9jay1rZXl3b3JkcwotICAiRm9udC1sb2NrIGtleXdvcmRzIHVzZWQgYnkgRXJsYW5nIE1vZGUuCi0KLVRoZXJlIGV4aXN0cyB0aHJlZSBsZXZlbHMgb2YgRm9udCBMb2NrIGtleXdvcmRzIGZvciBFcmxhbmc6Ci0gIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEnIC0gRnVuY3Rpb24gaGVhZGVycyBhbmQgcmVzZXJ2ZWQga2V5d29yZHMuCi0gIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTInIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2VsIHF1b3RlcycuCi0gIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMnIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCi0KLVRvIHVzZSBhIHNwZWNpZmljIGxldmVsLCBwbGVhc2Ugc2V0IHRoZSB2YXJpYWJsZQotYGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24nIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXZlbC4gIE5vdGUgdGhhdCB0aGUKLXZhcmlhYmxlIG11c3QgYmUgc2V0IGJlZm9yZSBFcmxhbmcgbW9kZSBpcyBhY3RpdmF0ZWQuCi0KLUV4YW1wbGU6Ci0gICAgKHNldHEgZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbiAyKSIpCi0KLQotKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTIKLSAgKGFwcGVuZCBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEKLQkgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtYXR0cgotCSAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1xdW90ZXMKLQkgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtZ3VhcmRzCi0JICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWJpZnMpCi0gIDs7IERvY1N0cmluZ0NvcHk6IGVybGFuZy1mb250LWxvY2sta2V5d29yZHMKLSAgIkZvbnQtbG9jayBrZXl3b3JkcyB1c2VkIGJ5IEVybGFuZyBNb2RlLgotCi1UaGVyZSBleGlzdHMgdGhyZWUgbGV2ZWxzIG9mIEZvbnQgTG9jayBrZXl3b3JkcyBmb3IgRXJsYW5nOgotICBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0xJyAtIEZ1bmN0aW9uIGhlYWRlcnMgYW5kIHJlc2VydmVkIGtleXdvcmRzLgotICBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0yJyAtIEJpZnMsIGd1YXJkcyBhbmQgYHNpbmdsZSBxdW90ZXMnLgotICBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0zJyAtIFZhcmlhYmxlcywgbWFjcm9zIGFuZCByZWNvcmRzLgotCi1UbyB1c2UgYSBzcGVjaWZpYyBsZXZlbCwgcGxlYXNlIHNldCB0aGUgdmFyaWFibGUKLWBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uJyB0byB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwuICBOb3RlIHRoYXQgdGhlCi12YXJpYWJsZSBtdXN0IGJlIHNldCBiZWZvcmUgRXJsYW5nIG1vZGUgaXMgYWN0aXZhdGVkLgotCi1FeGFtcGxlOgotICAgIChzZXRxIGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24gMikiKQotCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0zCi0gIChhcHBlbmQgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0yCi0JICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLW1hY3JvcwotCSAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1yZWNvcmRzCi0JICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLXZhcnMpCi0gIDs7IERvY1N0cmluZ0NvcHk6IGVybGFuZy1mb250LWxvY2sta2V5d29yZHMKLSAgIkZvbnQtbG9jayBrZXl3b3JkcyB1c2VkIGJ5IEVybGFuZyBNb2RlLgotCi1UaGVyZSBleGlzdHMgdGhyZWUgbGV2ZWxzIG9mIEZvbnQgTG9jayBrZXl3b3JkcyBmb3IgRXJsYW5nOgotICBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0xJyAtIEZ1bmN0aW9uIGhlYWRlcnMgYW5kIHJlc2VydmVkIGtleXdvcmRzLgotICBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0yJyAtIEJpZnMsIGd1YXJkcyBhbmQgYHNpbmdsZSBxdW90ZXMnLgotICBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0zJyAtIFZhcmlhYmxlcywgbWFjcm9zIGFuZCByZWNvcmRzLgotCi1UbyB1c2UgYSBzcGVjaWZpYyBsZXZlbCwgcGxlYXNlIHNldCB0aGUgdmFyaWFibGUKLWBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uJyB0byB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwuICBOb3RlIHRoYXQgdGhlCi12YXJpYWJsZSBtdXN0IGJlIHNldCBiZWZvcmUgRXJsYW5nIG1vZGUgaXMgYWN0aXZhdGVkLgotCi1FeGFtcGxlOgotICAgIChzZXRxIGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24gMikiKQotCi0KLShkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMKLSAgOzsgRG9jU3RyaW5nQ29weTogZXJsYW5nLWZvbnQtbG9jay1rZXl3b3JkcwotICAiRm9udC1sb2NrIGtleXdvcmRzIHVzZWQgYnkgRXJsYW5nIE1vZGUuCi0KLVRoZXJlIGV4aXN0cyB0aHJlZSBsZXZlbHMgb2YgRm9udCBMb2NrIGtleXdvcmRzIGZvciBFcmxhbmc6Ci0gIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEnIC0gRnVuY3Rpb24gaGVhZGVycyBhbmQgcmVzZXJ2ZWQga2V5d29yZHMuCi0gIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTInIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2xlIHF1b3RlcycuCi0gIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMnIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCi0KLVRvIHVzZSBhIHNwZWNpZmljIGxldmVsLCBwbGVhc2Ugc2V0IHRoZSB2YXJpYWJsZQotYGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24nIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXZlbC4gIE5vdGUgdGhhdCB0aGUKLXZhcmlhYmxlIG11c3QgYmUgc2V0IGJlZm9yZSBFcmxhbmcgbW9kZSBpcyBhY3RpdmF0ZWQuCi0KLUV4YW1wbGU6Ci0gICAgKHNldHEgZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbiAyKSIpCi0KLQotKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLXN5bnRheC10YWJsZSBuaWwKLSAgIlN5bnRheCB0YWJsZSB1c2VkIGJ5IEZvbnQgTG9jayBtb2RlLgotCi1UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBzdGFuZGFyZCBFcmxhbmcgTW9kZQotc3ludGF4IHRhYmxlIGlzIHRoYXQgYF8nIGlzIHRyZWF0ZWQgYXMgcGFydCBvZiB3b3JkcyBieQotdGhpcyBzeW50YXggdGFibGUuCi0KLVVuZm9ydHVhbnRlbHksIFhFbWFjcyBoYXNuJ3QgZ290IHN1cHBvcnQgZm9yIGEgc3BlY2lhbCBGb250Ci1Mb2NrIHN5bnRheCB0YWJsZS4gIFRoZSBlZmZlY3QgaXMgdGhhdCBgYXBwbHknIGluIHRoZSBhdG9tCi1gZm9vX2FwcGx5JyB3aWxsIGJlIGhpZ2hsaWdodGVkIGFzIGEgYmlmLiIpCi0KLQwKLTs7OyBBdm9pZCBlcnJvcnMgd2hpbGUgY29tcGlsaW5nIHRoaXMgZmlsZS4KLQotOzsgYGV2YWwtd2hlbi1jb21waWxlJyBpcyBub3QgZGVmaW5lZCBpbiBFbWFjcyAxOC4gIFdlIGRlZmluZSBpdCBhcyBhCi07OyBuby1vcC4KLShvciAoZmJvdW5kcCAnZXZhbC13aGVuLWNvbXBpbGUpCi0gICAgKGRlZm1hY3JvIGV2YWwtd2hlbi1jb21waWxlICgmcmVzdCByZXN0KSBuaWwpKQotCi07OyBUaGVzZSB1bW0uLi5mdW5jdGlvbnMgYXJlIG5ldyBpbiBFbWFjcyAyMC4gQW5kLCB5ZXMsIHVudGlsIHZlcnNpb24KLTs7IDE5LjI3IEVtYWNzIGJhY2txdW90ZXMgd2VyZSB0aGlzIHVnbHkuCi0KLShvciAoZmJvdW5kcCAndW5sZXNzKQotICAgIChkZWZtYWNybyB1bmxlc3MgKGNvbmRpdGlvbiAmcmVzdCBib2R5KQotICAgICAgIih1bmxlc3MgQ09ORElUSU9OIEJPRFkuLi4pOiBJZiBDT05ESVRJT04gaXMgZmFsc2UsIGRvIEJPRFksIGVsc2UgcmV0dXJuIG5pbC4iCi0gICAgICAoYCAoaWYgKCwgY29uZGl0aW9uKSAKLQkgICAgIG5pbCAKLQkgICAoLEAgYm9keSkpKSkpCi0KLShvciAoZmJvdW5kcCAnd2hlbikKLSAgICAoZGVmbWFjcm8gd2hlbiAoY29uZGl0aW9uICZyZXN0IGJvZHkpCi0gICAgICAiKHdoZW4gQ09ORElUSU9OIEJPRFkuLi4pOiBJZiBDT05ESVRJT04gaXMgdHJ1ZSwgZG8gQk9EWSwgZWxzZSByZXR1cm4gbmlsLiIKLSAgICAgIChgIChpZiAoLCBjb25kaXRpb24pCi0JICAgICAocHJvZ24gKCxAIGJvZHkpKSAKLQkgICBuaWwpKSkpCi0KLShvciAoZmJvdW5kcCAnY2hhci1iZWZvcmUpCi0gICAgKGRlZm1hY3JvIGNoYXItYmVmb3JlICgmb3B0aW9uYWwgcG9zKQotICAgICAgIlJldHVybiB0aGUgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGJ1ZmZlciBqdXN0IGJlZm9yZSBQT1MuIgotICAgICAgKGAgKGNoYXItYWZ0ZXIgKDEtIChvciAoLCBwb3MpIChwb2ludCkpKSkpKSkKLQkJCSAgIAotKG9yIChmYm91bmRwICdyZWdleHAtb3B0KQotICAgIChkZWZ1biByZWdleHAtb3B0IChzdHJpbmdzICZvcHRpb25hbCBwYXJlbikKLSAgICAgICJSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGFueSBzdHJpbmcgaW4KLVNUUklOR1MuIElmIFBBUkVOIGlzIHRydWUsIGl0IHdpbGwgYWx3YXlzIGVuY2xvc2UgdGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuIAotCi1Vbmxpa2UgaXRzIEVtYWNzLTIwIG5hbWVzYWtlLCBpdCB3aWxsIG5vdCBvcHRpbWl6ZSB0aGUgZ2VuZXJhdGVkCi1leHByZXNzaW9uLiIKLSAgICAgIDs7IFRoaXMgc3RvcC1nYXAgZGVmaW5pdGlvbiBpcyB0YWtlbiBmcm9tCi0gICAgICA7OyBfR05VX0VtYWNzX0xpc3BfUmVmZXJlbmNlX01hbnVhbF8sIGVkIDIuNSwgZm9yIEVtYWNzIDIwLjMuCi0gICAgICAobGV0ICgob3BlbiAoaWYgcGFyZW4gIlxcKCIgIiIpKQotCSAgICAoY2xvc2UgKGlmIHBhcmVuICJcXCkiICIiKSkpCi0JKGNvbmNhdCBvcGVuCi0JCShtYXBjb25jYXQgJ3JlZ2V4cC1xdW90ZSBzdHJpbmdzICJcXHwiKQotCQljbG9zZSkpKSkKLQotKGV2YWwtd2hlbi1jb21waWxlCi0gIChpZiAob3IgKGZlYXR1cmVwICdieXRlY29tcCkKLQkgIChmZWF0dXJlcCAnYnl0ZS1jb21waWxlKSkKLSAgICAgIChwcm9nbgotCShjb25kICgoc3RyaW5nLW1hdGNoICJMdWNpZFxcfFhFbWFjcyIgZW1hY3MtdmVyc2lvbikKLQkgICAgICAgKHB1dCAnY29tbWVudC1pbmRlbnQtaG9vayAnYnl0ZS1vYnNvbGV0ZS12YXJpYWJsZSBuaWwpCi0JICAgICAgIDs7IERvIG5vdCB3YXJuIGZvciB1bnVzZWQgdmFyaWFibGVzCi0JICAgICAgIDs7IHdoZW4gY29tcGlsaW5nIHVuZGVyIFhFbWFjcy4KLQkgICAgICAgKHNldHEgYnl0ZS1jb21waWxlLXdhcm5pbmdzCi0JCSAgICAgJyhmcmVlLXZhcnMgdW5yZXNvbHZlZCBjYWxsYXJncyByZWRlZmluZSkpKSkKLQkocmVxdWlyZSAnY29taW50KQotCShyZXF1aXJlICdjb21waWxlKSkpKQotCi0MCi0oZGVmdW4gZXJsYW5nLXZlcnNpb24gKCkKLSAgIlJldHVybiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEVybGFuZyBtb2RlLiIKLSAgKGludGVyYWN0aXZlKQotICAoaWYgKGludGVyYWN0aXZlLXApCi0gICAgICAobWVzc2FnZSAiRXJsYW5nIG1vZGUgdmVyc2lvbiAlcywgd3JpdHRlbiBieSBBbmRlcnMgTGluZGdyZW4iCi0JICAgICAgIGVybGFuZy12ZXJzaW9uKSkKLSAgZXJsYW5nLXZlcnNpb24pCi0KLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBlcmxhbmctbW9kZSAoKQotICAiTWFqb3IgbW9kZSBmb3IgZWRpdGluZyBFcmxhbmcgc291cmNlIGZpbGVzIGluIEVtYWNzLgotSXQga25vd3MgYWJvdXQgc3ludGF4IGFuZCBjb21tZW50LCBpdCBjYW4gaW5kZW50IGNvZGUsIGl0IGlzIGNhcGFibGUKLW9mIGZvbnRpZnlpbmcgdGhlIHNvdXJjZSBmaWxlLCB0aGUgVEFHUyBjb21tYW5kcyBhcmUgYXdhcmUgb2YgRXJsYW5nCi1tb2R1bGVzLCBhbmQgdGhlIEVybGFuZyBtYW4gcGFnZXMgY2FuIGJlIGFjY2Vzc2VkLgotCi1TaG91bGQgdGhpcyBtb2R1bGUsIFwiZXJsYW5nLmVsXCIsIGJlIGluc3RhbGxlZCBwcm9wZXJseSwgRXJsYW5nIG1vZGUKLWlzIGFjdGl2YXRlZCB3aGVuZXZlciBhbiBFcmxhbmcgc291cmNlIG9yIGhlYWRlciBmaWxlIGlzIGxvYWRlZCBpbnRvCi1FbWFjcy4gIFRvIGluZGljYXRlIHRoaXMsIHRoZSBtb2RlIGxpbmUgc2hvdWxkIGNvbnRhaW4gdGhlIHdvcmQKLVwiRXJsYW5nXCIuCi0KLVRoZSBtYWluIGZlYXR1cmUgb2YgRXJsYW5nIG1vZGUgaXMgaW5kZW50YXRpb24sIHByZXNzIFRBQiBhbmQgdGhlCi1jdXJyZW50IGxpbmUgd2lsbCBiZSBpbmRlbnRlZCBjb3JyZWN0bHkuCi0KLUNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggb25seSBvbmUgYCUnIGFyZSBpbmRlbnRlZCB0byB0aGUgY29sdW1uIHN0b3JlZAotaW4gdGhlIHZhcmlhYmxlIGBjb21tZW50LWNvbHVtbicuICBDb21tZW50cyBzdGFydGluZyB3aXRoIHR3byBgJSc6cwotYXJlIGluZGVudGVkIHdpdGggdGhlIHNhbWUgaW5kZW50YXRpb24gYXMgY29kZS4gIENvbW1lbnRzIHN0YXJ0aW5nCi13aXRoIGF0IGxlYXN0IHRocmVlIGAlJzpzIGFyZSBpbmRlbnRlZCB0byB0aGUgZmlyc3QgY29sdW1uLgotCi1Ib3dldmVyLCBFcmxhbmcgbW9kZSBjb250YWlucyBtdWNoIG1vcmUsIHRoaXMgaXMgYSBsaXN0IG9mIHRoZSBtb3N0Ci11c2VmdWwgY29tbWFuZHM6Ci0gICAgIFRBQiAgICAgLSBJbmRlbnQgdGhlIGxpbmUuCi0gICAgIEMtYyBDLXEgLSBJbmRlbnQgY3VycmVudCBmdW5jdGlvbi4KLSAgICAgTS07ICAgICAtIENyZWF0ZSBhIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4KLSAgICAgTS1xICAgICAtIEZpbGwgYSBjb21tZW50LCBpLmUuIHdyYXAgbGluZXMgc28gdGhhdCB0aGV5IChob3BlZnVsbHkpCi0JCSB3aWxsIGxvb2sgYmV0dGVyLgotICAgICBNLWEgICAgIC0gR290byB0aGUgYmVnaW5uaW5nIG9mIGFuIEVybGFuZyBjbGF1c2UuCi0gICAgIE0tQy1hICAgLSBEaXR0byBmb3IgZnVuY3Rpb24uCi0gICAgIE0tZSAgICAgLSBHb3RvIHRoZSBlbmQgb2YgYW4gRXJsYW5nIGNsYXVzZS4KLSAgICAgTS1DLWUgICAtIERpdHRvIGZvciBmdW5jdGlvbi4KLSAgICAgTS1oICAgICAtIE1hcmsgY3VycmVudCBFcmxhbmcgY2xhdXNlLgotICAgICBNLUMtaCAgIC0gRGl0dG8gZm9yIGZ1bmN0aW9uLgotICAgICBDLWMgQy16IC0gU3RhcnQsIG9yIHN3aXRjaCB0bywgYW4gaW5mZXJpb3IgRXJsYW5nIHNoZWxsLgotICAgICBDLWMgQy1rIC0gQ29tcGlsZSBjdXJyZW50IGZpbGUuCi0gICAgIEMteCBgICAgLSBOZXh0IGVycm9yLgotICAgICAsICAgICAgIC0gRWxlY3RyaWMgY29tbWEuCi0gICAgIDsgICAgICAgLSBFbGVjdHJpYyBzZW1pY29sb24uCi0KLUVybGFuZyBtb2RlIGNoZWNrIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGFnYWluc3QgdGhlIG1vZHVsZSBuYW1lIHdoZW4KLXNhdmluZywgd2hlbmV2ZXIgYSBtaXNtYXRjaCBvY2N1cnMgRXJsYW5nIG1vZGUgb2ZmZXJzIHRvIG1vZGlmeSB0aGUKLXNvdXJjZS4KLQotVGhlIHZhcmlhYmxlIGBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMnIGNvbnRyb2xzIHRoZSBlbGVjdHJpYwotY29tbWFuZHMuICBUbyBkZWFjdGl2YXRlIGFsbCBvZiB0aGVtLCBzZXQgaXQgdG8gbmlsLgotCi1UaGVyZSBleGlzdHMgYSBsYXJnZSBudW1iZXIgb2YgY29tbWFuZHMgYW5kIHZhcmlhYmxlcyBpbiB0aGUgRXJsYW5nCi1tb2R1bGUuICBQbGVhc2UgcHJlc3MgYE0teCBhcHJvcG9zIFJFVCBlcmxhbmcgUkVUJyB0byBzZWUgYSBjb21wbGV0ZQotbGlzdC4gIFByZXNzIGBDLWggZiBuYW1lLW9mLWZ1bmN0aW9uIFJFVCcgYW5kIGBDLWggdiBuYW1lLW9mLXZhcmlhYmxlCi1SRVQndG8gc2VlIHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLAotcmVzcGVjdGl2ZWx5LgotCi1PbiBlbnRyeSB0byB0aGlzIG1vZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBob29rIGBlcmxhbmctbW9kZS1ob29rJyBpcwotZXhlY3V0ZWQuCi0KLVBsZWFzZSBzZWUgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBgZXJsYW5nLmVsJyBmb3IgbW9yZSBpbmZvcm1hdGlvbgotYW5kIGV4YW1wbGVzIG9mIGhvb2tzLgotCi1PdGhlciBjb21tYW5kczoKLVxce2VybGFuZy1tb2RlLW1hcH0iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKGtpbGwtYWxsLWxvY2FsLXZhcmlhYmxlcykKLSAgKHNldHEgbWFqb3ItbW9kZSAnZXJsYW5nLW1vZGUpCi0gIChzZXRxIG1vZGUtbmFtZSAiRXJsYW5nIikKLSAgKGVybGFuZy1zeW50YXgtdGFibGUtaW5pdCkKLSAgKGVybGFuZy1rZXltYXAtaW5pdCkKLSAgKGVybGFuZy1lbGVjdHJpYy1pbml0KQotICAoZXJsYW5nLW1lbnUtaW5pdCkKLSAgKGVybGFuZy1tb2RlLXZhcmlhYmxlcykKLSAgKGVybGFuZy1jaGVjay1tb2R1bGUtbmFtZS1pbml0KQotICAoZXJsYW5nLWFkZC1jb21waWxhdGlvbi1hbGlzdCBlcmxhbmctZXJyb3ItcmVnZXhwLWFsaXN0KQotICAoZXJsYW5nLW1hbi1pbml0KQotICAoZXJsYW5nLXRhZ3MtaW5pdCkKLSAgKGVybGFuZy1mb250LWxvY2staW5pdCkKLSAgKGVybGFuZy1za2VsLWluaXQpCi0gIChydW4taG9va3MgJ2VybGFuZy1tb2RlLWhvb2spCi0gIChpZiAoemVyb3AgKGJ1ZmZlci1zaXplKSkKLSAgICAgIChydW4taG9va3MgJ2VybGFuZy1uZXctZmlsZS1ob29rKSkpCi0KLQotKGRlZnVuIGVybGFuZy1zeW50YXgtdGFibGUtaW5pdCAoKQotICAoaWYgKG51bGwgZXJsYW5nLW1vZGUtc3ludGF4LXRhYmxlKQotICAgIChsZXQgKCh0YWJsZSAobWFrZS1zeW50YXgtdGFibGUpKSkKLSAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cbiAiPiIgdGFibGUpCi0gICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XCIgIlwiIiB0YWJsZSkKLSAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8jICIuIiB0YWJsZSkKLSAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8kICIvIiB0YWJsZSkKLSAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8lICI8IiB0YWJsZSkKLSAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8mICIuIiB0YWJsZSkKLSAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cJyAiXCIiIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyogIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPysgIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPy0gIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPy8gIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPzogIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPzwgIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPz0gIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPz4gIi4iIHRhYmxlKQotICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xcICJcXCIgdGFibGUpCi0gICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XyAiXyIgdGFibGUpCi0gICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/fCAiLiIgdGFibGUpCi0gICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XiAiLyIgdGFibGUpCi0KLSAgICAgIDs7IFBzZXVkbyBiaXQtc3ludGF4OiBMYXRpbjEgZG91YmxlIGFuZ2xlIHF1b3RlcyBhcyBwYXJlbnMuCi0gICAgICA7Oyhtb2RpZnktc3ludGF4LWVudHJ5ID9cMjUzICIoP1wyNzMiIHRhYmxlKQotICAgICAgOzsobW9kaWZ5LXN5bnRheC1lbnRyeSA/XDI3MyAiKT9cMjUzIiB0YWJsZSkKLQotICAgICAgKHNldHEgZXJsYW5nLW1vZGUtc3ludGF4LXRhYmxlIHRhYmxlKSkpCi0KLSAgKHNldC1zeW50YXgtdGFibGUgZXJsYW5nLW1vZGUtc3ludGF4LXRhYmxlKSkKLQotCi0oZGVmdW4gZXJsYW5nLWtleW1hcC1pbml0ICgpCi0gIChpZiBlcmxhbmctbW9kZS1tYXAKLSAgICAgIG5pbAotICAgIChzZXRxIGVybGFuZy1tb2RlLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkKLSAgICAoZXJsYW5nLW1vZGUtY29tbWFuZHMgZXJsYW5nLW1vZGUtbWFwKSkKLSAgKHVzZS1sb2NhbC1tYXAgZXJsYW5nLW1vZGUtbWFwKSkKLQotCi0oZGVmdW4gZXJsYW5nLW1vZGUtY29tbWFuZHMgKG1hcCkKLSAgKGRlZmluZS1rZXkgbWFwICJcdCIgICAgICAgICdlcmxhbmctaW5kZW50LWNvbW1hbmQpCi0gIChkZWZpbmUta2V5IG1hcCAiOyIJICAgICAgJ2VybGFuZy1lbGVjdHJpYy1zZW1pY29sb24pCi0gIChkZWZpbmUta2V5IG1hcCAiLCIJICAgICAgJ2VybGFuZy1lbGVjdHJpYy1jb21tYSkKLSAgKGRlZmluZS1rZXkgbWFwICI8IiAgICAgICAgICdlcmxhbmctZWxlY3RyaWMtbHQpCi0gIChkZWZpbmUta2V5IG1hcCAiPiIgICAgICAgICAnZXJsYW5nLWVsZWN0cmljLWd0KQotICAoZGVmaW5lLWtleSBtYXAgIlxDLW0iICAgICAgJ2VybGFuZy1lbGVjdHJpYy1uZXdsaW5lKQotICAoZGVmaW5lLWtleSBtYXAgIlwxNzciICAgICAgJ2JhY2t3YXJkLWRlbGV0ZS1jaGFyLXVudGFiaWZ5KQotICAoZGVmaW5lLWtleSBtYXAgIlxNLXEiICAgICAgJ2VybGFuZy1maWxsLXBhcmFncmFwaCkKLSAgKGRlZmluZS1rZXkgbWFwICJcTS1cQy1hIiAgICdlcmxhbmctYmVnaW5uaW5nLW9mLWZ1bmN0aW9uKQotICAoZGVmaW5lLWtleSBtYXAgIlxNLVxDLWUiICAgJ2VybGFuZy1lbmQtb2YtZnVuY3Rpb24pCi0gIChkZWZpbmUta2V5IG1hcCAiXE0tXEMtaCIgICAnZXJsYW5nLW1hcmstZnVuY3Rpb24pCi0gIChkZWZpbmUta2V5IG1hcCAiXE0tXHQiICAgICAnZXJsYW5nLWNvbXBsZXRlLXRhZykKLSAgKGRlZmluZS1rZXkgbWFwICJcQy1jXE0tXHQiICd0ZW1wby1jb21wbGV0ZS10YWcpCi0gIChkZWZpbmUta2V5IG1hcCAiXEMtY1xNLWEiICAnZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCi0gIChkZWZpbmUta2V5IG1hcCAiXEMtY1xNLWIiICAndGVtcG8tYmFja3dhcmQtbWFyaykKLSAgKGRlZmluZS1rZXkgbWFwICJcQy1jXE0tZSIgICdlcmxhbmctZW5kLW9mLWNsYXVzZSkKLSAgKGRlZmluZS1rZXkgbWFwICJcQy1jXE0tZiIgICd0ZW1wby1mb3J3YXJkLW1hcmspCi0gIChkZWZpbmUta2V5IG1hcCAiXEMtY1xNLWgiICAnZXJsYW5nLW1hcmstY2xhdXNlKQotICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1jIiAgJ2NvbW1lbnQtcmVnaW9uKQotICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1qIiAgJ2VybGFuZy1nZW5lcmF0ZS1uZXctY2xhdXNlKQotICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1rIiAgJ2VybGFuZy1jb21waWxlKQotICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1sIiAgJ2VybGFuZy1jb21waWxlLWRpc3BsYXkpCi0gIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLXMiICAnZXJsYW5nLXNob3ctc3ludGFjdGljLWluZm9ybWF0aW9uKQotICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1xIiAgJ2VybGFuZy1pbmRlbnQtZnVuY3Rpb24pCi0gIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLXUiICAnZXJsYW5nLXVuY29tbWVudC1yZWdpb24pCi0gIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLXkiICAnZXJsYW5nLWNsb25lLWFyZ3VtZW50cykKLSAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMteiIgICdlcmxhbmctc2hlbGwtZGlzcGxheSkKLSAgKGRlZmluZS1rZXkgbWFwICJcQy14YCIgICAgICdlcmxhbmctbmV4dC1lcnJvcikpCi0KLQotKGRlZnVuIGVybGFuZy1lbGVjdHJpYy1pbml0ICgpCi0gIDs7IFNldCB1cCBlbGVjdHJpYyBjaGFyYWN0ZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aAotICA7OyBkZWxzZWwvcGVuZGluZy1kZWwgbW9kZS4gQWxzbywgc2V0IHVwIHRleHQgcHJvcGVydGllcyBmb3IgYml0Ci0gIDs7IHN5bnRheCBoYW5kbGluZy4KLSAgKG1hcGNhciAjJyhsYW1iZGEgKGNtZCkKLQkgICAgICAocHV0IGNtZCAnZGVsZXRlLXNlbGVjdGlvbiB0KQk7Zm9yIGRlbHNlbCAoRW1hY3MpCi0JICAgICAgKHB1dCBjbWQgJ3BlbmRpbmctZGVsZXRlIHQpKQk7Zm9yIHBlbmRpbmctZGVsIChYRW1hY3MpCi0JICAnKGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24KLQkgICAgZXJsYW5nLWVsZWN0cmljLWNvbW1hCi0JICAgIGVybGFuZy1lbGVjdHJpYy1ndCkpCi0KLSAgKHB1dCAnYml0c3ludGF4LW9wZW4tb3V0ZXIgJ3N5bnRheC10YWJsZSAnKDQgLiA/PikpCi0gIChwdXQgJ2JpdHN5bnRheC1vcGVuLW91dGVyICdyZWFyLW5vbnN0aWNreSAnKGNhdGVnb3J5KSkKLSAgKHB1dCAnYml0c3ludGF4LW9wZW4taW5uZXIgJ3JlYXItbm9uc3RpY2t5ICcoY2F0ZWdvcnkpKQotICAocHV0ICdiaXRzeW50YXgtY2xvc2UtaW5uZXIgJ3JlYXItbm9uc3RpY2t5ICcoY2F0ZWdvcnkpKQotICAocHV0ICdiaXRzeW50YXgtY2xvc2Utb3V0ZXIgJ3N5bnRheC10YWJsZSAnKDUgLiA/PCkpCi0gIChwdXQgJ2JpdHN5bnRheC1jbG9zZS1vdXRlciAncmVhci1ub25zdGlja3kgJyhjYXRlZ29yeSkpCi0gIChzZXRxIHBhcnNlLXNleHAtbG9va3VwLXByb3BlcnRpZXMgJ3QpKQotCi0KLQotKGRlZnVuIGVybGFuZy1tb2RlLXZhcmlhYmxlcyAoKQotICAob3IgZXJsYW5nLW1vZGUtYWJicmV2LXRhYmxlCi0gICAgICAoZGVmaW5lLWFiYnJldi10YWJsZSAnZXJsYW5nLW1vZGUtYWJicmV2LXRhYmxlICgpKSkKLSAgKHNldHEgbG9jYWwtYWJicmV2LXRhYmxlIGVybGFuZy1tb2RlLWFiYnJldi10YWJsZSkKLSAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1zdGFydCkKLSAgKHNldHEgcGFyYWdyYXBoLXN0YXJ0IChjb25jYXQgIl4kXFx8IiBwYWdlLWRlbGltaXRlcikpCi0gIChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJhZ3JhcGgtc2VwYXJhdGUpCi0gIChzZXRxIHBhcmFncmFwaC1zZXBhcmF0ZSBwYXJhZ3JhcGgtc3RhcnQpCi0gIChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJhZ3JhcGgtaWdub3JlLWZpbGwtcHJlZml4KQotICAoc2V0cSBwYXJhZ3JhcGgtaWdub3JlLWZpbGwtcHJlZml4IHQpCi0gIChtYWtlLWxvY2FsLXZhcmlhYmxlICdyZXF1aXJlLWZpbmFsLW5ld2xpbmUpCi0gIChzZXRxIHJlcXVpcmUtZmluYWwtbmV3bGluZSB0KQotICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZGVmdW4tcHJvbXB0LXJlZ2V4cCkKLSAgKHNldHEgZGVmdW4tcHJvbXB0LXJlZ2V4cCBlcmxhbmctZGVmdW4tcHJvbXB0LXJlZ2V4cCkKLSAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2NvbW1lbnQtc3RhcnQpCi0gIChzZXRxIGNvbW1lbnQtc3RhcnQgIiUiKQotICAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29tbWVudC1zdGFydC1za2lwKQotICAoc2V0cSBjb21tZW50LXN0YXJ0LXNraXAgIiUrXFxzICoiKQotICAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29tbWVudC1jb2x1bW4pCi0gIChzZXRxIGNvbW1lbnQtY29sdW1uIDQ4KQotICAobWFrZS1sb2NhbC12YXJpYWJsZSAnaW5kZW50LWxpbmUtZnVuY3Rpb24pCi0gIChzZXRxIGluZGVudC1saW5lLWZ1bmN0aW9uICdlcmxhbmctaW5kZW50LWNvbW1hbmQpCi0gIChtYWtlLWxvY2FsLXZhcmlhYmxlICdpbmRlbnQtcmVnaW9uLWZ1bmN0aW9uKQotICAoc2V0cSBpbmRlbnQtcmVnaW9uLWZ1bmN0aW9uICdlcmxhbmctaW5kZW50LXJlZ2lvbikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29tbWVudC1pbmRlbnQtZnVuY3Rpb24pICdlcmxhbmctY29tbWVudC1pbmRlbnQpCi0gIChpZiAoPD0gZXJsYW5nLWVtYWNzLW1ham9yLXZlcnNpb24gMTgpCi0gICAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdjb21tZW50LWluZGVudC1ob29rKSAnZXJsYW5nLWNvbW1lbnQtaW5kZW50KSkKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFyc2Utc2V4cC1pZ25vcmUtY29tbWVudHMpIHQpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2RhYmJyZXYtY2FzZS1mb2xkLXNlYXJjaCkgbmlsKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdpbWVudS1wcmV2LWluZGV4LXBvc2l0aW9uLWZ1bmN0aW9uKQotICAgICAgICdlcmxhbmctYmVnaW5uaW5nLW9mLWZ1bmN0aW9uKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdpbWVudS1leHRyYWN0LWluZGV4LW5hbWUtZnVuY3Rpb24pCi0gICAgICAgJ2VybGFuZy1nZXQtZnVuY3Rpb24tbmFtZSkKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAndGVtcG8tbWF0Y2gtZmluZGVyKQotICAgICAgICJbXi1hLXpBLVowLTlfXVxcKFstYS16QS1aMC05X10qXFwpXFw9IikpCi0KLQotOzsgQ29tcGlsYXRpb24uCi07OwotOzsgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQgcGFja2FnZSBgY29tcGlsYXRpb24nLAotOzsgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGdvIHRvIGVycm9ycyB1c2luZyBgZXJsYW5nLW5leHQtZXJyb3InLgotOzsKLTs7IFRoZSBub3JtYWwgYGNvbXBpbGUnIGNvbW1hbmQgd29ya3Mgb2Zjb3Vyc2UuICBGb3IgYmVzdCByZXN1bHQsIHBsZWFzZQotOzsgZXhlY3V0ZSBgbWFrZScgd2l0aCB0aGUgYC13JyBmbGFnLgotOzsKLTs7IFBsZWFzZSBzZWUgdGhlIHZhcmlhYmxlcyBuYW1lZCBgY29tcGlsaW5nLS4uJyBhYm92ZS4KLQotKGRlZnVuIGVybGFuZy1hZGQtY29tcGlsYXRpb24tYWxpc3QgKGFsaXN0KQotICAocmVxdWlyZSAnY29tcGlsZSkKLSAgKGNvbmQgKChib3VuZHAgJ2NvbXBpbGF0aW9uLWVycm9yLXJlZ2V4cC1hbGlzdCkgOyBFbWFjcyAxOQotCSAod2hpbGUgYWxpc3QKLQkgICAob3IgKGFzc29jIChjYXIgKGNhciBhbGlzdCkpIGNvbXBpbGF0aW9uLWVycm9yLXJlZ2V4cC1hbGlzdCkKLQkgICAgICAgKHNldHEgY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0Ci0JCSAgICAgKGNvbnMgKGNhciBhbGlzdCkgY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0KSkpCi0JICAgKHNldHEgYWxpc3QgKGNkciBhbGlzdCkpKSkKLQkoKGJvdW5kcCAnY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwKQotCSA7OyBFbWFjcyAxOCwgIE9ubHkgb25lIHJlZ2V4cCBpcyBhbGxvd2VkLgotCSAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpCi0JCSAgJ2NvbXBpbGF0aW9uLWVycm9yLXJlZ2V4cCAoY2FyIChjYXIgYWxpc3QpKSkpKSkKLQwKLShkZWZ1biBlcmxhbmctZm9udC1sb2NrLWluaXQgKCkKLSAgIkluaXRpYWxpemUgRm9udCBMb2NrIGZvciBFcmxhbmcgbW9kZS4iCi0gIChvciBlcmxhbmctZm9udC1sb2NrLXN5bnRheC10YWJsZQotICAgICAgKHNldHEgZXJsYW5nLWZvbnQtbG9jay1zeW50YXgtdGFibGUKLQkgICAgKGxldCAoKHRhYmxlIChjb3B5LXN5bnRheC10YWJsZSBlcmxhbmctbW9kZS1zeW50YXgtdGFibGUpKSkKLQkgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XyAidyIgdGFibGUpCi0JICAgICAgdGFibGUpKSkKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLXN5bnRheC10YWJsZSkKLSAgICAgICBlcmxhbmctZm9udC1sb2NrLXN5bnRheC10YWJsZSkKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWJlZ2lubmluZy1vZi1zeW50YXgtZnVuY3Rpb24pCi0gICAgICAgJ2VybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlKQotICAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWtleXdvcmRzKQotICAobGV0ICgobGV2ZWwgKGNvbmQgKChib3VuZHAgJ2ZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24pCi0JCSAgICAgIChzeW1ib2wtdmFsdWUgJ2ZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24pKQotCQkgICAgICgoYm91bmRwICdmb250LWxvY2stdXNlLW1heGltYWwtZGVjb3JhdGlvbikKLQkJICAgICAgKHN5bWJvbC12YWx1ZSAnZm9udC1sb2NrLXVzZS1tYXhpbWFsLWRlY29yYXRpb24pKQotCQkgICAgICh0IG5pbCkpKSkKLSAgICAoaWYgKGNvbnNwIGxldmVsKQotCShzZXRxIGxldmVsIChjZHItc2FmZSAob3IgKGFzc3EgJ2VybGFuZy1tb2RlIGxldmVsKQotCQkJCSAgKGFzc3EgdCBsZXZlbCkpKSkpCi0gICAgOzsgYGxldmVsJyBjYW4gaGVyZSBiZToKLSAgICA7OyAgICAgIEEgbnVtYmVyIC0gVGhlIGZvbnRpZmljYXRpb24gbGV2ZWwKLSAgICA7OyAgICAgIG5pbCAgICAgIC0gVXNlIHRoZSBkZWZhdWx0Ci0gICAgOzsgICAgICB0ICAgICAgICAtIFVzZSBtYXhpbXVtCi0gICAgKGNvbmQgKChlcSBsZXZlbCBuaWwpCi0JICAgKHNldCAnZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMpKQotCSAgKChlcSBsZXZlbCAxKQotCSAgIChzZXQgJ2ZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEpKQotCSAgKChlcSBsZXZlbCAyKQotCSAgIChzZXQgJ2ZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTIpKQotCSAgKHQKLQkgICAoc2V0ICdmb250LWxvY2sta2V5d29yZHMgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0zKSkpKQotCi0gIDs7IE1vZGVybiBmb250LWxvY2tzIGNhbiBoYW5kbGUgdGhlIGFib3ZlIG11Y2ggbW9yZSBlbGVnYW50OgotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdmb250LWxvY2stZGVmYXVsdHMpCi0gICAgICAgJygoZXJsYW5nLWZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEKLSAgICAgICAgICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy0zKQotCSBuaWwgbmlsICgoP18gLiAidyIpKSBlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZQotCSAoZm9udC1sb2NrLWNvbW1lbnQtc3RhcnQtcmVnZXhwIC4gIiUiKQotCSAoZm9udC1sb2NrLW1hcmstYmxvY2stZnVuY3Rpb24gLiBlcmxhbmctbWFyay1jbGF1c2UpKSkpCi0KLQotCi07OyBVc2VmdWwgd2hlbiBkZWZpbmlnIHlvdXQgb3duIGtleXdvcmRzLgotKGRlZnVuIGVybGFuZy1mb250LWxvY2stc2V0LWZhY2UgKGtzICZyZXN0IGZhY2VzKQotICAiUmVwbGFjZSB0aGUgZmFjZSBjb21wb25lbnRzIGluIGEgbGlzdCBvZiBrZXl3b3Jkcy4KLQotVGhlIGZpcnN0IGFyZ3VtZW50LCBLUywgaXMgYSBsaXN0IG9mIGtleXdvcmRzLiAgVGhlIHJlc3Qgb2YgdGhlCi1hcmd1bWVudHMgYXJlIGV4cHJlc3Npb25zIHRvIHJlcGxhY2UgdGhlIGZhY2UgaW5mb3JtYXRpb24gd2l0aC4gIFRoZQotZmlyc3QgZXhwcmVzc2lvbiByZXBsYWNlcyB0aGUgZmFjZSBvZiB0aGUgZmlyc3Qga2V5d29yZCwgdGhlIHNlY29uZAotZXhwcmVzc2lvbiB0aGUgc2Vjb25kIGtleXdvcmQgZXRjLgotCi1TaG91bGQgYW4gZXhwcmVzc2lvbiBiZSBuaWwsIHRoZSBmYWNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGtleXdvcmQgaXMKLW5vdCBjaGFuZ2VkLgotCi1TaG91bGQgZmV3ZXIgZXhwcmVzc2lvbnMgdGhhbiBrZXl3b3JkcyBiZSBnaXZlbiwgdGhlIGxhc3QgZXhwcmVzc2lvbgotaXMgdXNlZCBmb3IgYWxsIHJlbWFpbmluZyBrZXl3b3Jkcy4KLQotTm9ybWFsbHksIHRoZSBleHByZXNzaW9ucyBhcmUganVzdCBhdG9tcyByZXByZXNlbnRpbmcgdGhlIG5ldyBmYWNlLgotVGhleSBjb3VsZCBob3dldmVyIGJlIG1vcmUgY29tcGxleCwgcmV0dXJuaW5nIGRpZmZlcmVudCBmYWNlcyBpbgotZGlmZmVyZW50IHNpdHVhdGlvbnMuCi0KLVRoaXMgZnVuY3Rpb24gZG9lcyBvbmx5IGhhbmRsZSBrZXl3b3JkcyB3aXRoIGVsZW1lbnRzIG9uIHRoZSBmb3JtczoKLSAgKFJFR0VYUCBOVU1CRVIgRkFDRSkKLSAgKFJFR0VYUCBOVU1CRVIgRkFDRSBPVkVSV1JJVEUpCi0KLVRoaXMgY291bGQgYmUgdXNlZCB3aGVuIGRlZmluaW5nIHlvdXIgb3duIHNwZWNpYWwgZm9udC1sb2NrIHNldHVwLCBlLmc6Ci0KLVwoc2V0cSBteS1mb250LWxvY2sta2V5d29yZHMKLSAgICAgIChhcHBlbmQgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1mdW5jCi0gICAgICAgICAgICAgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtZG9sbGFyCi0gICAgICAgICAgICAgIChlcmxhbmctZm9udC1sb2NrLXNldC1mYWNlCi0gICAgICAgICAgICAgICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLW1hY3JvcyAnbXktbmVvbi1ncmVlbi1mYWNlKQotICAgICAgICAgICAgICAoZXJsYW5nLWZvbnQtbG9jay1zZXQtZmFjZQotICAgICAgICAgICAgICAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1sYyAnbXktZGVlcC1yZWQgJ215LWxpZ2h0LXJlZCkKLSAgICAgICAgICAgICAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1hdHRyKSkKLQotRm9yIGEgbW9yZSBlbGFib3JhdGUgZXhhbXBsZSwgcGxlYXNlIHNlZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCi1gZXJsYW5nLmVsJy4iCi0gIChsZXQgKChyZXMgJygpKSkKLSAgICAod2hpbGUga3MKLSAgICAgIChsZXQqICgocmVnZXhwIChjYXIgKGNhciBrcykpKQotCSAgICAgKG51bWJlciAoY2FyIChjZHIgKGNhciBrcykpKSkKLQkgICAgIChuZXctZmFjZSAoaWYgKGFuZCBmYWNlcyAoY2FyIGZhY2VzKSkKLQkJCSAgIChjYXIgZmFjZXMpCi0JCQkgKGNhciAoY2RyIChjZHIgKGNhciBrcykpKSkpKQotCSAgICAgKG92ZXJ3cml0ZSAoY2FyIChjZHIgKGNkciAoY2RyIChjYXIga3MpKSkpKSkKLQkgICAgIChuZXcta2V5d29yZCAobGlzdCByZWdleHAgbnVtYmVyIG5ldy1mYWNlKSkpCi0JKGlmIG92ZXJ3cml0ZSAobmNvbmMgbmV3LWtleXdvcmQgKGxpc3Qgb3ZlcndyaXRlKSkpCi0JKHNldHEgcmVzIChjb25zIG5ldy1rZXl3b3JkIHJlcykpCi0JKHNldHEga3MgKGNkciBrcykpCi0JKGlmIChhbmQgZmFjZXMgKGNkciBmYWNlcykpCi0JICAgIChzZXRxIGZhY2VzIChjZHIgZmFjZXMpKSkpKQotICAgIChucmV2ZXJzZSByZXMpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWZvbnQtbG9jay1sZXZlbC0wICgpCi0gIDs7IERvY1N0cmluZ09yaWc6IGZvbnQtY21kCi0gICJGb250aWZ5IGN1cnJlbnQgYnVmZmVyLiBMZXZlbCByYW5nZXMgZnJvbSAwIChvZmYpIHRvIDMgKENocmlzdG1hcyBUcmVlKS4KLQotVGhlIGZvbGxvd2luZyBmb250aWZpY2F0aW9uIGxldmVsIGV4aXN0czoKLSAgMCAtIE5vIGZvbnRpZmljYXRpb24KLSAgMSAtIEZ1bmN0aW9uIGhlYWRlcnMsIHJlc2VydmVkIGtleXdvcmRzLCBzdHJpbmdzIGFuZCBjb21tZW50cy4KLSAgMiAtIEJpZnMsIGd1YXJkcyBhbmQgYHNpbmdsZSBxdW90ZXMnLgotICAzIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCi0KLVRvIGF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgZm9udCBsb2NrIG1vZGUsIHBsYWNlIHRoZSBmb2xsb3dpbmcgbGluZXMKLWluIHlvdXIgfi8uZW1hY3MgZmlsZToKLQotXChkZWZ1biBteS1lcmxhbmctbW9kZS1ob29rICgpCi0gIChjb25kICh3aW5kb3ctc3lzdGVtCi0JIChmb250LWxvY2stbW9kZSAxKSkpKQotXChhZGQtaG9vayAnZXJsYW5nLW1vZGUtaG9vayAnbXktZXJsYW5nLW1vZGUtaG9vaykKLVwoc2V0cSBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uIHQpIgotICAoaW50ZXJhY3RpdmUpCi0gIChmb250LWxvY2stbW9kZSAwKSkKLQotCi0oZGVmdW4gZXJsYW5nLWZvbnQtbG9jay1sZXZlbC0xICgpCi0gIDs7IERvY1N0cmluZ0NvcHk6IGZvbnQtY21kCi0gICJGb250aWZ5IGN1cnJlbnQgYnVmZmVyLiBMZXZlbCByYW5nZXMgZnJvbSAwIChvZmYpIHRvIDMgKENocmlzdG1hcyBUcmVlKS4KLQotVGhlIGZvbGxvd2luZyBmb250aWZpY2F0aW9uIGxldmVsIGV4aXN0czoKLSAgMCAtIE5vIGZvbnRpZmljYXRpb24KLSAgMSAtIEZ1bmN0aW9uIGhlYWRlcnMsIHJlc2VydmVkIGtleXdvcmRzLCBzdHJpbmdzIGFuZCBjb21tZW50cy4KLSAgMiAtIEJpZnMsIGd1YXJkcyBhbmQgYHNpbmdsZSBxdW90ZXMnLgotICAzIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCi0KLVRvIGF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgZm9udCBsb2NrIG1vZGUsIHBsYWNlIHRoZSBmb2xsb3dpbmcgbGluZXMKLWluIHlvdXIgfi8uZW1hY3MgZmlsZToKLQotXChkZWZ1biBteS1lcmxhbmctbW9kZS1ob29rICgpCi0gIChjb25kICh3aW5kb3ctc3lzdGVtCi0JIChmb250LWxvY2stbW9kZSAxKSkpKQotXChhZGQtaG9vayAnZXJsYW5nLW1vZGUtaG9vayAnbXktZXJsYW5nLW1vZGUtaG9vaykKLVwoc2V0cSBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uIHQpIgotICAoaW50ZXJhY3RpdmUpCi0gIChyZXF1aXJlICdmb250LWxvY2spCi0gIChzZXQgJ2ZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEpCi0gIChmb250LWxvY2stbW9kZSAxKQotICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdmb250LWxvY2stZm9udGlmeS1idWZmZXIpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWZvbnQtbG9jay1sZXZlbC0yICgpCi0gIDs7IERvY1N0cmluZ0NvcHk6IGZvbnQtY21kCi0gICJGb250aWZ5IGN1cnJlbnQgYnVmZmVyLiBMZXZlbCByYW5nZXMgZnJvbSAwIChvZmYpIHRvIDMgKENocmlzdG1hcyBUcmVlKS4KLQotVGhlIGZvbGxvd2luZyBmb250aWZpY2F0aW9uIGxldmVsIGV4aXN0czoKLSAgMCAtIE5vIGZvbnRpZmljYXRpb24KLSAgMSAtIEZ1bmN0aW9uIGhlYWRlcnMsIHJlc2VydmVkIGtleXdvcmRzLCBzdHJpbmdzIGFuZCBjb21tZW50cy4KLSAgMiAtIEJpZnMsIGd1YXJkcyBhbmQgYHNpbmdsZSBxdW90ZXMnLgotICAzIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCi0KLVRvIGF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgZm9udCBsb2NrIG1vZGUsIHBsYWNlIHRoZSBmb2xsb3dpbmcgbGluZXMKLWluIHlvdXIgfi8uZW1hY3MgZmlsZToKLQotXChkZWZ1biBteS1lcmxhbmctbW9kZS1ob29rICgpCi0gIChjb25kICh3aW5kb3ctc3lzdGVtCi0JIChmb250LWxvY2stbW9kZSAxKSkpKQotXChhZGQtaG9vayAnZXJsYW5nLW1vZGUtaG9vayAnbXktZXJsYW5nLW1vZGUtaG9vaykKLVwoc2V0cSBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uIHQpIgotICAoaW50ZXJhY3RpdmUpCi0gIChyZXF1aXJlICdmb250LWxvY2spCi0gIChzZXQgJ2ZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTIpCi0gIChmb250LWxvY2stbW9kZSAxKQotICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdmb250LWxvY2stZm9udGlmeS1idWZmZXIpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWZvbnQtbG9jay1sZXZlbC0zICgpCi0gIDs7IERvY1N0cmluZ0NvcHk6IGZvbnQtY21kCi0gICJGb250aWZ5IGN1cnJlbnQgYnVmZmVyLiBMZXZlbCByYW5nZXMgZnJvbSAwIChvZmYpIHRvIDMgKENocmlzdG1hcyBUcmVlKS4KLQotVGhlIGZvbGxvd2luZyBmb250aWZpY2F0aW9uIGxldmVsIGV4aXN0czoKLSAgMCAtIE5vIGZvbnRpZmljYXRpb24KLSAgMSAtIEZ1bmN0aW9uIGhlYWRlcnMsIHJlc2VydmVkIGtleXdvcmRzLCBzdHJpbmdzIGFuZCBjb21tZW50cy4KLSAgMiAtIEJpZnMsIGd1YXJkcyBhbmQgYHNpbmdsZSBxdW90ZXMnLgotICAzIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCi0KLVRvIGF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgZm9udCBsb2NrIG1vZGUsIHBsYWNlIHRoZSBmb2xsb3dpbmcgbGluZXMKLWluIHlvdXIgfi8uZW1hY3MgZmlsZToKLQotXChkZWZ1biBteS1lcmxhbmctbW9kZS1ob29rICgpCi0gIChjb25kICh3aW5kb3ctc3lzdGVtCi0JIChmb250LWxvY2stbW9kZSAxKSkpKQotXChhZGQtaG9vayAnZXJsYW5nLW1vZGUtaG9vayAnbXktZXJsYW5nLW1vZGUtaG9vaykKLVwoc2V0cSBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uIHQpIgotICAoaW50ZXJhY3RpdmUpCi0gIChyZXF1aXJlICdmb250LWxvY2spCi0gIChzZXQgJ2ZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMpCi0gIChmb250LWxvY2stbW9kZSAxKQotICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdmb250LWxvY2stZm9udGlmeS1idWZmZXIpKSkKLQotDAotKGRlZnVuIGVybGFuZy1tZW51LWluaXQgKCkKLSAgIkluaXQgbWVudXMgZm9yIEVybGFuZyBtb2RlLgotCi1UaGUgdmFyaWFibGUgYGVybGFuZy1tZW51LWl0ZW1zJyBjb250YWluIGEgZGVzY3JpcHRpb24gb2YgdGhlIEVybGFuZwotbW9kZSBtZW51LiAgTm9ybWFsbHksIHRoZSBsaXN0IGNvbnRhaW5zIGF0b21zLCByZXByZXNlbnRpbmcgdmFyaWFibGVzCi1ib3VuZCB0byBwaWVjZXMgb2YgdGhlIG1lbnUuCi0KLVBlcnNvbmFsIGV4dGVudGlvbnMgY291bGQgYmUgYWRkZWQgdG8gYGVybGFuZy1tZW51LXBlcnNvbmFsLWl0ZW1zJy4KLQotU2hvdWxkIGFueSB2YXJpYWJsZSBkZXNjcmliaW5nIHRoZSBtZW51IGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24KLXNob3VsZCBiZSBjYWxsZWQuIgotICAgIChlcmxhbmctbWVudS1pbnN0YWxsICJFcmxhbmciIGVybGFuZy1tZW51LWl0ZW1zIGVybGFuZy1tb2RlLW1hcCB0KSkKLQotCi0oZGVmdW4gZXJsYW5nLW1lbnUtaW5zdGFsbCAobmFtZSBpdGVtcyBrZXltYXAgJm9wdGlvbmFsIHBvcHVwKQotICAiSW5zdGFsbCBhIG1lbnUgb24gRW1hY3MgMTkgb3IgWEVtYWNzIGJhc2VkIG9uIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uLgotCi1OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBtZW51LgotCi1JVEVNUyBpcyBhIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZWl0aGVyIG5pbCByZXByZXNlbnRpbmcgYSBob3Jpc29udGFsCi1saW5lIG9yIGEgbGlzdCB3aXRoIHR3byBvciB0aHJlZSBlbGVtZW50cy4gIFRoZSBmaXJzdCBpcyB0aGUgbmFtZSBvZgotdGhlIG1lbnUgaXRlbSwgdGhlIHNlY29uZCB0aGUgZnVuY3Rpb24gdG8gY2FsbCwgb3IgYSBzdWJtZW51LCBvbiB0aGUKLXNhbWUgc2FtZSBmb3JtIGFzIElURU1TLiAgVGhlIHRoaXJkIG9wdGlvbmFsIGVsZW1lbnQgaXMgYW4gZXhwcmVzc2lvbgotd2hpY2ggaXMgZXZhbHVhdGVkIGV2ZXJ5IHRpbWUgdGhlIG1lbnUgaXMgZGlzcGxheWVkLiAgU2hvdWxkIHRoZQotZXhwcmVzc2lvbiBldmFsdWF0ZSB0byBuaWwgdGhlIG1lbnUgaXRlbSBpcyBnaG9zdGVkLgotCi1LRVlNQVAgaXMgdGhlIGtleW1hcCB0byBhZGQgdG8gbWVudSB0by4gIChXaGVuIHVzaW5nIFhFbWFjcywgdGhlIG1lbnUKLXdpbGwgb25seSBiZSB2aXNpYmxlIHdoZW4gdGhpcyBtZW55IGlzIHRoZSBnbG9iYWwsIHRoZSBsb2NhbCwgb3IgYW4KLWFjdGl2YXRlZCBtaW5vciBtb2RlIGtleW1hcC4pCi0KLUlmIFBPUFVQIGlzIG5vbi1uaWwsIHRoZSBtZW51IGlzIGJvdW5kIHRvIHRoZSBYRW1hY3MgYG1vZGUtcG9wdXAtbWVudScKLXZhcmlhYmxlLCBpLmUuIGl0IHdpbGwgcG9wdXAgd2hlbiBwcmVzc2luZyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uLgotCi1QbGVhc2Ugc2VlIHRoZSB2YXJpYWJsZSBgZXJsYW5nLW1lbnUtYmFzZS1pdGVtcycuIgotICAoY29uZCAoZXJsYW5nLXhlbWFjcy1wCi0JIChsZXQgKChtZW51IChlcmxhbmctbWVudS14ZW1hY3MgbmFtZSBpdGVtcyBrZXltYXApKSkKLQkgICA7OyBXZSBhZGQgdGhlIG1lbnUgdG8gdGhlIGdsb2JhbCBtZW51YmFyLgotCSAgIDs7KGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0LWJ1ZmZlci1tZW51YmFyKQotCSAgIDs7ICAgICAgICAgKHN5bWJvbC12YWx1ZSAnY3VycmVudC1tZW51YmFyKSkKLQkgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdhZGQtc3VibWVudSkgbmlsIG1lbnUpCi0JICAgKHNldGNkciBlcmxhbmcteGVtYWNzLXBvcHVwLW1lbnUgKGNkciBtZW51KSkKLQkgICAoaWYgKGFuZCBwb3B1cCAoYm91bmRwICdtb2RlLXBvcHVwLW1lbnUpKQotCSAgICAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpCi0JCQknbW9kZS1wb3B1cC1tZW51IGVybGFuZy14ZW1hY3MtcG9wdXAtbWVudSkpKSkKLQkoKD49IGVybGFuZy1lbWFjcy1tYWpvci12ZXJzaW9uIDE5KQotCSAoZGVmaW5lLWtleSBrZXltYXAgKHZlY3RvciAnbWVudS1iYXIgKGludGVybiBuYW1lKSkKLQkgICAoZXJsYW5nLW1lbnUtbWFrZS1rZXltYXAgbmFtZSBpdGVtcykpKQotCSh0IG5pbCkpKQotCi0KLShkZWZ1biBlcmxhbmctbWVudS1tYWtlLWtleW1hcCAobmFtZSBpdGVtcykKLSAgIkJ1aWxkIGEgbWVudSBmb3IgRW1hY3MgMTkuIgotICAobGV0ICgobWVudW1hcCAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdtYWtlLXNwYXJzZS1rZXltYXApCi0JCQkgIG5hbWUpKQotCShjb3VudCAwKQotCWlkIGRlZiBmaXJzdCBzZWNvbmQgdGhpcmQpCi0gICAgKHNldHEgaXRlbXMgKHJldmVyc2UgaXRlbXMpKQotICAgICh3aGlsZSBpdGVtcwotICAgICAgOzsgUmVwbGFjZSBhbnkgb2NjdXJlbmNlIG9mIGF0b21zIGJ5IHRoZWlyIHZhbHVlLgotICAgICAgKHdoaWxlIChhbmQgaXRlbXMgKGF0b20gKGNhciBpdGVtcykpIChub3QgKG51bGwgKGNhciBpdGVtcykpKSkKLQkoaWYgKGFuZCAoYm91bmRwIChjYXIgaXRlbXMpKQotCQkgKGxpc3RwIChzeW1ib2wtdmFsdWUgKGNhciBpdGVtcykpKSkKLQkgICAgKHNldHEgaXRlbXMgKGFwcGVuZCAocmV2ZXJzZSAoc3ltYm9sLXZhbHVlIChjYXIgaXRlbXMpKSkKLQkJCQkoY2RyIGl0ZW1zKSkpCi0JICAoc2V0cSBpdGVtcyAoY2RyIGl0ZW1zKSkpKQotICAgICAgKHNldHEgZmlyc3QgKGNhci1zYWZlIChjYXIgaXRlbXMpKSkKLSAgICAgIChzZXRxIHNlY29uZCAoY2FyLXNhZmUgKGNkci1zYWZlIChjYXIgaXRlbXMpKSkpCi0gICAgICAoc2V0cSB0aGlyZCAoY2FyLXNhZmUgKGNkci1zYWZlIChjZHItc2FmZSAoY2FyIGl0ZW1zKSkpKSkKLSAgICAgIChjb25kICgobnVsbCBmaXJzdCkKLQkgICAgIChzZXRxIGNvdW50ICgrIGNvdW50IDEpKQotCSAgICAgKHNldHEgaWQgKGludGVybiAoZm9ybWF0ICJzZXBhcmF0b3ItJWQiIGNvdW50KSkpCi0JICAgICAoc2V0cSBkZWYgJygiLS0iIC4gbmlsKSkpCi0JICAgICgoYW5kIChjb25zcCBzZWNvbmQpIChlcSAoY2FyIHNlY29uZCkgJ2xhbWJkYSkpCi0JICAgICAoc2V0cSBjb3VudCAoKyBjb3VudCAxKSkKLQkgICAgIChzZXRxIGlkIChpbnRlcm4gKGZvcm1hdCAibGFtYmRhLSVkIiBjb3VudCkpKQotCSAgICAgKHNldHEgZGVmIChjb25zIGZpcnN0IHNlY29uZCkpKQotCSAgICAoKHN5bWJvbHAgc2Vjb25kKQotCSAgICAgKHNldHEgaWQgc2Vjb25kKQotCSAgICAgKHNldHEgZGVmIChjb25zIGZpcnN0IHNlY29uZCkpKQotCSAgICAodAotCSAgICAgKHNldHEgY291bnQgKCsgY291bnQgMSkpCi0JICAgICAoc2V0cSBpZCAoaW50ZXJuIChmb3JtYXQgInN1Ym1lbnUtJWQiIGNvdW50KSkpCi0JICAgICAoc2V0cSBkZWYgKGVybGFuZy1tZW51LW1ha2Uta2V5bWFwIGZpcnN0IHNlY29uZCkpKSkKLSAgICAgIChkZWZpbmUta2V5IG1lbnVtYXAgKHZlY3RvciBpZCkgZGVmKQotICAgICAgKGlmIHRoaXJkCi0JICAocHV0IGlkICdtZW51LWVuYWJsZSB0aGlyZCkpCi0gICAgICAoc2V0cSBpdGVtcyAoY2RyIGl0ZW1zKSkpCi0gICAgKGNvbnMgbmFtZSBtZW51bWFwKSkpCi0KLQotKGRlZnVuIGVybGFuZy1tZW51LXhlbWFjcyAobmFtZSBpdGVtcyAmb3B0aW9uYWwga2V5bWFwKQotICAiQnVpbGQgYSBtZW51IGZvciBYRW1hY3MuIgotICAobGV0ICgocmVzICcoKSkKLQlmaXJzdCBzZWNvbmQgdGhpcmQgZW50cnkpCi0gICAgKHdoaWxlIGl0ZW1zCi0gICAgICA7OyBSZXBsYWNlIGFueSBvY2N1cmVuY2Ugb2YgYXRvbXMgYnkgdGhlaXIgdmFsdWUuCi0gICAgICAod2hpbGUgKGFuZCBpdGVtcyAoYXRvbSAoY2FyIGl0ZW1zKSkgKG5vdCAobnVsbCAoY2FyIGl0ZW1zKSkpKQotCShpZiAoYW5kIChib3VuZHAgKGNhciBpdGVtcykpCi0JCSAobGlzdHAgKHN5bWJvbC12YWx1ZSAoY2FyIGl0ZW1zKSkpKQotCSAgICAoc2V0cSBpdGVtcyAoYXBwZW5kIChyZXZlcnNlIChzeW1ib2wtdmFsdWUgKGNhciBpdGVtcykpKQotCQkJCShjZHIgaXRlbXMpKSkKLQkgIChzZXRxIGl0ZW1zIChjZHIgaXRlbXMpKSkpCi0gICAgICAoc2V0cSBmaXJzdCAoY2FyLXNhZmUgKGNhciBpdGVtcykpKQotICAgICAgKHNldHEgc2Vjb25kIChjYXItc2FmZSAoY2RyLXNhZmUgKGNhciBpdGVtcykpKSkKLSAgICAgIChzZXRxIHRoaXJkIChjYXItc2FmZSAoY2RyLXNhZmUgKGNkci1zYWZlIChjYXIgaXRlbXMpKSkpKQotICAgICAgKGNvbmQgKChudWxsIGZpcnN0KQotCSAgICAgKHNldHEgcmVzIChjb25zICItLS0tLS0iIHJlcykpKQotCSAgICAoKHN5bWJvbHAgc2Vjb25kKQotCSAgICAgKHNldHEgcmVzIChjb25zICh2ZWN0b3IgZmlyc3Qgc2Vjb25kIChvciB0aGlyZCB0KSkgcmVzKSkpCi0JICAgICgoYW5kIChjb25zcCBzZWNvbmQpIChlcSAoY2FyIHNlY29uZCkgJ2xhbWJkYSkpCi0JICAgICAoc2V0cSByZXMgKGNvbnMgKHZlY3RvciBmaXJzdCAobGlzdCAnY2FsbC1pbnRlcmFjdGl2ZWx5IHNlY29uZCkKLQkJCQkgICAgIChvciB0aGlyZCB0KSkgcmVzKSkpCi0JICAgICh0Ci0JICAgICAoc2V0cSByZXMgKGNvbnMgKGNvbnMgZmlyc3QKLQkJCQkgICAoY2RyIChlcmxhbmctbWVudS14ZW1hY3MKLQkJCQkJIGZpcnN0IHNlY29uZCkpKQotCQkJICAgICByZXMpKSkpCi0gICAgICAoc2V0cSBpdGVtcyAoY2RyIGl0ZW1zKSkpCi0gICAgKHNldHEgcmVzIChyZXZlcnNlIHJlcykpCi0gICAgOzsgV2hlbiBhZGRpbmcgYSBtZW51IHRvIGEgbWlub3ItbW9kZSBrZXltYXAgdW5kZXIgRW1hY3MgMTksCi0gICAgOzsgaXQgZGlzYXBwZWFycyB3aGVuIHRoZSBtb2RlIGlzIGRpc2FibGVkLiAgVGhlIGV4cHJlc3Npb24KLSAgICA7OyBnZW5lcmF0ZWQgYmVsb3cgaW1pdGF0ZXMgdGhpcyBiZWhhdmlvdXIuCi0gICAgOzsgKFRoaXMgY291bGQgYmUgZXhwcmVzc2VkIG11Y2ggY2xlYXJlciB1c2luZyBiYWNrcXVvdGVzLAotICAgIDs7IGJ1dCBJIGRvbid0IHdhbnQgdG8gcHVsbCBpbiBldmVyeSBwYWNrYWdlLikKLSAgICAoaWYga2V5bWFwCi0JKGxldCAoKGV4cHIgKGxpc3QgJ29yCi0JCQkgIChsaXN0ICdlcSBrZXltYXAgJ2dsb2JhbC1tYXApCi0JCQkgIChsaXN0ICdlcSBrZXltYXAgKGxpc3QgJ2N1cnJlbnQtbG9jYWwtbWFwKSkKLQkJCSAgKGxpc3QgJ3N5bWJvbC12YWx1ZQotCQkJCShsaXN0ICdjYXItc2FmZQotCQkJCSAgICAgIChsaXN0ICdyYXNzcQotCQkJCQkgICAga2V5bWFwCi0JCQkJCSAgICAnbWlub3ItbW9kZS1tYXAtYWxpc3QpKSkpKSkKLQkgIChzZXRxIHJlcyAoY29ucyAnOmluY2x1ZGVkIChjb25zIGV4cHIgcmVzKSkpKSkKLSAgICAoY29ucyBuYW1lIHJlcykpKQotCi0KLShkZWZ1biBlcmxhbmctbWVudS1zdWJzdGl0dXRlIChpdGVtcyBhbGlzdCkKLSAgIlN1YnN0aXR1dGUgZnVuY3Rpb25zIGluIG1lbnUgZGVzY3JpYmVkIGJ5IElURU1TLgotCi1UaGUgbWVudSBJVEVNUyBpcyB1cGRhdGVkIGRlc3RydWN0aXZlbHkuCi0KLUFMSVNUIGlzIGxpc3Qgb2YgcGFpcnMgd2hlcmUgdGhlIGNhciBpcyB0aGUgb2xkIGZ1bmN0aW9uIGFuZCBjZHIgdGhlIG5ldy4iCi0gIChsZXQgKGZpcnN0IHNlY29uZCBwYWlyKQotICAgICh3aGlsZSBpdGVtcwotICAgICAgKHNldHEgZmlyc3QgKGNhci1zYWZlIChjYXIgaXRlbXMpKSkKLSAgICAgIChzZXRxIHNlY29uZCAoY2FyLXNhZmUgKGNkci1zYWZlIChjYXIgaXRlbXMpKSkpCi0gICAgICAoY29uZCAoKG51bGwgZmlyc3QpKQotCSAgICAoKHN5bWJvbHAgc2Vjb25kKQotCSAgICAgKHNldHEgcGFpciAoYW5kIHNlY29uZCAoYXNzcSBzZWNvbmQgYWxpc3QpKSkKLQkgICAgIChpZiBwYWlyCi0JCSAoc2V0Y2FyIChjZHIgKGNhciBpdGVtcykpIChjZHIgcGFpcikpKSkKLQkgICAgKChhbmQgKGNvbnNwIHNlY29uZCkgKGVxIChjYXIgc2Vjb25kKSAnbGFtYmRhKSkpCi0JICAgICh0Ci0JICAgICAoZXJsYW5nLW1lbnUtc3Vic3RpdHV0ZSBzZWNvbmQgYWxpc3QpKSkKLSAgICAgIChzZXRxIGl0ZW1zIChjZHIgaXRlbXMpKSkpKQotCi0KLShkZWZ1biBlcmxhbmctbWVudS1hZGQtYWJvdmUgKGVudHJ5IGFib3ZlIGl0ZW1zKQotICAiQWRkIG1lbnUgRU5UUlkgYWJvdmUgbWVudSBlbnRyeSBBQk9WRSBpbiBtZW51IElURU1TLgotRG8gbm90aGluZyBpZiB0aGUgaXRlbXMgYWxyZWFkeSBzaG91bGQgYmUgaW4gdGhlIG1lbnUuCi1TaG91bGQgQUJPVkUgbm90IGJlIGluIHRoZSBsaXN0LCB0aGUgZW50cnkgaXMgYWRkZWQgYXQKLXRoZSBib3R0b20gb2YgdGhlIG1lbnUuCi0KLVRoZSBuZXcgbWVudSBpcyByZXR1cm5lZC4gIE5vIGd1YXJhbnRlZSBpcyBnaXZlbiB0aGF0IHRoZSBvcmlnaW5hbAotbWVudSBpcyBsZWZ0IHVuY2hhbmdlZC4KLQotVGhlIGVxdWFsaXR5IHRlc3QgaXMgcGVyZm9ybWVkIGJ5IGBlcScuCi0KLUV4YW1wbGU6ICAoZXJsYW5nLW1lbnUtYWRkLWFib3ZlICdteS1lcmxhbmctbWVudS1pdGVtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VybGFuZy1tZW51LW1hbi1pdGVtcykiCi0gIChlcmxhbmctbWVudS1hZGQtYmVsb3cgZW50cnkgYWJvdmUgaXRlbXMgdCkpCi0KLQotKGRlZnVuIGVybGFuZy1tZW51LWFkZC1iZWxvdyAoZW50cnkgYmVsb3cgaXRlbXMgJm9wdGlvbmFsIGFib3ZlLXApCi0gICJBZGQgbWVudSBFTlRSWSBiZWxvdyBtZW51IGl0ZW1zIEJFTE9XIGluIHRoZSBFcmxhbmcgbWVudS4KLURvIG5vdGhpbmcgaWYgdGhlIGl0ZW1zIGFscmVhZHkgc2hvdWxkIGJlIGluIHRoZSBtZW51LgotU2hvdWxkIEJFTE9XIG5vdCBiZSBpbiB0aGUgbGlzdCwgaXRlbXMgaXMgYWRkZWQgYXQgdGhlIGJvdHRvbQotb2YgdGhlIG1lbnUuCi0KLVRoZSBuZXcgbWVudSBpcyByZXR1cm5lZC4gIE5vIGd1YXJhbnRlZSBpcyBnaXZlbiB0aGF0IHRoZSBvcmlnaW5hbAotbWVudSBpcyBsZWZ0IHVuY2hhbmdlZC4KLQotVGhlIGVxdWFsaXR5IHRlc3QgaXMgcGVyZm9ybWVkIGJ5IGBlcScuCi0KLUV4YW1wbGU6Ci0KLVwoc2V0cSBlcmxhbmctbWVudS1pdGVtcwotICAgICAgKGVybGFuZy1tZW51LWFkZC1iZWxvdyAnbXktZXJsYW5nLW1lbnUtaXRlbXMKLQkgCSAgICAgICAgICAgICAnZXJsYW5nLW1lbnUtYmFzZS1pdGVtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmctbWVudS1pdGVtcykpIgotICAoaWYgKG1lbXEgZW50cnkgaXRlbXMpCi0gICAgICBpdGVtcwkJCQk7IFJldHVybiB0aGUgb3JpZ2luYWwgbWVudS4KLSAgICAobGV0ICgoaGVhZCAnKCkpCi0JICAoZG9uZSBuaWwpCi0JICByZXMpCi0gICAgICAod2hpbGUgKG5vdCBkb25lKQotCShjb25kICgobnVsbCBpdGVtcykKLQkgICAgICAgKHNldHEgcmVzIChhcHBlbmQgaGVhZCAobGlzdCBlbnRyeSkpKQotCSAgICAgICAoc2V0cSBkb25lIHQpKQotCSAgICAgICgoZXEgYmVsb3cgKGNhciBpdGVtcykpCi0JICAgICAgIChzZXRxIHJlcwotCQkgICAgIChpZiBhYm92ZS1wCi0JCQkgKGFwcGVuZCBoZWFkIChjb25zIGVudHJ5IGl0ZW1zKSkKLQkJICAgICAgIChhcHBlbmQgaGVhZCAoY29ucyAoY2FyIGl0ZW1zKQotCQkJCQkgIChjb25zIGVudHJ5IChjZHIgaXRlbXMpKSkpKSkKLQkgICAgICAgKHNldHEgZG9uZSB0KSkKLQkgICAgICAodAotCSAgICAgICAoc2V0cSBoZWFkIChhcHBlbmQgaGVhZCAobGlzdCAoY2FyIGl0ZW1zKSkpKQotCSAgICAgICAoc2V0cSBpdGVtcyAoY2RyIGl0ZW1zKSkpKSkKLSAgICAgIHJlcykpKQotCi0oZGVmdW4gZXJsYW5nLW1lbnUtZGVsZXRlIChlbnRyeSBpdGVtcykKLSAgIkRlbGV0ZSBFTlRSWSBmcm9tIG1lbnUgSVRFTVMuCi0KLVRoZSBuZXcgbWVudSBpcyByZXR1cm5lZC4gIE5vIGd1YXJhbnRlZSBpcyBnaXZlbiB0aGF0IHRoZSBvcmlnaW5hbAotbWVudSBpcyBsZWZ0IHVuY2hhbmdlZC4iCi0gIChkZWxxIGVudHJ5IGl0ZW1zKSkKLQwKLTs7IE1hbiBjb2RlOgotCi0oZGVmdW4gZXJsYW5nLW1hbi1pbml0ICgpCi0gICJBZGQgbWVudXMgY29udGFpbmluZyB0aGUgbWFudWFsIHBhZ2VzIG9mIHRoZSBFcmxhbmcuCi0KLVRoZSB2YXJpYWJsZSBgZXJsYW5nLW1hbi1kaXJzJyBjb250YWlucyBlbnRyaWVzIGRlc2NyaWJpbmcKLXRoZSBsb2NhdGlvbiBvZiB0aGUgbWFudWFsIHBhZ2VzLiIKLSAgKGludGVyYWN0aXZlKQotICAoaWYgZXJsYW5nLW1hbi1pbmhpYml0Ci0gICAgICAoKQotICAgIChzZXRxIGVybGFuZy1tZW51LW1hbi1pdGVtcwotCSAgJyhuaWwKLQkgICAgKCJNYW4gLSBGdW5jdGlvbiIgZXJsYW5nLW1hbi1mdW5jdGlvbikpKQotICAgIChpZiBlcmxhbmctbWFuLWRpcnMKLQkoc2V0cSBlcmxhbmctbWVudS1tYW4taXRlbXMKLQkgICAgICAoYXBwZW5kIGVybGFuZy1tZW51LW1hbi1pdGVtcwotCQkgICAgICAoZXJsYW5nLW1hbi1tYWtlLXRvcC1tZW51IGVybGFuZy1tYW4tZGlycykpKSkKLSAgICAoc2V0cSBlcmxhbmctbWVudS1pdGVtcwotCSAgKGVybGFuZy1tZW51LWFkZC1hYm92ZSAnZXJsYW5nLW1lbnUtbWFuLWl0ZW1zCi0JCQkJICdlcmxhbmctbWVudS12ZXJzaW9uLWl0ZW1zCi0JCQkJIGVybGFuZy1tZW51LWl0ZW1zKSkKLSAgICAoZXJsYW5nLW1lbnUtaW5pdCkpKQotCi0KLShkZWZ1biBlcmxhbmctbWFuLXVuaW5zdGFsbCAoKQotICAiUmVtb3ZlIHRoZSBtYW4gcGFnZXMgZnJvbSB0aGUgRXJsYW5nIG1vZGUuIgotICAoaW50ZXJhY3RpdmUpCi0gIChzZXRxIGVybGFuZy1tZW51LWl0ZW1zCi0JKGVybGFuZy1tZW51LWRlbGV0ZSAnZXJsYW5nLW1lbnUtbWFuLWl0ZW1zIGVybGFuZy1tZW51LWl0ZW1zKSkKLSAgKGVybGFuZy1tZW51LWluaXQpKQotCi0KLTs7IFRoZSBtYW4gbWVudSBpcyBhIGhpZXJhcmNoYWwgc3RydWN0dXJlLCB3aXRoIHRoZSBtYW51YWwgc2VjdGlvbnMKLTs7IGF0IHRoZSB0b3AsIGRlc2NyaWJlZCBieSBgZXJsYW5nLW1hbi1kaXJzJy4gIFRoZSBuZXh0IGxldmVsIGNvdWxkCi07OyBlaXRoZXIgYmUgdGhlIG1hbnVhbCBwYWdlcyBpZiBub3QgdG8gbWFueSwgb3RoZXJ3aXNlIGl0IGlzIGFuIGluZGV4Ci07OyBtZW51IHdob3NlIHN1Ym1lbnVzIHdpbGwgY29udGFpbiB1cCB0byBgZXJsYW5nLW1hbi1tYXgtbWVudS1zaXplJwotOzsgbWFudWFsIHBhZ2VzLgotCi0oZGVmdW4gZXJsYW5nLW1hbi1tYWtlLXRvcC1tZW51IChkaXItbGlzdCkKLSAgIkNyZWF0ZSBvbmUgbWVudSBlbnRyeSBwZXIgZWxlbWVudCBvZiBESVItTElTVC4KLVRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGBlcmxhbmctbWFuLWRpcnMnLiIKLSAgKGxldCAoKG1lbnUgJygpKQotCWRpcikKLSAgICAod2hpbGUgZGlyLWxpc3QKLSAgICAgIChzZXRxIGRpciAoY29uZCAoKG50aCAyIChjYXIgZGlyLWxpc3QpKQotCQkgICAgICAgOzsgUmVsYXRpdmUgdG8gYGVybGFuZy1yb290LWRpcicuCi0JCSAgICAgICAoYW5kIChzdHJpbmdwIGVybGFuZy1yb290LWRpcikKLQkJCSAgICAoY29uY2F0IGVybGFuZy1yb290LWRpciAobnRoIDEgKGNhciBkaXItbGlzdCkpKSkpCi0JCSAgICAgICh0Ci0JCSAgICAgICA7OyBBYnNvbHV0ZQotCQkgICAgICAgKG50aCAxIChjYXIgZGlyLWxpc3QpKSkpKQotICAgICAgKGlmIChhbmQgZGlyCi0JICAgICAgIChmaWxlLXJlYWRhYmxlLXAgZGlyKSkKLQkgIChzZXRxIG1lbnUgKGNvbnMgKGxpc3QgKGNhciAoY2FyIGRpci1saXN0KSkKLQkJCQkgKGVybGFuZy1tYW4tbWFrZS1taWRkbGUtbWVudQotCQkJCSAgKGVybGFuZy1tYW4tZ2V0LWZpbGVzIGRpcikpKQotCQkJICAgbWVudSkpKQotICAgICAgKHNldHEgZGlyLWxpc3QgKGNkciBkaXItbGlzdCkpKQotICAgIDs7IFNob3VsZCBubyBtZW51cyBiZSBmb3VuZCwgZ2VuZXJhdGUgYSBtZW51IGl0ZW0gd2hpY2gKLSAgICA7OyB3aWxsIGRpc3BsYXkgYSBoZWxwIHRleHQsIHdoZW4gc2VsZWN0ZWQuCi0gICAgKGlmIG1lbnUKLQkobnJldmVyc2UgbWVudSkKLSAgICAgICcoKCJNYW4gUGFnZXMiCi0JICgoIkVycm9yISBXaHk/IiBlcmxhbmctbWFuLWRlc2NyaWJlLWVycm9yKSkpKSkpKQotCi0KLTs7IFNob3VsZCB0aGUgbWVudSBiZSB0byBsb25nLCBsZXQncyBzcGxpdCBpdCBpbnRvIGEgbnVtYmVyIG9mCi07OyBzbWFsbGVyIG1lbnVzLiAgV2FybmluZywgdGhpcyBjb2RlIGNvbnRhaW5zIGJlYXRpZnVsCi07OyBkZXN0cnVjdGl2ZSBvcGVyYXRpb25zIQotKGRlZnVuIGVybGFuZy1tYW4tbWFrZS1taWRkbGUtbWVudSAoZmlsZWxpc3QpCi0gICJDcmVhdGUgdGhlIHNlY29uZCBsZXZlbCBtZW51IGZyb20gRklMRUxJU1QuCi0KLVNob3VsZCB0aGUgbGlzdCBiZSBsb25nZXIgdGhhbiBgZXJsYW5nLW1hbi1tYXgtbWVudS1zaXplJywgYSB0cmVlIG9mCi1tZW51cyBpcyBjcmVhdGVkLiIKLSAgKGlmICg8PSAobGVuZ3RoIGZpbGVsaXN0KSBlcmxhbmctbWFuLW1heC1tZW51LXNpemUpCi0gICAgICAoZXJsYW5nLW1hbi1tYWtlLW1lbnUgZmlsZWxpc3QpCi0gICAgKGxldCAoKG1lbnUgJygpKQotCSAgKGZpbGVsaXN0IChjb3B5LXNlcXVlbmNlIGZpbGVsaXN0KSkKLQkgIHNlZ21lbnQgc3VibWVudSBwYWlyKQotICAgICAgKHdoaWxlIGZpbGVsaXN0Ci0JKHNldHEgcGFpciAobnRoY2RyICgtIGVybGFuZy1tYW4tbWF4LW1lbnUtc2l6ZSAxKSBmaWxlbGlzdCkpCi0JKHNldHEgc2VnbWVudCBmaWxlbGlzdCkKLQkoaWYgKG51bGwgcGFpcikKLQkgICAgKHNldHEgZmlsZWxpc3QgbmlsKQotCSAgKHNldHEgZmlsZWxpc3QgKGNkciBwYWlyKSkKLQkgIChzZXRjZHIgcGFpciBuaWwpKQotCShzZXRxIHN1Ym1lbnUgKGVybGFuZy1tYW4tbWFrZS1tZW51IHNlZ21lbnQpKQotCShzZXRxIG1lbnUgKGNvbnMgKGxpc3QgKGNvbmNhdCAoY2FyIChjYXIgc3VibWVudSkpCi0JCQkJICAgICAgICIgLS0gIgotCQkJCSAgICAgICAoY2FyIChjYXIgKHJldmVyc2Ugc3VibWVudSkpKSkKLQkJCSAgICAgICBzdWJtZW51KQotCQkJIG1lbnUpKSkKLSAgICAgIChucmV2ZXJzZSBtZW51KSkpKQotCi0KLShkZWZ1biBlcmxhbmctbWFuLW1ha2UtbWVudSAoZmlsZWxpc3QpCi0gICJNYWtlIGEgbGVhZiBtZW51IGJhc2VkIG9uIEZJTEVMSVNULiIKLSAgKGxldCAoKG1lbnUgJygpKQotCWl0ZW0pCi0gICAgKHdoaWxlIGZpbGVsaXN0Ci0gICAgICAoc2V0cSBpdGVtIChlcmxhbmctbWFuLW1ha2UtbWVudS1pdGVtIChjYXIgZmlsZWxpc3QpKSkKLSAgICAgIChpZiBpdGVtCi0JICAoc2V0cSBtZW51IChjb25zIGl0ZW0gbWVudSkpKQotICAgICAgKHNldHEgZmlsZWxpc3QgKGNkciBmaWxlbGlzdCkpKQotICAgIChucmV2ZXJzZSBtZW51KSkpCi0KLQotKGRlZnVuIGVybGFuZy1tYW4tbWFrZS1tZW51LWl0ZW0gKGZpbGUpCi0gICJDcmVhdGUgYSBtZW51IGl0ZW0gY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgbWFuIHBhZ2UuIgotICAoYW5kIChzdHJpbmctbWF0Y2ggIi4qL1xcKFteL10rXFwpXFwuW14uXSQiIGZpbGUpCi0gICAgICAgKGxldCAoKHBhZ2UgKHN1YnN0cmluZyBmaWxlIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkpKQotCSAobGlzdCAoY2FwaXRhbGl6ZSBwYWdlKQotCSAgICAgICAobGlzdCAnbGFtYmRhICcoKQotCQkgICAgICcoaW50ZXJhY3RpdmUpCi0JCSAgICAgKGxpc3QgJ2Z1bmNhbGwgJ2VybGFuZy1tYW4tZGlzcGxheS1mdW5jdGlvbgotCQkJICAgZmlsZSkpKSkpKQotCi0KLShkZWZ1biBlcmxhbmctbWFuLWdldC1maWxlcyAoZGlyKQotICAiUmV0dXJuIGZpbGVzIGluIGRpcmVjdG9yeSBESVIuIgotICAoZGlyZWN0b3J5LWZpbGVzIGRpciB0ICIuKlxcLlswLTldXFwnIikpCi0KLQotKGRlZnVuIGVybGFuZy1tYW4tbW9kdWxlICgmb3B0aW9uYWwgbW9kdWxlKQotICAiRmluZCBtYW51YWwgcGFnZSBmb3IgTU9EVUxFLCBkZWZhdWx0cyB0byBtb2R1bGUgb2YgZnVuY3Rpb24gdW5kZXIgcG9pbnQuCi1UaGlzIGZ1bmN0aW9uIGlzIGF3YXJlIG9mIGltcG9ydGVkIGZ1bmN0aW9ucy4iCi0gIChpbnRlcmFjdGl2ZQotICAgKGxpc3QgKGxldCogKChtb2QgKGNhci1zYWZlIChlcmxhbmctZ2V0LWZ1bmN0aW9uLXVuZGVyLXBvaW50KSkpCi0JCShpbnB1dCAocmVhZC1zdHJpbmcKLQkJCShmb3JtYXQgIk1hbnVhbCBlbnRyeSBmb3IgbW9kdWxlJXM6ICIKLQkJCQkoaWYgKG9yIChudWxsIG1vZCkgKHN0cmluZz0gbW9kICIiKSkKLQkJCQkgICAgIiIKLQkJCQkgIChmb3JtYXQgIiAoZGVmYXVsdCAlcykiIG1vZCkpKSkpKQotCSAgIChpZiAoc3RyaW5nPSBpbnB1dCAiIikKLQkgICAgICAgbW9kCi0JICAgICBpbnB1dCkpKSkKLSAgKG9yIG1vZHVsZSAoc2V0cSBtb2R1bGUgKGNhciAoZXJsYW5nLWdldC1mdW5jdGlvbi11bmRlci1wb2ludCkpKSkKLSAgKGlmIChvciAobnVsbCBtb2R1bGUpIChzdHJpbmc9IG1vZHVsZSAiIikpCi0gICAgICAoZXJyb3IgIk5vIEVybGFuZyBtb2R1bGUgbmFtZSBnaXZlbiIpKQotICAobGV0ICgoZGlyLWxpc3QgZXJsYW5nLW1hbi1kaXJzKQotCShwYXQgKGNvbmNhdCAiXFxiIiAocmVnZXhwLXF1b3RlIG1vZHVsZSkgIlxcLlteLl0kIikpCi0JKGZpbGUgbmlsKQotCWZpbGUtbGlzdCkKLSAgICAod2hpbGUgKGFuZCBkaXItbGlzdCAobnVsbCBmaWxlKSkKLSAgICAgIChzZXRxIGZpbGUtbGlzdCAoZXJsYW5nLW1hbi1nZXQtZmlsZXMKLQkJICAgICAgIChpZiAobnRoIDIgKGNhciBkaXItbGlzdCkpCi0JCQkgICAoY29uY2F0IGVybGFuZy1yb290LWRpciAobnRoIDEgKGNhciBkaXItbGlzdCkpKQotCQkJIChudGggMSAoY2FyIGRpci1saXN0KSkpKSkKLSAgICAgICh3aGlsZSAoYW5kIGZpbGUtbGlzdCAobnVsbCBmaWxlKSkKLQkoaWYgKHN0cmluZy1tYXRjaCBwYXQgKGNhciBmaWxlLWxpc3QpKQotCSAgICAoc2V0cSBmaWxlIChjYXIgZmlsZS1saXN0KSkpCi0JKHNldHEgZmlsZS1saXN0IChjZHIgZmlsZS1saXN0KSkpCi0gICAgICAoc2V0cSBkaXItbGlzdCAoY2RyIGRpci1saXN0KSkpCi0gICAgKGlmIGZpbGUKLQkoZnVuY2FsbCBlcmxhbmctbWFuLWRpc3BsYXktZnVuY3Rpb24gZmlsZSkKLSAgICAgIChlcnJvciAiTm8gbWFudWFsIHBhZ2UgZm9yIG1vZHVsZSAlcyBmb3VuZC4iIG1vZHVsZSkpKSkKLQotCi07OyBXYXJuaW5nLCB0aGUgZnVuY3Rpb24gYGVybGFuZy1tYW4tZnVuY3Rpb24nIGlzIGEgaGFjayEKLTs7IEl0IGxpbmtzIGl0c2VsZiBpbnRvIHRoZSBtYW4gY29kZSBpbiBhIG5vbi1jbGVhbiB3YXkuICBJIGhhdmUKLTs7IGNob29zZWQgdG8ga2VlcCBpdCBzaW5jZSBpdCBwcm92aWRlcyBhIHZlcnkgdXNlZnVsIGZ1bmN0aW9uYWxpdHkKLTs7IHdoaWNoIGlzIG5vdCBwb3NzaWJsZSB0byBhY2hpdmUgdXNpbmcgYSBjbGVhbiBhcHByb2FjaC4KLTs7ICAgLyBBbmRlcnNMCi0KLShkZWZ2YXIgZXJsYW5nLW1hbi1mdW5jdGlvbi1uYW1lIG5pbAotICAiTmFtZSBvZiBmdW5jdGlvbiBmb3IgbGFzdCBgZXJsYW5nLW1hbi1mdW5jdGlvbicgY2FsbC4KLVVzZWQgZm9yIGNvbW1uaWNhdGlvbiBiZXR3ZWVuIGBlcmxhbmctbWFuLWZ1bmN0aW9uJyBhbmQgdGhlCi1wYXRjaCB0byBgTWFuLW5vdGlmeS13aGVuLXJlYWR5Jy4iKQotCi0oZGVmdW4gZXJsYW5nLW1hbi1mdW5jdGlvbiAoJm9wdGlvbmFsIG5hbWUpCi0gICJGaW5kIG1hbnVhbCBwYWdlIGZvciBOQU1FLCB3aGVyZSBOQU1FIGlzIG1vZHVsZTpmdW5jdGlvbi4KLVRoZSBlbnRyeSBmb3IgYGZ1bmN0aW9uJyBpcyBkaXNwbGF5ZWQuCi0KLVRoaXMgZnVuY3Rpb24gaXMgYXdhcmUgb2YgaW1wb3J0ZWQgZnVuY3Rpb25zLiIKLSAgKGludGVyYWN0aXZlCi0gICAobGlzdCAobGV0KiAoKG1vZC1mdW5jIChlcmxhbmctZ2V0LWZ1bmN0aW9uLXVuZGVyLXBvaW50KSkKLQkJKG1vZCAoY2FyLXNhZmUgbW9kLWZ1bmMpKQotCQkoZnVuYyAobnRoIDEgbW9kLWZ1bmMpKQotCQkoaW5wdXQgKHJlYWQtc3RyaW5nCi0JCQkoZm9ybWF0Ci0JCQkgIk1hbnVhbCBlbnRyeSBmb3IgYG1vZHVsZTpmdW5jJyBvciBgbW9kdWxlJyVzOiAiCi0JCQkgKGlmIChvciAobnVsbCBtb2QpIChzdHJpbmc9IG1vZCAiIikpCi0JCQkgICAgICIiCi0JCQkgICAoZm9ybWF0ICIgKGRlZmF1bHQgJXM6JXMpIiBtb2QgZnVuYykpKSkpKQotCSAgIChpZiAoc3RyaW5nPSBpbnB1dCAiIikKLQkgICAgICAgKGlmIChhbmQgbW9kIGZ1bmMpCi0JCSAgIChjb25jYXQgbW9kICI6IiBmdW5jKQotCQkgbW9kKQotCSAgICAgaW5wdXQpKSkpCi0gIDs7IEVtYWNzIDE4IGRvZXNuJ3QgcHJvdmlkZSBgbWFuJy4uLgotICAoY29uZGl0aW9uLWNhc2UgbmlsCi0gICAgICAocmVxdWlyZSAnbWFuKQotICAgIChlcnJvciBuaWwpKQotICAobGV0ICgobW9kbmFtZSBuaWwpCi0JKGZ1bmNuYW1lIG5pbCkpCi0gICAgKGNvbmQgKChudWxsIG5hbWUpCi0JICAgKGxldCAoKG1vZC1mdW5jIChlcmxhbmctZ2V0LWZ1bmN0aW9uLXVuZGVyLXBvaW50KSkpCi0JICAgICAoc2V0cSBtb2RuYW1lIChjYXItc2FmZSBtb2QtZnVuYykpCi0JICAgICAoc2V0cSBmdW5jbmFtZSAobnRoIDEgbW9kLWZ1bmMpKSkpCi0JICAoKHN0cmluZy1tYXRjaCAiOiIgbmFtZSkKLQkgICAoc2V0cSBtb2RuYW1lIChzdWJzdHJpbmcgbmFtZSAwIChtYXRjaC1iZWdpbm5pbmcgMCkpKQotCSAgIChzZXRxIGZ1bmNuYW1lIChzdWJzdHJpbmcgbmFtZSAobWF0Y2gtZW5kIDApIG5pbCkpKQotCSAgKChzdHJpbmdwIG5hbWUpCi0JICAgKHNldHEgbW9kbmFtZSBuYW1lKSkpCi0gICAgKGlmIChvciAobnVsbCBtb2RuYW1lKSAoc3RyaW5nPSBtb2RuYW1lICIiKSkKLQkoZXJyb3IgIk5vIEVybGFuZyBtb2R1bGUgbmFtZSBnaXZlbiIpKQotICAgIChjb25kICgoZmJvdW5kcCAnTWFuLW5vdGlmeS13aGVuLXJlYWR5KQotCSAgIDs7IEVtYWNzIDE5OiAgVGhlIG1hbiBjb21tYW5kIGNvdWxkIHBvc3NpYmx5IHN0YXJ0IGFuCi0JICAgOzsgYXN5bmNyb25vdXMgcHJvY2VzcywgaS5lLiB3ZSBtdXN0IGhvb2sgb3Vyc2VsdmVzIGludG8KLQkgICA7OyB0aGUgc3lzdGVtIHRvIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSBtYW4tcHJvY2VzcwotCSAgIDs7IHRlcm1pbmF0ZXMuCi0JICAgKGlmIChudWxsIGZ1bmNuYW1lKQotCSAgICAgICAoKQotCSAgICAgKGVybGFuZy1tYW4tcGF0Y2gtbm90aWZ5KQotCSAgICAgKHNldHEgZXJsYW5nLW1hbi1mdW5jdGlvbi1uYW1lIGZ1bmNuYW1lKSkKLQkgICAoY29uZGl0aW9uLWNhc2UgbmlsCi0JICAgICAgIChlcmxhbmctbWFuLW1vZHVsZSBtb2RuYW1lKQotCSAgICAgKGVycm9yIChzZXRxIGVybGFuZy1tYW4tZnVuY3Rpb24tbmFtZSBuaWwpKSkpCi0JICAodAotCSAgIChlcmxhbmctbWFuLW1vZHVsZSBtb2RuYW1lKQotCSAgIChpZiBmdW5jbmFtZQotCSAgICAgICAoZXJsYW5nLW1hbi1maW5kLWZ1bmN0aW9uCi0JCShvciAoZ2V0LWJ1ZmZlciAiKk1hbnVhbCBFbnRyeSoiKSA7IEVtYWNzIDE4Ci0JCSAgICAoY3VycmVudC1idWZmZXIpKQkgICAgICAgICAgOyBYRW1hY3MKLQkJZnVuY25hbWUpKSkpKSkKLQotCi07OyBTaG91bGQgdGhlIGRlZmFkdmljZSBiZSBhdCB0aGUgdG9wIGxldmVsLCB0aGUgcGFja2FnZSBgYWR2aWNlJyB3b3VsZAotOzsgYmUgcmVxdWlyZWQuICBOb3cgaXQgaXMgb25seSByZXF1aXJlZCB3aGVuIHRoaXMgZnVuY3Rpb25hbGl0eQotOzsgaXMgdXNlZC4gIChFbWFjcyAxOSBzcGVjaWZpYy4pCi0oZGVmdW4gZXJsYW5nLW1hbi1wYXRjaC1ub3RpZnkgKCkKLSAgIlBhdGNoIHRoZSBmdW5jdGlvbiBgTWFuLW5vdGlmeS13aGVuLXJlYWR5JyB0byBzZWFyY2ggZm9yIGZ1bmN0aW9uLgotVGhlIHZhcmlhYmxlIGBlcmxhbmctbWFuLWZ1bmN0aW9uLW5hbWUnIGlzIGFzc3VtZWQgdG8gYmUgYm91bmQgdG8KLXRoZSBmdW5jdGlvbiBuYW1lLCBvciB0byBuaWwuCi0KLVRoZSByZWFzb24gZm9yIHBhdGNoaW5nIGEgZnVuY3Rpb24gaXMgdGhhdCB1bmRlciBFbWFjcyAxOSwgdGhlIG1hbgotY29tbWFuZCBpcyBleGVjdXRlZCBhc3luY2hyb25vdXNseS4iCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChyZXF1aXJlICdhZHZpY2UpCi0gICAgOzsgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCBzaW5jZSB0aGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4KLSAgICA7OyBydW5uaW5nIHVuZGVyIEVtYWNzIDE5LgotICAgIChlcnJvciAoZXJyb3IgKGNvbmNhdCAiVGhpcyBjb21tYW5kcyBuZWVkcyB0aGUgcGFja2FnZSBgYWR2aWNlJywgIgotCQkJICAicGxlYXNlIHVwZ3JhZGUgeW91ciBFbWFjcy4iKSkpKQotICAocmVxdWlyZSAnbWFuKQotICAoZGVmYWR2aWNlIE1hbi1ub3RpZnktd2hlbi1yZWFkeQotICAgIChhZnRlciBlcmxhbmctTWFuLW5vdGlmeS13aGVuLXJlYWR5IGFjdGl2YXRlKQotICAgICJTZXRzIHBvaW50IGF0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmdW5jdGlvbiBuYW1lIGluCi1lcmxhbmctbWFuLWZ1bmN0aW9uLW5hbWUgd2hlbiB0aGUgbWFuLXBhZ2UgaXMgZGlzcGxheWVkLiIKLSAgICAoaWYgZXJsYW5nLW1hbi1mdW5jdGlvbi1uYW1lCi0JKGVybGFuZy1tYW4tZmluZC1mdW5jdGlvbiAoYWQtZ2V0LWFyZyAwKSBlcmxhbmctbWFuLWZ1bmN0aW9uLW5hbWUpKQotICAgIChzZXRxIGVybGFuZy1tYW4tZnVuY3Rpb24tbmFtZSBuaWwpKSkKLQotCi0oZGVmdW4gZXJsYW5nLW1hbi1maW5kLWZ1bmN0aW9uIChidWYgZnVuYykKLSAgIkZpbmQgbWFudWFsIHBhZ2UgZm9yIGZ1bmN0aW9uIGluIGBlcmxhbmctbWFuLWZ1bmN0aW9uLW5hbWUnIGluIGJ1ZmZlciBCVUYuIgotICAoaWYgZnVuYwotICAgICAgKGxldCAoKHdpbiAoZ2V0LWJ1ZmZlci13aW5kb3cgYnVmKSkpCi0JKGlmIHdpbgotCSAgICAocHJvZ24KLQkgICAgICAoc2V0LWJ1ZmZlciBidWYpCi0JICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLQkgICAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkCi0JCSAgIChjb25jYXQgIl5bIFx0XSsiIGZ1bmMgIiA/KCIpCi0JCSAgIChwb2ludC1tYXgpIHQpCi0JCSAgKHByb2duCi0JCSAgICAoZm9yd2FyZC13b3JkIC0xKQotCQkgICAgKHNldC13aW5kb3ctcG9pbnQgd2luIChwb2ludCkpKQotCQkobWVzc2FnZSAiQ291bGQgbm90IGZpbmQgZnVuY3Rpb24gYCVzJyIgZnVuYykpKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLW1hbi1kaXNwbGF5IChmaWxlKQotICAiRGlzcGxheSBGSUxFIGFzIGEgYG1hbicgZmlsZS4KLVRoaXMgaXMgZGUgZGVmYXVsdCBtYW51YWwgcGFnZSBkaXNwbGF5IGZ1bmN0aW9uLgotVGhlIHZhcmlhYmxlcyBgZXJsYW5nLW1hbi1kaXNwbGF5LWZ1bmN0aW9uJyBjb250YWlucyB0aGUgZnVuY3Rpb24KLXRvIGJlIHVzZWQuIgotICA7OyBFbWFjcyAxOCBkb2Vzbid0IGBwcm92aWRlJyBtYW4uCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChyZXF1aXJlICdtYW4pCi0gICAgKGVycm9yIG5pbCkpCi0gIChpZiBmaWxlCi0gICAgICAobGV0ICgocHJvY2Vzcy1lbnZpcm9ubWVudCAoY29weS1zZXF1ZW5jZSBwcm9jZXNzLWVudmlyb25tZW50KSkpCi0JKGlmIChzdHJpbmctbWF0Y2ggIlxcKC4qXFwpL21hblteL10qL1xcKFteL10rXFwpXFwuW14uXSQiIGZpbGUpCi0JICAgIChsZXQgKChkaXIgKHN1YnN0cmluZyBmaWxlIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkpCi0JCSAgKHBhZ2UgKHN1YnN0cmluZyBmaWxlIChtYXRjaC1iZWdpbm5pbmcgMikgKG1hdGNoLWVuZCAyKSkpKQotCSAgICAgIChpZiAoZmJvdW5kcCAnc2V0ZW52KQotCQkgIChzZXRlbnYgIk1BTlBBVEgiIGRpcikKLQkJOzsgRW1hY3MgMTgKLQkJKHNldHEgcHJvY2Vzcy1lbnZpcm9ubWVudCAoY29ucyAoY29uY2F0ICJNQU5QQVRIPSIgZGlyKQotCQkJCQkJcHJvY2Vzcy1lbnZpcm9ubWVudCkpKQotCSAgICAgIChjb25kICgobm90IChhbmQgKG5vdCBlcmxhbmcteGVtYWNzLXApCi0JCQkgICAgICAgKD0gZXJsYW5nLWVtYWNzLW1ham9yLXZlcnNpb24gMTkpCi0JCQkgICAgICAgKDwgZXJsYW5nLWVtYWNzLW1pbm9yLXZlcnNpb24gMjkpKSkKLQkJICAgICAobWFudWFsLWVudHJ5IHBhZ2UpKQotCQkgICAgKHQKLQkJICAgICA7OyBFbWFjcyAxOS4yOCBhbmQgZWFybGllciB2ZXJzaW9ucyBvZiAxOToKLQkJICAgICA7OyBUaGUgbWFudWFsLWVudHJ5IGNvbW1hbmQgdW5jb25kaXRpb25hbGx5IHByb21wdHMKLQkJICAgICA7OyB0aGUgdXNlciA6LSgKLQkJICAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdNYW4tZ2V0cGFnZS1pbi1iYWNrZ3JvdW5kKQotCQkJICAgICAgcGFnZSkpKSkKLQkgIChlcnJvciAiQ2FuJ3QgZmluZCBtYW4gcGFnZSBmb3IgJXNcbiIgZmlsZSkpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1tYW4tZGVzY3JpYmUtZXJyb3IgKCkKLSAgIkRlc2NyaWJlIHdoeSB0aGUgbWFudWFsIHBhZ2VzIHdlcmVuJ3QgZm91bmQuIgotICAoaW50ZXJhY3RpdmUpCi0gICh3aXRoLW91dHB1dC10by10ZW1wLWJ1ZmZlciAiKkVybGFuZyBNYW4gRXJyb3IqIgotICAgICAgKHByaW5jICJOb3JtYWxseSwgdGhpcyBtZW51IHNob3VsZCBjb250YWluIEVybGFuZyBtYW51YWwgcGFnZXMuCi0KLUluIG9yZGVyIHRvIGZpbmQgdGhlIG1hbnVhbCBwYWdlcywgdGhlIHZhcmlhYmxlIGBlcmxhbmctcm9vdC1kaXInCi1zaG91bGQgYmUgYm91bmQgdG8gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBFcmxhbmcKLWluc3RhbGxhdGlvbi4gIFRoZSBuYW1lIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgZmluYWwgc2xhc2guCi0KLVByYWN0aWNhbGx5LCB5b3Ugc2hvdWxkIGFkZCBhIGxpbmUgb24gdGhlIGZvbGxvd2luZyBmb3JtIHRvCi15b3VyIH4vLmVtYWNzLCBvciBhc2sgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciB0byBhZGQgaXQgdG8KLXRoZSBzaXRlIGluaXQgZmlsZToKLSAgICAoc2V0cSBlcmxhbmctcm9vdC1kaXIgXCIvdGhlL2VybGFuZy9yb290L2Rpci9nb2VzL2hlcmVcIikKLQotRm9yIGV4YW1wbGU6Ci0gICAgKHNldHEgZXJsYW5nLXJvb3QtZGlyIFwiL3Vzci9sb2NhbC9lcmxhbmdcIikKLQotQWZ0ZXIgaW5zdGFsbGluZyB0aGUgbGluZSwga2lsbCBhbmQgcmVzdGFydCBFbWFjcywgb3IgcmVzdGFydCBFcmxhbmcKLW1vZGUgd2l0aCB0aGUgY29tbWFuZCBgTS14IGVybGFuZy1tb2RlIFJFVCcuIikpKQotDAotOzsgU2tlbGV0b24gY29kZToKLQotOzsgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBwYWNrYWdlIGB0ZW1wbycgd2hpY2ggaXMgcGFydCBvZiBtb2Rlcm4KLTs7IEVtYWNzZW4uICAoR05VIEVtYWNzIDE5LjI1ICg/KSBhbmQgWEVtYWNzIDE5LjE0LikKLQotKGRlZnVuIGVybGFuZy1za2VsLWluaXQgKCkKLSAgIkdlbmVyYXRlIHRoZSBza2VsZXRvbiBmdW5jdGlvbnMgYW5kIG1lbnUgaXRlbXMuCi1UaGUgdmFyaWFibGUgYGVybGFuZy1za2VsJyBjb250YWlucyB0aGUgbmFtZSBhbmQgZGVzY3JpcHRpb25zIG9mCi1hbGwgc2tlbGV0b25zLgotCi1UaGUgc2tlbGV0b24gcm91dGluZXMgYXJlIGJhc2VkIG9uIHRoZSBgdGVtcG8nIHBhY2thZ2UuICBTaG91bGQgdGhpcwotcGFja2FnZSBub3QgYmUgcHJlc2VudCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuIgotICAoaW50ZXJhY3RpdmUpCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChyZXF1aXJlICd0ZW1wbykKLSAgICAoZXJyb3IgdCkpCi0gIChpZiAoZmVhdHVyZXAgJ3RlbXBvKQotICAgICAgKGxldCAoKHNrZWwgZXJsYW5nLXNrZWwpCi0JICAgIChtZW51ICcoKSkpCi0JKHdoaWxlIHNrZWwKLQkgIChjb25kICgobnVsbCAoY2FyIHNrZWwpKQotCQkgKHNldHEgbWVudSAoY29ucyBuaWwgbWVudSkpKQotCQkodAotCQkgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAndGVtcG8tZGVmaW5lLXRlbXBsYXRlKQotCQkgIChjb25jYXQgImVybGFuZy0iIChudGggMSAoY2FyIHNrZWwpKSkKLQkJICA7OyBUaGUgdGVtcG8gdGVtcGxhdGUgdXNlZCBjb250YWlucyBhbiBgaW5jbHVkZScKLQkJICA7OyBmdW5jdGlvbiBjYWxsIG9ubHksIGhlbmNlIGNoYW5nZXMgdG8gdGhlCi0JCSAgOzsgdmFyaWFibGVzIGRlc2NyaWJpbmcgdGhlIHRlbXBsYXRlcyB0YWtlIGVmZmVjdAotCQkgIDs7IGltbWRpYXRlbHkuCi0JCSAgKGxpc3QgKGxpc3QgJ2VybGFuZy1za2VsLWluY2x1ZGUgKG50aCAyIChjYXIgc2tlbCkpKSkKLQkJICAobnRoIDEgKGNhciBza2VsKSkpCi0JCSAoc2V0cSBtZW51IChjb25zIChlcmxhbmctc2tlbC1tYWtlLW1lbnUtaXRlbQotCQkJCSAgIChjYXIgc2tlbCkpIG1lbnUpKSkpCi0JICAoc2V0cSBza2VsIChjZHIgc2tlbCkpKQotCShzZXRxIGVybGFuZy1tZW51LXNrZWwtaXRlbXMKLQkgICAgICAobGlzdCBuaWwgKGxpc3QgIlNrZWxldG9ucyIgKG5yZXZlcnNlIG1lbnUpKSkpCi0JKHNldHEgZXJsYW5nLW1lbnUtaXRlbXMKLQkgICAgICAoZXJsYW5nLW1lbnUtYWRkLWFib3ZlICdlcmxhbmctbWVudS1za2VsLWl0ZW1zCi0JCQkJICAgICAnZXJsYW5nLW1lbnUtdmVyc2lvbi1pdGVtcwotCQkJCSAgICAgZXJsYW5nLW1lbnUtaXRlbXMpKQotCShlcmxhbmctbWVudS1pbml0KSkpKQotCi0oZGVmdW4gZXJsYW5nLXNrZWwtbWFrZS1tZW51LWl0ZW0gKHNrZWwpCi0gIChsZXQgKChmdW5jIChpbnRlcm4gKGNvbmNhdCAidGVtcG8tdGVtcGxhdGUtZXJsYW5nLSIgKG50aCAxIHNrZWwpKSkpKQotICAgIChjb25kICgobnVsbCAobnRoIDMgc2tlbCkpCi0JICAgKGxpc3QgKGNhciBza2VsKSBmdW5jKSkKLQkgICh0Ci0JICAgKGxpc3QgKGNhciBza2VsKQotCQkgKGxpc3QgJ2xhbWJkYSAnKCkKLQkJICAgICAgICcoaW50ZXJhY3RpdmUpCi0JCSAgICAgICAobGlzdCAnZnVuY2FsbAotCQkJICAgICAobGlzdCAncXVvdGUgKG50aCAzIHNrZWwpKQotCQkJICAgICAobGlzdCAncXVvdGUgZnVuYykpKSkpKSkpCi0KLTs7IEZ1bmN0aW9ucyBkZXNpZ25lZCB0byBiZSBhZGRlZCB0byB0aGUgc2tlbGV0b24gbWVudS4KLTs7IChOb3Qgbm9ybWFsbHkgdXNlZCkKLShkZWZ1biBlcmxhbmctc2tlbC1pbnNlcnQgKGZ1bmMpCi0gICJJbnNlcnQgc2tlbGV0b24gZ2VuZXJhdGVkIGJ5IEZVTkMgYW5kIGdvdG8gZmlyc3QgdGVtcG8gbWFyay4iCi0gIChzYXZlLWV4Y3Vyc2lvbiAoZnVuY2FsbCBmdW5jKSkKLSAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAndGVtcG8tZm9yd2FyZC1tYXJrKSkpCi0KLShkZWZ1biBlcmxhbmctc2tlbC1oZWFkZXIgKGZ1bmMpCi0gICJJbnNlcnQgdGhlIGhlYWRlciBnZW5lcmF0ZWQgYnkgRlVOQyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuIgotICAoZ290by1jaGFyIChwb2ludC1taW4pKQotICAoc2F2ZS1leGN1cnNpb24gKGZ1bmNhbGwgZnVuYykpCi0gIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3RlbXBvLWZvcndhcmQtbWFyaykpKQotCi0KLTs7IEZ1bmN0aW9ucyB1c2VkIGluc2lkZSB0aGUgc2tlbGV0b24gZGVzY3JpcHRpb25zLgotKGRlZnVuIGVybGFuZy1za2VsLXNraXAtYmxhbmsgKCkKLSAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpCi0gIG5pbCkKLQotKGRlZnVuIGVybGFuZy1za2VsLWluY2x1ZGUgKCZyZXN0IGFyZ3MpCi0gICJJbmNsdWRlIGEgdGVtcGxhdGUgaW5zaWRlIGFub3RoZXIgdGVtcGxhdGUuCi0KLUV4YW1wbGUgb2YgdXNlLCBhc3N1bWluZyB0aGF0IGBlcmxhbmctc2tlbC1mdW5jJyBpcyBkZWZpbmVkOgotCi0gKGRlZnZhciBmb28tc2tlbGV0b24gJyhcIiUlJSBOZXcgZnVuY3Rpb246XCIKLSAgICAgICAgICAgICAgICAgICAgICAgIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWZ1bmMpKSkKLQotVGVjaGljYWxseSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBgdGVtcG8nIGF0dHJpYnV0ZWAobCAuLi4pJyB3aGljaAotY2FuIGNvbnRhaW4gb3RoZXIgYHRlbXBvJyBhdHRyaWJ1dGVzLiAgUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24KLWB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBgKGwgLi4uKScgYXR0cmlidXRlLiIKLSAgKGxldCAoKHJlcyAnKCkpCi0JZW50cnkpCi0gICAgKHdoaWxlIGFyZ3MKLSAgICAgIChzZXRxIGVudHJ5IChjYXIgYXJncykpCi0gICAgICAod2hpbGUgZW50cnkKLQkoc2V0cSByZXMgKGNvbnMgKGNhciBlbnRyeSkgcmVzKSkKLQkoc2V0cSBlbnRyeSAoY2RyIGVudHJ5KSkpCi0gICAgICAoc2V0cSBhcmdzIChjZHIgYXJncykpKQotICAgIChjb25zICdsIChucmV2ZXJzZSByZXMpKSkpCi0KLShkZWZ1biBlcmxhbmctc2tlbC1zZXBhcmF0b3IgKCZvcHRpb25hbCBwZXJjZW50KQotICAiUmV0dXJuIGEgY29tbWVudCBzZXBhcmF0b3IuIgotICAobGV0ICgocGVyY2VudCAob3IgcGVyY2VudCAzKSkpCi0gICAgKGNvbmNhdCAobWFrZS1zdHJpbmcgcGVyY2VudCA/JSkgCi0JICAgIChtYWtlLXN0cmluZyAoLSA3MCBwZXJjZW50KSA/LSkgCi0JICAgICJcbiIpKSkKLQotKGRlZnVuIGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgKCZvcHRpb25hbCBwZXJjZW50KQotICAiUmV0dXJuIGEgY29tbWVudCBzZXBhcmF0b3IuIgotICAobGV0ICgocGVyY2VudCAob3IgcGVyY2VudCAzKSkpCi0gICAgKGNvbmNhdCAobWFrZS1zdHJpbmcgcGVyY2VudCA/JSkgCi0JICAgIChtYWtlLXN0cmluZyAoLSA3MCBwZXJjZW50KSA/PSkgCi0JICAgICJcbiIpKSkKLQotKGRlZnVuIGVybGFuZy1za2VsLWRkLW1tbS15eXl5ICgpCi0gICJSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBhcyBhIHN0cmluZyBpbiBcIkREIE1vbiBZWVlZXCIgZm9ybS4KLVRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgREQgaXMgc3BhY2UgaWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiAxMC4iCi0gIChsZXQgKChkYXRlIChjdXJyZW50LXRpbWUtc3RyaW5nKSkpCi0gICAgKGZvcm1hdCAiJTJkICVzICVzIgotCSAgICAoc3RyaW5nLXRvLWludCAoc3Vic3RyaW5nIGRhdGUgOCAxMCkpCi0JICAgIChzdWJzdHJpbmcgZGF0ZSA0IDcpCi0JICAgIChzdWJzdHJpbmcgZGF0ZSAtNCkpKSkKLQwKLTs7IEluZGVudGF0aW9uIGNvZGU6Ci0KLShkZWZ1biBlcmxhbmctaW5kZW50LWNvbW1hbmQgKCZvcHRpb25hbCB3aG9sZS1leHApCi0gICJJbmRlbnQgY3VycmVudCBsaW5lIGFzIEVybGFuZyBjb2RlLgotV2l0aCBhcmd1bWVudCwgaW5kZW50IGFueSBhZGRpdGlvbmFsIGxpbmVzIG9mIHRoZSBzYW1lIGNsYXVzZQotcmlnaWRseSBhbG9uZyB3aXRoIHRoaXMgb25lLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKGlmIHdob2xlLWV4cAotICAgICAgOzsgSWYgYXJnLCBhbHd5cyBpbmRlbnQgdGhpcyBsaW5lIGFzIEVybGFuZwotICAgICAgOzsgYW5kIHNoaWZ0IHJlbWFpbmluZyBsaW5lcyBvZiBjbGF1c2UgdGhlIHNhbWUgYW1vdW50LgotICAgICAgKGxldCAoKHNoaWZ0LWFtdCAoZXJsYW5nLWluZGVudC1saW5lKSkKLQkgICAgYmVnIGVuZCkKLQkoc2F2ZS1leGN1cnNpb24KLQkgIChpZiBlcmxhbmctdGFiLWFsd2F5cy1pbmRlbnQKLQkgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpKQotCSAgKHNldHEgYmVnIChwb2ludCkpCi0JICAoZXJsYW5nLWVuZC1vZi1jbGF1c2UgMSkKLQkgIChzZXRxIGVuZCAocG9pbnQpKQotCSAgKGdvdG8tY2hhciBiZWcpCi0JICAoZm9yd2FyZC1saW5lIDEpCi0JICAoc2V0cSBiZWcgKHBvaW50KSkpCi0JKGlmICg+IGVuZCBiZWcpCi0JICAgIChpbmRlbnQtY29kZS1yaWdpZGx5IGJlZyBlbmQgc2hpZnQtYW10ICJcbiIpKSkKLSAgICAoaWYgKGFuZCAobm90IGVybGFuZy10YWItYWx3YXlzLWluZGVudCkKLQkgICAgIChzYXZlLWV4Y3Vyc2lvbgotCSAgICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKLQkgICAgICAgKG5vdCAoYm9scCkpKSkKLQkoaW5zZXJ0LXRhYikKLSAgICAgIChlcmxhbmctaW5kZW50LWxpbmUpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1pbmRlbnQtbGluZSAoKQotICAiSW5kZW50IGN1cnJlbnQgbGluZSBhcyBFcmxhbmcgY29kZS4KLVJldHVybiB0aGUgYW1vdW50IHRoZSBpbmRlbnRhdGlvbiBjaGFuZ2VkIGJ5LiIKLSAgKGxldCAoKHBvcyAoLSAocG9pbnQtbWF4KSAocG9pbnQpKSkKLQlpbmRlbnQgYmVnCi0Jc2hpZnQtYW10KQotICAgIChiZWdpbm5pbmctb2YtbGluZSAxKQotICAgIChzZXRxIGJlZyAocG9pbnQpKQotICAgIChza2lwLWNoYXJzLWZvcndhcmQgIiBcdCIpCi0gICAgKGNvbmQgKChsb29raW5nLWF0ICIlIikKLQkgICAoc2V0cSBpbmRlbnQgKGZ1bmNhbGwgY29tbWVudC1pbmRlbnQtZnVuY3Rpb24pKQotCSAgIChzZXRxIHNoaWZ0LWFtdCAoLSBpbmRlbnQgKGN1cnJlbnQtY29sdW1uKSkpKQotCSAgKHQKLQkgICAoc2V0cSBpbmRlbnQgKGVybGFuZy1jYWxjdWxhdGUtaW5kZW50KSkKLQkgICAoY29uZCAoKG51bGwgaW5kZW50KQotCQkgIChzZXRxIGluZGVudCAoY3VycmVudC1pbmRlbnRhdGlvbikpKQotCQkgKChlcSBpbmRlbnQgdCkKLQkJICA7OyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ciBoZXJlLgotCQkgIChlcnJvciAiRXJsYW5nIG1vZGUgZXJyb3IiKSkKLQkJICgoPSAoY2hhci1zeW50YXggKGZvbGxvd2luZy1jaGFyKSkgP1wpKQotCQkgIChzZXRxIGluZGVudCAoMS0gaW5kZW50KSkpKQotCSAgIChzZXRxIHNoaWZ0LWFtdCAoLSBpbmRlbnQgKGN1cnJlbnQtY29sdW1uKSkpKSkKLSAgICAoaWYgKHplcm9wIHNoaWZ0LWFtdCkKLQluaWwKLSAgICAgIChkZWxldGUtcmVnaW9uIGJlZyAocG9pbnQpKQotICAgICAgKGluZGVudC10byBpbmRlbnQpKQotICAgIDs7IElmIGluaXRpYWwgcG9pbnQgd2FzIHdpdGhpbiBsaW5lJ3MgaW5kZW50YXRpb24sIHBvc2l0aW9uCi0gICAgOzsgYWZ0ZXIgdGhlIGluZGVudGF0aW9uLiBFbHNlIHN0YXkgYXQgc2FtZSBwb2ludCBpbiB0ZXh0LgotICAgIChpZiAoPiAoLSAocG9pbnQtbWF4KSBwb3MpIChwb2ludCkpCi0JKGdvdG8tY2hhciAoLSAocG9pbnQtbWF4KSBwb3MpKSkKLSAgICBzaGlmdC1hbXQpKQotCi0KLShkZWZ1biBlcmxhbmctaW5kZW50LXJlZ2lvbiAoYmVnIGVuZCkKLSAgIkluZGVudCByZWdpb24gb2YgZXJsYW5nIGNvZGUuCi0KLVRoaXMgaXMgYXV0b21hZ2ljYWxseSBjYWxsZWQgYnkgdGhlIHVzZXIgbGV2ZWwgZnVuY3Rpb24gYGluZGVudC1yZWdpb24nLiIKLSAgKGludGVyYWN0aXZlICJyIikKLSAgKHNhdmUtZXhjdXJzaW9uCi0gICAgKGxldCAoKGNhc2UtZm9sZC1zZWFyY2ggbmlsKQotCSAgKGNvbnRpbnVlIHQpCi0JICAoZnJvbS1lbmQgKC0gKHBvaW50LW1heCkgZW5kKSkKLQkgIGluZGVudC1wb2ludAkJOzsgVGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBsaW5lCi0JICBpbmRlbnQgCQk7OyBUaGUgaW5kZW50IGFtb3VudAotCSAgc3RhdGUpCi0gICAgICAoZ290by1jaGFyIGJlZykKLSAgICAgIChiZWdpbm5pbmctb2YtbGluZSkKLSAgICAgIChzZXRxIGluZGVudC1wb2ludCAocG9pbnQpKQotICAgICAgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlKQotICAgICAgOzsgUGFyc2UgdGhlIEVybGFuZyBjb2RlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2xhdXNlIHRvCi0gICAgICA7OyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb24uCi0gICAgICAod2hpbGUgKDwgKHBvaW50KSBpbmRlbnQtcG9pbnQpCi0JKHNldHEgc3RhdGUgKGVybGFuZy1wYXJ0aWFsLXBhcnNlIChwb2ludCkgaW5kZW50LXBvaW50IHN0YXRlKSkpCi0gICAgICA7OyBJbmRlbnQgZXZlcnkgbGluZSBpbiB0aGUgcmVnaW9uCi0gICAgICAod2hpbGUgY29udGludWUKLQkoZ290by1jaGFyIGluZGVudC1wb2ludCkKLQkoc2tpcC1jaGFycy1mb3J3YXJkICIgXHQiKQotCShjb25kICgobG9va2luZy1hdCAiJSIpCi0JICAgICAgIDs7IERvIG5vdCB1c2Ugb3VyIHN0YWNrIHRvIGhlbHAgdGhlIHVzZXIgdG8gY3VzdG9taXplCi0JICAgICAgIDs7IGNvbW1lbnQgaW5kZW50YXRpb24uCi0JICAgICAgIChzZXRxIGluZGVudCAoZnVuY2FsbCBjb21tZW50LWluZGVudC1mdW5jdGlvbikpKQotCSAgICAgICgobG9va2luZy1hdCAiJCIpCi0JICAgICAgIDs7IERvbid0IGluZGVudCBlbXB0eSBsaW5lcy4KLQkgICAgICAgKHNldHEgaW5kZW50IDApKQotCSAgICAgICh0Ci0JICAgICAgIChzZXRxIGluZGVudAotCQkgICAgIChzYXZlLWV4Y3Vyc2lvbgotCQkgICAgICAgKGVybGFuZy1jYWxjdWxhdGUtc3RhY2staW5kZW50IChwb2ludCkgc3RhdGUpKSkKLQkgICAgICAgKGNvbmQgKChudWxsIGluZGVudCkKLQkJICAgICAgKHNldHEgaW5kZW50IChjdXJyZW50LWluZGVudGF0aW9uKSkpCi0JCSAgICAgKChlcSBpbmRlbnQgdCkKLQkJICAgICAgOzsgVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIgaGVyZS4KLQkJICAgICAgKGVycm9yICJFcmxhbmcgbW9kZSBlcnJvciIpKQotCQkgICAgICgoPSAoY2hhci1zeW50YXggKGZvbGxvd2luZy1jaGFyKSkgP1wpKQotCQkgICAgICAoc2V0cSBpbmRlbnQgKDEtIGluZGVudCkpKSkpKQotCShpZiAoemVyb3AgKC0gaW5kZW50IChjdXJyZW50LWNvbHVtbikpKQotCSAgICBuaWwKLQkgIChkZWxldGUtcmVnaW9uIGluZGVudC1wb2ludCAocG9pbnQpKQotCSAgKGluZGVudC10byBpbmRlbnQpKQotCTs7IEZpbmQgdGhlIG5leHQgbGluZSBpbiB0aGUgcmVnaW9uCi0JKGdvdG8tY2hhciBpbmRlbnQtcG9pbnQpCi0JKHNhdmUtZXhjdXJzaW9uCi0JICAoZm9yd2FyZC1saW5lIDEpCi0JICAoc2V0cSBpbmRlbnQtcG9pbnQgKHBvaW50KSkpCi0JKGlmICg+PSBmcm9tLWVuZCAoLSAocG9pbnQtbWF4KSBpbmRlbnQtcG9pbnQpKQotCSAgICAoc2V0cSBjb250aW51ZSBuaWwpCi0JICAod2hpbGUgKDwgKHBvaW50KSBpbmRlbnQtcG9pbnQpCi0JICAgIChzZXRxIHN0YXRlIChlcmxhbmctcGFydGlhbC1wYXJzZQotCQkJIChwb2ludCkgaW5kZW50LXBvaW50IHN0YXRlKSkpKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWluZGVudC1jdXJyZW50LWJ1ZmZlciAoKQotICAiSW5kZW50IGN1cnJlbnQgYnVmZmVyIGFzIEVybGFuZyBjb2RlLiIKLSAgKGludGVyYWN0aXZlKQotICAoc2F2ZS1leGN1cnNpb24KLSAgICAoc2F2ZS1yZXN0cmljdGlvbgotICAgICAgKHdpZGVuKQotICAgICAgKGVybGFuZy1pbmRlbnQtcmVnaW9uIChwb2ludC1taW4pIChwb2ludC1tYXgpKSkpKQotCi0KLShkZWZ1biBlcmxhbmctaW5kZW50LWZ1bmN0aW9uICgpCi0gICJJbmRlbnQgY3VycmVudCBFcmxhbmcgZnVuY3Rpb24uIgotICAoaW50ZXJhY3RpdmUpCi0gIChzYXZlLWV4Y3Vyc2lvbgotICAgIChsZXQgKChlbmQgKHByb2duIChlcmxhbmctZW5kLW9mLWZ1bmN0aW9uIDEpIChwb2ludCkpKQotCSAgKGJlZyAocHJvZ24gKGVybGFuZy1iZWdpbm5pbmctb2YtZnVuY3Rpb24gMSkgKHBvaW50KSkpKQotICAgICAgKGVybGFuZy1pbmRlbnQtcmVnaW9uIGJlZyBlbmQpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1pbmRlbnQtY2xhdXNlICgpCi0gICJJbmRlbnQgY3VycmVudCBFcmxhbmcgY2xhdXNlLiIKLSAgKGludGVyYWN0aXZlKQotICAoc2F2ZS1leGN1cnNpb24KLSAgICAobGV0ICgoZW5kIChwcm9nbiAoZXJsYW5nLWVuZC1vZi1jbGF1c2UgMSkgKHBvaW50KSkpCi0JICAoYmVnIChwcm9nbiAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgMSkgKHBvaW50KSkpKQotICAgICAgKGVybGFuZy1pbmRlbnQtcmVnaW9uIGJlZyBlbmQpKSkpCi0KLQotKGRlZm1hY3JvIGVybGFuZy1wdXNoICh4IHN0YWNrKSAobGlzdCAnc2V0cSBzdGFjayAobGlzdCAnY29ucyB4IHN0YWNrKSkpCi0oZGVmbWFjcm8gZXJsYW5nLXBvcCAoc3RhY2spIChsaXN0ICdzZXRxIHN0YWNrIChsaXN0ICdjZHIgc3RhY2spKSkKLTs7IFdvdWxkIG11Y2ggcHJlZmVyIHRvIG1ha2UgY2FkZHIgYSBtYWNybyBidXQgdGhpcyBjbGFzaGVzLgotKGRlZnVuIGVybGFuZy1jYWRkciAoeCkgKGNhciAoY2RyIChjZHIgeCkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWNhbGN1bGF0ZS1pbmRlbnQgKCZvcHRpb25hbCBwYXJzZS1zdGFydCkKLSAgIkNvbXB1dGUgYXBwcm9wcmlhdGUgaW5kZW50YXRpb24gZm9yIGN1cnJlbnQgbGluZSBhcyBFcmxhbmcgY29kZS4KLVJldHVybiBuaWwgaWYgbGluZSBzdGFydHMgaW5zaWRlIHN0cmluZywgdCBpZiBpbiBhIGNvbW1lbnQuIgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAobGV0ICgoaW5kZW50LXBvaW50IChwb2ludCkpCi0JICAoY2FzZS1mb2xkLXNlYXJjaCBuaWwpCi0JICAoc3RhdGUgbmlsKSkKLSAgICAgIChpZiBwYXJzZS1zdGFydAotCSAgKGdvdG8tY2hhciBwYXJzZS1zdGFydCkKLQkoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpKQotICAgICAgKHdoaWxlICg8IChwb2ludCkgaW5kZW50LXBvaW50KQotCShzZXRxIHN0YXRlIChlcmxhbmctcGFydGlhbC1wYXJzZSAocG9pbnQpIGluZGVudC1wb2ludCBzdGF0ZSkpKQotICAgICAgKGVybGFuZy1jYWxjdWxhdGUtc3RhY2staW5kZW50IGluZGVudC1wb2ludCBzdGF0ZSkpKSkKLQotKGRlZnVuIGVybGFuZy1zaG93LXN5bnRhY3RpYy1pbmZvcm1hdGlvbiAoKQotICAiU2hvdyBzeW50YWN0aWMgaW5mb3JtYXRpb24gZm9yIGN1cnJlbnQgbGluZS4iCi0KLSAgKGludGVyYWN0aXZlKQotCi0gIChzYXZlLWV4Y3Vyc2lvbgotICAgIChsZXQgKChzdGFydGluZy1wb2ludCAocG9pbnQpKQotCSAgKGNhc2UtZm9sZC1zZWFyY2ggbmlsKQotCSAgKHN0YXRlIG5pbCkpCi0gICAgICAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCi0gICAgICAod2hpbGUgKDwgKHBvaW50KSBzdGFydGluZy1wb2ludCkKLQkoc2V0cSBzdGF0ZSAoZXJsYW5nLXBhcnRpYWwtcGFyc2UgKHBvaW50KSBzdGFydGluZy1wb2ludCBzdGF0ZSkpKQotICAgICAgKG1lc3NhZ2UgIiVTIiBzdGF0ZSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLXBhcnRpYWwtcGFyc2UgKGZyb20gdG8gJm9wdGlvbmFsIHN0YXRlKQotICAiUGFyc2UgRXJsYW5nIHN5bnRheCBzdGFydGluZyBhdCBGUk9NIHVudGlsIFRPLCB3aXRoIGFuIG9wdGlvbmFsIFNUQVRFLgotVmFsdWUgaXMgbGlzdCAoc3RhY2sgdG9rZW4tc3RhcnQgdG9rZW4tdHlwZSBpbi13aGF0KS4iCi0gIChnb3RvLWNoYXIgZnJvbSkJCQk7IFN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcKLSAgKGVybGFuZy1za2lwLWJsYW5rIHRvKQotICAobGV0ICgoY3MgKGNoYXItc3ludGF4IChmb2xsb3dpbmctY2hhcikpKQotCShzdGFjayAoY2FyIHN0YXRlKSkKLQkodG9rZW4gKHBvaW50KSkKLQlpbi13aGF0KQotICAgIChjb25kIAotCi0gICAgIDs7IERvbmU6IFJldHVybiBwcmV2aW91cyBzdGF0ZS4KLSAgICAgKCg+PSB0b2tlbiB0bykKLQkgICAoc2V0cSB0b2tlbiAobnRoIDEgc3RhdGUpKQotCSAgIChzZXRxIGNzIChudGggMiBzdGF0ZSkpCi0JICAgKHNldHEgaW4td2hhdCAobnRoIDMgc3RhdGUpKSkKLSAgICAgOzsgV29yZCBjb25zdGl0dWVudDogY2hlY2sgYW5kIGhhbmRsZSBrZXl3b3Jkcy4KLSAgICAgKCg9IGNzID93KQotICAgICAgKGlmIChsb29raW5nLWF0ICJcXChlbmRcXHxhZnRlclxcKVteX2EtekEtWjAtOV0iKQotCSAgOzsgTXVzdCBwb3AgdG9wIGljciBsYXllciwgYGFmdGVyJyB3aWxsIHB1c2ggYSBuZXcKLQkgIDs7IGxheWVyIG5leHQuCi0JICAocHJvZ24KLQkgICAgKHdoaWxlIChhbmQgc3RhY2sgKGVxIChjYXIgKGNhciBzdGFjaykpICctPikpCi0JICAgICAgKGVybGFuZy1wb3Agc3RhY2spKQotCSAgICAoaWYgKGFuZCBzdGFjayAobWVtcSAoY2FyIChjYXIgc3RhY2spKSAnKGljciBiZWdpbikpKQotCQkoZXJsYW5nLXBvcCBzdGFjaykpKSkKLSAgICAgIChjb25kICgobG9va2luZy1hdAotCSAgICAgICJcXChpZlxcfGNhc2VcXHxyZWNlaXZlXFx8YWZ0ZXJcXClbXl9hLXpBLVowLTldIikKLQkgICAgIDs7IE11c3QgcHVzaCBhIG5ldyBpY3IgKGlmL2Nhc2UvcmVjZWl2ZSkgbGF5ZXIuCi0JICAgICAoZXJsYW5nLXB1c2ggKGxpc3QgJ2ljciB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykpCi0JICAgICgobG9va2luZy1hdCAiXFwoZnVuXFwpW15fYS16QS1aMC05XSIpCi0JICAgICA7OyBQdWNoIGEgbmV3IGljciBsYXllciBpZiB3ZSBhcmUgZGVmaW5pbmcgYSBgZnVuJwotCSAgICAgOzsgZXhwcmVzc2lvbiwgbm90IHdoZW4gd2UgYXJlIHJlZmVyaW5nIGFuIGV4aXN0aW5nCi0JICAgICA7OyBmdW5jdGlvbi4KLQkgICAgIChpZiAoc2F2ZS1leGN1cnNpb24KLQkJICAgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDEpKQotCQkgICAoZXJsYW5nLXNraXAtYmxhbmsgdG8pCi0JCSAgIChlcSAoZm9sbG93aW5nLWNoYXIpID9cKCkpCi0JCSAoZXJsYW5nLXB1c2ggKGxpc3QgJ2ljciB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykpKQotCSAgICAoKGxvb2tpbmctYXQgIlxcKGJlZ2luXFx8cXVlcnlcXClbXl9hLXpBLVowLTldIikKLQkgICAgIChlcmxhbmctcHVzaCAobGlzdCAnYmVnaW4gdG9rZW4gKGN1cnJlbnQtY29sdW1uKSkgc3RhY2spKQotCSAgICAoKGxvb2tpbmctYXQgIndoZW5bXl9hLXpBLVowLTldIikKLQkgICAgIChlcmxhbmctcHVzaCAobGlzdCAnd2hlbiB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykpKQotICAgICAgKGZvcndhcmQtc2V4cCAxKSkKLQotICAgICA7OyBTdHJpbmc6IFRyeSB0byBza2lwIG92ZXIgaXQuIChDYXRjaCBlcnJvciBpZiBub3QgY29tcGxldGUuKQotICAgICAoKD0gY3MgP1wiKQotICAgICAgKGNvbmRpdGlvbi1jYXNlIG5pbAotCSAgKHByb2duCi0JICAgIChmb3J3YXJkLXNleHAgMSkKLQkgICAgKGlmICg+IChwb2ludCkgdG8pCi0JCShwcm9nbgotCQkgIChzZXRxIGluLXdoYXQgJ3N0cmluZykKLQkJICAoZ290by1jaGFyIHRvKSkpKQotCShlcnJvcgotCSAoc2V0cSBpbi13aGF0ICdzdHJpbmcpCi0JIChnb3RvLWNoYXIgdG8pKSkpCi0KLSAgICAgOzsgU3ltYm9sIGNvbnN0aXR1ZW50LCBwdW5jdHVhdGlvbiwgb3IgZXhwcmVzc2lvbiBwcmVmaXg/Ci0gICAgICgobWVtcSBjcyAnKD8uID9fID8nKSkKLSAgICAgIChjb25kIAotCi0gICAgICAgOzsgQ2xhdXNlIGVuZAotICAgICAgICgoPSAoZm9sbG93aW5nLWNoYXIpID9cOykKLQkoaWYgKGFuZCBzdGFjayAoZXEgKGNhciAoY2FyIHN0YWNrKSkgJy0+KSkKLQkgICAgKGVybGFuZy1wb3Agc3RhY2spKQotCShmb3J3YXJkLWNoYXIgMSkpCi0KLSAgICAgICA7OyBGdW5jdGlvbiBlbmQKLSAgICAgICAoKGxvb2tpbmctYXQgIlxcLlxcKFxccyBcXHxcblxcfFxcczxcXCkiKQotCShzZXRxIHN0YWNrIG5pbCkKLQkoZm9yd2FyZC1jaGFyIDEpKQotCi0gICAgICAgOzsgRnVuY3Rpb24gaGVhZAotICAgICAgICgobG9va2luZy1hdCAiLT5cXHw6LSIpCi0JKGlmIChhbmQgc3RhY2sgKGVxIChjYXIgKGNhciBzdGFjaykpICd3aGVuKSkKLQkgICAgKGVybGFuZy1wb3Agc3RhY2spKQotCShlcmxhbmctcHVzaCAobGlzdCAnLT4gdG9rZW4gKGN1cnJlbnQtY29sdW1uKSkgc3RhY2spCi0JKGZvcndhcmQtY2hhciAyKSkKLQotICAgICAgIDs7IExpc3QtY29tcHJlaGVuc2lvbiBkaXZpZGVyCi0gICAgICAgKChsb29raW5nLWF0ICJ8fCIpCi0JKGVybGFuZy1wdXNoIChsaXN0ICd8fCB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykKLQkoZm9yd2FyZC1jaGFyIDIpKQotCi0gICAgICAgOzsgQml0LXN5bnRheCBvcGVuIHBhcmVuCi0gICAgICAgKChsb29raW5nLWF0ICI8PCIpCi0JKGVybGFuZy1wdXNoIChsaXN0ICdcKCB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykKLQkoZm9yd2FyZC1jaGFyIDIpKQotCi0gICAgICAgOzsgQmJpdC1zeW50YXggY2xvc2UgcGFyZW4KLSAgICAgICAoKGxvb2tpbmctYXQgIj4+IikKLQkod2hpbGUgKG1lbXEgKGNhciAoY2FyIHN0YWNrKSkgJyh8fCAtPikpCi0JICAoZXJsYW5nLXBvcCBzdGFjaykpCi0JKGNvbmQgKChlcSAoY2FyIChjYXIgc3RhY2spKSAnXCgpCi0JICAgICAgIChlcmxhbmctcG9wIHN0YWNrKSkKLQkgICAgICAoKG1lbXEgKGNhciAoY2FyIHN0YWNrKSkgJyhpY3IgYmVnaW4pKQotCSAgICAgICAoZXJyb3IgIk1pc3NpbmcgYGVuZCciKSkKLQkgICAgICAodAotCSAgICAgICAoZXJyb3IgIlVuYmFsYW5jZWQgcGFyZW50aGVzZXMiKSkpCi0JKGZvcndhcmQtY2hhciAyKSkKLQotICAgICAgIDs7IE1hY3JvCi0gICAgICAgKCg9IChmb2xsb3dpbmctY2hhcikgPz8pCi0JOzsgU2tpcCBvdmVyIG1hY3JvIG5hbWUgYW5kIGFueSBmb2xsb3dpbmcgd2hpdGVzcGFjZS4KLQkoZm9yd2FyZC13b3JkIDEpCi0JKHNraXAtc3ludGF4LWZvcndhcmQgIi0iIHRvKQotCTs7IE1hY3JvIG1pZ2h0IGhhdmUgYW4gYXJndW1lbnQgbGlzdC4gU2tpcCBpdCB0b28uCi0JKHdoZW4gKD0gKGZvbGxvd2luZy1jaGFyKSA/XCgpCi0JICAoZm9yd2FyZC1saXN0IDEpKSkKLQotICAgICAgIDs7IE90aGVyIHB1bmN0dWF0aW9uOiBTa2lwIG92ZXIgaXQgYW5kIGFueSBmb2xsb3dpbmcgcHVuY3R1YXRpb24KLSAgICAgICAoKD0gY3MgPy4pCi0JOzsgU2tpcCBvdmVyIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBvcGVyYW5kLgotCShza2lwLXN5bnRheC1mb3J3YXJkICIuIikpCi0KLSAgICAgICA7OyBPdGhlciBjaGFyOiBTa2lwIG92ZXIgaXQuCi0gICAgICAgKHQKLQkoZm9yd2FyZC1jaGFyIDEpKSkpCi0KLSAgICAgOzsgT3BlbiBwYXJlbnRoZXNpcwotICAgICAoKD0gY3MgP1woKQotICAgICAgKGVybGFuZy1wdXNoIChsaXN0ICdcKCB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykKLSAgICAgIChmb3J3YXJkLWNoYXIgMSkpCi0KLSAgICAgOzsgQ2xvc2UgcGFyZW50aGVzaXMKLSAgICAgKCg9IGNzID9cKSkKLSAgICAgICh3aGlsZSAobWVtcSAoY2FyIChjYXIgc3RhY2spKSAnKHx8IC0+KSkKLQkoZXJsYW5nLXBvcCBzdGFjaykpCi0gICAgICAoY29uZCAoKGVxIChjYXIgKGNhciBzdGFjaykpICdcKCkKLQkgICAgIChlcmxhbmctcG9wIHN0YWNrKSkKLQkgICAgKChtZW1xIChjYXIgKGNhciBzdGFjaykpICcoaWNyIGJlZ2luKSkKLQkgICAgIChlcnJvciAiTWlzc2luZyBgZW5kJyIpKQotCSAgICAodAotCSAgICAgKGVycm9yICJVbmJhbGFuY2VkIHBhcmVudGhlc2lzIikpKQotICAgICAgKGZvcndhcmQtY2hhciAxKSkKLSAgICAgCi0gICAgIDs7IENoYXJhY3RlciBxdW90ZTogU2tpcCBpdCBhbmQgdGhlIHF1b3RlZCBjaGFyLgotICAgICAoKD0gY3MgPy8pCi0gICAgICAoZm9yd2FyZC1jaGFyIDIpKQotCi0gICAgIDs7IENoYXJhY3RlciBlc2NhcGU6IFNraXAgaXQgYW5kIHRoZSBlc2NhcGUgc2VxdWVuY2UuCi0gICAgICgoPSBjcyA/XFwpCi0gICAgICAoZm9yd2FyZC1jaGFyIDEpCi0gICAgICAoc2tpcC1zeW50YXgtZm9yd2FyZCAidyIpKQotCi0gICAgIDs7IEV2ZXJ5dGhpbmcgZWxzZQotICAgICAodAotICAgICAgKGZvcndhcmQtY2hhciAxKSkpCi0gICAgKGxpc3Qgc3RhY2sgdG9rZW4gY3MgaW4td2hhdCkpKQotCi0KLShkZWZ1biBlcmxhbmctY2FsY3VsYXRlLXN0YWNrLWluZGVudCAoaW5kZW50LXBvaW50IHN0YXRlKQotICAiRnJvbSB0aGUgZ2l2ZW4gbGFzdCBwb3NpdGlvbiBhbmQgc3RhdGUgKHN0YWNrKSBjYWxjdWxhdGUgaW5kZW50YXRpb24uCi1SZXR1cm4gbmlsIGlmIGluc2lkZSBzdHJpbmcsIHQgaWYgaW4gYSBjb21tZW50LiIKLSAgKGxldCogKChzdGFjayAoYW5kIHN0YXRlIChjYXIgc3RhdGUpKSkKLQkgKHRva2VuIChudGggMSBzdGF0ZSkpCi0JIChzdGFjay10b3AgKGFuZCBzdGFjayAoY2FyIHN0YWNrKSkpKQotICAgIChjb25kICgobnVsbCBzdGF0ZSkJCQk7Tm8gc3RhdGUKLQkgICAwKQotCSAgKChudGggMyBzdGF0ZSkKLQkgICA7OyBSZXR1cm4gbmlsIG9yIHQuCi0JICAgKGVxIChudGggMyBzdGF0ZSkgJ2NvbW1lbnQpKQotCSAgKChudWxsIHN0YWNrKQotCSAgIChpZiAobG9va2luZy1hdCAid2hlblteX2EtekEtWjAtOV0iKQotCSAgICAgICBlcmxhbmctaW5kZW50LWd1YXJkCi0JICAgICAwKSkKLQkgICgoZXEgKGNhciBzdGFjay10b3ApICdcKCkKLQkgICA7OyBFbGVtZW50IG9mIGxpc3QsIHR1cGxlIG9yIHBhcnQgb2YgYW4gZXhwcmVzc2lvbiwKLQkgICAoaWYgKG51bGwgZXJsYW5nLWFyZ3VtZW50LWluZGVudCkKLQkgICAgICAgOzsgaW5kZW50IHRvIG5leHQgY29sdW1uLgotCSAgICAgICAoMSsgKG50aCAyIHN0YWNrLXRvcCkpCi0JICAgICAoZ290by1jaGFyIChudGggMSBzdGFjay10b3ApKQotCSAgICAgKGNvbmQgKChsb29raW5nLWF0ICJbKHtdXFxzICpcXCgkXFx8JVxcKSIpCi0JCSAgICA7OyBMaW5lIGVuZHMgd2l0aCBwYXJlbnRoZXNpcy4KLQkJICAgICgrIChlcmxhbmctaW5kZW50LWZpbmQtcHJlY2VkaW5nLWV4cHIpCi0JCSAgICAgICBlcmxhbmctYXJndW1lbnQtaW5kZW50KSkKLQkJICAgKHQKLQkJICAgIDs7IEluZGVudCB0byB0aGUgc2FtZSBjb2x1bW4gYXMgdGhlIGZpcnN0Ci0JCSAgICA7OyBhcmd1bWVudC4KLQkJICAgIChnb3RvLWNoYXIgKDErIChudGggMSBzdGFjay10b3ApKSkKLQkJICAgIChza2lwLWNoYXJzLWZvcndhcmQgIiBcdCIpCi0JCSAgICAoY3VycmVudC1jb2x1bW4pKSkpKQotCSAgKChlcSAoY2FyIHN0YWNrLXRvcCkgJ2ljcikKLQkgICA7OyBUaGUgZGVmYXVsdCBpbmRlbnRhdGlvbiBpcyB0aGUgY29sdW1uIG9mIHRoZSBvcHRpb24KLQkgICA7OyBkaXJlY3RseSBmb2xsb3dpbmcgdGhlIGtleXdvcmQuIChUaGlzIGRvZXMgbm90IGFwcGx5IHRvCi0JICAgOzsgYGNhc2UnLikgIFNob3VsZCBubyBvcHRpb24gYmUgb24gdGhlIHNhbWUgbGluZSwgdGhlCi0JICAgOzsgaW5kZW50YXRpb24gaXMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBrZXl3b3JkICsKLQkgICA7OyBgZXJsYW5nLWluZGVudC1sZXZlbCcuCi0JICAgOzsKLQkgICA7OyBgYWZ0ZXInIHNob3VsZCBiZSBpbmRlbnRhdGVkIHRvIHRoZSBzYXZlIGxldmVsIGFzIHRoZQotCSAgIDs7IGNvcnJlc3BvbmRpbmcgcmVjZWl2ZS4KLQkgICAoaWYgKGxvb2tpbmctYXQgImFmdGVyW15fYS16QS1aMC05XSIpCi0JICAgICAgIChudGggMiBzdGFjay10b3ApCi0JICAgICAoc2F2ZS1leGN1cnNpb24KLQkgICAgICAgKGdvdG8tY2hhciAobnRoIDEgc3RhY2stdG9wKSkKLQkgICAgICAgKGlmIChsb29raW5nLWF0ICJjYXNlW15fYS16QS1aMC05XSIpCi0JCSAgICgrIChudGggMiBzdGFjay10b3ApIGVybGFuZy1pbmRlbnQtbGV2ZWwpCi0JCSAoc2tpcC1jaGFycy1mb3J3YXJkICJhLXoiKQotCQkgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKLQkJIChpZiAobWVtcSAoZm9sbG93aW5nLWNoYXIpICcoPyUgP1xuKSkKLQkJICAgICAoKyAobnRoIDIgc3RhY2stdG9wKSBlcmxhbmctaW5kZW50LWxldmVsKQotCQkgICAoY3VycmVudC1jb2x1bW4pKSkpKSkKLQkgIDs7IFJlYWwgaW5kZW50YXRpb24sIHdoZXJlIG9wZXJhdG9ycyBjcmVhdGUgZXh0cmEgaW5kZW50YXRpb24gZXRjLgotCSAgKChtZW1xIChjYXIgc3RhY2stdG9wKSAnKC0+IHx8IGJlZ2luKSkKLQkgICAoZ290by1jaGFyIChudGggMSBzdGFjay10b3ApKQotCSAgIDs7IENoZWNrIGlmIHRoZXJlIGlzIG1vcmUgY29kZSBhZnRlciB0aGUgJy0+JyBvbiB0aGUKLQkgICA7OyBzYW1lIGxpbmUuIElmIHNvIHVzZSB0aGlzIGluZGVudGF0aW9uIGFzIGJhc2UsIGVsc2UKLQkgICA7OyB1c2UgcGFyZW50IGluZGVudGF0aW9uICsgMiAqIGxldmVsIGFzIGJhc2UuCi0JICAgKGxldCAoKG9mZiBlcmxhbmctaW5kZW50LWxldmVsKQotCQkgKHNraXAgMikpCi0JICAgICAoY29uZCAoKG51bGwgKGNkciBzdGFjaykpKQk7IFRvcCBsZXZlbCBpbiBmdW5jdGlvbi4KLQkJICAgKChlcSAoY2FyIHN0YWNrLXRvcCkgJ2JlZ2luKQotCQkgICAgKHNldHEgc2tpcCA1KSkKLQkJICAgKChlcSAoY2FyIHN0YWNrLXRvcCkgJy0+KQotCQkgICAgKHNldHEgb2ZmICgqIDIgZXJsYW5nLWluZGVudC1sZXZlbCkpKSkKLQkgICAgIChsZXQgKChiYXNlIChlcmxhbmctaW5kZW50LWZpbmQtYmFzZSBzdGFjayBpbmRlbnQtcG9pbnQgb2ZmIHNraXApKSkKLQkgICAgICAgOzsgTG9vayBhdCBsYXN0IHRoaW5nIHRvIHNlZSBob3cgd2UgYXJlIHRvIG1vdmUgcmVsYXRpdmUKLQkgICAgICAgOzsgdG8gdGhlIGJhc2UuCi0JICAgICAgIChnb3RvLWNoYXIgdG9rZW4pCi0JICAgICAgIChjb25kICgobG9va2luZy1hdCAifHxcXHwsXFx8LT5cXHw6LSIpCi0JCSAgICAgIGJhc2UpCi0JCSAgICAgKChlcmxhbmctYXQta2V5d29yZCkKLQkJICAgICAgKCsgKGN1cnJlbnQtY29sdW1uKSBlcmxhbmctaW5kZW50LWxldmVsKSkKLQkJICAgICAoKG9yICg9IChjaGFyLXN5bnRheCAoZm9sbG93aW5nLWNoYXIpKSA/LikKLQkJCSAgKGVybGFuZy1hdC1vcGVyYXRvcikpCi0JCSAgICAgICgrIGJhc2UgZXJsYW5nLWluZGVudC1sZXZlbCkpCi0JCSAgICAgKHQKLQkJICAgICAgKGdvdG8tY2hhciBpbmRlbnQtcG9pbnQpCi0JCSAgICAgIChjb25kICgobWVtcSAoZm9sbG93aW5nLWNoYXIpICcoP1woID97KSkKLQkJCSAgICAgOzsgRnVuY3Rpb24gYXBwbGljYXRpb24gb3IgcmVjb3JkLgotCQkJICAgICAoKyAoZXJsYW5nLWluZGVudC1maW5kLXByZWNlZGluZy1leHByKQotCQkJCWVybGFuZy1hcmd1bWVudC1pbmRlbnQpKQotCQkJICAgIDs7IEVtcHR5IGxpbmUsIG9yIGVuZDsgdHJlYXQgaXQgYXMgdGhlIGVuZCBvZgotCQkJICAgIDs7IHRoZSBibG9jay4gIChIZXJlIHdlIGhhdmUgYSBjaG9pY2U6IHNob3VsZAotCQkJICAgIDs7IHRoZSB1c2VyIGJlIGZvcmNlZCB0byByZWluZGVudCBjb250aW51ZWQKLQkJCSAgICA7OyBsaW5lcywgb3Igc2hvdWxkIHRoZSAiZW5kIiBiZSByZWluZGVudGVkPykKLQkJCSAgICAoKGxvb2tpbmctYXQgIlxcKGVuZFxcfGFmdGVyXFwpW15fYS16QS1aMC05XVxcfCQiKQotCQkJICAgICAoaWYgKGVxIChjYXIgKGNhciBzdGFjaykpICctPikKLQkJCQkgKGVybGFuZy1wb3Agc3RhY2spKQotCQkJICAgICAoaWYgc3RhY2sKLQkJCQkgKGVybGFuZy1jYWRkciAoY2FyIHN0YWNrKSkKLQkJCSAgICAgICAwKSkKLQkJCSAgICA7OyBBdm9pZCB0cmF0aW5nIGNvbW1lbnRzIGEgY29udGludWVkIGxpbmUuCi0JCQkgICAgKCg9IChmb2xsb3dpbmctY2hhcikgPyUpCi0JCQkgICAgIGJhc2UpCi0JCQkgICAgOzsgQ29udGludWVkIGxpbmUgKGUuZy4gbGluZSBiZWdpbm5pbmcKLQkJCSAgICA7OyB3aXRoIGFuIG9wZXJhdG9yLikKLQkJCSAgICAodCAoKyBiYXNlIGVybGFuZy1pbmRlbnQtbGV2ZWwpKSkpKSkpKQotCSAgKChlcSAoY2FyIHN0YWNrLXRvcCkgJ3doZW4pCi0JICAgKGdvdG8tY2hhciAobnRoIDEgc3RhY2stdG9wKSkKLQkgICAoaWYgKGxvb2tpbmctYXQgIndoZW5cXHMgKlxcKCRcXHwlXFwpIikKLQkgICAgICAgKHByb2duCi0JCSAoZXJsYW5nLXBvcCBzdGFjaykKLQkJIChpZiAoYW5kIHN0YWNrIChlcSAobnRoIDAgKGNhciBzdGFjaykpICdpY3IpKQotCQkgICAgIChwcm9nbgotCQkgICAgICAgKGdvdG8tY2hhciAobnRoIDEgKGNhciBzdGFjaykpKQotCQkgICAgICAgKCsgKG50aCAyIChjYXIgc3RhY2spKSBlcmxhbmctaW5kZW50LWd1YXJkCi0JCQkgIDs7IHJlY2VpdmUgWFlaICAgIG9yICAgIHJlY2VpdmUKLQkJCSAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgIFhZWgotCQkJICAoaWYgKGxvb2tpbmctYXQgIlthLXpdK1xccyAqXFwoJFxcfCVcXCkiKQotCQkJICAgICAgZXJsYW5nLWluZGVudC1sZXZlbAotCQkJICAgICgqIDIgZXJsYW5nLWluZGVudC1sZXZlbCkpKSkKLQkJICAgZXJsYW5nLWluZGVudC1ndWFyZCkpCi0JICAgICA7OyAid2hlbiIgaXMgZm9sbG93ZWQgYnkgY29kZSwgbGV0J3MgaW5kZW50IHRvIHRoZSBzYW1lCi0JICAgICA7OyBjb2x1bW4uCi0JICAgICAoZm9yd2FyZC1jaGFyIDQpCQk7IFNraXAgIndoZW4iCi0JICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHQiKQotCSAgICAgKGN1cnJlbnQtY29sdW1uKSkpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1pbmRlbnQtZmluZC1iYXNlIChzdGFjayBpbmRlbnQtcG9pbnQgJm9wdGlvbmFsIG9mZnNldCBza2lwKQotICAiRmluZCB0aGUgYmFzZSBjb2x1bW4gZm9yIGN1cnJlbnQgc3RhY2suIgotICAob3Igc2tpcCAoc2V0cSBza2lwIDIpKQotICAob3Igb2Zmc2V0IChzZXRxIG9mZnNldCBlcmxhbmctaW5kZW50LWxldmVsKSkKLSAgKHNhdmUtZXhjdXJzaW9uCi0gICAgKGxldCogKChzdGFjay10b3AgKGNhciBzdGFjaykpKQotICAgICAgKGdvdG8tY2hhciAobnRoIDEgc3RhY2stdG9wKSkKLSAgICAgIChmb3J3YXJkLWNoYXIgc2tpcCkKLSAgICAgIChpZiAobG9va2luZy1hdCAiXFxzICpcXCgkXFx8JVxcKSIpCi0JICAocHJvZ24KLQkgICAgKGlmIChtZW1xIChjYXIgc3RhY2stdG9wKSAnKC0+IHx8KSkKLQkJKGVybGFuZy1wb3Agc3RhY2spKQotCSAgICA7OyBUYWtlIHBhcmVudCBpZGVudGF0aW9uICsgb2Zmc2V0LAotCSAgICA7OyBlbHNlIGp1c3QgZXJsYW5nLWluZGVudC1sZXZlbCBpZiBubyBwYXJlbnQKLQkgICAgKGlmIHN0YWNrCi0JCSgrIChlcmxhbmctY2FkZHIgKGNhciBzdGFjaykpCi0JCSAgIG9mZnNldCkKLQkgICAgICBlcmxhbmctaW5kZW50LWxldmVsKSkKLQkoZXJsYW5nLXNraXAtYmxhbmsgaW5kZW50LXBvaW50KQotCShjdXJyZW50LWNvbHVtbikpKSkpCi0KLQotOzsgRG9lcyBub3QgaGFuZGxlIGBiZWdpbicgLi4gYGVuZCcuCi0oZGVmdW4gZXJsYW5nLWluZGVudC1maW5kLXByZWNlZGluZy1leHByICgpCi0gICJSZXR1cm4gdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgcHJlY2VkaW5nIGV4cHJlc3Npb24uCi1UaGlzIGFzc3VtZXMgdGhhdCB0aGUgcHJlY2VkaW5nIGV4cHJlc3Npb24gaXMgZWl0aGVyIHNpbXBsZQotXChpLmUuIGFuIGF0b20pIG9yIHBhcmVudGhlc2l6ZWQuIgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAoZm9yd2FyZC1zZXhwIC0xKQotICAgIChsZXQgKChjb2wgKGN1cnJlbnQtY29sdW1uKSkpCi0gICAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKLSAgICAgIDs7IE5lZWRlZCB0byBtYXRjaCB0aGUgY29sb24gaW4gIidmb28nOidiYXInIi4KLSAgICAgIChpZiAobm90IChtZW1xIChwcmVjZWRpbmctY2hhcikgJyg/IyA/OikpKQotCSAgY29sCi0JKGJhY2t3YXJkLWNoYXIgMSkKLQkoZm9yd2FyZC1zZXhwIC0xKQotCShjdXJyZW50LWNvbHVtbikpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1za2lwLWJsYW5rICgmb3B0aW9uYWwgbGltKQotICAiU2tpcCBvdmVyIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIHVudGlsIGxpbWl0IHJlYWNoZWQuIgotICAob3IgbGltIChzZXRxIGxpbSAocG9pbnQtbWF4KSkpCi0gIChsZXQgKHN0b3ApCi0gICAgKHdoaWxlIChhbmQgKG5vdCBzdG9wKSAoPCAocG9pbnQpIGxpbSkpCi0gICAgICAoY29uZCAoKD0gKGZvbGxvd2luZy1jaGFyKSA/JSkKLQkgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIl5cbiIgbGltKSkKLQkgICAgKCg9IChmb2xsb3dpbmctY2hhcikgP1xuKQotCSAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiXG4iIGxpbSkpCi0JICAgICgobG9va2luZy1hdCAiXFxzICIpCi0JICAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkICJcXFMgIiBsaW0gJ21vdmUpCi0JCSAoZm9yd2FyZC1jaGFyIC0xKSkpCi0JICAgICh0Ci0JICAgICAoc2V0cSBzdG9wIHQpKSkpCi0gICAgc3RvcCkpCi0KLShkZWZ1biBlcmxhbmctYXQta2V5d29yZCAoKQotICAiQXJlIHdlIGxvb2tpbmcgYXQgYW4gRXJsYW5nIGtleXdvcmQgd2hpY2ggd2lsbCBpbmNyZWFzZSBpbmRlbnRhdGlvbj8iCi0gIChsb29raW5nLWF0IChjb25jYXQgIlxcKHdoZW5cXHxpZlxcfGZ1blxcfGNhc2VcXHxiZWdpblxcfHF1ZXJ5XFx8IgotCQkgICAgICAib2ZcXHxyZWNlaXZlXFx8YWZ0ZXJcXHxjYXRjaFxcKVteX2EtekEtWjAtOV0iKSkpCi0KLShkZWZ1biBlcmxhbmctYXQtb3BlcmF0b3IgKCkKLSAgIkFyZSB3ZSBsb29raW5nIGF0IGFuIEVybGFuZyBvcGVyYXRvcj8iCi0gIChsb29raW5nLWF0Ci0gICAiXFwoYm5vdFxcfGRpdlxcfG1vZFxcfGJhbmRcXHxib3JcXHxieG9yXFx8YnNsXFx8YnNyXFwpW15fYS16QS1aMC05XSIpKQotCi0oZGVmdW4gZXJsYW5nLWNvbW1lbnQtaW5kZW50ICgpCi0gICJDb21wdXRlIGVybGFuZyBjb21tZW50IGluZGVudGF0aW9uLgotCi1Vc2VkIGJvdGggYnkgYGluZGVudC1mb3ItY29tbWVudCcgYW5kIHRoZSBlcmxhbmcgc3BlY2lmaWMgaW5kZW50YXRpb24KLWNvbW1hbmRzLiIKLSAgKGNvbmQgKChsb29raW5nLWF0ICIlJSUiKSAwKQotCSgobG9va2luZy1hdCAiJSUiKQotCSAob3IgKGVybGFuZy1jYWxjdWxhdGUtaW5kZW50KQotCSAgICAgKGN1cnJlbnQtaW5kZW50YXRpb24pKSkKLQkodAotCSAoc2F2ZS1leGN1cnNpb24KLQkgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKLQkgICAobWF4IChpZiAoYm9scCkgMCAoMSsgKGN1cnJlbnQtY29sdW1uKSkpCi0JCWNvbW1lbnQtY29sdW1uKSkpKSkKLQwKLTs7OyBFcmxhbmcgbW92ZW1lbnQgY29tbWFuZHMKLQotOzsgQWxsIGNvbW1hbmRzIGJlbG93IHdvcmsgYXMgbW92ZW1lbnQgY29tbWFuZHMuICBJLmUuIGlmIHRoZSBwb2ludCBpcwotOzsgYXQgdGhlIGVuZCBvZiB0aGUgY2xhdXNlLCBhbmQgdGhlIGNvbW1hbmQgYGVybGFuZy1lbmQtb2YtY2xhdXNlJyBpcwotOzsgZXhlY3V0ZWQsIHRoZSBwb2ludCBpcyBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBORVhUIGNsYXVzZS4gIChUaGlzCi07OyBtaW1pY3MgdGhlIGJlaGF2aW91ciBvZiBgZW5kLW9mLWRlZnVuJy4pCi07OwotOzsgUGVyc29uYWxseSBJIHdvdWxkIGxpa2UgdG8gcmV3cml0ZSB0aGVtIHRvIGJlICJwdXJlIiwgYW5kIGFkZCBhIHNldAotOzsgb2YgbW92ZW1lbnQgZnVuY3Rpb25zLCBsaWtlIGBlcmxhbmctbmV4dC1jbGF1c2UnLAotOzsgYGVybGFuZy1wcmV2aW91cy1jbGF1c2UnLCBhbmQgdGhlIHNhbWUgZm9yIGZ1bmN0aW9ucy4KLTs7Ci07OyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBob3BlbGVzcyB0byB1c2UgdGhlIGZ1bmN0aW9ucyBhcwotOzsgc3Vicm91dGluZXMgaW4gbW9yZSBjb21wbGV4IGNvbW1hbmRzLiAgIC9hbmRlcnNsCi0KLShkZWZ1biBlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAoJm9wdGlvbmFsIGFyZykKLSAgIk1vdmUgYmFja3dhcmQgdG8gcHJldmlvdXMgc3RhcnQgb2YgY2xhdXNlLgotV2l0aCBhcmd1bWVudCwgZG8gdGhpcyB0aGF0IG1hbnkgdGltZXMuCi1SZXR1cm4gdCB1bmxlc3Mgc2VhcmNoIHN0b3BzIGR1ZSB0byBlbmQgb2YgYnVmZmVyLiIKLSAgKGludGVyYWN0aXZlICJwIikKLSAgKG9yIGFyZyAoc2V0cSBhcmcgMSkpCi0gIChpZiAoPCBhcmcgMCkKLSAgICAgIDs7IFN0ZXAgYmFjayB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBsaW5lLCB1bmxlc3Mgd2UgYXJlIGF0Ci0gICAgICA7OyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuICBUaGUgcmVhc29uIGZvciB0aGlzIG1vdmUgaXMKLSAgICAgIDs7IHRoYXQgdGhlIHJlZ2V4cCBiZWxvdyBpbmNsdWRlcyB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlCi0gICAgICA7OyBwcmV2aW91cyBsaW5lLgotICAgICAgKGlmIChib2JwKQotCSAgKG9yIChsb29raW5nLWF0ICJcbiIpCi0JICAgICAgKGZvcndhcmQtY2hhciAxKSkKLQkoZm9yd2FyZC1jaGFyIC0xKQotCShpZiAobG9va2luZy1hdCAiXFxgXG4iKQotCSAgICAoZm9yd2FyZC1jaGFyIDEpKSkpCi0gIDs7IFRoZSByZWdleHAgbWF0Y2hlcyBhIGZ1bmN0aW9uIGhlYWRlciB0aGF0IGlzbid0Ci0gIDs7IGluY2x1ZGVkIGluIGEgc3RyaW5nLgotICAoYW5kIChyZS1zZWFyY2gtZm9yd2FyZCAiXFwoXFxgXFx8XFxgXG5cXHxbXlxcXVxuXFwpXFwoW2Etel1cXHwnXFx8LVxcKSIKLQkJCSAgbmlsICdtb3ZlICgtIGFyZykpCi0gICAgICAgKGxldCAoKGJlZyAobWF0Y2gtYmVnaW5uaW5nIDIpKSkKLQkgKGFuZCBiZWcgKGdvdG8tY2hhciBiZWcpKQotCSB0KSkpCi0KLShkZWZ1biBlcmxhbmctZW5kLW9mLWNsYXVzZSAoJm9wdGlvbmFsIGFyZykKLSAgIk1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBjbGF1c2UuCi1XaXRoIGFyZ3VtZW50LCBkbyB0aGlzIHRoYXQgbWFueSB0aW1lcy4iCi0gIChpbnRlcmFjdGl2ZSAicCIpCi0gIChvciBhcmcgKHNldHEgYXJnIDEpKQotICAod2hpbGUgKGFuZCAobG9va2luZy1hdCAiWyBcdF0qWyVcbl0iKQotCSAgICAgICh6ZXJvcCAoZm9yd2FyZC1saW5lIDEpKSkpCi0gIDs7IE1vdmUgdG8gdGhlIG5leHQgY2xhdXNlLgotICAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgKC0gYXJnKSkKLSAgKGJlZ2lubmluZy1vZi1saW5lKSAgOzsgSnVzdCB0byBiZSBzdXJlLi4uCi0gIChsZXQgKChjb250aW51ZSB0KSkKLSAgICAod2hpbGUgKGFuZCAobm90IChib2JwKSkgY29udGludWUpCi0gICAgICAoZm9yd2FyZC1saW5lIC0xKQotICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKLSAgICAgIChpZiAobG9va2luZy1hdCAiWyVcbl0iKQotCSAgbmlsCi0JKGVuZC1vZi1saW5lKQotCShzZXRxIGNvbnRpbnVlIG5pbCkpKSkpCi0KLShkZWZ1biBlcmxhbmctbWFyay1jbGF1c2UgKCkKLSAgIlB1dCBtYXJrIGF0IGVuZCBvZiBjbGF1c2UsIHBvaW50IGF0IGJlZ2lubmluZy4iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKHB1c2gtbWFyayAocG9pbnQpKQotICAoZXJsYW5nLWVuZC1vZi1jbGF1c2UgMSkKLSAgOzsgU2V0cyB0aGUgcmVnaW9uLiBJbiBFbWFjcyAxOSBhbmQgWEVtYWNzLCB3ZSB3YW50cyB0byBhY3RpdmF0ZQotICA7OyB0aGUgcmVnaW9uLgotICAoY29uZGl0aW9uLWNhc2UgbmlsCi0gICAgICAocHVzaC1tYXJrIChwb2ludCkgbmlsIHQpCi0gICAgKGVycm9yIChwdXNoLW1hcmsgKHBvaW50KSkpKQotICAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgMSkKLSAgOzsgVGhlIGFib3ZlIGZ1bmN0aW9uIGRlYWN0aXZhdGVzIHRoZSBtYXJrLgotICAoaWYgKGJvdW5kcCAnZGVhY3RpdmF0ZS1tYXJrKQotICAgICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KSAnZGVhY3RpdmF0ZS1tYXJrIG5pbCkpKQotCi0oZGVmdW4gZXJsYW5nLWJlZ2lubmluZy1vZi1mdW5jdGlvbiAoJm9wdGlvbmFsIGFyZykKLSAgIk1vdmUgYmFja3dhcmQgdG8gcHJldmlvdXMgc3RhcnQgb2YgZnVuY3Rpb24uCi1XaXRoIHBvc2l0aXZlIGFyZ3VtZW50LCBkbyB0aGlzIHRoYXQgbWFueSB0aW1lcy4KLVdpdGggbmVnYXRpdmUgYXJndW1lbnQsIHNlYXJjaCBmb3J3YXJkLgotCi1SZXR1cm4gdCB1bmxlc3Mgc2VhcmNoIHN0b3BzIGR1ZSB0byBlbmQgb2YgYnVmZmVyLiIKLSAgKGludGVyYWN0aXZlICJwIikKLSAgKG9yIGFyZyAoc2V0cSBhcmcgMSkpCi0gIChjb25kCi0gICA7OyBTZWFyY2ggYmFja3dhcmQKLSAgICgoPiBhcmcgMCkKLSAgICAod2hpbGUgKGFuZCAoPiBhcmcgMCkKLQkJKGFuZCAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgMSkKLQkJICAgICAobGV0ICgoc3RhcnQgKHBvaW50KSkKLQkJCSAgIChuYW1lIChlcmxhbmctbmFtZS1vZi1mdW5jdGlvbikpCi0JCQkgICAoYXJpdHkgKGVybGFuZy1nZXQtZnVuY3Rpb24tYXJpdHkpKSkKLQkJICAgICAgIDs7IE5vdGU6ICJhcml0eSIgaXMgbmlsIGZvciBlLmcuICItaW1wb3J0IiwgaGVuY2UKLQkJICAgICAgIDs7IHR3byAiLWltcG9ydCIgY2xhdXNlcyBhcmUgbm90IGNvbnNpZGVyZWQgdG8KLQkJICAgICAgIDs7IGJlIHBhcnQgb2YgdGhlIHNhbWUgZnVuY3Rpb24uCi0JCSAgICAgICAod2hpbGUgKGFuZCAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgMSkKLQkJCQkgICAoc3RyaW5nLWVxdWFsIG5hbWUKLQkJCQkJCSAoZXJsYW5nLW5hbWUtb2YtZnVuY3Rpb24pKQotCQkJCSAgIGFyaXR5Ci0JCQkJICAgKGVxdWFsIGFyaXR5Ci0JCQkJCSAgKGVybGFuZy1nZXQtZnVuY3Rpb24tYXJpdHkpKSkKLQkJCSAoc2V0cSBzdGFydCAocG9pbnQpKSkKLQkJICAgICAgIChnb3RvLWNoYXIgc3RhcnQpCi0JCSAgICAgICB0KSkpCi0gICAgICAoc2V0cSBhcmcgKDEtIGFyZykpKSkKLSAgIDs7IFNlYXJjaCBmb3J3YXJkCi0gICAoKDwgYXJnIDApCi0gICAgKGVuZC1vZi1saW5lKQotICAgIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAxKQotICAgIDs7IFN0ZXAgLWFyZyBmdW5jdGlvbnMgZm9yd2FyZC4KLSAgICAod2hpbGUgKGFuZCAoPCBhcmcgMCkKLQkJOzsgU3RlcCBvbmUgZnVuY3Rpb24gZm9yd2FyZCwgb3Igc3RvcCBpZiB0aGUgZW5kIG9mCi0JCTs7IHRoZSBidWZmZXIgd2FzIHJlYWNoZWQuICBSZXR1cm4gdCBpZiB3ZSBmb3VuZCB0aGUKLQkJOzsgZnVuY3Rpb24uCi0JCShsZXQgKChuYW1lIChlcmxhbmctbmFtZS1vZi1mdW5jdGlvbikpCi0JCSAgICAgIChhcml0eSAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eSkpCi0JCSAgICAgIChmb3VuZCAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgLTEpKSkKLQkJICAod2hpbGUgKGFuZCBmb3VuZAotCQkJICAgICAgKHN0cmluZy1lcXVhbCBuYW1lIChlcmxhbmctbmFtZS1vZi1mdW5jdGlvbikpCi0JCQkgICAgICBhcml0eQotCQkJICAgICAgKGVxdWFsIGFyaXR5Ci0JCQkJICAgICAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eSkpKQotCQkgICAgKHNldHEgZm91bmQgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlIC0xKSkpCi0JCSAgZm91bmQpKQotICAgICAgKHNldHEgYXJnICgxKyBhcmcpKSkpKQotICAoemVyb3AgYXJnKSkKLQotCi0oZGVmdW4gZXJsYW5nLWVuZC1vZi1mdW5jdGlvbiAoJm9wdGlvbmFsIGFyZykKLSAgIk1vdmUgZm9yd2FyZCB0byBuZXh0IGVuZCBvZiBmdW5jdGlvbi4KLQotV2l0aCBhcmd1bWVudCwgZG8gdGhpcyB0aGF0IG1hbnkgdGltZXMuCi1XaXRoIG5lZ2F0aXZlIGFyZ3VtZW50IGdvIHRvd2FyZHMgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiIKLSAgKGludGVyYWN0aXZlICJwIikKLSAgKG9yIGFyZyAoc2V0cSBhcmcgMSkpCi0gIChsZXQgKChmaXJzdCB0KSkKLSAgICA7OyBGb3J3YXJkCi0gICAgKHdoaWxlIChhbmQgKD4gYXJnIDApICg8IChwb2ludCkgKHBvaW50LW1heCkpKQotICAgICAgKGxldCAoKHBvcyAocG9pbnQpKSkKLQkod2hpbGUgKHByb2duCi0JCSAoaWYgKGFuZCBmaXJzdAotCQkJICAocHJvZ24KLQkJCSAgICAoZm9yd2FyZC1jaGFyIDEpCi0JCQkgICAgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlIDEpKSkKLQkJICAgICBuaWwKLQkJICAgKG9yIChib2JwKSAoZm9yd2FyZC1jaGFyIC0xKSkKLQkJICAgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlIC0xKSkKLQkJIChzZXRxIGZpcnN0IG5pbCkKLQkJIChlcmxhbmctcGFzcy1vdmVyLWZ1bmN0aW9uKQotCQkgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKLQkJIChpZiAobG9va2luZy1hdCAiWyVcbl0iKQotCQkgICAgIChmb3J3YXJkLWxpbmUgMSkpCi0JCSAoPD0gKHBvaW50KSBwb3MpKSkpCi0gICAgICAoc2V0cSBhcmcgKDEtIGFyZykpKQotICAgIDs7IEJhY2t3YXJkCi0gICAgKHdoaWxlICg8IGFyZyAwKQotICAgICAgKGxldCAoKHBvcyAocG9pbnQpKSkKLQkoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgMSkKLQkoZXJsYW5nLXBhc3Mtb3Zlci1mdW5jdGlvbikKLQkoZm9yd2FyZC1saW5lIDEpCi0JKGlmICg+PSAocG9pbnQpIHBvcykKLQkgICAgKGlmIChlcmxhbmctYmVnaW5uaW5nLW9mLWZ1bmN0aW9uIDIpCi0JCShwcm9nbgotCQkgIChlcmxhbmctcGFzcy1vdmVyLWZ1bmN0aW9uKQotCQkgIChza2lwLWNoYXJzLWZvcndhcmQgIiBcdCIpCi0JCSAgKGlmIChsb29raW5nLWF0ICJbJVxuXSIpCi0JCSAgICAgIChmb3J3YXJkLWxpbmUgMSkpKQotCSAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpKSkpCi0gICAgICAoc2V0cSBhcmcgKDErIGFyZykpKSkpCi0KLShkZWZ1biBlcmxhbmctbWFyay1mdW5jdGlvbiAoKQotICAiUHV0IG1hcmsgYXQgZW5kIG9mIGZ1bmN0aW9uLCBwb2ludCBhdCBiZWdpbm5pbmcuIgotICAoaW50ZXJhY3RpdmUpCi0gIChwdXNoLW1hcmsgKHBvaW50KSkKLSAgKGVybGFuZy1lbmQtb2YtZnVuY3Rpb24gMSkKLSAgOzsgU2V0cyB0aGUgcmVnaW9uLiBJbiBFbWFjcyAxOSBhbmQgWEVtYWNzLCB3ZSB3YW50cyB0byBhY3RpdmF0ZQotICA7OyB0aGUgcmVnaW9uLgotICAoY29uZGl0aW9uLWNhc2UgbmlsCi0gICAgICAocHVzaC1tYXJrIChwb2ludCkgbmlsIHQpCi0gICAgKGVycm9yIChwdXNoLW1hcmsgKHBvaW50KSkpKQotICAoZXJsYW5nLWJlZ2lubmluZy1vZi1mdW5jdGlvbiAxKQotICA7OyBUaGUgYWJvdmUgZnVuY3Rpb24gZGVhY3RpdmF0ZXMgdGhlIG1hcmsuCi0gIChpZiAoYm91bmRwICdkZWFjdGl2YXRlLW1hcmspCi0gICAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpICdkZWFjdGl2YXRlLW1hcmsgbmlsKSkpCi0KLShkZWZ1biBlcmxhbmctcGFzcy1vdmVyLWZ1bmN0aW9uICgpCi0gICh3aGlsZSAocHJvZ24KLQkgICAoZXJsYW5nLXNraXAtYmxhbmspCi0JICAgKGFuZCAobm90IChsb29raW5nLWF0ICJcXC5cXChcXHMgXFx8XG5cXHxcXHM8XFwpIikpCi0JCShub3QgKGVvYnApKSkpCi0gICAgKGZvcndhcmQtc2V4cCAxKSkKLSAgKGlmIChub3QgKGVvYnApKQotICAgICAgKGZvcndhcmQtY2hhciAxKSkpCi0KLShkZWZ1biBlcmxhbmctbmFtZS1vZi1mdW5jdGlvbiAoKQotICAoc2F2ZS1leGN1cnNpb24KLSAgICA7OyBTa2lwIG92ZXIgYXR0cmlidXRlIGxlYWRlci4KLSAgICAoaWYgKGxvb2tpbmctYXQgIi1bIFx0XSoiKQotCShyZS1zZWFyY2gtZm9yd2FyZCAiLVsgXHRdKiIgbmlsICdtb3ZlKSkKLSAgICAobGV0ICgoc3RhcnQgKHBvaW50KSkpCi0gICAgICAoZm9yd2FyZC1zZXhwIDEpCi0gICAgICAoYnVmZmVyLXN1YnN0cmluZyBzdGFydCAocG9pbnQpKSkpKQotCi0MCi07OzsgTWlzY2VsbGFuZW91cwotCi0oZGVmdW4gZXJsYW5nLWZpbGwtcGFyYWdyYXBoICgmb3B0aW9uYWwganVzdGlmeSkKLSAgIkxpa2UgXFxbZmlsbC1wYXJhZ3JhcGhdLCBidXQgaGFuZGxlIEVybGFuZyBjb21tZW50cy4KLUlmIGFueSBvZiB0aGUgY3VycmVudCBsaW5lIGlzIGEgY29tbWVudCwgZmlsbCB0aGUgY29tbWVudCBvciB0aGUKLXBhcmFncmFwaCBvZiBpdCB0aGF0IHBvaW50IGlzIGluLCBwcmVzZXJ2aW5nIHRoZSBjb21tZW50J3MgaW5kZW50YXRpb24KLWFuZCBpbml0aWFsIGAlJzpzLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKGxldCAoKGhhcy1jb21tZW50IG5pbCkKLQk7OyBJZiBoYXMtY29tbWVudCwgdGhlIGFwcHJvcHJpYXRlIGZpbGwtcHJlZml4IGZvciB0aGUgY29tbWVudC4KLQljb21tZW50LWZpbGwtcHJlZml4KQotICAgIDs7IEZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGNvbW1lbnQgd2UgYXJlIGxvb2tpbmcgYXQuCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCi0gICAgICAoY29uZAotICAgICAgIDs7IEZpbmQgdGhlIGNvbW1hbmQgcHJlZml4LgotICAgICAgICgobG9va2luZy1hdCAoY29uY2F0ICJcXHMgKiIgY29tbWVudC1zdGFydC1za2lwKSkKLQkoc2V0cSBoYXMtY29tbWVudCB0KQotCShzZXRxIGNvbW1lbnQtZmlsbC1wcmVmaXggKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAwKQotCQkJCQkJICAgIChtYXRjaC1lbmQgMCkpKSkKLSAgICAgICA7OyBBIGxpbmUgd2l0aCBzb21lIGNvZGUsIGZvbGxvd2VkIGJ5IGEgY29tbWVudD8gIFJlbWVtYmVyIHRoYXQgdGhlCi0gICAgICAgOzsgJSB3aGljaCBzdGFydHMgdGhlIGNvbW1lbnQgc2hvdWxkbid0IGJlIHBhcnQgb2YgYSBzdHJpbmcgb3IKLSAgICAgICA7OyBjaGFyYWN0ZXIuCi0gICAgICAgKChwcm9nbgotCSAgKHdoaWxlIChub3QgKGxvb2tpbmctYXQgIiVcXHwkIikpCi0JICAgIChza2lwLWNoYXJzLWZvcndhcmQgIl4lXG5cIlxcXFwiKQotCSAgICAoY29uZAotCSAgICAgKChlcSAoY2hhci1hZnRlciAocG9pbnQpKSA/XFwpIChmb3J3YXJkLWNoYXIgMikpCi0JICAgICAoKGVxIChjaGFyLWFmdGVyIChwb2ludCkpID9cIikgKGZvcndhcmQtc2V4cCAxKSkpKQotCSAgKGxvb2tpbmctYXQgY29tbWVudC1zdGFydC1za2lwKSkKLQkoc2V0cSBoYXMtY29tbWVudCB0KQotCShzZXRxIGNvbW1lbnQtZmlsbC1wcmVmaXgKLQkgICAgICAoY29uY2F0IChtYWtlLXN0cmluZyAoY3VycmVudC1jb2x1bW4pID8gKQotCQkgICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDApIChtYXRjaC1lbmQgMCkpKSkpKSkKLSAgICAoaWYgKG5vdCBoYXMtY29tbWVudCkKLQkoZmlsbC1wYXJhZ3JhcGgganVzdGlmeSkKLSAgICAgIDs7IE5hcnJvdyB0byBpbmNsdWRlIG9ubHkgdGhlIGNvbW1lbnQsIGFuZCB0aGVuIGZpbGwgdGhlIHJlZ2lvbi4KLSAgICAgIChzYXZlLXJlc3RyaWN0aW9uCi0JKG5hcnJvdy10by1yZWdpb24KLQkgOzsgRmluZCB0aGUgZmlyc3QgbGluZSB3ZSBzaG91bGQgaW5jbHVkZSBpbiB0aGUgcmVnaW9uIHRvIGZpbGwuCi0JIChzYXZlLWV4Y3Vyc2lvbgotCSAgICh3aGlsZSAoYW5kICh6ZXJvcCAoZm9yd2FyZC1saW5lIC0xKSkKLQkJICAgICAgIChsb29raW5nLWF0ICJeXFxzIColIikpKQotCSAgIDs7IFdlIG1heSBoYXZlIGdvbmUgdG8gZmFyLiAgR28gZm9yd2FyZCBhZ2Fpbi4KLQkgICAob3IgKGxvb2tpbmctYXQgIl5cXHMgKiUiKQotCSAgICAgICAoZm9yd2FyZC1saW5lIDEpKQotCSAgIChwb2ludCkpCi0JIDs7IEZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgbGluZSBwYXN0IHRoZSByZWdpb24gdG8gZmlsbC4KLQkgKHNhdmUtZXhjdXJzaW9uCi0JICAgKHdoaWxlIChwcm9nbiAoZm9yd2FyZC1saW5lIDEpCi0JCQkgKGxvb2tpbmctYXQgIl5cXHMgKiUiKSkpCi0JICAgKHBvaW50KSkpCi0JOzsgTGluZXMgd2l0aCBvbmx5ICUgb24gdGhlbSBjYW4gYmUgcGFyYWdyYXBoIGJvdW5kYXJpZXMuCi0JKGxldCAoKHBhcmFncmFwaC1zdGFydCAoY29uY2F0IHBhcmFncmFwaC1zdGFydCAiXFx8XlsgXHQlXSokIikpCi0JICAgICAgKHBhcmFncmFwaC1zZXBhcmF0ZSAoY29uY2F0IHBhcmFncmFwaC1zdGFydCAiXFx8XlsgXHQlXSokIikpCi0JICAgICAgKGZpbGwtcHJlZml4IGNvbW1lbnQtZmlsbC1wcmVmaXgpKQotCSAgKGZpbGwtcGFyYWdyYXBoIGp1c3RpZnkpKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLXVuY29tbWVudC1yZWdpb24gKGJlZyBlbmQpCi0gICJVbmNvbW1lbnQgYWxsIGNvbW1lbnRlZCBsaW5lcyBpbiB0aGUgcmVnaW9uLiIKLSAgKGludGVyYWN0aXZlICJyIikKLSAgKGNvbW1lbnQtcmVnaW9uIGJlZyBlbmQgLTEpKQotCi0KLShkZWZ1biBlcmxhbmctZ2VuZXJhdGUtbmV3LWNsYXVzZSAoKQotICAiQ3JlYXRlIGFkZGl0aW9uYWwgRXJsYW5nIGNsYXVzZSBoZWFkZXIuCi0KLVBhcnNlcyB0aGUgc291cmNlIGZpbGUgZm9yIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IEVybGFuZyBmdW5jdGlvbi4KLUNyZWF0ZSB0aGUgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIG5hbWUsIEEgcGFpciBvZiBwYXJlbnRoZXNlcywKLWFuZCBhbiBhcnJvdy4gVGhlIHNwYWNlIGJldHdlZW4gdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZQotZmlyc3QgcGFyZW50aGVzaXMgaXMgcHJlc2VydmVkLiAgVGhlIHBvaW50IGlzIHBsYWNlZCBiZXR3ZWVuCi10aGUgcGFyZW50aGVzZXMuIgotICAoaW50ZXJhY3RpdmUpCi0gIChsZXQgKChuYW1lIChzYXZlLWV4Y3Vyc2lvbgotCQkoYW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKLQkJICAgICAoZXJsYW5nLWdldC1mdW5jdGlvbi1uYW1lIHQpKSkpCi0JKGFycm93IChzYXZlLWV4Y3Vyc2lvbgotCQkoYW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKLQkJICAgICAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcnJvdykpKSkpCi0gICAgKGlmIChvciAobnVsbCBhcnJvdykgKG51bGwgbmFtZSkpCi0JKGVycm9yICJDYW4ndCBmaW5kIG5hbWUgb2YgY3VycmVudCBFcmxhbmcgZnVuY3Rpb24uIikpCi0gICAgKGlmIChhbmQgKGJvbHApIChlb2xwKSkKLQluaWwKLSAgICAgIChlbmQtb2YtbGluZSkKLSAgICAgIChuZXdsaW5lKSkKLSAgICAoaW5zZXJ0IG5hbWUpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAoaW5zZXJ0IChjb25jYXQgIikgIiBhcnJvdykpKQotICAgIChpZiBlcmxhbmctbmV3LWNsYXVzZS13aXRoLWFyZ3VtZW50cwotCShlcmxhbmctY2xvbmUtYXJndW1lbnRzKSkpKQotCi0KLShkZWZ1biBlcmxhbmctY2xvbmUtYXJndW1lbnRzICgpCi0gICJJbnNlcnQsIGF0IHRoZSBwb2ludCwgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIHByZXZpb3VzIGNsYXVzZS4KLQotVGhlIG1hcmsgaXMgc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluc2VydGVkIHRleHQsIHRoZSBwb2ludAotYXQgdGhlIGVuZC4iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKGxldCAoKGFyZ3MgKHNhdmUtZXhjdXJzaW9uCi0JCShiZWdpbm5pbmctb2YtbGluZSkKLQkJKGFuZCAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCi0JCSAgICAgKGVybGFuZy1nZXQtZnVuY3Rpb24tYXJndW1lbnRzKSkpKQotCShwIChwb2ludCkpKQotICAgIChpZiAobnVsbCBhcmdzKQotCShlcnJvciAiQ2FuJ3QgY2xvbmUgYXJndW1lbnQgbGlzdC4iKSkKLSAgICAoaW5zZXJ0IGFyZ3MpCi0gICAgKHNldC1tYXJrIHApKSkKLQwKLTs7OyBJbmZvcm1hdGlvbiByZXRyZWl2YWwgZnVuY3Rpb25zLgotCi0oZGVmdW4gZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcgKGJlZyBlbmQpCi0gICJMaWtlIGBidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMnLgotQWx0aG91Z2gsIHRoaXMgZnVuY3Rpb24gd29ya3Mgb24gYWxsIHZlcnNpb25zIG9mIEVtYWNzLiIKLSAgKGlmIChmYm91bmRwICdidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMpCi0gICAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdidWZmZXItc3Vic3RyaW5nLW5vLXByb3BlcnRpZXMpIGJlZyBlbmQpCi0gICAgKGJ1ZmZlci1zdWJzdHJpbmcgYmVnIGVuZCkpKQotCi0KLShkZWZ1biBlcmxhbmctZ2V0LW1vZHVsZSAoKQotICAiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgYXMgc3BlY2lmaWVkIGJ5IGAtbW9kdWxlJy4KLQotUmV0dXJuIG5pbCBpZiBmaWxlIGNvbnRhaW5zIG5vIGAtbW9kdWxlJyBhdHRyaWJ1dGUuIgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAoc2F2ZS1yZXN0cmljdGlvbgotICAgICAgKHdpZGVuKQotICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLSAgICAgIChsZXQgKChtZCAobWF0Y2gtZGF0YSkpKQotCSh1bndpbmQtcHJvdGVjdAotCSAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkCi0JCSAoY29uY2F0ICJeLW1vZHVsZVxccyAqKFxccyAqXFwoXFwoIgotCQkJIGVybGFuZy1hdG9tLXJlZ2V4cAotCQkJICJcXCk/XFwpXFxzICopXFxzICpcXC4iKQotCQkgKHBvaW50LW1heCkgdCkKLQkJKGVybGFuZy1yZW1vdmUtcXVvdGVzCi0JCSAoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQotCQkJCQkgIChtYXRjaC1lbmQgMSkpKQotCSAgICAgIG5pbCkKLQkgIChzdG9yZS1tYXRjaC1kYXRhIG1kKSkpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1nZXQtbW9kdWxlLWZyb20tZmlsZS1uYW1lICgmb3B0aW9uYWwgZmlsZSkKLSAgIkV4dHJhY3QgdGhlIG1vZHVsZSBuYW1lIGZyb20gYSBmaWxlIG5hbWUuCi0KLUZpcnN0LCB0aGUgZGlyZWN0b3J5IHBhcnQgaXMgcmVtb3ZlZC4gIFNlY29uZCwgdGhlIHBhcnQgb2YgdGhlIGZpbGUgbmFtZQotbWF0Y2hpbmcgYGVybGFuZy1maWxlLW5hbWUtZXh0ZW5zaW9uLXJlZ2V4cCcgaXMgcmVtb3ZlZC4KLQotU2hvdWxkIHRoZSBtYXRjaCBmYWlsLCBuaWwgaXMgcmV0dXJuZWQuCi0KLUJ5IG1vZGlmeWluZyBgZXJsYW5nLWZpbGUtbmFtZS1leHRlbnNpb24tcmVnZXhwJyB0byBtYXRjaCBmaWxlcyBvdGhlcgotdGhhbiBFcmxhbmcgc291cmNlIGZpbGVzLCBFcmxhbmcgc3BlY2lmaWMgZnVuY3Rpb25zIGNvdWxkIGJlIGFwcGxpZWQgb24KLW5vbi1FcmxhbmcgZmlsZXMuICBNb3N0IG5vdGFibHk7IHRoZSBzdXBwb3J0IGZvciBFcmxhbmcgbW9kdWxlcyBpbiB0aGUKLXRhZ3Mgc3lzdGVtIGNvdWxkIGJlIHVzZWQgYnkgZmlsZXMgd3JpdHRlbiBpbiBvdGhlciBsYW5ndWFnZXMuIgotICAob3IgZmlsZSAoc2V0cSBmaWxlIGJ1ZmZlci1maWxlLW5hbWUpKQotICAoaWYgKG51bGwgZmlsZSkKLSAgICAgIG5pbAotICAgIChzZXRxIGZpbGUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZmlsZSkpCi0gICAgKGlmIChzdHJpbmctbWF0Y2ggZXJsYW5nLWZpbGUtbmFtZS1leHRlbnNpb24tcmVnZXhwIGZpbGUpCi0JKHN1YnN0cmluZyBmaWxlIDAgKG1hdGNoLWJlZ2lubmluZyAwKSkKLSAgICAgIG5pbCkpKQotCi0KLTs7IFVzZWQgYnkgYGVybGFuZy1nZXQtZXhwb3J0JyBhbmQgYGVybGFuZy1nZXQtaW1wb3J0Jy4KLQotKGRlZnVuIGVybGFuZy1nZXQtZnVuY3Rpb24tYXJpdHktbGlzdCAoKQotICAiUGFyc2VzIGxpc3Qgb2YgYGZ1bmN0aW9uL2FyaXR5JyBhcyB1c2VkIGJ5IGAtaW1wb3J0JyBhbmQgYC1leHBvcnQnLgotCi1UaGUgcG9pbnQgbXVzdCBiZSBwbGFjZWQgYXQgYmVmb3JlIHRoZSBvcGVuaW5nIGJyYWNrZXQuICBXaGVuIHRoZQotZnVuY3Rpb24gcmV0dXJucyB0aGUgcG9pbnQgd2lsbCBiZSBwbGFjZWQgYWZ0ZXIgdGhlIGNsb3NpbmcgYnJhY2tldC4KLQotVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhbiBlcnJvciBpZiB0aGUgbGlzdCBpcyBpbmNvcnJlY3RseQotZm9ybWF0dGVkLgotCi1SZXR1cm4gbGlzdCBvZiAoZnVuY3Rpb24gLiBhcml0eSkuICBUaGUgb3JkZXIgb2YgdGhlIHJldHVybmVkIGxpc3QKLWNvcnJlc3BvbmRzIHRvIHRoZSBvcmRlciBvZiB0aGUgcGFyc2VkIEVybGFuZyBsaXN0LiIKLSAgKGxldCAoKHJlcyAnKCkpKQotICAgIChlcmxhbmctc2tpcC1ibGFuaykKLSAgICAoZm9yd2FyZC1jaGFyIDEpCi0gICAgKGlmIChub3QgKGVxIChwcmVjZWRpbmctY2hhcikgP1xbKSkKLQknKCkJCQkJOyBOb3QgbG9va2luZyBhdCBhbiBFcmxhbmcgbGlzdC4KLSAgICAgICh3aGlsZQkJCQk7IE5vdGU6IGB3aGlsZScgaGFzIG5vIGJvZHkuCi0JICAocHJvZ24KLQkgICAgKGVybGFuZy1za2lwLWJsYW5rKQotCSAgICAoYW5kIChsb29raW5nLWF0IChjb25jYXQgZXJsYW5nLWF0b20tcmVnZXhwCi0JCQkJICAgICAiL1xcKFswLTldK1xcKVxcPiIpKQotCQkgKHByb2duCi0JCSAgIChzZXRxIHJlcyAoY29ucwotCQkJICAgICAgKGNvbnMKLQkJCSAgICAgICAoZXJsYW5nLXJlbW92ZS1xdW90ZXMKLQkJCQkoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcKLQkJCQkgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKSkKLQkJCSAgICAgICAoc3RyaW5nLXRvLWludAotCQkJCShlcmxhbmctYnVmZmVyLXN1YnN0cmluZwotCQkJCSAobWF0Y2gtYmVnaW5uaW5nCi0JCQkJICAoKyAxIGVybGFuZy1hdG9tLXJlZ2V4cC1tYXRjaGVzKSkKLQkJCQkgKG1hdGNoLWVuZAotCQkJCSAgKCsgMSBlcmxhbmctYXRvbS1yZWdleHAtbWF0Y2hlcykpKSkpCi0JCQkgICAgICByZXMpKQotCQkgICAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpCi0JCSAgIChlcmxhbmctc2tpcC1ibGFuaykKLQkJICAgKGZvcndhcmQtY2hhciAxKQotCQkgICA7OyBUZXN0IGlmIHRoZXJlIGFyZSBtb3JlIGV4cG9ydGVkIGZ1bmN0aW9ucy4KLQkJICAgKGVxIChwcmVjZWRpbmctY2hhcikgPywpKSkpKSkKLSAgICAobnJldmVyc2UgcmVzKSkpCi0KLQotOzs7ICBOb3RlIHRoYXQgYC1leHBvcnQnIGFuZCB0aGUgb3BlbiBwYXJlbnRoZXNpcyBtdXN0IGJlIHdyaXR0ZW4gb24KLTs7OyAgdGhlIHNhbWUgbGluZS4KLQotKGRlZnVuIGVybGFuZy1nZXQtZXhwb3J0ICgpCi0gICJSZXR1cm4gYSBsaXN0IG9mIGAoZnVuY3Rpb24gLiBhcml0eSknIGFzIHNwZWNpZmllZCBieSBgLWV4cG9ydCcuIgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQotICAgIChsZXQgKChtZCAobWF0Y2gtZGF0YSkpCi0JICAocmVzICcoKSkpCi0gICAgICAodW53aW5kLXByb3RlY3QKLQkgIChwcm9nbgotCSAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJeLWV4cG9ydFxccyAqKCIgKHBvaW50LW1heCkgdCkKLQkgICAgICAoZXJsYW5nLXNraXAtYmxhbmspCi0JICAgICAgKHNldHEgcmVzIChuY29uYyByZXMgKGVybGFuZy1nZXQtZnVuY3Rpb24tYXJpdHktbGlzdCkpKSkKLQkgICAgcmVzKQotCShzdG9yZS1tYXRjaC1kYXRhIG1kKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWdldC1pbXBvcnQgKCkKLSAgIlBhcnNlIGFuIEVybGFuZyBzb3VyY2UgZmlsZSBmb3IgaW1wb3J0ZWQgZnVuY3Rpb25zLgotCi1SZXR1cm4gYW4gYWxpc3Qgd2l0aCBtb2R1bGUgbmFtZSBhcyBjYXIgcGFydCBhbmQgbGlzdCBvZiBjb25zZXMgY29udGFpbmluZwotZnVuY3Rpb24gYW5kIGFyaXR5IGFzIGNkciBwYXJ0LiIKLSAgKHNhdmUtZXhjdXJzaW9uCi0gICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLSAgICAobGV0ICgobWQgKG1hdGNoLWRhdGEpKQotCSAgKHJlcyAnKCkpKQotICAgICAgKHVud2luZC1wcm90ZWN0Ci0JICAocHJvZ24KLQkgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAiXi1pbXBvcnRcXHMgKigiIChwb2ludC1tYXgpIHQpCi0JICAgICAgKGVybGFuZy1za2lwLWJsYW5rKQotCSAgICAgIChpZiAobG9va2luZy1hdCBlcmxhbmctYXRvbS1yZWdleHApCi0JCSAgKGxldCAoKG1vZHVsZSAoZXJsYW5nLXJlbW92ZS1xdW90ZXMKLQkJCQkgKGVybGFuZy1idWZmZXItc3Vic3RyaW5nCi0JCQkJICAobWF0Y2gtYmVnaW5uaW5nIDApCi0JCQkJICAobWF0Y2gtZW5kIDApKSkpKQotCQkgICAgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKQotCQkgICAgKGVybGFuZy1za2lwLWJsYW5rKQotCQkgICAgKGlmIChlcSAoZm9sbG93aW5nLWNoYXIpID8sKQotCQkJKHByb2duCi0JCQkgIChmb3J3YXJkLWNoYXIgMSkKLQkJCSAgKGVybGFuZy1za2lwLWJsYW5rKQotCQkJICAobGV0ICgoZnVuY3MgKGVybGFuZy1nZXQtZnVuY3Rpb24tYXJpdHktbGlzdCkpCi0JCQkJKHBhaXIgKGFzc29jIG1vZHVsZSByZXMpKSkKLQkJCSAgICAoaWYgcGFpcgotCQkJCShzZXRjZHIgcGFpciAobmNvbmMgKGNkciBwYWlyKSBmdW5jcykpCi0JCQkgICAgICAoc2V0cSByZXMgKGNvbnMgKGNvbnMgbW9kdWxlIGZ1bmNzKQotCQkJCQkgICAgICByZXMpKSkpKSkpKSkKLQkgICAgKG5yZXZlcnNlIHJlcykpCi0JKHN0b3JlLW1hdGNoLWRhdGEgbWQpKSkpKQotCi0KLShkZWZ1biBlcmxhbmctZ2V0LWZ1bmN0aW9uLW5hbWUgKCZvcHRpb25hbCBhcmcpCi0gICJSZXR1cm4gbmFtZSBvZiBjdXJyZW50IGZ1bmN0aW9uLCBvciBuaWwuCi0KLUlmIG9wdGlvbmFsIGFyZ3VtZW50IGlzIG5vbi1uaWwsIGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZwotdGhlIGZpcnN0IGAoJyBpcyByZXR1cm5lZC4KLQotTm9ybWFsbHkgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggYGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlJywgZS5nLjoKLSAgICAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAgICAgICAgICAgKGlmIChub3QgKGVvYnApKSAoZm9yd2FyZC1jaGFyIDEpKQotCQkoYW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKLQkJICAgICAoZXJsYW5nLWdldC1mdW5jdGlvbi1uYW1lIHQpKSkiCi0gIChsZXQgKChuIChpZiBhcmcgMCAxKSkpCi0gICAgKGFuZCAobG9va2luZy1hdCAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIlxccyAqKCIpKQotCSAoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyBuKSAobWF0Y2gtZW5kIG4pKSkpKQotCi0KLShkZWZ1biBlcmxhbmctZ2V0LWZ1bmN0aW9uLWFycm93ICgpCi0gICJSZXR1cm4gYXJyb3cgb2YgY3VycmVudCBmdW5jdGlvbiwgY291bGQgYmUgXCItPlwiLCBcIjotXCIgb3IgbmlsLgotCi1UaGUgXCI6LVwiIGFycm93IGlzIHVzZWQgYnkgbW5lc2lhIHF1ZXJpZXMuCi0KLU5vcm1hbGx5IHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIGBlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZScsIGUuZy46Ci0gICAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgICAgICAgICAgIChpZiAobm90IChlb2JwKSkgKGZvcndhcmQtY2hhciAxKSkKLQkJKGFuZCAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCi0JCSAgICAgKGVybGFuZy1nZXQtZnVuY3Rpb24tYXJyb3cpKSkiCi0gIChhbmQgKGxvb2tpbmctYXQgKGNvbmNhdCAiXiIgZXJsYW5nLWF0b20tcmVnZXhwICJcXHMgKlxcKChcXCkiKSkKLSAgICAgICAoY29uZGl0aW9uLWNhc2UgKCkKLQkgICAoc2F2ZS1leGN1cnNpb24KLQkgICAgIChnb3RvLWNoYXIgKG1hdGNoLWJlZ2lubmluZyAoKyAxIGVybGFuZy1hdG9tLXJlZ2V4cC1tYXRjaGVzKSkpCi0JICAgICAoZm9yd2FyZC1zZXhwIDEpCi0JICAgICAoZXJsYW5nLXNraXAtYmxhbmspCi0JICAgICAoYW5kIChsb29raW5nLWF0ICItPlxcfDotIikKLQkJICAoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcKLQkJICAgKG1hdGNoLWJlZ2lubmluZyAwKSAobWF0Y2gtZW5kIDApKSkpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1nZXQtZnVuY3Rpb24tYXJpdHkgKCkKLSAgIlJldHVybiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBhdCBwb2ludCwgb3IgbmlsLiIKLSAgKGFuZCAobG9va2luZy1hdCAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIlxccyAqKCIpKQotICAgICAgIChzYXZlLWV4Y3Vyc2lvbgotCSAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpCi0JIChjb25kaXRpb24tY2FzZSBuaWwKLQkgICAgIChsZXQgKChyZXMgMCkKLQkJICAgKGNvbnQgdCkpCi0JICAgICAgICh3aGlsZSBjb250Ci0JCSAoY29uZCAoKGVvYnApCi0JCQkoc2V0cSByZXMgbmlsKQotCQkJKHNldHEgY29udCBuaWwpKQotCQkgICAgICAgKChsb29raW5nLWF0ICJcXHMgKikiKQotCQkJKHNldHEgY29udCBuaWwpKQotCQkgICAgICAgKChsb29raW5nLWF0ICJcXHMgKlxcKCRcXHwlXFwpIikKLQkJCShmb3J3YXJkLWxpbmUgMSkpCi0JCSAgICAgICAoKGxvb2tpbmctYXQgIlxccyAqLCIpCi0JCQkoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpKQotCQkgICAgICAgKHQKLQkJCShzZXRxIHJlcyAoKyAxIHJlcykpCi0JCQkoZm9yd2FyZC1zZXhwIDEpKSkpCi0JICAgICAgIHJlcykKLQkgICAoZXJyb3IgbmlsKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWdldC1mdW5jdGlvbi1hcmd1bWVudHMgKCkKLSAgIlJldHVybiBhcmd1bWVudHMgb2YgY3VycmVudCBmdW5jdGlvbiwgb3IgbmlsLiIKLSAgKGlmIChub3QgKGxvb2tpbmctYXQgKGNvbmNhdCAiXiIgZXJsYW5nLWF0b20tcmVnZXhwICJcXHMgKigiKSkpCi0gICAgICBuaWwKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIChjb25kaXRpb24tY2FzZSBuaWwKLQkgIChsZXQgKChzdGFydCAobWF0Y2gtZW5kIDApKSkKLQkgICAgKGdvdG8tY2hhciAoLSBzdGFydCAxKSkKLQkgICAgKGZvcndhcmQtc2V4cCkKLQkgICAgKGVybGFuZy1idWZmZXItc3Vic3RyaW5nIHN0YXJ0ICgtIChwb2ludCkgMSkpKQotCShlcnJvciBuaWwpKSkpKQotCi0KLShkZWZ1biBlcmxhbmctZ2V0LWZ1bmN0aW9uLXVuZGVyLXBvaW50ICgpCi0gICJSZXR1cm4gdGhlIG1vZHVsZSBhbmQgZnVuY3Rpb24gdW5kZXIgdGhlIHBvaW50LCBvciBuaWwuCi0KLVNob3VsZCBubyBleHBsaWNpdCBtb2R1bGUgbmFtZSBiZSBwcmVzZW50IGF0IHRoZSBwb2ludCwgdGhlCi1saXN0IG9mIGltcG9ydGVkIGZ1bmN0aW9ucyBpcyBzZWFyY2hlZC4KLQotVGhlIGZvbGxvd2luZyBjb3VsZCBiZSByZXR1cmVkOgotICAgKFwibW9kdWxlXCIgIFwiZnVuY3Rpb25cIikgICAgLS0gQm90aCBtb2R1bGUgYW5kIGZ1bmN0aW9uIG5hbWUgZm91bmQuCi0gICAobmlsICAgICAgIFwiZnVuY3Rpb25cIikgICAgLS0gTm8gbW9kdWxlIG5hbWUgd2FzIGZvdW5kLgotICAgbmlsICAgICAgICAgICAgICAgICAgICAgICAtLSBObyBmdW5jdGlvbiBuYW1lIGZvdW5kCi0KLUluIHRoZSBmdXR1cmUgdGhlIGxpc3QgbWF5IGNvbnRhaW4gbW9yZSBlbGVtZW50cy4iCi0gIChzYXZlLWV4Y3Vyc2lvbgotICAgIChsZXQgKChtZCAobWF0Y2gtZGF0YSkpCi0JICAocmVzIG5pbCkpCi0gICAgICAoaWYgKGVxIChjaGFyLXN5bnRheCAoZm9sbG93aW5nLWNoYXIpKSA/ICkKLQkgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKSkKLSAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICJhLXpBLVowLTlfOiciKQotICAgICAgKGNvbmQgKChsb29raW5nLWF0IChjb25jYXQgZXJsYW5nLWF0b20tcmVnZXhwICI6IiBlcmxhbmctYXRvbS1yZWdleHApKQotCSAgICAgKHNldHEgcmVzIChsaXN0Ci0JCQkoZXJsYW5nLXJlbW92ZS1xdW90ZXMKLQkJCSAoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcKLQkJCSAgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKSkKLQkJCShlcmxhbmctcmVtb3ZlLXF1b3RlcwotCQkJIChlcmxhbmctYnVmZmVyLXN1YnN0cmluZwotCQkJICAobWF0Y2gtYmVnaW5uaW5nICgxKyBlcmxhbmctYXRvbS1yZWdleHAtbWF0Y2hlcykpCi0JCQkgIChtYXRjaC1lbmQgKDErIGVybGFuZy1hdG9tLXJlZ2V4cC1tYXRjaGVzKSkpKSkpKQotCSAgICAoKGxvb2tpbmctYXQgZXJsYW5nLWF0b20tcmVnZXhwKQotCSAgICAgKGxldCAoKGZrIChlcmxhbmctcmVtb3ZlLXF1b3RlcwotCQkJKGVybGFuZy1idWZmZXItc3Vic3RyaW5nCi0JCQkgKG1hdGNoLWJlZ2lubmluZyAwKSAobWF0Y2gtZW5kIDApKSkpCi0JCSAgIChtb2QgbmlsKQotCQkgICAoaW1wb3J0cyAoZXJsYW5nLWdldC1pbXBvcnQpKSkKLQkgICAgICAgKHdoaWxlIChhbmQgaW1wb3J0cyAobnVsbCBtb2QpKQotCQkgKGlmIChhc3NvYyBmayAoY2RyIChjYXIgaW1wb3J0cykpKQotCQkgICAgIChzZXRxIG1vZCAoY2FyIChjYXIgaW1wb3J0cykpKQotCQkgICAoc2V0cSBpbXBvcnRzIChjZHIgaW1wb3J0cykpKSkKLQkgICAgICAgKHNldHEgcmVzIChsaXN0IG1vZCBmaykpKSkpCi0gICAgICAoc3RvcmUtbWF0Y2gtZGF0YSBtZCkKLSAgICAgIHJlcykpKQotCi0KLTs7IFRPRE86IEVzY2FwZSBzaW5nbGUgcXVvdGVzIGluc2lkZSB0aGUgc3RyaW5nLgotKGRlZnVuIGVybGFuZy1hZGQtcXVvdGVzLWlmLW5lZWRlZCAoc3RyKQotICAiUmV0dXJuIFNUUiwgcG9zc2libHkgd2l0aCBxdW90ZXMuIgotICAoaWYgKGFuZCAoc3RyaW5ncCBzdHIpCi0JICAgKG5vdCAoc3RyaW5nLW1hdGNoIChjb25jYXQgIlxcYCIgZXJsYW5nLWF0b20tcmVnZXhwICJcXCciKSBzdHIpKSkKLSAgICAgIChjb25jYXQgIiciIHN0ciAiJyIpCi0gICAgc3RyKSkKLQotCi0oZGVmdW4gZXJsYW5nLXJlbW92ZS1xdW90ZXMgKHN0cikKLSAgIlJldHVybiBTVFIgd2l0aG91dCBxdW90ZXMsIGlmIHByZXNlbnQuIgotICAobGV0ICgobWQgKG1hdGNoLWRhdGEpKSkKLSAgICAocHJvZzEKLQkoaWYgKHN0cmluZy1tYXRjaCAiXFxgJ1xcKC4qXFwpJ1xcJyIgc3RyKQotCSAgICAoc3Vic3RyaW5nIHN0ciAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpCi0JICBzdHIpCi0gICAgICAoc3RvcmUtbWF0Y2gtZGF0YSBtZCkpKSkKLQotDAotOzs7IENoZWNrIG1vZHVsZSBuYW1lCi0KLTs7IEkgZG9uJ3Qgd2FudCB0byB1c2UgYGFkdmljZScgc2luY2UgaXQgaXMgbm90IHBhcnQgb2YgRW1hY3MgMTguCi07OwotOzsgVGhlIGZ1bmN0aW9uIGB3cml0ZS1maWxlJywgYm91bmQgdG8gQy14IEMtdywgY2FsbHMKLTs7IGBzZXQtdmlzaXRlZC1maWxlLW5hbWUnIHdoaWNoIGNsZWFycyB0aGUgaG9vay4gIDotKAotOzsgVG8gbWFrZSBzdXJlIHRoYXQgdGhlIGhvb2sgYWx3YXlzIGlzIHByZXNlbnQsIHdlIGFkZCBhIHBpZWNlIG9mCi07OyBjb2RlIHRvIHRoZSBmdW5jdGlvbiBgc2V0LXZpc2l0ZWQtZmlsZS1uYW1lJy4KLShkZWZ1biBlcmxhbmctY2hlY2stbW9kdWxlLW5hbWUtaW5pdCAoKQotICAiSW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb25hbGl0eSB0byBjb21wYXJlIGZpbGUgYW5kIG1vZHVsZSBuYW1lcy4KLQotV2UgcmVkZWZpbmVzIHRoZSBmdW5jdGlvbiBgc2V0LXZpc2l0ZWQtZmlsZS1uYW1lJyBzaW5jZSBpdCBjbGVhcnMKLXRoZSB2YXJpYWJsZSBgbG9jYWwtd3JpdGUtZmlsZS1ob29rcycuICBUaGUgb3JpZ2luYWwgZnVuY3Rpb24gZGVmaW5pdGlvbgotaXMgc3RvcmVkIGluIGBlcmxhbmctb3JpZy1zZXQtdmlzaXRlZC1maWxlLW5hbWUnLiIKLSAgKGlmIChmYm91bmRwICdlcmxhbmctb3JpZy1zZXQtdmlzaXRlZC1maWxlLW5hbWUpCi0gICAgICAoKQotICAgIChmc2V0ICdlcmxhbmctb3JpZy1zZXQtdmlzaXRlZC1maWxlLW5hbWUKLQkgIChzeW1ib2wtZnVuY3Rpb24gJ3NldC12aXNpdGVkLWZpbGUtbmFtZSkpCi0gICAgKGRlZnVuIHNldC12aXNpdGVkLWZpbGUtbmFtZSAoJnJlc3QgYXJncykKLSAgICAgICJQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgZXJsYW5nLW9yaWctc2V0LXZpc2l0ZWQtZmlsZS1uYW1lJy4iCi0gICAgICAoaW50ZXJhY3RpdmUgIkZTZXQgdmlzaXRlZCBmaWxlIG5hbWU6ICIpCi0gICAgICAoYXBwbHkgKHN5bWJvbC1mdW5jdGlvbiAnZXJsYW5nLW9yaWctc2V0LXZpc2l0ZWQtZmlsZS1uYW1lKSBhcmdzKQotICAgICAgKGlmIChlcSBtYWpvci1tb2RlICdlcmxhbmctbW9kZSkKLQkgIChhZGQtaG9vayAnbG9jYWwtd3JpdGUtZmlsZS1ob29rcyAnZXJsYW5nLWNoZWNrLW1vZHVsZS1uYW1lKSkpKQotICAoYWRkLWhvb2sgJ2xvY2FsLXdyaXRlLWZpbGUtaG9va3MgJ2VybGFuZy1jaGVjay1tb2R1bGUtbmFtZSkpCi0KLQotKGRlZnVuIGVybGFuZy1jaGVjay1tb2R1bGUtbmFtZSAoKQotICAiSWYgdGhlIG1vZHVsZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggZmlsZSBuYW1lLCBhc2sgZm9yIHBlcm1pc3Npb24gdG8gY2hhbmdlLgotCi1UaGUgdmFyaWFibGUgYGVybGFuZy1jaGVjay1tb2R1bGUtbmFtZScgY29udHJvbHMgdGhlIGJlaGF2aW91ciBvZiB0aGlzCi1mdW5jdGlvbi4gIEl0IGl0IGlzIG5pbCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuICBJZiBpdCBpcyB0LCB0aGUKLXNvdXJjZSBpcyBzaWxlbnRseSBjaGFuZ2VkLiAgSWYgaXQgaXMgc2V0IHRvIHRoZSBhdG9tIGBhc2snLCB0aGUgdXNlcgotaXMgcHJvbXB0ZWQuCi0KLVRoaXMgZnVuY3Rpb24gaXMgbm9ybWFsbHkgcGxhY2VkIGluIHRoZSBob29rIGBsb2NhbC13cml0ZS1maWxlLWhvb2snLiIKLSAgKGlmIGVybGFuZy1jaGVjay1tb2R1bGUtbmFtZQotICAgICAgKGxldCAoKG1uIChlcmxhbmctZ2V0LW1vZHVsZSkpCi0JICAgIChmbiAoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUgKGJ1ZmZlci1maWxlLW5hbWUpKSkpCi0JKGlmIChhbmQgKHN0cmluZ3AgbW4pIChzdHJpbmdwIGZuKSkKLQkgICAgKG9yIChzdHJpbmctZXF1YWwgbW4gZm4pCi0JCShpZiAob3IgKGVxIGVybGFuZy1jaGVjay1tb2R1bGUtbmFtZSB0KQotCQkJKHktb3Itbi1wCi0JCQkgIk1vZHVsZSBkb2VzIG5vdCBtYXRjaCBmaWxlIG5hbWUuIE1vZGlmeSBzb3VyY2U/ICIpKQotCQkgICAgKHNhdmUtZXhjdXJzaW9uCi0JCSAgICAgIChzYXZlLXJlc3RyaWN0aW9uCi0JCQkod2lkZW4pCi0JCQkoZ290by1jaGFyIChwb2ludC1taW4pKQotCQkJKGlmIChyZS1zZWFyY2gtZm9yd2FyZAotCQkJICAgICAoY29uY2F0ICJeLW1vZHVsZVxccyAqKFxccyAqXFwoXFwoIgotCQkJCSAgICAgZXJsYW5nLWF0b20tcmVnZXhwCi0JCQkJICAgICAiXFwpP1xcKVxccyAqKVxccyAqXFwuIikKLQkJCSAgICAgKHBvaW50LW1heCkgdCkKLQkJCSAgICAocHJvZ24KLQkJCSAgICAgIChnb3RvLWNoYXIgKG1hdGNoLWJlZ2lubmluZyAxKSkKLQkJCSAgICAgIChkZWxldGUtcmVnaW9uIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkJICAgICAobWF0Y2gtZW5kIDEpKQotCQkJICAgICAgKGluc2VydCBmbikpKSkpKSkpKSkKLSAgOzsgTXVzdCByZXR1cm4gbmlsIHNpbmNlIGl0IGlzIGFkZGVkIHRvIGBsb2NhbC13cml0ZS1maWxlLWhvb2snLgotICBuaWwpCi0KLQwKLTs7OyBFbGVjdHJpYyBmdW5jdGlvbnMuCi0KLShkZWZ1biBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uICgmb3B0aW9uYWwgYXJnKQotICAiSW5zZXJ0IGEgc2VtaWNvbG9uIGNoYXJhY3RlciBhbmQgcG9zc2libHkgYSBwcm90b3R5cGUgZm9yIHRoZSBuZXh0IGxpbmUuCi0KLVRoZSB2YXJpYWJsZSBgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbi1jcml0ZXJpYScgc3RhdGVzIGEgY3JpdGVyYSwKLXdoZW4gZnVsZmlsbGVkIGEgbmV3bGluZSBpcyBpbnNlcnRlZCwgdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBhbmQgYQotcHJvdG90eXBlIGZvciB0aGUgbmV4dCBsaW5lIGlzIGluc2VydGVkLiAgTm9ybWFsbHkgdGhlIHByb3RvdHlwZQotY29uc2lzdHMgb2YgXCIgLT5cIi4gIFNob3VsZCB0aGUgc2VtaWNvbG9uIGVuZCB0aGUgY2xhdXNlIGEgbmV3IGNsYXVzZQotaGVhZGVyIGlzIGdlbmVyYXRlZC4KLQotVGhlIHZhcmlhYmxlIGBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uLWluc2VydC1ibGFuay1saW5lcycgY29udHJvbHMKLXRoZSBudW1iZXIgb2YgYmxhbmsgbGluZXMgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgY3VycmVudCBsaW5lIGFuZCBuZXcKLWZ1bmN0aW9uIGhlYWRlci4KLQotQmVoYXZlcyBqdXN0IGxpa2UgdGhlIG5vcm1hbCBzZW1pY29sb24gd2hlbiBzdXBwbGllZCB3aXRoIGEKLW51bWVyaWNhbCBhcmcsIHBvaW50IGlzIGluc2lkZSBzdHJpbmcgb3IgY29tbWVudCwgb3Igd2hlbiB0aGVyZSBhcmUKLW5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgZm9sbG93aW5nIHRoZSBwb2ludCBvbiB0aGUgY3VycmVudCBsaW5lLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKHNlbGYtaW5zZXJ0LWNvbW1hbmQgKHByZWZpeC1udW1lcmljLXZhbHVlIGFyZykpCi0gIChpZiAob3IgYXJnCi0JICAoYW5kIChsaXN0cCBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpCi0JICAgICAgIChub3QgKG1lbXEgJ2VybGFuZy1lbGVjdHJpYy1zZW1pY29sb24KLQkJCSAgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzKSkpCi0JICAoZXJsYW5nLWluLWxpdGVyYWwpCi0JICAobm90IChsb29raW5nLWF0ICJcXHMgKlxcKCUuKlxcKT8kIikpCi0JICAobnVsbCAoZXJsYW5nLXRlc3QtY3JpdGVyaWEtbGlzdAotCQkgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbi1jcml0ZXJpYSkpKQotICAgICAgKHNldHEgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdCBuaWwpCi0gICAgKHNldHEgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdCB0KQotICAgICh1bmRvLWJvdW5kYXJ5KQotICAgIChlbmQtb2YtbGluZSkKLSAgICAobmV3bGluZSkKLSAgICAoaWYgKGNvbmRpdGlvbi1jYXNlIG5pbAotCSAgICAocHJvZ24gKGVybGFuZy1pbmRlbnQtbGluZSkgdCkKLQkgIChlcnJvciAoaWYgKGJvbHApIChkZWxldGUtYmFja3dhcmQtY2hhciAxKSkpKQotCShpZiAobm90IChib2xwKSkKLQkgICAgKHNhdmUtZXhjdXJzaW9uCi0JICAgICAgKGluc2VydCAiIC0+IikpCi0JICAoY29uZGl0aW9uLWNhc2UgbmlsCi0JICAgICAgKHByb2duCi0JCShlcmxhbmctZ2VuZXJhdGUtbmV3LWNsYXVzZSkKLQkJKGlmIGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24taW5zZXJ0LWJsYW5rLWxpbmVzCi0JCSAgICAoc2F2ZS1leGN1cnNpb24KLQkJICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQotCQkgICAgICAobmV3bGluZQotCQkgICAgICAgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbi1pbnNlcnQtYmxhbmstbGluZXMpKSkpCi0JICAgIChlcnJvciAoaWYgKGJvbHApIChkZWxldGUtYmFja3dhcmQtY2hhciAxKSkpKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWVsZWN0cmljLWNvbW1hICgmb3B0aW9uYWwgYXJnKQotICAiSW5zZXJ0IGEgY29tbWEgY2hhcmFjdGVyIGFuZCBwb3NzaWJseSBhIG5ldyBpbmRlbnRlZCBsaW5lLgotVGhlIHZhcmlhYmxlIGBlcmxhbmctZWxlY3RyaWMtY29tbWEtY3JpdGVyaWEnIHN0YXRlcyBhIGNyaXRlcmEsCi13aGVuIGZ1bGZpbGxlZCBhIG5ld2xpbmUgaXMgaW5zZXJ0ZWQgYW5kIHRoZSBuZXh0IGxpbmUgaXMgaW5kZXRlZC4KLQotQmVoYXZlcyBqdXN0IGxpa2UgdGhlIG5vcm1hbCBjb21tYSB3aGVuIHN1cHBsaWVkIHdpdGggYQotbnVtZXJpY2FsIGFyZywgcG9pbnQgaXMgaW5zaWRlIHN0cmluZyBvciBjb21tZW50LCBvciB3aGVuIHRoZXJlIGFyZQotbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBmb2xsb3dpbmcgdGhlIHBvaW50IG9uIHRoZSBjdXJyZW50IGxpbmUuIgotICAoaW50ZXJhY3RpdmUgIlAiKQotCi0gIChzZWxmLWluc2VydC1jb21tYW5kIChwcmVmaXgtbnVtZXJpYy12YWx1ZSBhcmcpKQotCi0gIChpZiAob3IgYXJnCi0JICAoYW5kIChsaXN0cCBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpCi0JICAgICAgIChub3QgKG1lbXEgJ2VybGFuZy1lbGVjdHJpYy1jb21tYSBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpKSkKLQkgIChlcmxhbmctaW4tbGl0ZXJhbCkKLQkgIChub3QgKGxvb2tpbmctYXQgIlxccyAqXFwoJS4qXFwpPyQiKSkKLQkgIChudWxsIChlcmxhbmctdGVzdC1jcml0ZXJpYS1saXN0Ci0JCSBlcmxhbmctZWxlY3RyaWMtY29tbWEtY3JpdGVyaWEpKSkKLSAgICAgIChzZXRxIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQgbmlsKQotICAgIChzZXRxIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQgdCkKLSAgICAodW5kby1ib3VuZGFyeSkKLSAgICAoZW5kLW9mLWxpbmUpCi0gICAgKG5ld2xpbmUpCi0gICAgKGNvbmRpdGlvbi1jYXNlIG5pbAotCShlcmxhbmctaW5kZW50LWxpbmUpCi0gICAgICAoZXJyb3IgKGlmIChib2xwKSAoZGVsZXRlLWJhY2t3YXJkLWNoYXIgMSkpKSkpKQotCi0oZGVmdW4gZXJsYW5nLWVsZWN0cmljLWx0ICgmb3B0aW9uYWwgYXJnKQotICAiSW5zZXJ0IGEgbGVzcy10aGFuIHNpZ24sIGFuZCBvcHRpb25hbGx5IG1hcmsgaXQgYXMgYW4gb3BlbiBwYXJlbi4iCi0gIAotICAoaW50ZXJhY3RpdmUgInAiKQotCi0gIChzZWxmLWluc2VydC1jb21tYW5kIGFyZykKLQotICA7OyBXYXMgdGhpcyB0aGUgc2Vjb25kIGNoYXIgaW4gYml0LXN5bnRheCBvcGVuIChgPDwnKT8KLSAgKHVubGVzcyAoPCAocG9pbnQpIDIpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAoYmFja3dhcmQtY2hhciAyKQotICAgICAgKHdoZW4gKGFuZCAoZXEgKGNoYXItYWZ0ZXIgKHBvaW50KSkgPzwpCi0JCSAobm90IChlcSAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAnY2F0ZWdvcnkpCi0JCQkgICdiaXRzeW50YXgtb3Blbi1pbm5lcikpKQotCTs7IFRoZW4gbWFyayB0aGUgdHdvIGNoYXJzLi4uCi0JKHB1dC10ZXh0LXByb3BlcnR5IChwb2ludCkgKDErIChwb2ludCkpIAotCQkJICAgJ2NhdGVnb3J5ICdiaXRzeW50YXgtb3Blbi1vdXRlcikKLQkoZm9yd2FyZC1jaGFyIDEpCi0JKHB1dC10ZXh0LXByb3BlcnR5IChwb2ludCkgKDErIChwb2ludCkpCi0JCQkgICAnY2F0ZWdvcnkgJ2JpdHN5bnRheC1vcGVuLWlubmVyKQotCTs7Li4uYW5kIHVubWFyayBhbnkgc3Vic2VxdWVudCBsZXNzLXRoYW4gY2hhcnMuCi0JKGZvcndhcmQtY2hhciAxKQotCSh3aGlsZSAoZXEgKGNoYXItYWZ0ZXIgKHBvaW50KSkgPzwpCi0JICAocmVtb3ZlLXRleHQtcHJvcGVydGllcyAocG9pbnQpICgxKyAocG9pbnQpKQotCQkJCSAgJyhjYXRlZ29yeSBuaWwpKQotCSAgKGZvcndhcmQtY2hhciAxKSkpKSkpCi0KLShkZWZ1biBlcmxhbmctYWZ0ZXItYml0c3ludGF4LWNsb3NlICgpCi0gICJSZXR1cm5zIHRydWUgaWYgcG9pbnQgaXMgcGxhY2VkIGltbWVkaWF0ZWx5IGFmdGVyIGEgYml0LXN5bnRheCBjbG9zZSBwYXJlbnRoZXNpcyAoYD4+JykuIgotICAoYW5kICg+PSAocG9pbnQpIDIpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAoYmFja3dhcmQtY2hhciAyKQotICAgICAgKGFuZCAoZXEgKGNoYXItYWZ0ZXIgKHBvaW50KSkgPz4pCi0JICAgKG5vdCAoZXEgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2NhdGVnb3J5KQotCQkgICAgJ2JpdHN5bnRheC1jbG9zZS1vdXRlcikpKSkpKQotCSAKLShkZWZ1biBlcmxhbmctYWZ0ZXItYXJyb3cgKCkKLSAgIlJldHVybnMgdHJ1ZSBpZiBwb2ludCBpcyBwbGFjZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBhcnJvdyAoYC0+JykuIgotICAoYW5kICg+PSAocG9pbnQpIDIpCi0JIChhbmQgCi0JICAoc2F2ZS1leGN1cnNpb24KLQkgICAgKGJhY2t3YXJkLWNoYXIpCi0JICAgIChlcSAoY2hhci1iZWZvcmUgKHBvaW50KSkgPy0pKQotCSAgKG9yIChub3QgKGxpc3RwIGVybGFuZy1lbGVjdHJpYy1jb21tYW5kcykpCi0JICAgICAgKG1lbXEgJ2VybGFuZy1lbGVjdHJpYy1ndAotCQkgICAgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzKSkKLQkgIChub3QgKGVybGFuZy1pbi1saXRlcmFsKSkKLQkgIChsb29raW5nLWF0ICJcXHMgKlxcKCUuKlxcKT8kIikKLQkgIChlcmxhbmctdGVzdC1jcml0ZXJpYS1saXN0IGVybGFuZy1lbGVjdHJpYy1hcnJvdy1jcml0ZXJpYSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWVsZWN0cmljLWd0ICgmb3B0aW9uYWwgYXJnKQotICAiSW5zZXJ0IGEgZ3JlYXRlci10aGFuIHNpZ24sIGFuZCBvcHRpb25hbGx5IG1hcmsgaXQgYXMgYSBjbG9zZSBwYXJlbi4iCi0gIAotICAoaW50ZXJhY3RpdmUgInAiKQotCi0gIChzZWxmLWluc2VydC1jb21tYW5kIGFyZykKLQotICAoY29uZAotICAgOzsgRGlkIHdlIGp1c3Qgd3JpdGUgYSBiaXQtc3ludGF4IGNsb3NlIChgPj4nKT8KLSAgICgoZXJsYW5nLWFmdGVyLWJpdHN5bnRheC1jbG9zZSkKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIDs7IFRoZW4gbWFyayB0aGUgdHdvIGNoYXJzLi4uCi0gICAgICAoYmFja3dhcmQtY2hhciAyKQotICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IChwb2ludCkgKDErIChwb2ludCkpIAotCQkJICdjYXRlZ29yeSAnYml0c3ludGF4LWNsb3NlLWlubmVyKQotICAgICAgKGZvcndhcmQtY2hhcikKLSAgICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICgxKyAocG9pbnQpKQotCQkJICdjYXRlZ29yeSAnYml0c3ludGF4LWNsb3NlLW91dGVyKQotICAgICAgOzsuLi5hbmQgdW5tYXJrIGFueSBzdWJzZXF1ZW50IGdyZWF0ZXItdGhhbiBjaGFycy4KLSAgICAgIChmb3J3YXJkLWNoYXIpCi0gICAgICAod2hpbGUgKGVxIChjaGFyLWFmdGVyIChwb2ludCkpID8+KQotCShyZW1vdmUtdGV4dC1wcm9wZXJ0aWVzIChwb2ludCkgKDErIChwb2ludCkpCi0JCQkJJyhjYXRlZ29yeSBuaWwpKQotCShmb3J3YXJkLWNoYXIpKSkpCi0KLSAgIDs7IERpZCB3ZSBqdXN0IHdyaXRlIGEgZnVuY3Rpb24gYXJyb3cgKGAtPicpPwotICAgKChlcmxhbmctYWZ0ZXItYXJyb3cpCi0gICAgKGxldCAoKGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQgdCkpCi0gICAgICAodW5kby1ib3VuZGFyeSkKLSAgICAgIChlbmQtb2YtbGluZSkKLSAgICAgIChuZXdsaW5lKQotICAgICAgKGNvbmRpdGlvbi1jYXNlIG5pbAotCSAgKGVybGFuZy1pbmRlbnQtbGluZSkKLQkoZXJyb3IgKGlmIChib2xwKSAoZGVsZXRlLWJhY2t3YXJkLWNoYXIgMSkpKSkpKQotCi0gICA7OyBUaGVuIGl0J3MganVzdCBhIHBsYWluIGdyZWF0ZXItdGhhbi4KLSAgICh0Ci0gICAgbmlsKSkpCi0gICAgCi0KLShkZWZ1biBlcmxhbmctZWxlY3RyaWMtYXJyb3dcIG9mZiAoJm9wdGlvbmFsIGFyZykKLSAgIkluc2VydCBhICc+Jy1zaWduIGFuZCBwb3NzaWJsZSBhIG5ldyBpbmRlbnRlZCBsaW5lLgotCi1UaGlzIGNvbW1hbmQgaXMgb25seSBgZWxlY3RyaWMnIHdoZW4gdGhlIGA+JyBpcyBwYXJ0IG9mIGFuIGAtPicgYXJyb3cuCi1UaGUgdmFyaWFibGUgYGVybGFuZy1lbGVjdHJpYy1hcnJvdy1jcml0ZXJpYScgc3RhdGVzIGEgc2VxdWVuY2Ugb2YKLWNyaXRlcmlhLCB3aGljaCBkZWNpZGVzIHdoZW4gYSBuZXdsaW5lIHNob3VsZCBiZSBpbnNlcnRlZCBhbmQgdGhlIG5leHQKLWxpbmUgaW5kZW50ZWQuCi0KLUl0IGJlaGF2ZXMganVzdCBsaWtlIHRoZSBub3JtYWwgZ3JlYXRlciB0aGFuIHNpZ24gd2hlbiBzdXBwbGllZCB3aXRoIGEKLW51bWVyaWNhbCBhcmcsIHBvaW50IGlzIGluc2lkZSBzdHJpbmcgb3IgY29tbWVudCwgb3Igd2hlbiB0aGVyZSBhcmUKLW5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgZm9sbG93aW5nIHRoZSBwb2ludCBvbiB0aGUgY3VycmVudCBsaW5lLgotCi1BZnRlciBiZWluZyBzcGxpdC9tZXJnZWQgaW50byBlcmxhbmctYWZ0ZXItYXJyb3cgYW5kCi1lcmxhbmctZWxlY3RyaWMtZ3QsIGl0IGlzIG5vdyB1bnVzZWQgYW5kIGRpc2FibGVkLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKGxldCAoKHByZWMgKHByZWNlZGluZy1jaGFyKSkpCi0gICAgKHNlbGYtaW5zZXJ0LWNvbW1hbmQgKHByZWZpeC1udW1lcmljLXZhbHVlIGFyZykpCi0gICAgKGlmIChvciBhcmcKLQkgICAgKGFuZCAobGlzdHAgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzKQotCQkgKG5vdCAobWVtcSAnZXJsYW5nLWVsZWN0cmljLWFycm93Ci0JCQkgICAgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzKSkpCi0JICAgIChub3QgKGVxIHByZWMgPy0pKQotCSAgICAoZXJsYW5nLWluLWxpdGVyYWwpCi0JICAgIChub3QgKGxvb2tpbmctYXQgIlxccyAqXFwoJS4qXFwpPyQiKSkKLQkgICAgKG51bGwgKGVybGFuZy10ZXN0LWNyaXRlcmlhLWxpc3QKLQkJICAgZXJsYW5nLWVsZWN0cmljLWFycm93LWNyaXRlcmlhKSkpCi0JKHNldHEgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdCBuaWwpCi0gICAgICAoc2V0cSBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1pbmhpYml0IHQpCi0gICAgICAodW5kby1ib3VuZGFyeSkKLSAgICAgIChlbmQtb2YtbGluZSkKLSAgICAgIChuZXdsaW5lKQotICAgICAgKGNvbmRpdGlvbi1jYXNlIG5pbAotCSAgKGVybGFuZy1pbmRlbnQtbGluZSkKLQkoZXJyb3IgKGlmIChib2xwKSAoZGVsZXRlLWJhY2t3YXJkLWNoYXIgMSkpKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUgKCZvcHRpb25hbCBhcmcpCi0gICJCcmVhayBsaW5lIGF0IHBvaW50IGFuZCBpbmRlbnQsIGNvbnRpbnVpbmcgY29tbWVudCBpZiB3aXRoaW4gb25lLgotVGhlIHZhcmlhYmxlIGBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1jcml0ZXJpYScgc3RhdGVzIGEgY3JpdGVyYSwKLXdoZW4gZnVsZmlsbGVkIGEgbmV3bGluZSBpcyBpbnNlcnRlZCBhbmQgdGhlIG5leHQgbGluZSBpcyBpbmRldGVkLgotCi1TaG91bGQgdGhlIGN1cnJlbnQgbGluZSBiZWdpbiB3aXRoIGEgY29tbWVudCwgYW5kIHRoZSB2YXJpYWJsZQotYGNvbW1lbnQtbXVsdGktbGluZScgYmUgbm9uLW5pbCwgYSBuZXcgY29tbWVudCBzdGFydCBpcyBpbnNlcnRlZC4KLQotU2hvdWxkIHRoZSBwcmV2aW91cyBjb21tYW5kIGJlIGFub3RoZXIgZWxlY3RyaWMgY29tbWFuZCB3ZSBhc3N1bWUgdGhhdAotdGhlIHVzZXIgcHJlc3NlZCBuZXdsaW5lIG91dCBvZiBvbGQgaGFiaXQsIGhlbmNlIHdlIHdpbGwgZG8gbm90aGluZy4iCi0gIChpbnRlcmFjdGl2ZSAiUCIpCi0gIChjb25kICgoYW5kIChub3QgYXJnKQotCSAgICAgIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQKLQkgICAgICAobWVtcSBsYXN0LWNvbW1hbmQgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdC1saXN0KSkKLQkgKCkpCQkJCTsgRG8gbm90aGluZyEKLQkoKG9yIGFyZwotCSAgICAgKGFuZCAobGlzdHAgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzKQotCQkgIChub3QgKG1lbXEgJ2VybGFuZy1lbGVjdHJpYy1uZXdsaW5lCi0JCQkgICAgIGVybGFuZy1lbGVjdHJpYy1jb21tYW5kcykpKQotCSAgICAgKG51bGwgKGVybGFuZy10ZXN0LWNyaXRlcmlhLWxpc3QKLQkJICAgIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWNyaXRlcmlhKSkpCi0JIChuZXdsaW5lIChwcmVmaXgtbnVtZXJpYy12YWx1ZSBhcmcpKSkKLQkodAotCSAoaWYgKGFuZCBjb21tZW50LW11bHRpLWxpbmUKLQkJICAoc2F2ZS1leGN1cnNpb24KLQkJICAgIChiZWdpbm5pbmctb2YtbGluZSkKLQkJICAgIChsb29raW5nLWF0IChjb25jYXQgIlxccyAqIiBjb21tZW50LXN0YXJ0LXNraXApKSkpCi0JICAgICAobGV0ICgoc3RyIChidWZmZXItc3Vic3RyaW5nCi0JCQkgKG9yIChtYXRjaC1lbmQgMSkgKG1hdGNoLWJlZ2lubmluZyAwKSkKLQkJCSAobWluIChtYXRjaC1lbmQgMCkgKHBvaW50KSkpKSkKLQkgICAgICAgKG5ld2xpbmUpCi0JICAgICAgICh1bmRvLWJvdW5kYXJ5KQotCSAgICAgICAoaW5zZXJ0IHN0cikpCi0JICAgKG5ld2xpbmUpCi0JICAgKHVuZG8tYm91bmRhcnkpCi0JICAgKGluZGVudC1hY2NvcmRpbmctdG8tbW9kZSkpKSkpCi0KLQotKGRlZnVuIGVybGFuZy10ZXN0LWNyaXRlcmlhLWxpc3QgKGNyaXRlcmlhKQotICAiR2l2ZW4gYSBsaXN0IG9mIGNyaXRlcmlhIGZ1bmN0aW9ucywgdGVzdCBpZiBjcml0ZXJpYSBpcyBmdWxmaWxsZWQuCi0KLUVhY2ggZWxlbWVudCBpbiB0aGUgY3JpdGVyaWEgbGlzdCBjYW4gYSBmdW5jdGlvbiByZXR1cm5pbmcgbmlsLCB0IG9yCi10aGUgYXRvbSBgc3RvcCcuICB0IG1lYW5zIHRoYXQgdGhlIGNyaXRlcmlhIGlzIGZ1bGZpbGxlZCwgYHN0b3AnIG1lYW5zCi10aGF0IGl0IHRoZSBjcml0ZXJpYSBpc24ndCBmdWxmaWxsZWQgYW5kIHRoYXQgdGhlIHNlYXJjaCBzaG91bGQgc3RvcCwKLWFuZCBuaWwgbWVhbnMgY29udGludWUgc2VhcmNoaW5nLgotCi1TaG91bGQgdGhlIGxpc3QgY29udGFpbiB0aGUgYXRvbSB0IHRoZSBjcml0ZXJpYSBpcyBhc3N1bWVkIHRvIGJlCi1mdWxmaWxsZWQsIHVubGVzcyBwcmVjZWRlZCBieSBhIGZ1bmN0aW9uIHJldHVybmluZyBgc3RvcCcsIG9mIGNvdXJzZS4KLQotU2hvdWxkIHRoZSBhcmd1bWVudCBiZSB0aGUgYXRvbSB0IGluc3RlYWQgb2YgYSBsaXN0LCB0aGUgY3JpdGVyaWEgaXMKLWFzc3VtZWQgdG8gYmUgdHJpdmlhbGx5IHRydWUuCi0KLVNob3VsZCBhbGwgZnVuY3Rpb24gcmV0dXJuIG5pbCwgdGhlIGNyaXRlcmlhIGlzIGFzc3VtZWQgbm90IHRvIGJlCi1mdWxmaWxsZWQuCi0KLVJldHVybiB0IGlmIGNyaXRlcmlhIGZ1bGZpbGxlZCwgbmlsIG90aGVyd2lzZS4iCi0gIChpZiAoZXEgY3JpdGVyaWEgdCkKLSAgICAgIHQKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIChsZXQgKChhbnN3ZXIgbmlsKSkKLQkod2hpbGUgKGFuZCBjcml0ZXJpYSAobnVsbCBhbnN3ZXIpKQotCSAgKGlmIChlcSAoY2FyIGNyaXRlcmlhKSB0KQotCSAgICAgIChzZXRxIGFuc3dlciB0KQotCSAgICAoc2V0cSBhbnN3ZXIgKGZ1bmNhbGwgKGNhciBjcml0ZXJpYSkpKSkKLQkgIChzZXRxIGNyaXRlcmlhIChjZHIgY3JpdGVyaWEpKSkKLQkoaWYgKGFuZCBhbnN3ZXIgKG5vdCAoZXEgYW5zd2VyICdzdG9wKSkpCi0JICAgIHQKLQkgIG5pbCkpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1pbi1saXRlcmFsICgmb3B0aW9uYWwgbGltKQotICAiVGVzdCBpZiBwb2ludCBpcyBpbiBzdHJpbmcsIHF1b3RlZCBhdG9tIG9yIGNvbW1lbnQuCi0KLVJldHVybiBvbmUgb2YgdGhlIHRocmVlIGF0b21zIGBhdG9tJywgYHN0cmluZycsIGFuZCBgY29tbWVudCcuCi1TaG91bGQgdGhlIHBvaW50IGJlIGluc2lkZSBub25lIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgdHlwZXMgb2YKLWNvbnRleHQsIG5pbCBpcyByZXR1cm5lZC4iCi0gIChzYXZlLWV4Y3Vyc2lvbgotICAgIChsZXQqICgobGltIChvciBsaW0gKHNhdmUtZXhjdXJzaW9uCi0JCQkgIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKLQkJCSAgKHBvaW50KSkpKQotCSAgIChzdGF0ZSAocGFyc2UtcGFydGlhbC1zZXhwIGxpbSAocG9pbnQpKSkpCi0gICAgICAoY29uZAotICAgICAgICgoZXEgKG50aCAzIHN0YXRlKSA/JykgJ2F0b20pCi0gICAgICAgKChudGggMyBzdGF0ZSkgJ3N0cmluZykKLSAgICAgICAoKG50aCA0IHN0YXRlKSAnY29tbWVudCkKLSAgICAgICAodCBuaWwpKSkpKQotCi0KLShkZWZ1biBlcmxhbmctYXQtZW5kLW9mLWZ1bmN0aW9uLXAgKCkKLSAgIlRlc3QgaWYgcG9pbnQgaXMgYXQgZW5kIG9mIGFuIEVybGFuZyBmdW5jdGlvbi4KLQotVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBhIG1lbWJlciBvZiBhIGNyaXRlcmlhIGxpc3QuIgotICAoZXEgKHNhdmUtZXhjdXJzaW9uIChlcmxhbmctc2tpcC1ibGFuaykgKHBvaW50KSkKLSAgICAgIChzYXZlLWV4Y3Vyc2lvbgotCShlcmxhbmctYmVnaW5uaW5nLW9mLWZ1bmN0aW9uIC0xKSAocG9pbnQpKSkpCi0KLQotKGRlZnVuIGVybGFuZy1zdG9wLXdoZW4taW5zaWRlLWFyZ3VtZW50LWxpc3QgKCkKLSAgIlJldHVybiBgc3RvcCcgaWYgaW5zaWRlIHBhcmVudGhlc2lzIGxpc3QsIG5pbCBvdGhlcndpc2UuCi0KLUtub3dzIGFib3V0IHRoZSBsaXN0IGNvbXByZWhlbnNpb24gc3ludGF4LiAgV2hlbiB0aGUgcG9pbnQgaXMKLWFmdGVyIGB8fCcsIGBzdG9wJyBpcyBub3QgcmV0dXJuZWQuCi0KLVRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgYSBtZW1iZXIgb2YgYSBjcml0ZXJpYSBsaXN0LiIKLSAgKHNhdmUtZXhjdXJzaW9uCi0gICAgKGNvbmRpdGlvbi1jYXNlIG5pbAotCShsZXQgKChvcmlnLXBvaW50IChwb2ludCkpCi0JICAgICAgKHN0YXRlIG5pbCkpCi0JICAodXAtbGlzdCAtMSkKLQkgIChpZiAobm90IChlcSAoZm9sbG93aW5nLWNoYXIpID9cWykpCi0JICAgICAgJ3N0b3AKLQkgICAgOzsgRG8gbm90IHJldHVybiBgc3RvcCcgd2hlbiBpbnNpZGUgYSBsaXN0IGNvbXByZWhlbnNpb24KLQkgICAgOzsgY29uc3RydW5jdGlvbi4gIChUaGUgcG9pbnQgbXVzdCBiZSBhZnRlciBgfHwnKS4KLQkgICAgKHdoaWxlICg8IChwb2ludCkgb3JpZy1wb2ludCkKLQkgICAgICAoc2V0cSBzdGF0ZSAoZXJsYW5nLXBhcnRpYWwtcGFyc2UgKHBvaW50KSBvcmlnLXBvaW50IHN0YXRlKSkpCi0JICAgIChpZiAoYW5kIChjYXIgc3RhdGUpIChlcSAoY2FyIChjYXIgKGNhciBzdGF0ZSkpKSAnfHwpKQotCQluaWwKLQkgICAgICAnc3RvcCkpKQotICAgICAgKGVycm9yIAotICAgICAgIG5pbCkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLXN0b3Atd2hlbi1hdC1ndWFyZCAoKQotICAiUmV0dXJuIGBzdG9wJyB3aGVuIGF0IGZ1bmN0aW9uIGd1YXJkcy4KLQotVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBhIG1lbWJlciBvZiBhIGNyaXRlcmlhIGxpc3QuIgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCi0gICAgKGlmIChhbmQgKGxvb2tpbmctYXQgKGNvbmNhdCAiXiIgZXJsYW5nLWF0b20tcmVnZXhwICJcXHMgKigiKSkKLQkgICAgIChub3QgKGxvb2tpbmctYXQKLQkJICAgKGNvbmNhdCAiXiIgZXJsYW5nLWF0b20tcmVnZXhwICIuKlxcKC0+XFx8Oi1cXCkiKSkpKQotCSdzdG9wCi0gICAgICBuaWwpKSkKLQotCi0oZGVmdW4gZXJsYW5nLW5leHQtbGluZXMtZW1wdHktcCAoKQotICAiUmV0dXJuIG5vbi1uaWwgaWYgbmV4dCBsaW5lcyBhcmUgZW1wdHkuCi0KLVRoZSB2YXJpYWJsZSBgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktdGhyZXNob2xkJyBjb250YWlucyB0aGUgbnVtYmVyCi1vZiBsaW5lcyByZXF1aXJlZCB0byBiZSBlbXB0eS4KLQotQSBsaW5lIGNvbnRhaW5pbmcgb25seSBzcGFjZXMgYW5kIHRhYnMgaXMgY29uc2lkZXJlZCBlbXB0eS4KLQotVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBhIG1lbWJlciBvZiBhIGNyaXRlcmlhIGxpc3QuIgotICAoYW5kIGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXRocmVzaG9sZAotICAgICAgIChzYXZlLWV4Y3Vyc2lvbgotCSAobGV0ICgobGVmdCBlcmxhbmctbmV4dC1saW5lcy1lbXB0eS10aHJlc2hvbGQpCi0JICAgICAgIChjb250IHQpKQotCSAgICh3aGlsZSAoYW5kIGNvbnQgKD4gbGVmdCAwKSkKLQkgICAgIChmb3J3YXJkLWxpbmUgMSkKLQkgICAgIChzZXRxIGNvbnQgKGxvb2tpbmctYXQgIlxccyAqJCIpKQotCSAgICAgKHNldHEgbGVmdCAoLSBsZWZ0IDEpKSkKLQkgICBjb250KSkpKQotCi0KLShkZWZ1biBlcmxhbmctYXQta2V5d29yZC1lbmQtcCAoKQotICAiVGVzdCBpZiBuZXh0IHJlYWRhYmxlIHRva2VuIGlzIHRoZSBrZXl3b3JkIGVuZC4KLQotVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBhIG1lbWJlciBvZiBhIGNyaXRlcmlhIGxpc3QuIgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAoZXJsYW5nLXNraXAtYmxhbmspCi0gICAgKGxvb2tpbmctYXQgImVuZFteX2EtekEtWjAtOV0iKSkpCi0KLQwKLTs7IEVybGFuZyB0YWdzIHN1cHBvcnQgd2hpY2ggaXMgYXdhcmUgb2YgZXJsYW5nIG1vZHVsZXMuCi07OwotOzsgTm90IHlldCBpbXBsZW1lbnRlZCB1bmRlciBYRW1hY3MuICAoSGludDogIFRoZSBFbWFjcyAxOSBldGFncwotOzsgcGFja2FnZSB3b3JrIHVuZGVyIFhFbWFjcy4pCi0KLShldmFsLXdoZW4tY29tcGlsZQotICAoaWYgKG9yIChmZWF0dXJlcCAnYnl0ZWNvbXApCi0JICAoZmVhdHVyZXAgJ2J5dGUtY29tcGlsZSkpCi0gICAgICAocHJvZ24KLQkocmVxdWlyZSAnZXRhZ3MpKSkpCi0KLQotOzsgVmFyaWFibGVzOgotCi0oZGVmdmFyIGVybGFuZy10YWdzLWZ1bmN0aW9uLWFsaXN0Ci0gICAnKChmaW5kLXRhZyAgICAgICAgICAgICAgICAgLiBlcmxhbmctZmluZC10YWcpCi0gICAgIChmaW5kLXRhZy1vdGhlci13aW5kb3cgICAgLiBlcmxhbmctZmluZC10YWctb3RoZXItd2luZG93KQotICAgICAoZmluZC10YWctcmVnZXhwICAgICAgICAgIC4gZXJsYW5nLWZpbmQtdGFnLXJlZ2V4cCkKLSAgICAgKGZpbmQtdGFnLW90aGVyLWZyYW1lICAgICAuIGVybGFuZy1maW5kLXRhZy1vdGhlci1mcmFtZSkpCi0gICAiQWxpc3Qgb2Ygb2xkIHRhZ3MgY29tbWFuZHMgYW5kIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbnMuIikKLQotKGRlZnZhciBlcmxhbmctdGFncy1pbnN0YWxsZWQgbmlsCi0gICJOb24tbmlsIHdoZW4gdGhlIEVybGFuZyB0YWdzIHN5c3RlbSBpcyBpbnN0YWxsZWQuIikKLShkZWZ2YXIgZXJsYW5nLXRhZ3MtZmlsZS1saXN0ICcoKQotICAiTGlzdCBvZiBmaWxlcyBpbiB0YWcgbGlzdC4gVXNlZCB3aGVuIGZpbmRpbmcgdGFnIG9uIGZvcm0gYG1vZHVsZTonLiIpCi0oZGVmdmFyIGVybGFuZy10YWdzLWNvbXBsZXRpb24tdGFibGUgbmlsCi0gICJMaWtlIGB0YWdzLWNvbXBsZXRpb24tdGFibGUnLCB0aGlzIHRhYmxlIGNvbnRhaW5zIGB0YWcnIGFuZCBgbW9kdWxlOnRhZycuIikKLShkZWZ2YXIgZXJsYW5nLXRhZ3MtYnVmZmVyLWluc3RhbGxlZC1wIG5pbAotICAiTm9uLW5pbCB3aGVuIGVybGFuZyBtb2R1bGUgcmVjb2duaXNpbmcgZnVuY3Rpb25zIGluc3RhbGxlZC4iKQotKGRlZnZhciBlcmxhbmctdGFncy1idWZmZXItbGlzdCAnKCkKLSAgIlRlbXBvcmFyeSBsaXN0IG9mIGJ1ZmZlcnMuIikKLShkZWZ2YXIgZXJsYW5nLXRhZ3Mtb3JpZy1jb21wbGV0aW9uLXRhYmxlIG5pbAotICAiVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGB0YWdzLWNvbXBsZXRpb24tdGFibGUnLiIpCi0oZGVmdmFyIGVybGFuZy10YWdzLW9yaWctdGFnLW9yZGVyIG5pbAotICAiVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGBmaW5kLXRhZy10YWctb3JkZXInLiIpCi0oZGVmdmFyIGVybGFuZy10YWdzLW9yaWctcmVnZXhwLXRhZy1vcmRlciBuaWwKLSAgIlRlbXBvcmFyeSBzdG9yYWdlIGZvciBgZmluZC10YWctcmVnZXhwLXRhZy1vcmRlcicuIikKLShkZWZ2YXIgZXJsYW5nLXRhZ3Mtb3JpZy1zZWFyY2gtZnVuY3Rpb24gbmlsCi0gICJUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYGZpbmQtdGFnLXNlYXJjaC1mdW5jdGlvbicuIikKLShkZWZ2YXIgZXJsYW5nLXRhZ3Mtb3JpZy1yZWdleHAtc2VhcmNoLWZ1bmN0aW9uIG5pbAotICAiVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGBmaW5kLXRhZy1yZWdleHAtc2VhcmNoLWZ1bmN0aW9uJy4iKQotKGRlZnZhciBlcmxhbmctdGFncy1vcmlnLWZvcm1hdC1ob29rcyBuaWwKLSAgIlRlbXBvcmFyeSBzdG9yYWdlIGZvciBgdGFncy10YWJsZS1mb3JtYXQtaG9va3MnLiIpCi0KLShkZWZ1biBlcmxhbmctdGFncy1pbml0ICgpCi0gICJJbnN0YWxsIGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIHRhZ3MsIGF3YXJlIG9mIEVybGFuZyBtb2R1bGVzLgotCi1BZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSB0YWdzIGZ1bmN0aW9ucyBhcmUgYXdhcmUgb2YKLUVybGFuZyBtb2R1bGVzLiAgVGFncyBjYW4gYmUgZW50ZXJlZCBvbiB0aGUgZm9yIGBtb2R1bGU6dGFnJyBhc3dlbGwKLWFzIG9uIHRoZSBvbGQgZm9ybSBgdGFnJy4KLQotSW4gdGhlIGNvbXBsZXRpb24gbGlzdCwgYG1vZHVsZTp0YWcnIGFuZCBgbW9kdWxlOicgc2hvd3MgdXAuCi0KLUNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFuIGFwcHJvcHJpYXRlIGluaXQgZmlsZSwgb3IgYWRkIGl0IHRvCi1FcmxhbmcgbW9kZSBob29rIHdpdGggdGhlIGNvbW1hbmRzOgotICAgIChhZGQtaG9vayAnZXJsYW5nLW1vZGUtaG9vayAnZXJsYW5nLXRhZ3MtaW5pdCkKLSAgICAoYWRkLWhvb2sgJ2VybGFuZy1zaGVsbC1tb2RlLWhvb2sgJ2VybGFuZy10YWdzLWluaXQpCi0KLVRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB1bmRlciBFbWFjcyAxOCBhbmQgRW1hY3MgMTkuICBDdXJyZW50bHksIEl0Ci1pcyBub3QgaW1wbGVtZW50ZWQgdW5kZXIgWEVtYWNzLiAgKEhpbnQ6IFRoZSBFbWFjcyAxOSBldGFncyBtb2R1bGUKLXdvcmtzIHVuZGVyIFhFbWFjcy4pIgotICAoaW50ZXJhY3RpdmUpCi0gIChjb25kICgoPSBlcmxhbmctZW1hY3MtbWFqb3ItdmVyc2lvbiAxOCkKLQkgKHJlcXVpcmUgJ3RhZ3MpCi0JIChlcmxhbmctdGFncy1kZWZpbmUta2V5cyAoY3VycmVudC1sb2NhbC1tYXApKQotCSAoc2V0cSBlcmxhbmctdGFncy1pbnN0YWxsZWQgdCkpCi0JKHQKLQkgKHJlcXVpcmUgJ2V0YWdzKQotCSA7OyBUZXN0IG9uIGEgZnVuY3Rpb24gYXZhaWxhYmxlIGluIHRoZSBFbWFjcyAxOSB2ZXJzaW9uCi0JIDs7IG9mIHRhZ3MgYnV0IG5vdCBpbiB0aGUgWEVtYWNzIHZlcnNpb24uCi0JIChpZiAobm90IChmYm91bmRwICdmaW5kLXRhZy1ub3NlbGVjdCkpCi0JICAgICAoKQotCSAgIChlcmxhbmctdGFncy1kZWZpbmUta2V5cyAoY3VycmVudC1sb2NhbC1tYXApKQotCSAgIChzZXRxIGVybGFuZy10YWdzLWluc3RhbGxlZCB0KSkpKSkKLQotCi07OyBTZXQgYWxsIGtleXMgYm91bmQgdG8gYGZpbmQtdGFnJyBldC5hbC4gaW4gdGhlIGdsb2JhbCBtYXAgYW5kIHRoZQotOzsgbWVudSB0byBgZXJsYW5nLWZpbmQtdGFnJyBldC5hbC4gaW4gYG1hcCcuCi07OwotOzsgVGhlIGZ1bmN0aW9uIGBzdWJzdGl0dXRlLWtleS1kZWZpbml0aW9uJyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5Ci07OyBpbiBhbGwgdmVyc2lvbiBvZiBFbWFjcy4KLQotKGRlZnVuIGVybGFuZy10YWdzLWRlZmluZS1rZXlzIChtYXApCi0gICJCaW5kIHRhZ3MgY29tbWFuZHMgdG8ga2V5bWFwIE1BUCBhd2FyZSBvZiBFcmxhbmcgbW9kdWxlcy4iCi0gIChsZXQgKChhbGlzdCBlcmxhbmctdGFncy1mdW5jdGlvbi1hbGlzdCkpCi0gICAgKHdoaWxlIGFsaXN0Ci0gICAgICAobGV0KiAoKG9sZCAoY2FyIChjYXIgYWxpc3QpKSkKLQkgICAgIChuZXcgKGNkciAoY2FyIGFsaXN0KSkpCi0JICAgICAoa2V5cyAoYXBwZW5kICh3aGVyZS1pcy1pbnRlcm5hbCBvbGQgZ2xvYmFsLW1hcCkpKSkKLQkod2hpbGUga2V5cwotCSAgKGRlZmluZS1rZXkgbWFwIChjYXIga2V5cykgbmV3KQotCSAgKHNldHEga2V5cyAoY2RyIGtleXMpKSkpCi0gICAgICAoc2V0cSBhbGlzdCAoY2RyIGFsaXN0KSkpKQotICA7OyBVcGRhdGUgdGhlIG1lbnUuCi0gIChlcmxhbmctbWVudS1zdWJzdGl0dXRlIGVybGFuZy1tZW51LWJhc2UtaXRlbXMgZXJsYW5nLXRhZ3MtZnVuY3Rpb24tYWxpc3QpCi0gIChlcmxhbmctbWVudS1pbml0KSkKLQotCi07OyBUaGVyZSBleGlzdHMgYSB2YXJpYWJsZSBgZmluZC10YWctZGVmYXVsdC1mdW5jdGlvbicuICBJdCBpcyBub3QgdXNlZAotOzsgc2luY2UgYGNvbXBsZXRlLXRhZycgdXNlcyBpdCB0byBnZXQgY3VycmVudCB3b3JkIHVuZGVyIHBvaW50LiAgSW4gdGhhdAotOzsgc2l0dWF0aW9uIHdlIGRvZXNuJ3Qgd2FudCB0aGUgbW9kdWxlIHRvIGJlIHByZXBlbmRlZC4KLQotKGRlZnVuIGVybGFuZy1maW5kLXRhZy1kZWZhdWx0ICgpCi0gICJSZXR1cm4gdGhlIGRlZmF1bHQgdGFnLCBzZWFyY2hlcyBgLWltcG9ydCcgbGlzdCBvZiBpbXBvcnRlZCBmdW5jdGlvbnMuCi1TaW5nbGUgcXVvdGVzIGhhcyBiZWVuIHN0cmlwcGVkIGF3YXkuIgotICAobGV0ICgobW9kLWZ1bmMgKGVybGFuZy1nZXQtZnVuY3Rpb24tdW5kZXItcG9pbnQpKSkKLSAgICAoY29uZCAoKG51bGwgbW9kLWZ1bmMpCi0JICAgbmlsKQotCSAgKChudWxsIChjYXIgbW9kLWZ1bmMpKQotCSAgIChudGggMSBtb2QtZnVuYykpCi0JICAodAotCSAgIChjb25jYXQgKGNhciBtb2QtZnVuYykgIjoiIChudGggMSBtb2QtZnVuYykpKSkpKQotCi0KLTs7IFJldHVybiBgdCcgc2luY2UgaXQgaXMgdXNlZCBpbnNpZGUgYHRhZ3MtbG9vcC1mb3JtJy4KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gZXJsYW5nLWZpbmQtdGFnIChtb2R0YWduYW1lICZvcHRpb25hbCBuZXh0LXAgcmVnZXhwLXApCi0gICJMaWtlIGBmaW5kLXRhZycuICBDYXBhYmxlIG9mIHJldHJlaXZpbmcgRXJsYW5nIG1vZHVsZXMuCi0KLVRhZ3MgY2FuIGJlIGdpdmVuIG9uIHRoZSBmb3JtcyBgdGFnJywgYG1vZHVsZTonLCBgbW9kdWxlOnRhZycuIgotICAoaW50ZXJhY3RpdmUgKGVybGFuZy10YWctaW50ZXJhY3RpdmUgIkZpbmQgYG1vZHVsZTp0YWcnIG9yIGB0YWcnOiAiKSkKLSAgKHN3aXRjaC10by1idWZmZXIgKGVybGFuZy1maW5kLXRhZy1ub3NlbGVjdCBtb2R0YWduYW1lIG5leHQtcCByZWdleHAtcCkpCi0gIHQpCi0KLQotOzsgQ29kZSBtYWlubHkgZnJvbSBgZmluZC10YWctb3RoZXItd2luZG93JyBpbiBgZXRhZ3MuZWwnLgotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBlcmxhbmctZmluZC10YWctb3RoZXItd2luZG93ICh0YWduYW1lICZvcHRpb25hbCBuZXh0LXAgcmVnZXhwLXApCi0gICJMaWtlIGBmaW5kLXRhZy1vdGhlci13aW5kb3cnIGJ1dCBhd2FyZSBvZiBFcmxhbmcgbW9kdWxlcy4iCi0gIChpbnRlcmFjdGl2ZSAoZXJsYW5nLXRhZy1pbnRlcmFjdGl2ZQotCQkiRmluZCBgbW9kdWxlOnRhZycgb3IgYHRhZycgb3RoZXIgd2luZG93OiAiKSkKLQotICA7OyBUaGlzIGlzIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGUgdGFnIGlzIGZvdW5kIGluIHRoZQotICA7OyBzZWxlY3RlZCB3aW5kb3cncyBidWZmZXI7IHdpdGhvdXQgdGhpcywgcG9pbnQgaXMgbW92ZWQgaW4gYm90aAotICA7OyB3aW5kb3dzLiAgVG8gcHJldmVudCB0aGlzLCB3ZSBzYXZlIHRoZSBzZWxlY3RlZCB3aW5kb3cncyBwb2ludAotICA7OyBiZWZvcmUgZG9pbmcgZmluZC10YWctbm9zZWxlY3QsIGFuZCByZXN0b3JlIGl0IGFmdGVyd2FyZHMuCi0gIChsZXQqICgod2luZG93LXBvaW50ICh3aW5kb3ctcG9pbnQgKHNlbGVjdGVkLXdpbmRvdykpKQotCSAodGFnYnVmIChlcmxhbmctZmluZC10YWctbm9zZWxlY3QgdGFnbmFtZSBuZXh0LXAgcmVnZXhwLXApKQotCSAodGFncG9pbnQgKHByb2duIChzZXQtYnVmZmVyIHRhZ2J1ZikgKHBvaW50KSkpKQotICAgIChzZXQtd2luZG93LXBvaW50IChwcm9nMQotCQkJICAoc2VsZWN0ZWQtd2luZG93KQotCQkJKHN3aXRjaC10by1idWZmZXItb3RoZXItd2luZG93IHRhZ2J1ZikKLQkJCTs7IFdlIGhhdmUgdG8gc2V0IHRoaXMgbmV3IHdpbmRvdydzIHBvaW50OyBpdAotCQkJOzsgbWlnaHQgYWxyZWFkeSBoYXZlIGJlZW4gZGlzcGxheWluZyBhCi0JCQk7OyBkaWZmZXJlbnQgcG9ydGlvbiBvZiB0YWdidWYsIGluIHdoaWNoIGNhc2UKLQkJCTs7IHN3aXRjaC10by1idWZmZXItb3RoZXItd2luZG93IGRvZXNuJ3Qgc2V0Ci0JCQk7OyB0aGUgd2luZG93J3MgcG9pbnQgZnJvbSB0aGUgYnVmZmVyLgotCQkJKHNldC13aW5kb3ctcG9pbnQgKHNlbGVjdGVkLXdpbmRvdykgdGFncG9pbnQpKQotCQkgICAgICB3aW5kb3ctcG9pbnQpKSkKLQotCi0oZGVmdW4gZXJsYW5nLWZpbmQtdGFnLW90aGVyLWZyYW1lICh0YWduYW1lICZvcHRpb25hbCBuZXh0LXApCi0gICJMaWtlIGBmaW5kLXRhZy1vdGhlci1mcmFtZScgYnV0IGF3YXJlIG9mIEVybGFuZyBtb2R1bGVzLiIKLSAgKGludGVyYWN0aXZlIChlcmxhbmctdGFnLWludGVyYWN0aXZlCi0JCSJGaW5kIGBtb2R1bGU6dGFnJyBvciBgdGFnJyBvdGhlciBmcmFtZTogIikpCi0gIChsZXQgKChwb3AtdXAtZnJhbWVzIHQpKQotICAgIChlcmxhbmctZmluZC10YWctb3RoZXItd2luZG93IHRhZ25hbWUgbmV4dC1wKSkpCi0KLQotKGRlZnVuIGVybGFuZy1maW5kLXRhZy1yZWdleHAgKHJlZ2V4cCAmb3B0aW9uYWwgbmV4dC1wIG90aGVyLXdpbmRvdykKLSAgIkxpa2UgYGZpbmQtdGFnLXJlZ2V4cCcgYnV0IGF3YXJlIG9mIEVybGFuZyBtb2R1bGVzLiIKLSAgKGludGVyYWN0aXZlIChpZiAoZmJvdW5kcCAnZmluZC10YWctcmVnZXhwKQotCQkgICAoZXJsYW5nLXRhZy1pbnRlcmFjdGl2ZQotCQkgICAgIkZpbmQgYG1vZHVsZTpyZWdleHAnIG9yIGByZWdleHAnOiAiKQotCQkgKGVycm9yICJUaGlzIHZlcnNpb24gb2YgRW1hY3MgY2FuJ3QgZmluZCB0YWdzIGJ5IHJlZ2V4cHMuIikpKQotICAoZnVuY2FsbCAoaWYgb3RoZXItd2luZG93Ci0JICAgICAgICdlcmxhbmctZmluZC10YWctb3RoZXItd2luZG93Ci0JICAgICAnZXJsYW5nLWZpbmQtdGFnKQotCSAgIHJlZ2V4cCBuZXh0LXAgdCkpCi0KLQotOzsgSnVzdCBsaWtlIEMtdSBNLS4gIFRoaXMgY291bGQgYmUgYWRkZWQgdG8gdGhlIG1lbnUuCi0oZGVmdW4gZXJsYW5nLWZpbmQtbmV4dC10YWcgKCkKLSAgKGludGVyYWN0aXZlKQotICAobGV0ICgoY3VycmVudC1wcmVmaXgtYXJnICcoNCkpKQotICAgIChpZiBlcmxhbmctdGFncy1pbnN0YWxsZWQKLQkoY2FsbC1pbnRlcmFjdGl2ZWx5ICdlcmxhbmctZmluZC10YWcpCi0gICAgICAoY2FsbC1pbnRlcmFjdGl2ZWx5ICdmaW5kLXRhZykpKSkKLQotCi07OyBNaW1pY3MgYGZpbmQtdGFnLW5vc2VsZWN0JyBmb3VuZCBpbiBgZXRhZ3MuZWwnLCBidXQgdXNlcyBgZmluZC10YWcnIHRvCi07OyBiZSBjb21wYXRpYmxlIHdpdGggYHRhZ3MuZWwnLgotOzsKLTs7IEhhbmRsZXMgdGhyZWUgY2FzZXM6Ci07OyAqIGBtb2R1bGU6JyAgTG9vcCBvdmVyIGFsbCBwb3NzaWJsZSBmaWxlbi1hbWVzLiAgU3RvcCBpZiBhIGZpbGUtbmFtZQotOzsgICAgICAgICAgICAgIHdpdGhvdXQgZXh0ZW5zaW9uIGFuZCBkaXJlY3RvcnkgbWF0Y2hlcyB0aGUgbW9kdWxlLgotOzsKLTs7ICogYG1vZHVsZTp0YWcnCi07OwkJRW1hY3MgMTk6IFJlcGxhY2UgdGVzdGZ1bmN0aW9ucyB3aXRoIGZ1bmN0aW9ucyBhd2FyZSBvZgotOzsJICAgICAgICBFcmxhbmcgbW9kdWxlcy4gIFRyaWNreSBiZWNhdXNlIHRoZSBldGFncyBzeXN0ZW0gd2Fzbid0Ci07OwkJYnVpbHQgZm9yIHRoZXNlIGtpbmQgb2Ygb3BlcmF0aW9ucy4uLgotOzsKLTs7ICAgICAgICAgICAgICBFbWFjcyAxODogV2UgbG9vcCBvdmVyIGBmaW5kLXRhZycgdW50aWwgd2UgZmluZCBhIGZpbGUKLTs7ICAgICAgICAgICAgICB3aG9zZSBtb2R1bGUgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIG1vZHVsZS4gIFRoZQotOzsgICAgICAgICAgICAgIGRyYXdiYWNrIGlzIHRoYXQgYSBsb3Qgb2YgZmlsZXMgY291bGQgYmUgbG9hZGVkIGludG8KLTs7ICAgICAgICAgICAgICBFbWFjcy4KLTs7Ci07OyAqIGB0YWcnICAgICAgSnVzdCBnaXZlIGl0IHRvIGBmaW5kLXRhZycuCi0KLShkZWZ1biBlcmxhbmctZmluZC10YWctbm9zZWxlY3QgKG1vZHRhZ25hbWUgJm9wdGlvbmFsIG5leHQtcCByZWdleHAtcCkKLSAgIkxpa2UgYGZpbmQtdGFnLW5vc2VsZWN0JyBidXQgYXdhcmUgb2YgRXJsYW5nIG1vZHVsZXMuIgotICAoaW50ZXJhY3RpdmUgKGVybGFuZy10YWctaW50ZXJhY3RpdmUgIkZpbmQgYG1vZHVsZTp0YWcnIG9yIGB0YWcnOiAiKSkKLSAgKG9yIG1vZHRhZ25hbWUKLSAgICAgIChzZXRxIG1vZHRhZ25hbWUgKHN5bWJvbC12YWx1ZSAnbGFzdC10YWcpKSkKLSAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KSAnbGFzdC10YWcgbW9kdGFnbmFtZSkKLSAgOzsgYHRhZ3MuZWwnIHVzZXMgdGhpcyB2YXJpYWJsZSB0byByZWNvcmQgaG93IE0tLCB3b3VsZAotICA7OyBrbm93IHdoZXJlIHRvIHJlc3RhcnQgYSB0YWdzIGNvbW1hbmQuCi0gIChpZiAoYm91bmRwICd0YWdzLWxvb3AtZm9ybSkKLSAgICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkKLQkgICAgICAgJ3RhZ3MtbG9vcC1mb3JtICcoZXJsYW5nLWZpbmQtdGFnIG5pbCB0KSkpCi0gIChzYXZlLXdpbmRvdy1leGN1cnNpb24KLSAgICAoY29uZAotICAgICAoKHN0cmluZy1tYXRjaCAiOiQiIG1vZHRhZ25hbWUpCi0gICAgICA7OyBPbmx5IHRoZSBtb2R1bGUgbmFtZSB3YXMgZ2l2ZW4uICBSZWFkIGFsbCBmaWxlcyB3aG9zZSBmaWxlIG5hbWUKLSAgICAgIDs7IG1hdGNoLgotICAgICAgKGxldCAoKG1vZG5hbWUgKHN1YnN0cmluZyBtb2R0YWduYW1lIDAgKG1hdGNoLWJlZ2lubmluZyAwKSkpCi0JICAgIChmaWxlIG5pbCkpCi0JKGlmIChub3QgbmV4dC1wKQotCSAgICAoc2F2ZS1leGN1cnNpb24KLQkgICAgICAodmlzaXQtdGFncy10YWJsZS1idWZmZXIpCi0JICAgICAgKHNldHEgZXJsYW5nLXRhZ3MtZmlsZS1saXN0Ci0JCSAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICd0YWdzLXRhYmxlLWZpbGVzKSkpKSkKLQkod2hpbGUgKG51bGwgZmlsZSkKLQkgIChvciBlcmxhbmctdGFncy1maWxlLWxpc3QKLQkgICAgICAoc2F2ZS1leGN1cnNpb24KLQkJKGlmIChhbmQgKGZlYXR1cmVwICdldGFncykKLQkJCSAoZnVuY2FsbAotCQkJICAoc3ltYm9sLWZ1bmN0aW9uICd2aXNpdC10YWdzLXRhYmxlLWJ1ZmZlcikgJ3NhbWUpCi0JCQkgKGZ1bmNhbGwKLQkJCSAgKHN5bWJvbC1mdW5jdGlvbiAndmlzaXQtdGFncy10YWJsZS1idWZmZXIpIHQpKQotCQkgICAgKHNldHEgZXJsYW5nLXRhZ3MtZmlsZS1saXN0Ci0JCQkgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3RhZ3MtdGFibGUtZmlsZXMpKSkKLQkJICAoZXJyb3IgIk5vICVzdGFncyBjb250YWluaW5nICVzIiAoaWYgbmV4dC1wICJtb3JlICIgIiIpCi0JCQkgbW9kdGFnbmFtZSkpKSkKLQkgIChpZiBlcmxhbmctdGFncy1maWxlLWxpc3QKLQkgICAgICAobGV0ICgodGhpcy1tb2R1bGUgKGVybGFuZy1nZXQtbW9kdWxlLWZyb20tZmlsZS1uYW1lCi0JCQkJICAoY2FyIGVybGFuZy10YWdzLWZpbGUtbGlzdCkpKSkKLQkJKGlmIChhbmQgKHN0cmluZ3AgdGhpcy1tb2R1bGUpCi0JCQkgKHN0cmluZz0gbW9kbmFtZSB0aGlzLW1vZHVsZSkpCi0JCSAgICAoc2V0cSBmaWxlIChjYXIgZXJsYW5nLXRhZ3MtZmlsZS1saXN0KSkpCi0JCShzZXRxIGVybGFuZy10YWdzLWZpbGUtbGlzdCAoY2RyIGVybGFuZy10YWdzLWZpbGUtbGlzdCkpKSkpCi0JKHNldC1idWZmZXIgKG9yIChnZXQtZmlsZS1idWZmZXIgZmlsZSkKLQkJCShmaW5kLWZpbGUtbm9zZWxlY3QgZmlsZSkpKSkpCi0KLSAgICAgKChzdHJpbmctbWF0Y2ggIjoiIG1vZHRhZ25hbWUpCi0gICAgICAoaWYgKGJvdW5kcCAnZmluZC10YWctdGFnLW9yZGVyKQotCSAgOzsgTWV0aG9kIG9uZTogQWRkIG1vZHVsZS1yZWNvZ25pc2luZyBmdW5jdGlvbnMgdG8gdGhlCi0JICA7OyBsaXN0IG9mIG9yZGVyIGZ1bmN0aW9ucy4gIEhvd2V2ZXIsIHRoZSB0YWdzIHN5c3RlbQotCSAgOzsgZnJvbSBFbWFjcyAxOCwgYW5kIGRlcml2ZXMgdGhlcmVvZiAocmVhZDogWEVtYWNzKQotCSAgOzsgaGFzbid0IGdvdCB0aGlzIGZlYXR1cmUuCi0JICAocHJvZ24KLQkgICAgKGVybGFuZy10YWdzLWluc3RhbGwtbW9kdWxlLWNoZWNrKQotCSAgICAodW53aW5kLXByb3RlY3QKLQkJKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnZmluZC10YWcpCi0JCQkgbW9kdGFnbmFtZSBuZXh0LXAgcmVnZXhwLXApCi0JICAgICAgKGVybGFuZy10YWdzLXJlbW92ZS1tb2R1bGUtY2hlY2spKSkKLQk7OyBNZXRob2QgdHdvOiBDYWxsIHRoZSB0YWdzIHN5c3RlbSB1bnRpbCBhIGZpbGUgbWF0Y2hpbmcKLQk7OyB0aGUgbW9kdWxlIGlzIGZvdW5kLiAgVGhpcyBjb3VsZCByZXN1bHQgaW4gdGhhdCBtYW55Ci0JOzsgZmlsZXMgYXJlIHJlYWQuIChlLmcuIFRoZSB0YWcgImZvbzpmaWxlIiB3aWxsIHRha2UgYQotCTs7IHdoaWxlIHRvIHByb2Nlc3MuKQotCShsZXQqICgobW9kbmFtZSAoc3Vic3RyaW5nIG1vZHRhZ25hbWUgMCAobWF0Y2gtYmVnaW5uaW5nIDApKSkKLQkgICAgICAgKHRhZ25hbWUgKHN1YnN0cmluZyBtb2R0YWduYW1lIChtYXRjaC1lbmQgMCkgbmlsKSkKLQkgICAgICAgKGxhc3QtdGFnIHRhZ25hbWUpCi0JICAgICAgIGZpbGUpCi0JICAod2hpbGUKLQkgICAgICAocHJvZ24KLQkJKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnZmluZC10YWcpIHRhZ25hbWUgbmV4dC1wIHJlZ2V4cC1wKQotCQkoc2V0cSBuZXh0LXAgdCkKLQkJOzsgRGV0ZXJtaW5lIHRoZSBtb2R1bGUgZm9ybSB0aGUgZmlsZSBuYW1lLiAgKFRoZQotCQk7OyBhbHRlcm5hdGl2ZSwgdG8gY2hlY2sgYC1tb2R1bGUnLCB3b3VsZCBtYWtlIHRoaXMKLQkJOzsgY29kZSB1c2VsZXNzIGZvciBub24tRXJsYW5nIHByb2dyYW1zLikKLQkJKHNldHEgZmlsZSAoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUgYnVmZmVyLWZpbGUtbmFtZSkpCi0JCShub3QgKGFuZCAoc3RyaW5ncCBmaWxlKQotCQkJICAoc3RyaW5nPSBtb2RuYW1lIGZpbGUpKSkpKSkpKQotICAgICAodAotICAgICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnZmluZC10YWcpIG1vZHRhZ25hbWUgbmV4dC1wIHJlZ2V4cC1wKSkpCi0gICAgKGN1cnJlbnQtYnVmZmVyKSkpCQk7IFJldHVybiB0aGUgbmV3IGJ1ZmZlci4KLQotCi07OyBQcm9jZXNzIGludGVyYWN0aXZlIGFyZ3VtZW50cyBmb3IgZXJsYW5nLWZpbmQtdGFnLSouCi07OwotOzsgTmVnYXRpdmUgYXJndW1lbnRzIHdvcmsgb25seSBmb3IgYGV0YWdzJywgbm90IGB0YWdzJy4gIFRoaXMgaXMgbm90Ci07OyBhIHByb2JsZW0gc2luY2UgbmVnYXRpdmUgYXJndW1lbnRzIG1lYW5zIHN0ZXAgYmFjayBpbnRvIHRoZQotOzsgaGlzdG9yeSBsaXN0LCBhIGZlYXR1cmUgbm90IGltcGxlbWVudGVkIGluIGB0YWdzJy4KLQotKGRlZnVuIGVybGFuZy10YWctaW50ZXJhY3RpdmUgKHByb21wdCkKLSAgKGNvbmRpdGlvbi1jYXNlIG5pbAotICAgICAgKHJlcXVpcmUgJ2V0YWdzKQotICAgIChlcnJvcgotICAgICAocmVxdWlyZSAndGFncykpKQotICAoaWYgY3VycmVudC1wcmVmaXgtYXJnCi0gICAgICAobGlzdCBuaWwgKGlmICg8IChwcmVmaXgtbnVtZXJpYy12YWx1ZSBjdXJyZW50LXByZWZpeC1hcmcpIDApCi0JCSAgICAnLQotCQkgIHQpKQotICAgIChsZXQqICgoZGVmYXVsdCAoZXJsYW5nLWZpbmQtdGFnLWRlZmF1bHQpKQotCSAgIChwcm9tcHQgKGlmIGRlZmF1bHQKLQkJICAgICAgIChmb3JtYXQgIiVzKGRlZmF1bHQgJXMpICIgcHJvbXB0IGRlZmF1bHQpCi0JCSAgICAgcHJvbXB0KSkKLQkgICAoc3BlYyAoaWYgKGZlYXR1cmVwICdldGFncykKLQkJICAgICAoY29tcGxldGluZy1yZWFkIHByb21wdCAnZXJsYW5nLXRhZ3MtY29tcGxldGUtdGFnKQotCQkgICAocmVhZC1zdHJpbmcgcHJvbXB0KSkpKQotICAgICAgKGxpc3QgKGlmIChlcXVhbCBzcGVjICIiKQotCQkob3IgZGVmYXVsdCAoZXJyb3IgIlRoZXJlIGlzIG5vIGRlZmF1bHQgdGFnIikpCi0JICAgICAgc3BlYykpKSkpCi0KLQwKLTs7IFNlYXJjaCB0YWcgZnVuY3Rpb25zIHdoaWNoIGFyZSBhd2FyZSBvZiBFcmxhbmcgbW9kdWxlcy4gIFRoZSB0YWN0aWMKLTs7IGlzIHRvIHN0b3JlIG5ldyBzZWFyY2ggZnVuY3Rpb25zIGludG8gdGhlIGxvY2FsIHZhcmlhYmVscyBvZiB0aGUKLTs7IFRBR1MgYnVmZmVycy4gIFRoZSB2YXJpYWJsZXMgYXJlIHJlc3RvcmVkIGRpcmVjdGx5IGFmdGVyIHRoZQotOzsgc2VhcmNoLiAgVGhlIHNpdHVhdGlvbiBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IG5ldyBUQUdTCi07OyBmaWxlcyBjYW4gYmUgbG9hZGVkIGR1cmluZyB0aGUgc2VhcmNoLgotOzsKLTs7IFRoaXMgY29kZSBpcyBFbWFjcyAxOSBgZXRhZ3MnIHNwZWNpZmljLgotCi0oZGVmdW4gZXJsYW5nLXRhZ3MtaW5zdGFsbC1tb2R1bGUtY2hlY2sgKCkKLSAgIkluc3RhbGwgb3VyIG93biB0YWcgc2VhcmNoIGZ1bmN0aW9ucy4iCi0gIDs7IE1ha2Ugc3VyZSBvdXIgZnVuY3Rpb25zIGFyZSBpbnN0YWxsZWQgaW4gVEFHUyBmaWxlcyBsb2FkZWQKLSAgOzsgaW50byBFbWFjcyB3aGlsZSBzZWFyY2hpbmcuCi0gIChzZXRxIGVybGFuZy10YWdzLW9yaWctZm9ybWF0LWhvb2tzCi0JKHN5bWJvbC12YWx1ZSAndGFncy10YWJsZS1mb3JtYXQtaG9va3MpKQotICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpICd0YWdzLXRhYmxlLWZvcm1hdC1ob29rcwotCSAgIChjb25zICdlcmxhbmctdGFncy1yZWNvZ25pemUtdGFncy10YWJsZQotCQkgZXJsYW5nLXRhZ3Mtb3JpZy1mb3JtYXQtaG9va3MpKQotICAoc2V0cSBlcmxhbmctdGFncy1idWZmZXItbGlzdCAnKCkpCi0gIDs7IEluc3RhbGwgb3VyIGZ1bmN0aW9ucyBpbiB0aGUgVEFHUyBmaWxlcyBhbHJlYWR5IHJlc2lkZW50LgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAobGV0ICgoZmlsZXMgKHN5bWJvbC12YWx1ZSAndGFncy10YWJsZS1jb21wdXRlZC1saXN0KSkpCi0gICAgICAod2hpbGUgZmlsZXMKLQkoaWYgKHN0cmluZ3AgKGNhciBmaWxlcykpCi0JICAgIChpZiAoZ2V0LWZpbGUtYnVmZmVyIChjYXIgZmlsZXMpKQotCQkocHJvZ24KLQkJICAoc2V0LWJ1ZmZlciAoZ2V0LWZpbGUtYnVmZmVyIChjYXIgZmlsZXMpKSkKLQkJICAoZXJsYW5nLXRhZ3MtaW5zdGFsbC1sb2NhbCkpKSkKLQkoc2V0cSBmaWxlcyAoY2RyIGZpbGVzKSkpKSkpCi0KLQotKGRlZnVuIGVybGFuZy10YWdzLWluc3RhbGwtbG9jYWwgKCkKLSAgIkluc3RhbGwgb3VyIHRhZyBzZWFyY2ggZnVuY3Rpb25zIGluIGN1cnJlbnQgYnVmZmVyLiIKLSAgKGlmIGVybGFuZy10YWdzLWJ1ZmZlci1pbnN0YWxsZWQtcAotICAgICAgKCkKLSAgICA7OyBNYXJrIHRoaXMgYnVmZmVyIGFzICJpbnN0YWxsZWQiIGFuZCByZWNvcmQuCi0gICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZXJsYW5nLXRhZ3MtYnVmZmVyLWluc3RhbGxlZC1wKSB0KQotICAgIChzZXRxIGVybGFuZy10YWdzLWJ1ZmZlci1saXN0Ci0JICAoY29ucyAoY3VycmVudC1idWZmZXIpIGVybGFuZy10YWdzLWJ1ZmZlci1saXN0KSkKLQotICAgIDs7IFNhdmUgdGhlIG9yaWdpbmFsIHZhbHVlcy4KLSAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdlcmxhbmctdGFncy1vcmlnLXRhZy1vcmRlcikKLQkgKHN5bWJvbC12YWx1ZSAnZmluZC10YWctdGFnLW9yZGVyKSkKLSAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdlcmxhbmctdGFncy1vcmlnLXJlZ2V4cC10YWctb3JkZXIpCi0JIChzeW1ib2wtdmFsdWUgJ2ZpbmQtdGFnLXJlZ2V4cC10YWctb3JkZXIpKQotICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2VybGFuZy10YWdzLW9yaWctc2VhcmNoLWZ1bmN0aW9uKQotCSAoc3ltYm9sLXZhbHVlICdmaW5kLXRhZy1zZWFyY2gtZnVuY3Rpb24pKQotICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2VybGFuZy10YWdzLW9yaWctcmVnZXhwLXNlYXJjaC1mdW5jdGlvbikKLQkgKHN5bWJvbC12YWx1ZSAnZmluZC10YWctcmVnZXhwLXNlYXJjaC1mdW5jdGlvbikpCi0KLSAgICA7OyBJbnN0YWxsIG91ciBvd24gZnVuY3Rpb25zLgotICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ZpbmQtdGFnLXNlYXJjaC1mdW5jdGlvbikKLQkgJ2VybGFuZy10YWdzLXNlYXJjaC1mb3J3YXJkKQotICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ZpbmQtdGFnLXJlZ2V4cC1zZWFyY2gtZnVuY3Rpb24pCi0JICdlcmxhbmctdGFncy1yZWdleHAtc2VhcmNoLWZvcndhcmQpCi0gICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZmluZC10YWctdGFnLW9yZGVyKQotCSAnKGVybGFuZy10YWctbWF0Y2gtbW9kdWxlLXApKQotICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ZpbmQtdGFnLXJlZ2V4cC10YWctb3JkZXIpCi0JICcoZXJsYW5nLXRhZy1tYXRjaC1tb2R1bGUtcmVnZXhwLXApKSkpCi0KLQotKGRlZnVuIGVybGFuZy10YWdzLXJlbW92ZS1tb2R1bGUtY2hlY2sgKCkKLSAgIlJlbW92ZSBvdXIgb3duIHRhZ3Mgc2VhcmNoIGZ1bmN0aW9ucy4iCi0gIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkKLQkgICAndGFncy10YWJsZS1mb3JtYXQtaG9va3MKLQkgICBlcmxhbmctdGFncy1vcmlnLWZvcm1hdC1ob29rcykKLSAgOzsgUmVtb3ZlIG91ciBmdW5jdGlvbnMgZnJvbSB0aGUgVEFHUyBmaWxlcy4gIChOb3RlIHRoYXQKLSAgOzsgYHRhZ3MtdGFibGUtY29tcHV0ZWQtbGlzdCcgbmVlZCBub3QgYmUgdGhlIHNhbWUgbGlzdCBhcyB3aGVuCi0gIDs7IHRoZSBzZWFyY2ggd2FzIHN0YXJ0ZWQuKQotICAoc2F2ZS1leGN1cnNpb24KLSAgICAobGV0ICgoYnVmZmVycyBlcmxhbmctdGFncy1idWZmZXItbGlzdCkpCi0gICAgICAod2hpbGUgYnVmZmVycwotCShpZiAoYnVmZmVyLW5hbWUgKGNhciBidWZmZXJzKSkKLQkgICAgKHByb2duCi0JICAgICAgKHNldC1idWZmZXIgKGNhciBidWZmZXJzKSkKLQkgICAgICAoZXJsYW5nLXRhZ3MtcmVtb3ZlLWxvY2FsKSkpCi0JKHNldHEgYnVmZmVycyAoY2RyIGJ1ZmZlcnMpKSkpKSkKLQotCi0oZGVmdW4gZXJsYW5nLXRhZ3MtcmVtb3ZlLWxvY2FsICgpCi0gICJSZW1vdmUgb3VyIHRhZyBzZWFyY2ggZnVuY3Rpb25zIGZyb20gY3VycmVudCBidWZmZXIuIgotICAoaWYgKG51bGwgZXJsYW5nLXRhZ3MtYnVmZmVyLWluc3RhbGxlZC1wKQotICAgICAgKCkKLSAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpICdlcmxhbmctdGFncy1idWZmZXItaW5zdGFsbGVkLXAgbmlsKQotICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkKLQkgICAgICdmaW5kLXRhZy10YWctb3JkZXIgZXJsYW5nLXRhZ3Mtb3JpZy10YWctb3JkZXIpCi0gICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KQotCSAgICAgJ2ZpbmQtdGFnLXJlZ2V4cC10YWctb3JkZXIgZXJsYW5nLXRhZ3Mtb3JpZy1yZWdleHAtdGFnLW9yZGVyKQotICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkKLQkgICAgICdmaW5kLXRhZy1zZWFyY2gtZnVuY3Rpb24gZXJsYW5nLXRhZ3Mtb3JpZy1zZWFyY2gtZnVuY3Rpb24pCi0gICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KQotCSAgICAgJ2ZpbmQtdGFnLXJlZ2V4cC1zZWFyY2gtZnVuY3Rpb24KLQkgICAgIGVybGFuZy10YWdzLW9yaWctcmVnZXhwLXNlYXJjaC1mdW5jdGlvbikpKQotCi0KLShkZWZ1biBlcmxhbmctdGFncy1yZWNvZ25pemUtdGFncy10YWJsZSAoKQotICAiSW5zdGFsbCBvdXIgZnVuY3Rpb25zIGluIGFsbCBsb2FkZWQgVEFHUyBmaWxlcy4KLQotVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBgdGFncy10YWJsZS1mb3JtYXQtaG9va3MnIHdoZW4gc2VhcmNoaW5nCi1mb3IgYSB0YWcgb24gdGhlIGZvcm0gYG1vZHVsZTp0YWcnLiIKLSAgKGlmIChudWxsIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2V0YWdzLXJlY29nbml6ZS10YWdzLXRhYmxlKSkpCi0gICAgICBuaWwKLSAgICAoZXJsYW5nLXRhZ3MtaW5zdGFsbC1sb2NhbCkKLSAgICB0KSkKLQotCi0oZGVmdW4gZXJsYW5nLXRhZ3Mtc2VhcmNoLWZvcndhcmQgKHRhZyAmb3B0aW9uYWwgYm91bmQgbm9lcnJvciBjb3VudCkKLSAgIkZvcndhcmQgc2VhcmNoIGZ1bmN0aW9uLCBhd2FyZSBvZiBFcmxhbmcgbW9kdWxlIHByZWZpeC4iCi0gIChpZiAoc3RyaW5nLW1hdGNoICI6IiB0YWcpCi0gICAgICAoc2V0cSB0YWcgKHN1YnN0cmluZyB0YWcgKG1hdGNoLWVuZCAwKSBuaWwpKSkKLSAgOzsgQXZvaWQgdW5pbnRlZGVkIHJlY3Vyc2lvbi4KLSAgKGlmIChlcSBlcmxhbmctdGFncy1vcmlnLXNlYXJjaC1mdW5jdGlvbiAnZXJsYW5nLXRhZ3Mtc2VhcmNoLWZvcndhcmQpCi0gICAgICAoc2VhcmNoLWZvcndhcmQgdGFnIGJvdW5kIG5vZXJyb3IgY291bnQpCi0gICAgKGZ1bmNhbGwgZXJsYW5nLXRhZ3Mtb3JpZy1zZWFyY2gtZnVuY3Rpb24gdGFnIGJvdW5kIG5vZXJyb3IgY291bnQpKSkKLQotCi0oZGVmdW4gZXJsYW5nLXRhZ3MtcmVnZXhwLXNlYXJjaC1mb3J3YXJkICh0YWcgJm9wdGlvbmFsIGJvdW5kIG5vZXJyb3IgY291bnQpCi0gICJGb3J3YXJkIHJlZ2V4cCBzZWFyY2ggZnVuY3Rpb24sIGF3YXJlIG9mIEVybGFuZyBtb2R1bGUgcHJlZml4LiIKLSAgKGlmIChzdHJpbmctbWF0Y2ggIjoiIHRhZykKLSAgICAgIChzZXRxIHRhZyAoc3Vic3RyaW5nIHRhZyAobWF0Y2gtZW5kIDApIG5pbCkpKQotICAoaWYgKGVxIGVybGFuZy10YWdzLW9yaWctcmVnZXhwLXNlYXJjaC1mdW5jdGlvbgotCSAgJ2VybGFuZy10YWdzLXJlZ2V4cC1zZWFyY2gtZm9yd2FyZCkKLSAgICAgIChyZS1zZWFyY2gtZm9yd2FyZCB0YWcgYm91bmQgbm9lcnJvciBjb3VudCkKLSAgICAoZnVuY2FsbCBlcmxhbmctdGFncy1vcmlnLXJlZ2V4cC1zZWFyY2gtZnVuY3Rpb24KLQkgICAgIHRhZyBib3VuZCBub2Vycm9yIGNvdW50KSkpCi0KLQotOzsgdCBpZiBwb2ludCBpcyBhdCBhIHRhZyBsaW5lIHRoYXQgbWF0Y2hlcyBUQUcsIGNvbnRhaW5pbmcKLTs7IG1vZHVsZSBpbmZvcm1hdGlvbi4gIEFzc3VtZXMgdGhhdCBhbGwgb3RoZXIgb3JkZXIgZnVuY3Rpb25zCi07OyBhcmUgc3RvcmVkIGluIGBlcmxhbmctdGFncy1vcmlnLVtyZWdleF0tdGFnLW9yZGVyJy4KLQotKGRlZnVuIGVybGFuZy10YWctbWF0Y2gtbW9kdWxlLXAgKHRhZykKLSAgKGVybGFuZy10YWctbWF0Y2gtbW9kdWxlLWNvbW1vbi1wIHRhZyBlcmxhbmctdGFncy1vcmlnLXRhZy1vcmRlcikpCi0KLShkZWZ1biBlcmxhbmctdGFnLW1hdGNoLW1vZHVsZS1yZWdleHAtcCAodGFnKQotICAoZXJsYW5nLXRhZy1tYXRjaC1tb2R1bGUtY29tbW9uLXAgdGFnIGVybGFuZy10YWdzLW9yaWctcmVnZXhwLXRhZy1vcmRlcikpCi0KLShkZWZ1biBlcmxhbmctdGFnLW1hdGNoLW1vZHVsZS1jb21tb24tcCAodGFnIG9yZGVyKQotICAobGV0ICgobW9kIG5pbCkKLQkoZm91bmQgbmlsKSkKLSAgKGlmIChzdHJpbmctbWF0Y2ggIjoiIHRhZykKLSAgICAgIChwcm9nbgotCShzZXRxIG1vZCAoc3Vic3RyaW5nIHRhZyAwIChtYXRjaC1iZWdpbm5pbmcgMCkpKQotCShzZXRxIHRhZyAoc3Vic3RyaW5nIHRhZyAobWF0Y2gtZW5kIDApIG5pbCkpKSkKLSAgKHdoaWxlIChhbmQgb3JkZXIgKG5vdCBmb3VuZCkpCi0gICAgKHNldHEgZm91bmQKLQkgIChhbmQgKG5vdCAobWVtcSAoY2FyIG9yZGVyKQotCQkJICAnKGVybGFuZy10YWctbWF0Y2gtbW9kdWxlLXAKLQkJCSAgICBlcmxhbmctdGFnLW1hdGNoLW1vZHVsZS1yZWdleHAtcCkpKQotCSAgICAgICAoZnVuY2FsbCAoY2FyIG9yZGVyKSB0YWcpKSkKLSAgICAoc2V0cSBvcmRlciAoY2RyIG9yZGVyKSkpCi0gIChhbmQgZm91bmQKLSAgICAgICAob3IgKG51bGwgbW9kKQotCSAgIChzdHJpbmc9IG1vZCAoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUKLQkJCSAoZmlsZS1vZi10YWcpKSkpKSkpCi0KLQwKLTs7OyBUYWdzIGNvbXBsZXRpb24sIEVtYWNzIDE5IGBldGFncycgc3BlY2lmaWMuCi07OzsKLTs7OyBUaGUgYmFzaWMgaWRlYSBpcyB0byBjcmVhdGUgYSBzZWNvbmQgY29tcGxldGlvbiB0YWJsZSBgZXJsYW5nLXRhZ3MtCi07OzsgY29tcGxldGlvbi10YWJsZScgY29udGFpbmluZyBhbGwgbm9ybWFsIHRhZ3MgcGx1cyB0YWdzIG9uIHRoZSBmb3JtCi07OzsgYG1vZHVsZTp0YWcnLgotCi0KLShkZWZ1biBlcmxhbmctY29tcGxldGUtdGFnICgpCi0gICJQZXJmb3JtIHRhZ3MgY29tcGxldGlvbiBvbiB0aGUgdGV4dCBhcm91bmQgcG9pbnQuCi1Db21wbGV0ZXMgdG8gdGhlIHNldCBvZiBuYW1lcyBsaXN0ZWQgaW4gdGhlIGN1cnJlbnQgdGFncyB0YWJsZS4KLQotU2hvdWxkIHRoZSBFcmxhbmcgdGFncyBzeXN0ZW0gYmUgaW5zdGFsbGVkIHRoaXMgY29tbWFuZCBrbm93cwotYWJvdXQgRXJsYW5nIG1vZHVsZXMuIgotICAoaW50ZXJhY3RpdmUpCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChyZXF1aXJlICdldGFncykKLSAgICAoZXJyb3IgbmlsKSkKLSAgKGNvbmQgKChhbmQgZXJsYW5nLXRhZ3MtaW5zdGFsbGVkCi0JICAgICAgKGZib3VuZHAgJ2NvbXBsZXRlLXRhZykpCTsgRW1hY3MgMTkKLQkgKGxldCAoKG9yaWctdGFncy1jb21wbGV0ZS10YWcgKHN5bWJvbC1mdW5jdGlvbiAndGFncy1jb21wbGV0ZS10YWcpKSkKLQkgICAoZnNldCAndGFncy1jb21wbGV0ZS10YWcKLQkJIChzeW1ib2wtZnVuY3Rpb24gJ2VybGFuZy10YWdzLWNvbXBsZXRlLXRhZykpCi0JICAgKHVud2luZC1wcm90ZWN0Ci0JICAgICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2NvbXBsZXRlLXRhZykpCi0JICAgICAoZnNldCAndGFncy1jb21wbGV0ZS10YWcgb3JpZy10YWdzLWNvbXBsZXRlLXRhZykpKSkKLQkoKGZib3VuZHAgJ2NvbXBsZXRlLXRhZykJOyBFbWFjcyAxOQotCSAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdjb21wbGV0ZS10YWcpKSkKLQkoKGZib3VuZHAgJ3RhZy1jb21wbGV0ZS1zeW1ib2wpCTsgWEVtYWNzCi0JIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3RhZy1jb21wbGV0ZS1zeW1ib2wpKSkKLQkodAotCSAoZXJyb3IgIlRoaXMgdmVyc2lvbiBvZiBFbWFjcyBjYW4ndCBjb21wbGV0ZSB0YWdzLiIpKSkpCi0KLQotOzsgQmFzZWQgb24gYHRhZ3MtY29tcGxldGUtdGFnJywgYnV0IHRoaXMgb25lIHVzZXMKLTs7IGBlcmxhbmctdGFnLWNvbXBsZXRpb24tdGFibGUnIGluc3RlYWQgb2YgYHRhZy1jb21wbGV0aW9uLXRhYmxlJy4KLTs7Ci07OyBUaGlzIGlzIHRoZSBlbnRyeS1wb2ludCBjYWxsZWQgYnkgc3lzdGVtIGZ1bmN0aW9uIGBjb21wbGV0aW5nLXJlYWQnLgotKGRlZnVuIGVybGFuZy10YWdzLWNvbXBsZXRlLXRhZyAoc3RyaW5nIHByZWRpY2F0ZSB3aGF0KQotICAoc2F2ZS1leGN1cnNpb24KLSAgICA7OyBJZiB3ZSBuZWVkIHRvIGFzayBmb3IgdGhlIHRhZyB0YWJsZSwgYWxsb3cgdGhhdC4KLSAgICAobGV0ICgoZW5hYmxlLXJlY3Vyc2l2ZS1taW5pYnVmZmVycyB0KSkKLSAgICAgICh2aXNpdC10YWdzLXRhYmxlLWJ1ZmZlcikpCi0gICAgKGlmIChlcSB3aGF0IHQpCi0JKGFsbC1jb21wbGV0aW9ucyBzdHJpbmcgKGVybGFuZy10YWdzLWNvbXBsZXRpb24tdGFibGUpIHByZWRpY2F0ZSkKLSAgICAgICh0cnktY29tcGxldGlvbiBzdHJpbmcgKGVybGFuZy10YWdzLWNvbXBsZXRpb24tdGFibGUpIHByZWRpY2F0ZSkpKSkKLQotCi07OyBgdGFncy1jb21wbGV0aW9uLXRhYmxlJyBjYWxscyBpdHNlbGYgcmVjdXJzaXZlbHksIG1ha2UgaXQKLTs7IGNhbGwgb3VyIG93biB3ZWRnZSBpbnN0ZWFkLiAgTm90ZSB0aGF0IHRoZSByZWN1cnNpdmUgY2FsbAotOzsgaXMgdmVyeSByYXJlOyAgaXQgb25seSBvY2N1cnMgd2hlbiBhIHRhZ3MtZmlsZSBjb250YWlucwotOzsgYGluY2x1ZGUnLXN0YXRlbWVudHMuCi0oZGVmdW4gZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZSAoKQotICAiQnVpbGQgY29tcGxldGlvbiB0YWJsZS4gIFRhZ3Mgb24gdGhlIGZvcm0gYHRhZycgb3IgYG1vZHVsZTp0YWcnLiIKLSAgKHNldHEgZXJsYW5nLXRhZ3Mtb3JpZy1jb21wbGV0aW9uLXRhYmxlCi0JKHN5bWJvbC1mdW5jdGlvbiAndGFncy1jb21wbGV0aW9uLXRhYmxlKSkKLSAgKGZzZXQgJ3RhZ3MtY29tcGxldGlvbi10YWJsZQotCShzeW1ib2wtZnVuY3Rpb24gJ2VybGFuZy10YWdzLWNvbXBsZXRpb24tdGFibGUtMSkpCi0gICh1bndpbmQtcHJvdGVjdAotICAgICAgKGVybGFuZy10YWdzLWNvbXBsZXRpb24tdGFibGUtMSkKLSAgICAoZnNldCAndGFncy1jb21wbGV0aW9uLXRhYmxlCi0JICBlcmxhbmctdGFncy1vcmlnLWNvbXBsZXRpb24tdGFibGUpKSkKLQotCi0oZGVmdW4gZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZS0xICgpCi0gIChtYWtlLWxvY2FsLXZhcmlhYmxlICdlcmxhbmctdGFncy1jb21wbGV0aW9uLXRhYmxlKQotICAob3IgZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZQotICAgICAgKGxldCAoKHRhZ3MtY29tcGxldGlvbi10YWJsZSBuaWwpCi0JICAgICh0YWdzLWNvbXBsZXRpb24tdGFibGUtZnVuY3Rpb24KLQkgICAgICdlcmxhbmctZXRhZ3MtdGFncy1jb21wbGV0aW9uLXRhYmxlKSkKLQkoZnVuY2FsbCBlcmxhbmctdGFncy1vcmlnLWNvbXBsZXRpb24tdGFibGUpCi0JKHNldHEgZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZSB0YWdzLWNvbXBsZXRpb24tdGFibGUpKSkpCi0KLQotOzsgQmFzZWQgb24gYGV0YWdzLXRhZ3MtY29tcGxldGlvbi10YWJsZScuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHdlCi07OyBhZGRzIHRocmVlIHN5bWJvbHMgdG8gdGhlIHZlY3RvciwgdGhlIHRhZywgbW9kdWxlOiBhbmQgbW9kdWxlOnRhZy4KLTs7IFRoZSBtb2R1bGUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGZpbGUgbmFtZSBvZiBhIHRhZy4gIChUaGlzIG9uZQotOzsgb25seSB3b3JrcyBpZiB3ZSBhcmUgbG9va2luZyBhdCBhbiBgZXRhZ3MnIGZpbGUuIEhvd2V2ZXIsIHRoaXMgaXMKLTs7IHRoZSBvbmx5IGZvcm1hdCBzdXBwb3J0ZWQgYnkgRW1hY3MsIHNvIGZhci4pCi0oZGVmdW4gZXJsYW5nLWV0YWdzLXRhZ3MtY29tcGxldGlvbi10YWJsZSAoKQotICAobGV0ICgodGFibGUgKG1ha2UtdmVjdG9yIDUxMSAwKSkKLQkoZmlsZSBuaWwpKQotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLSAgICAgIDs7IFRoaXMgbW9uc3RlciByZWdleHAgbWF0Y2hlcyBhbiBldGFncyB0YWcgbGluZS4KLSAgICAgIDs7ICAgXDEgaXMgdGhlIHN0cmluZyB0byBtYXRjaDsKLSAgICAgIDs7ICAgXDIgaXMgbm90IGludGVyZXN0aW5nOwotICAgICAgOzsgICBcMyBpcyB0aGUgZ3Vlc3NlZCB0YWcgbmFtZTsgWFhYIGd1ZXNzIHNob3VsZCBiZSBiZXR0ZXIgZWcgREVGVU4KLSAgICAgIDs7ICAgXDQgaXMgbm90IGludGVyZXN0aW5nOwotICAgICAgOzsgICBcNSBpcyB0aGUgZXhwbGljaXRseS1zcGVjaWZpZWQgdGFnIG5hbWUuCi0gICAgICA7OyAgIFw2IGlzIHRoZSBsaW5lIHRvIHN0YXJ0IHNlYXJjaGluZyBhdDsKLSAgICAgIDs7ICAgXDcgaXMgdGhlIGNoYXIgdG8gc3RhcnQgc2VhcmNoaW5nIGF0LgotICAgICAgKHdoaWxlIChwcm9nbgotCSAgICAgICAod2hpbGUgKGFuZAotCQkgICAgICAgKGVxIChmb2xsb3dpbmctY2hhcikgP1xmKQotCQkgICAgICAgKGxvb2tpbmctYXQgIlxmXG5cXChbXixcbl0qXFwpLC4qXG4iKSkKLQkJIChzZXRxIGZpbGUgKGJ1ZmZlci1zdWJzdHJpbmcKLQkJCSAgICAgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKSkKLQkJIChnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkpCi0JICAgICAgIChyZS1zZWFyY2gtZm9yd2FyZAotCQkiXAotXlxcKFxcKFteXDE3N10rW14tYS16QS1aMC05XyRcMTc3XStcXCk/XFwoWy1hLXpBLVowLTlfJD86XStcXClcCi1cW14tYS16QS1aMC05XyQ/OlwxNzddKlxcKVwxNzdcXChcXChbXlxuXDAwMV0rXFwpXDAwMVxcKT9cCi1cXChbMC05XStcXCk/LFxcKFswLTldK1xcKT9cbiIKLQkJbmlsIHQpKQotCShsZXQgKCh0YWcgKGlmIChtYXRjaC1iZWdpbm5pbmcgNSkKLQkJICAgICAgIDs7IFRoZXJlIGlzIGFuIGV4cGxpY2l0IHRhZyBuYW1lLgotCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyA1KSAobWF0Y2gtZW5kIDUpKQotCQkgICAgIDs7IE5vIGV4cGxpY2l0IHRhZyBuYW1lLiAgQmVzdCBndWVzcy4KLQkJICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDMpIChtYXRjaC1lbmQgMykpKSkKLQkgICAgICAobW9kdWxlIChhbmQgZmlsZQotCQkJICAgKGVybGFuZy1nZXQtbW9kdWxlLWZyb20tZmlsZS1uYW1lIGZpbGUpKSkpCi0JICAoaW50ZXJuIHRhZyB0YWJsZSkKLQkgIChpZiAoc3RyaW5ncCBtb2R1bGUpCi0JICAgICAgKHByb2duCi0JCShpbnRlcm4gKGNvbmNhdCBtb2R1bGUgIjoiIHRhZykgdGFibGUpCi0JCTs7IE9ubHkgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgdGFibGUuCi0JCShpbnRlcm4gKGNvbmNhdCBtb2R1bGUgIjoiKSB0YWJsZSkpKSkpKQotICAgIHRhYmxlKSkKLQwKLTs7OwotOzs7IFByZXBhcmUgZm9yIG90aGVyIG1ldGhvZHMgdG8gcnVuIGFuIEVybGFuZyBzbGF2ZSBwcm9jZXNzLgotOzs7Ci0KLShkZWZ2YXIgZXJsYW5nLXNoZWxsLWZ1bmN0aW9uICdpbmZlcmlvci1lcmxhbmcKLSAgIkNvbW1hbmQgdG8gZXhlY3V0ZSBzdGFydCBhIG5ldyBFcmxhbmcgc2hlbGwuCi0KLUNoYW5nZSB0aGlzIHZhcmlhYmxlIHRvIHVzZSB5b3VyIGZhdm9yaXRlCi1FcmxhbmcgY29tcGlsYXRpb24gcGFja2FnZS4iKQotCi0oZGVmdmFyIGVybGFuZy1zaGVsbC1kaXNwbGF5LWZ1bmN0aW9uICdpbmZlcmlvci1lcmxhbmctcnVuLW9yLXNlbGVjdAotICAiQ29tbWFuZCB0byBleGVjdXRlIHRvIGRpc3BsYXkgRXJsYW5nIHNoZWxsLgotCi1DaGFuZ2UgdGhpcyB2YXJpYWJsZSB0byB1c2UgeW91ciBmYXZvcml0ZQotRXJsYW5nIGNvbXBpbGF0aW9uIHBhY2thZ2UuIikKLQotKGRlZnZhciBlcmxhbmctY29tcGlsZS1mdW5jdGlvbiAnaW5mZXJpb3ItZXJsYW5nLWNvbXBpbGUKLSAgIkNvbW1hbmQgdG8gZXhlY3V0ZSB0byBjb21waWxlIGN1cnJlbnQgYnVmZmVyLgotCi1DaGFuZ2UgdGhpcyB2YXJpYWJsZSB0byB1c2UgeW91ciBmYXZvcml0ZQotRXJsYW5nIGNvbXBpbGF0aW9uIHBhY2thZ2UuIikKLQotKGRlZnZhciBlcmxhbmctY29tcGlsZS1kaXNwbGF5LWZ1bmN0aW9uICdpbmZlcmlvci1lcmxhbmctcnVuLW9yLXNlbGVjdAotICAiQ29tbWFuZCB0byBleGVjdXRlIHRvIHZpZXcgbGFzdCBjb21waWxhdGlvbi4KLQotQ2hhbmdlIHRoaXMgdmFyaWFibGUgdG8gdXNlIHlvdXIgZmF2b3JpdGUKLUVybGFuZyBjb21waWxhdGlvbiBwYWNrYWdlLiIpCi0KLShkZWZ2YXIgZXJsYW5nLW5leHQtZXJyb3ItZnVuY3Rpb24gJ2luZmVyaW9yLWVybGFuZy1uZXh0LWVycm9yCi0gICJDb21tYW5kIHRvIGV4ZWN1dGUgdG8gZ28gdG8gdGhlIG5leHQgZXJyb3IuCi0KLUNoYW5nZSB0aGlzIHZhcmlhYmxlIHRvIHVzZSB5b3VyIGZhdm9yaXRlCi1FcmxhbmcgY29tcGlsYXRpb24gcGFja2FnZS4iKQotCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gZXJsYW5nLXNoZWxsICgpCi0gICJTdGFydCBhIG5ldyBFcmxhbmcgc2hlbGwuCi0KLVRoZSB2YXJpYWJsZSBgZXJsYW5nLXNoZWxsLWZ1bmN0aW9uJyBkZWNpZGVzIHdoaWNoIG1ldGhvZCB0byB1c2UsCi1kZWZhdWx0IGlzIHRvIHN0YXJ0IGEgbmV3IEVybGFuZyBob3N0LiAgSXQgaXMgcG9zc2libGUgdGhhdCwgaW4gdGhlCi1mdXR1cmUsIGEgbmV3IHNoZWxsIG9uIGFuIGFscmVhZHkgcnVubmluZyBob3N0IHdpbGwgYmUgc3RhcnRlZC4iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKGNhbGwtaW50ZXJhY3RpdmVseSBlcmxhbmctc2hlbGwtZnVuY3Rpb24pKQotCi0KLTs7OyMjI2F1dG9sb2FkIChhdXRvbG9hZCAncnVuLWVybGFuZyAiZXJsYW5nIiAiU3RhcnQgYSBuZXcgRXJsYW5nIHNoZWxsLiIgdCkKLQotOzsgSXQgaXMgY3VzdG9tYXJ5IGZvciBFbWFjcyBwYWNrYWdlcyB0byBzdXBwbHkgYSBmdW5jdGlvbiBvbiB0aGlzCi07OyBmb3JtLCBldmVuIHRob3VnaCBpdCB2aW9sYXRlcyB0aGUgYGVybGFuZy0qJyBuYW1lIGNvbnZlbnRpb24uCi0oZnNldCAncnVuLWVybGFuZyAnZXJsYW5nLXNoZWxsKQotCi0KLShkZWZ1biBlcmxhbmctc2hlbGwtZGlzcGxheSAoKQotICAiRGlzcGxheSBhbiBFcmxhbmcgc2hlbGwsIG9yIHN0YXJ0IGEgbmV3LiIKLSAgKGludGVyYWN0aXZlKQotICAoY2FsbC1pbnRlcmFjdGl2ZWx5IGVybGFuZy1zaGVsbC1kaXNwbGF5LWZ1bmN0aW9uKSkKLQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGVybGFuZy1jb21waWxlICgpCi0gICJDb21waWxlIEVybGFuZyBtb2R1bGUgaW4gY3VycmVudCBidWZmZXIuIgotICAoaW50ZXJhY3RpdmUpCi0gIChjYWxsLWludGVyYWN0aXZlbHkgZXJsYW5nLWNvbXBpbGUtZnVuY3Rpb24pKQotCi0KLShkZWZ1biBlcmxhbmctY29tcGlsZS1kaXNwbGF5ICgpCi0gICJEaXNwbGF5IGNvbXBpbGF0aW9uIG91dHB1dC4iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKGNhbGwtaW50ZXJhY3RpdmVseSBlcmxhbmctY29tcGlsZS1kaXNwbGF5LWZ1bmN0aW9uKSkKLQotCi0oZGVmdW4gZXJsYW5nLW5leHQtZXJyb3IgKCkKLSAgIkRpc3BsYXkgbmV4dCBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGxhdGVzdCBjb21waWxhdGlvbi4iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKGNhbGwtaW50ZXJhY3RpdmVseSBlcmxhbmctbmV4dC1lcnJvci1mdW5jdGlvbikpCi0KLQotDAotOzs7Ci07OzsgRXJsYW5nIFNoZWxsIE1vZGUgLS0gTWFqb3IgbW9kZSB1c2VkIGZvciBFcmxhbmcgc2hlbGxzLgotOzs7Ci0KLTs7IFRoaXMgbW9kZSBpcyBkZXNpZ25lZCB0byBiZSBpbXBsZW1lbnRhdGlvbiBpbmRlcGVuZGVudCwKLTs7IGUuZy4gaXQgZG9lcyBub3QgYXNzdW1lIHRoYXQgd2UgYXJlIHJ1bm5pbmcgYW4gaW5mZXJpb3IKLTs7IEVybGFuZywgdGhlcmUgZXhpc3RzIGEgbG90IG9mIG90aGVyIHBvc3NpYmlsaXRpZXMuCi0KLQotKGRlZnZhciBlcmxhbmctc2hlbGwtYnVmZmVyLW5hbWUgIiplcmxhbmcqIgotICAiKlRoZSBuYW1lIG9mIHRoZSBFcmxhbmcgbGluayBzaGVsbCBidWZmZXIuIikKLQotCi0oZGVmdmFyIGVybGFuZy1zaGVsbC1tb2RlLW1hcCBuaWwKLSAgIipLZXltYXAgdXNlZCBieSBFcmxhbmcgc2hlbGxzLiIpCi0KLQotKGRlZnZhciBlcmxhbmctc2hlbGwtbW9kZS1ob29rIG5pbAotICAiKlVzZXIgZnVuY3Rpb25zIHRvIHJ1biB3aGVuIGFuIEVybGFuZyBzaGVsbCBpcyBzdGFydGVkLgotCi1UaGlzIGhvb2sgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ciBvZiBFcmxhbmcgbW9kZS4gIEl0IGlzCi1ub3JtYWxseSB1c2VkIGJ5IHRoZSB1c2VyIHRvIHBlcnNvbmFsaXNlIHRoZSBwcm9ncmFtbWluZyBlbnZpcm9ubWVudC4KLVdoZW4gdXNlZCBpbiBhIHNpdGUgaW5pdCBmaWxlLCBpdCBjb3VsZCBiZSB1c2VkIHRvIGN1c3RvbWlzZSBFcmxhbmcKLW1vZGUgZm9yIGFsbCB1c2VycyBvbiB0aGUgc3lzdGVtLgotCi1UaGUgZnVuY3Rpb25lZCBhZGRlZCB0byB0aGlzIGhvb2sgaXMgcnVuZWQgZXZlcnkgdGltZSBhIG5ldyBFcmxhbmcKLXNoZWxsIGlzIHN0YXJ0ZWQuCi0KLVNlZSBhbHNvIGBlcmxhbmctbG9hZC1ob29rJywgYSBob29rIHdoaWNoIGlzIHJ1bmVkIG9uY2UsIHdoZW4gRXJsYW5nCi1tb2RlIGlzIGxvYWRlZCwgYW5kIGBlcmxhbmctbW9kZS1ob29rJyB3aGljaCBpcyBydW5lZCBldmVyeSB0aW1lIGEgbmV3Ci1Fcmxhbmcgc291cmNlIGZpbGUgaXMgbG9hZGVkIGludG8gRW1hY3MuIikKLQotCi0oZGVmdmFyIGVybGFuZy1pbnB1dC1yaW5nLWZpbGUtbmFtZSAifi8uZXJsYW5nX2hpc3RvcnkiCi0gICIqV2hlbiBub24tbmlsLCBmaWxlIG5hbWUgdXNlZCB0byBzdG9yZSBlcmxhbmcgc2hlbGwgaGlzdG9yeSBpbmZvcm1hdGlvbi4iKQotCi0KLShkZWZ1biBlcmxhbmctc2hlbGwtbW9kZSAoKQotICAiTWFqb3IgbW9kZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBFcmxhbmcgc2hlbGwuCi0KLVdlIGFzc3VtZSB0aGF0IHdlIGFscmVhZHkgYXJlIGluIGNvbWludC1tb2RlLgotCi1UaGUgZm9sbG93aW5nIHNwZWNpYWwgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToKLVxce2VybGFuZy1zaGVsbC1tb2RlLW1hcH0iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKHNldHEgbWFqb3ItbW9kZSAnZXJsYW5nLXNoZWxsLW1vZGUpCi0gIChzZXRxIG1vZGUtbmFtZSAiRXJsYW5nIFNoZWxsIikKLSAgKGVybGFuZy1tb2RlLXZhcmlhYmxlcykKLSAgKGlmIGVybGFuZy1zaGVsbC1tb2RlLW1hcAotICAgICAgbmlsCi0gICAgKHNldHEgZXJsYW5nLXNoZWxsLW1vZGUtbWFwIChjb3B5LWtleW1hcCBjb21pbnQtbW9kZS1tYXApKQotICAgIChlcmxhbmctc2hlbGwtbW9kZS1jb21tYW5kcyBlcmxhbmctc2hlbGwtbW9kZS1tYXApKQotICAodXNlLWxvY2FsLW1hcCBlcmxhbmctc2hlbGwtbW9kZS1tYXApCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2NvbXBpbGF0aW9uLXBhcnNpbmctZW5kKSAxKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdjb21waWxhdGlvbi1lcnJvci1saXN0KSBuaWwpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2NvbXBpbGF0aW9uLW9sZC1lcnJvci1saXN0KSBuaWwpCi0gIDs7IE5lZWRlZCB3aGVuIGNvbXBpbGluZyBkaXJlY3RseSBmcm9tIHRoZSBFcmxhbmcgc2hlbGwuCi0gIChzZXRxIGNvbXBpbGF0aW9uLWxhc3QtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpCi0gIChlcmxhbmctYWRkLWNvbXBpbGF0aW9uLWFsaXN0IGVybGFuZy1lcnJvci1yZWdleHAtYWxpc3QpCi0gIChzZXRxIGNvbWludC1wcm9tcHQtcmVnZXhwICJeW14+PV0qPiAqIikKLSAgKHNldHEgY29taW50LWVvbC1vbi1zZW5kIHQpCi0gIChzZXRxIGNvbWludC1pbnB1dC1pZ25vcmVkdXBzIHQpCi0gIChzZXRxIGNvbWludC1zY3JvbGwtc2hvdy1tYXhpbXVtLW91dHB1dCB0KQotICAoc2V0cSBjb21pbnQtc2Nyb2xsLXRvLWJvdHRvbS1vbi1vdXRwdXQgdCkKLSAgOzsgSW4gRW1hY3MgMTkuMzAsIGBhZGQtaG9vaycgaGFzIGdvdCBhIGBsb2NhbCcgZmxhZywgdXNlIGl0LiAgSWYKLSAgOzsgdGhlIGNhbGwgZmFpbHMsIGp1c3QgY2FsbCB0aGUgbm9ybWFsIGBhZGQtaG9vaycuCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChwcm9nbgotCShmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2FkZC1ob29rKSAnY29taW50LW91dHB1dC1maWx0ZXItZnVuY3Rpb25zCi0JCSAgJ2luZmVyaW9yLWVybGFuZy1zdHJpcC1kZWxldGUgbmlsIHQpCi0JKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnYWRkLWhvb2spICdjb21pbnQtb3V0cHV0LWZpbHRlci1mdW5jdGlvbnMKLQkJICAnaW5mZXJpb3ItZXJsYW5nLXN0cmlwLWN0cmwtbSBuaWwgdCkpCi0gICAgKGVycm9yCi0gICAgIChhZGQtaG9vayAnY29taW50LW91dHB1dC1maWx0ZXItZnVuY3Rpb25zICdpbmZlcmlvci1lcmxhbmctc3RyaXAtZGVsZXRlKQotICAgICAoYWRkLWhvb2sgJ2NvbWludC1vdXRwdXQtZmlsdGVyLWZ1bmN0aW9ucyAnaW5mZXJpb3ItZXJsYW5nLXN0cmlwLWN0cmwtbSkpKQotICA7OyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIGNvbWludCBkb2Vzbid0IGhhdmUgYW4gaW5wdXQgcmluZy4KLSAgKGlmIChmYm91bmRwICdjb21pbnQtcmVhZC1pbnB1dC1yaW5nKQotICAgICAgKHByb2duCi0JKHNldHEgY29taW50LWlucHV0LXJpbmctZmlsZS1uYW1lIGVybGFuZy1pbnB1dC1yaW5nLWZpbGUtbmFtZSkKLQkoY29taW50LXJlYWQtaW5wdXQtcmluZyB0KQotCShtYWtlLWxvY2FsLXZhcmlhYmxlICdraWxsLWJ1ZmZlci1ob29rKQotCShhZGQtaG9vayAna2lsbC1idWZmZXItaG9vayAnY29taW50LXdyaXRlLWlucHV0LXJpbmcpKSkKLSAgKHJ1bi1ob29rcyAnZXJsYW5nLXNoZWxsLW1vZGUtaG9vaykpCi0KLQotKGRlZnVuIGVybGFuZy1zaGVsbC1tb2RlLWNvbW1hbmRzIChtYXApCi0gIChkZWZpbmUta2V5IG1hcCAiXE0tXHQiICAgICdlcmxhbmctY29tcGxldGUtdGFnKQotICAoZGVmaW5lLWtleSBtYXAgIlxDLWEiICAgICAnY29taW50LWJvbCkgOyBOb3JtYWxseSB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLSAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtYSIgJ2JlZ2lubmluZy1vZi1saW5lKQotICAoZGVmaW5lLWtleSBtYXAgIlxDLWQiICAgICBuaWwpCTsgV2FzIGBjb21pbnQtZGVsY2hhci1vci1tYXliZS1lb2YnCi0gIChkZWZpbmUta2V5IG1hcCAiXEMteGAiICAgICdlcmxhbmctbmV4dC1lcnJvcikpCi0MCi07OzsKLTs7OyBJbmZlcmlvciBFcmxhbmcgLS0gUnVuIGFuIEVybGFuZyBzaGVsbCBhcyBhIHN1YnByb2Nlc3MuCi07OzsKLQotKGRlZnZhciBpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXItYW55LWZyYW1lIG5pbAotICAiKldoZW4gbmlsLCBgaW5mZXJpb3ItZXJsYW5nLWRpc3BsYXktYnVmZmVyJyB1c2Ugb25seSBzZWxlY3RlZCBmcmFtZS4KLVdoZW4gdCwgYWxsIGZyYW1lcyBhcmUgc2VhcmNoZWQuICBXaGVuICdyYWlzZSwgdGhlIGZyYW1lIGlzIHJhaXNlZC4iKQotCi0oZGVmdmFyIGluZmVyaW9yLWVybGFuZy1zaGVsbC10eXBlICduZXdzaGVsbAotICAiVGhlIHR5cGUgb2YgRXJsYW5nIHNoZWxsIHRvIHVzZS4KLQotV2hlbiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgYXRvbSBgb2xkc2hlbGwnLCB0aGUgb2xkIHNoZWxsIGlzIHVzZWQuCi1XaGVuIHNldCB0byBgbmV3c2hlbGwnIHRoZSBuZXcgc2hlbGwgaXMgdXNlZC4gIFNob3VsZCB0aGUgdmFyaWFibGUgYmUKLW5pbCwgdGhlIGRlZmF1bHQgc2hlbGwgaXMgdXNlZC4KLQotVGhpcyB2YXJpYWJsZSBpbmZsdWVuY2UgdGhlIHNldHRpbmcgb2Ygb3RoZXIgdmFyaWFibGVzLiIpCi0KLShkZWZ2YXIgaW5mZXJpb3ItZXJsYW5nLW1hY2hpbmUgImVybCIKLSAgIipUaGUgbmFtZSBvZiB0aGUgRXJsYW5nIHNoZWxsLiIpCi0KLShkZWZ2YXIgaW5mZXJpb3ItZXJsYW5nLW1hY2hpbmUtb3B0aW9ucyAnKCkKLSAgIipUaGUgb3B0aW9ucyB1c2VkIHdoZW4gYWN0aXZhdGluZyB0aGUgRXJsYW5nIHNoZWxsLgotCi1UaGlzIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MuIikKLQotKGRlZnZhciBpbmZlcmlvci1lcmxhbmctcHJvY2Vzcy1uYW1lICJpbmZlcmlvci1lcmxhbmciCi0gICIqVGhlIG5hbWUgb2YgdGhlIGluZmVyaW9yIEVybGFuZyBwcm9jZXNzLiIpCi0KLShkZWZ2YXIgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlci1uYW1lIGVybGFuZy1zaGVsbC1idWZmZXItbmFtZQotICAiKlRoZSBuYW1lIG9mIHRoZSBpbmZlcmlvciBlcmxhbmcgYnVmZmVyLiIpCi0KLShkZWZ2YXIgaW5mZXJpb3ItZXJsYW5nLXByb21wdC10aW1lb3V0IDYwCi0gICIqTnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIGBpbmZlcmlvci1lcmxhbmctd2FpdC1wcm9tcHQnIHRpbWVvdXRzLgotCi1UaGUgdGltZSBzcGVjaWZpZWQgaXMgd2FpdGVkIGFmdGVyIGV2ZXJ5IG91dHB1dCBtYWRlIGJ5IHRoZSBpbmZlcmlvcgotRXJsYW5nIHNoZWxsLiAgV2hlbiB0aGlzIHZhcmlhYmxlIGlzIHQsIHdlIGFzc3VtZSB0aGF0IHdlIGFsd2F5cyBoYXZlCi1hIHByb21wdC4gIFdoZW4gbmlsLCB3ZSB3aWxsIHdhaXQgZm9yZXZlciwgb3IgdW50aWwgQy1nLiIpCi0KLShkZWZ2YXIgaW5mZXJpb3ItZXJsYW5nLXByb2Nlc3MgbmlsCi0gICJQcm9jZXNzIG9mIGxhc3QgaW52b2tlZCBpbmZlcmlvciBFcmxhbmcsIG9yIG5pbC4iKQotCi0oZGVmdmFyIGluZmVyaW9yLWVybGFuZy1idWZmZXIgbmlsCi0gICJCdWZmZXIgb2YgbGFzdCBpbnZva2VkIGluZmVyaW9yIEVybGFuZywgb3IgbmlsLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gaW5mZXJpb3ItZXJsYW5nICgpCi0gICJSdW4gYW4gaW5mZXJpb3IgRXJsYW5nLgotCi1UaGlzIGlzIGp1c3QgbGlrZSBydW5uaW5nIEVybGFuZyBpbiBhIG5vcm1hbCBzaGVsbCwgZXhjZXB0IHRoYXQKLWFuIEVtYWNzIGJ1ZmZlciBpcyB1c2VkIGZvciBpbnB1dCBhbmQgb3V0cHV0LgotCi1UaGUgY29tbWFuZCBsaW5lIGhpc3RvcnkgY2FuIGJlIGFjY2Vzc2VkIHdpdGggIE0tcCAgYW5kICBNLW4uCi1UaGUgaGlzdG9yeSBpcyBzYXZlZCBiZXR3ZWVuIHNlc3Npb25zLgotCi1FbnRyeSB0byB0aGlzIG1vZGUgY2FsbHMgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgdmFyaWFibGVzCi1gY29taW50LW1vZGUtaG9vaycgYW5kIGBlcmxhbmctc2hlbGwtbW9kZS1ob29rJyB3aXRoIG5vIGFyZ3VtZW50cy4KLQotVGhlIGZvbGxvd2luZyBjb21tYW5kcyBpbWl0YXRlIHRoZSB1c3VhbCBVbml4IGludGVycnVwdCBhbmQKLWVkaXRpbmcgY29udHJvbCBjaGFyYWN0ZXJzOgotXFx7ZXJsYW5nLXNoZWxsLW1vZGUtbWFwfSIKLSAgKGludGVyYWN0aXZlKQotICAocmVxdWlyZSAnY29taW50KQotICAobGV0ICgob3B0cyBpbmZlcmlvci1lcmxhbmctbWFjaGluZS1vcHRpb25zKSkKLSAgICAoY29uZCAoKGVxIGluZmVyaW9yLWVybGFuZy1zaGVsbC10eXBlICdvbGRzaGVsbCkKLQkgICAoc2V0cSBvcHRzIChjb25zICItb2xkc2hlbGwiIG9wdHMpKSkKLQkgICgoZXEgaW5mZXJpb3ItZXJsYW5nLXNoZWxsLXR5cGUgJ25ld3NoZWxsKQotCSAgIChzZXRxIG9wdHMgKGFwcGVuZCAnKCItbmV3c2hlbGwiICItZW52IiAiVEVSTSIgInZ0MTAwIikgb3B0cykpKSkKLSAgICAoc2V0cSBpbmZlcmlvci1lcmxhbmctYnVmZmVyCi0JICAoYXBwbHkgJ21ha2UtY29taW50Ci0JCSBpbmZlcmlvci1lcmxhbmctcHJvY2Vzcy1uYW1lIGluZmVyaW9yLWVybGFuZy1tYWNoaW5lCi0JICAgICAgIG5pbCBvcHRzKSkpCi0gIChzZXRxIGluZmVyaW9yLWVybGFuZy1wcm9jZXNzCi0JKGdldC1idWZmZXItcHJvY2VzcyBpbmZlcmlvci1lcmxhbmctYnVmZmVyKSkKLSAgKHByb2Nlc3Mta2lsbC13aXRob3V0LXF1ZXJ5IGluZmVyaW9yLWVybGFuZy1wcm9jZXNzKQotICAoc3dpdGNoLXRvLWJ1ZmZlciBpbmZlcmlvci1lcmxhbmctYnVmZmVyKQotICAoaWYgKGFuZCAobm90IChlcSBzeXN0ZW0tdHlwZSAnd2luZG93cy1udCkpCi0JICAgKGVxIGluZmVyaW9yLWVybGFuZy1zaGVsbC10eXBlICduZXdzaGVsbCkpCi0gICAgICAoc2V0cSBjb21pbnQtcHJvY2Vzcy1lY2hvZXMgdCkpCi0gIDs7IGByZW5hbWUtYnVmZmVyJyB0YWtlcyBvbmx5IG9uZSBhcmd1bWVudCBpbiBFbWFjcyAxOC4KLSAgKGNvbmRpdGlvbi1jYXNlIG5pbAotICAgICAgKHJlbmFtZS1idWZmZXIgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlci1uYW1lIHQpCi0gICAgKGVycm9yIChyZW5hbWUtYnVmZmVyIGluZmVyaW9yLWVybGFuZy1idWZmZXItbmFtZSkpKQotICAoZXJsYW5nLXNoZWxsLW1vZGUpKQotCi0KLShkZWZ1biBpbmZlcmlvci1lcmxhbmctcnVuLW9yLXNlbGVjdCAoKQotICAiU3dpdGNoIHRvIGFuIGluZmVyaW9yIEVybGFuZyBidWZmZXIsIHBvc3NpYmx5IHN0YXJ0aW5nIG5ldyBwcm9jZXNzLiIKLSAgKGludGVyYWN0aXZlKQotICAoaWYgKG51bGwgKGluZmVyaW9yLWVybGFuZy1ydW5uaW5nLXApKQotICAgICAgKGluZmVyaW9yLWVybGFuZykKLSAgICAoaW5mZXJpb3ItZXJsYW5nLWRpc3BsYXktYnVmZmVyIHQpKSkKLQotCi0oZGVmdW4gaW5mZXJpb3ItZXJsYW5nLWRpc3BsYXktYnVmZmVyICgmb3B0aW9uYWwgc2VsZWN0KQotICAiTWFrZSB0aGUgaW5mZXJpb3IgRXJsYW5nIHByb2Nlc3MgdmlzaWJsZS4KLVRoZSB3aW5kb3cgaXMgcmV0dXJuZWQuCi0KLVNob3VsZCBgaW5mZXJpb3ItZXJsYW5nLWRpc3BsYXktYnVmZmVyLWFueS1mcmFtZScgYmUgbmlsIHRoZSBidWZmZXIgaXMKLWRpc3BsYXllZCBpbiB0aGUgY3VycmVudCBmcmFtZS4gIFNob3VsZCBpdCBiZSBub24tbmlsLCBhbmQgdGhlIGJ1ZmZlcgotYWxyZWFkeSBpcyB2aXNpYmxlIGluIGFueSBvdGhlciBmcmFtZSwgbm8gbmV3IHdpbmRvdyB3aWxsIGJlIGNyZWF0ZWQuCi1TaG91bGQgaXQgYmUgdGhlIGF0b20gJ3JhaXNlLCB0aGUgZnJhbWUgY29udGFpbmluZyB0aGUgd2luZG93IHdpbGwKLWJlIHJhaXNlZC4KLQotU2hvdWxkIHRoZSBvcHRpb25hbCBhcmd1bWVudCBTRUxFQ1QgYmUgbm9uLW5pbCwgdGhlIHdpbmRvdyBpcwotc2VsZWN0ZWQuICBTaG91bGQgdGhlIHdpbmRvdyBiZSBpbiBhbm90aGVyIGZyYW1lLCB0aGF0IGZyYW1lIGlzIHJhaXNlZC4KLQotTm90ZSwgc2hvdWxkIHRoZSBtb3VzZSBwb2ludGVyIGJlIHBsYWNlcyBvdXRzaWRlIHRoZSByYWlzZWQgZnJhbWUsIHRoYXQKLWZyYW1lIHdpbGwgYmVjb21lIGRlc2VsZWN0ZWQgYmVmb3JlIHRoZSBuZXh0IGNvbW1hbmQuIgotICAoaW50ZXJhY3RpdmUpCi0gIChvciAoaW5mZXJpb3ItZXJsYW5nLXJ1bm5pbmctcCkKLSAgICAgIChlcnJvciAiTm8gaW5mZXJpb3IgRXJsYW5nIHByb2Nlc3MgaXMgcnVubmluZy4iKSkKLSAgKGxldCAoKHdpbiAoaW5mZXJpb3ItZXJsYW5nLXdpbmRvdwotCSAgICAgIGluZmVyaW9yLWVybGFuZy1kaXNwbGF5LWJ1ZmZlci1hbnktZnJhbWUpKQotCShmcmFtZXMtcCAoZmJvdW5kcCAnc2VsZWN0ZWQtZnJhbWUpKSkKLSAgICAoaWYgKG51bGwgd2luKQotCShsZXQgKChvbGQtd2luIChzZWxlY3RlZC13aW5kb3cpKSkKLQkgIChzYXZlLWV4Y3Vyc2lvbgotCSAgICAoc3dpdGNoLXRvLWJ1ZmZlci1vdGhlci13aW5kb3cgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlcikKLQkgICAgKHNldHEgd2luIChzZWxlY3RlZC13aW5kb3cpKSkKLQkgIChzZWxlY3Qtd2luZG93IG9sZC13aW4pKQotICAgICAgKGlmIChhbmQgd2luZG93LXN5c3RlbQotCSAgICAgICBmcmFtZXMtcAotCSAgICAgICAob3Igc2VsZWN0Ci0JCSAgIChlcSBpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXItYW55LWZyYW1lICdyYWlzZSkpCi0JICAgICAgIChub3QgKGVxIChzZWxlY3RlZC1mcmFtZSkgKHdpbmRvdy1mcmFtZSB3aW4pKSkpCi0JICAocmFpc2UtZnJhbWUgKHdpbmRvdy1mcmFtZSB3aW4pKSkpCi0gICAgKGlmIHNlbGVjdAotCShzZWxlY3Qtd2luZG93IHdpbikpCi0gICAgKHNpdC1mb3IgMCkKLSAgICB3aW4pKQotCi0KLShkZWZ1biBpbmZlcmlvci1lcmxhbmctcnVubmluZy1wICgpCi0gICJOb24tbmlsIHdoZW4gYW4gaW5mZXJpb3IgRXJsYW5nIGlzIHJ1bm5pbmcuIgotICAoYW5kIGluZmVyaW9yLWVybGFuZy1wcm9jZXNzCi0JICAgKG1lbXEgKHByb2Nlc3Mtc3RhdHVzIGluZmVyaW9yLWVybGFuZy1wcm9jZXNzKSAnKHJ1biBvcGVuKSkKLQkgICBpbmZlcmlvci1lcmxhbmctYnVmZmVyCi0JICAgKGJ1ZmZlci1uYW1lIGluZmVyaW9yLWVybGFuZy1idWZmZXIpKSkKLQotCi0oZGVmdW4gaW5mZXJpb3ItZXJsYW5nLXdpbmRvdyAoJm9wdGlvbmFsIGFsbC1mcmFtZXMpCi0gICJSZXR1cm4gdGhlIHdpbmRvdyBjb250YWluaW5nIHRoZSBpbmZlcmlvciBFcmxhbmcsIG9yIG5pbC4iCi0gIChhbmQgKGluZmVyaW9yLWVybGFuZy1ydW5uaW5nLXApCi0gICAgICAgKGlmIChhbmQgYWxsLWZyYW1lcyAoPj0gZXJsYW5nLWVtYWNzLW1ham9yLXZlcnNpb24gMTkpKQotCSAgIChnZXQtYnVmZmVyLXdpbmRvdyBpbmZlcmlvci1lcmxhbmctYnVmZmVyIHQpCi0JIChnZXQtYnVmZmVyLXdpbmRvdyBpbmZlcmlvci1lcmxhbmctYnVmZmVyKSkpKQotCi0KLShkZWZ1biBpbmZlcmlvci1lcmxhbmctd2FpdC1wcm9tcHQgKCkKLSAgIldhaXQgdW50aWwgdGhlIGluZmVyaW9yIEVybGFuZyBzaGVsbCBwcm9tcHQgYXBwZWFyLiIKLSAgKGlmIChlcSBpbmZlcmlvci1lcmxhbmctcHJvbXB0LXRpbWVvdXQgdCkKLSAgICAgICgpCi0gICAgKG9yIChpbmZlcmlvci1lcmxhbmctcnVubmluZy1wKQotCShlcnJvciAiTm8gaW5mZXJpb3IgRXJsYW5nIHNoZWxsIGlzIHJ1bm5pbmcuIikpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAoc2V0LWJ1ZmZlciBpbmZlcmlvci1lcmxhbmctYnVmZmVyKQotICAgICAgKGxldCAoKG1zZyBuaWwpKQotCSh3aGlsZSAoc2F2ZS1leGN1cnNpb24KLQkJIChnb3RvLWNoYXIgKHByb2Nlc3MtbWFyayBpbmZlcmlvci1lcmxhbmctcHJvY2VzcykpCi0JCSAoZm9yd2FyZC1saW5lIDApCi0JCSAobm90IChsb29raW5nLWF0IGNvbWludC1wcm9tcHQtcmVnZXhwKSkpCi0JICAoaWYgbXNnCi0JICAgICAgKCkKLQkgICAgKHNldHEgbXNnIHQpCi0JICAgIChtZXNzYWdlICJXYWl0aW5nIGZvciBFcmxhbmcgc2hlbGwgcHJvbXB0IChwcmVzcyBDLWcgdG8gYWJvcnQpLiIpKQotCSAgKG9yIChhY2NlcHQtcHJvY2Vzcy1vdXRwdXQgaW5mZXJpb3ItZXJsYW5nLXByb2Nlc3MKLQkJCQkgICAgIGluZmVyaW9yLWVybGFuZy1wcm9tcHQtdGltZW91dCkKLQkgICAgICAoZXJyb3IgIk5vIEVybGFuZyBzaGVsbCBwcm9tcHQgYmVmb3JlIHRpbWVvdXQuIikpKQotCShpZiBtc2cgKG1lc3NhZ2UgIiIpKSkpKSkKLQotCi0oZGVmdW4gaW5mZXJpb3ItZXJsYW5nLXNlbmQtY29tbWFuZCAoY21kICZvcHRpb25hbCBoaXN0KQotICAiU2VuZCBjb21tYW5kIENNRCB0byB0aGUgaW5mZXJpb3IgRXJsYW5nLgotCi1UaGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lIChpZiBhbnkpIHdpbGwKLWJlIHBsYWNlZCBhdCB0aGUgbmV4dCBwcm9tcHQuCi0KLUlmIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyBub24tbmlsIHRoZSBjb21tYW5kIGlzIGluc2VydGVkIGludG8KLXRoZSBoaXN0b3J5IGxpc3QuCi0KLVJldHVybiB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIG5ld2x5IGluc2VydGVkIGNvbW1hbmQuIgotICAob3IgKGluZmVyaW9yLWVybGFuZy1ydW5uaW5nLXApCi0gICAgICAoZXJyb3IgIk5vIGluZmVyaW9yIEVybGFuZyBwcm9jZXNzIGlzIHJ1bm5pbmcuIikpCi0gIChsZXQgKChvbGQtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpCi0JKGluc2VydC1wb2ludCAobWFya2VyLXBvc2l0aW9uCi0JCSAgICAgICAocHJvY2Vzcy1tYXJrIGluZmVyaW9yLWVybGFuZy1wcm9jZXNzKSkpCi0JKGluc2VydC1sZW5ndGggKGlmIGNvbWludC1wcm9jZXNzLWVjaG9lcwotCQkJICAgMAotCQkJICgxKyAobGVuZ3RoIGNtZCkpKSkpCi0gICAgKHNldC1idWZmZXIgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlcikKLSAgICAoZ290by1jaGFyIGluc2VydC1wb2ludCkKLSAgICAoaW5zZXJ0IGNtZCkKLSAgICA7OyBTdHJhbmdlIHRoaW5ncyBoYXBwZW5kIGlmIGBjb21pbnQtZW9sLW9uLXNlbmQnIGlzIGRlY2xhcmVkCi0gICAgOzsgaW4gdGhlIGBsZXQnIGV4cHJlc3Npb24gYWJvdmUsIGJ1dCBzZXRxOmQgaGVyZS4gVGhlCi0gICAgOzsgYHNldC1idWZmZXInIHN0YXRlbWVudCBvYnZpb3VzbHkgbWFrZXMgdGhlIGJ1ZmZlciBsb2NhbAotICAgIDs7IGluc3RhbmNlIG9mIGBjb21pbnQtZW9sLW9uLXNlbmQnIHNoYWRvdyB0aGlzIG9uZS4KLSAgICA7OyBJJ20gY29uc2lkZXJpbmcgdGhpcyBhIGJ1ZyBpbiBFbGlzcC4KLSAgICAobGV0ICgoY29taW50LWVvbC1vbi1zZW5kIG5pbCkKLQkgIChjb21pbnQtaW5wdXQtZmlsdGVyIChpZiBoaXN0IGNvbWludC1pbnB1dC1maWx0ZXIgJ2lnbm9yZSkpKQotICAgICAgKGNvbWludC1zZW5kLWlucHV0KSkKLSAgICA7OyBBZGp1c3QgYWxsIHdpbmRvd3Mgd2hvc2UgcG9pbnRzIGFyZSBpbmNvcnJlY3QuCi0gICAgKGlmIChudWxsIGNvbWludC1wcm9jZXNzLWVjaG9lcykKLQkod2Fsay13aW5kb3dzCi0JIChmdW5jdGlvbgotCSAgKGxhbWJkYSAod2luZG93KQotCSAgICAoaWYgKGFuZCAoZXEgKHdpbmRvdy1idWZmZXIgd2luZG93KSBpbmZlcmlvci1lcmxhbmctYnVmZmVyKQotCQkgICAgIChlcSAod2luZG93LXBvaW50IHdpbmRvdykgaW5zZXJ0LXBvaW50KSkKLQkJKHNldC13aW5kb3ctcG9pbnQgd2luZG93Ci0JCQkJICAoKyBpbnNlcnQtcG9pbnQgaW5zZXJ0LWxlbmd0aCkpKSkpCi0JIG5pbCB0KSkKLSAgICAoc2V0LWJ1ZmZlciBvbGQtYnVmZmVyKQotICAgICgrIGluc2VydC1wb2ludCBpbnNlcnQtbGVuZ3RoKSkpCi0KLQotKGRlZnVuIGluZmVyaW9yLWVybGFuZy1zdHJpcC1kZWxldGUgKCZvcHRpb25hbCBzKQotICAiUmVtb3ZlIGBeSCcgKGRlbGV0ZSkgYW5kIHRoZSBjaGFyYWN0ZXJzIGl0IHdhcyBzdXBwb3NlZCB0byByZW1vdmUuIgotICAoaW50ZXJhY3RpdmUpCi0gIChpZiAoYW5kIChib3VuZHAgJ2NvbWludC1sYXN0LWlucHV0LWVuZCkKLQkgICAoYm91bmRwICdjb21pbnQtbGFzdC1vdXRwdXQtc3RhcnQpKQotICAgICAgKHNhdmUtZXhjdXJzaW9uCi0JKGdvdG8tY2hhcgotCSAoaWYgKGludGVyYWN0aXZlLXApCi0JICAgICAoc3ltYm9sLXZhbHVlICdjb21pbnQtbGFzdC1pbnB1dC1lbmQpCi0JICAgKHN5bWJvbC12YWx1ZSAnY29taW50LWxhc3Qtb3V0cHV0LXN0YXJ0KSkpCi0JKHdoaWxlIChwcm9nbiAoc2tpcC1jaGFycy1mb3J3YXJkICJeXEMtaCIpCi0JCSAgICAgIChub3QgKGVxIChwb2ludCkgKHBvaW50LW1heCkpKSkKLQkgIChkZWxldGUtY2hhciAxKQotCSAgKG9yIChib2xwKQotCSAgICAgIChiYWNrd2FyZC1kZWxldGUtY2hhciAxKSkpKSkpCi0KLQotOzsgQmFzaWNhbGx5IGBjb21pbnQtc3RyaXAtY3RybC1tJywgd2l0aCBhIGZldyBleHRyYSBjaGVja3MuCi0oZGVmdW4gaW5mZXJpb3ItZXJsYW5nLXN0cmlwLWN0cmwtbSAoJm9wdGlvbmFsIHN0cmluZykKLSAgIlN0cmlwIHRyYWlsaW5nIGBeTScgY2hhcmFjdGVycyBmcm9tIHRoZSBjdXJyZW50IG91dHB1dCBncm91cC4iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKGlmIChhbmQgKGJvdW5kcCAnY29taW50LWxhc3QtaW5wdXQtZW5kKQotCSAgIChib3VuZHAgJ2NvbWludC1sYXN0LW91dHB1dC1zdGFydCkpCi0gICAgICAobGV0ICgocG1hcmsgKHByb2Nlc3MtbWFyayAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1ZmZlcikpKSkpCi0JKHNhdmUtZXhjdXJzaW9uCi0JICAoZ290by1jaGFyCi0JICAgKGlmIChpbnRlcmFjdGl2ZS1wKQotCSAgICAgICAoc3ltYm9sLXZhbHVlICdjb21pbnQtbGFzdC1pbnB1dC1lbmQpCi0JICAgICAoc3ltYm9sLXZhbHVlICdjb21pbnQtbGFzdC1vdXRwdXQtc3RhcnQpKSkKLQkgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlxyKyQiIHBtYXJrIHQpCi0JICAgIChyZXBsYWNlLW1hdGNoICIiIHQgdCkpKSkpKQotCi0KLShkZWZ1biBpbmZlcmlvci1lcmxhbmctY29tcGlsZSAoKQotICAiQ29tcGlsZSB0aGUgZmlsZSBpbiB0aGUgY3VycmVudCBidWZmZXIuCi0KLVNob3VsZCBFcmxhbmcgcmV0dXJuIGB7ZXJyb3IsIG5vZmlsZX0nIGl0IGNvdWxkIG5vdCBsb2FkIHRoZSBvYmplY3QKLW1vZHVsZSBhZnRlciBjb21wbGV0aW5nIHRoZSBjb21waWxhdGlvbi4gIFRoaXMgaXMgZHVlIHRvIGEgYnVnIGluIHRoZQotY29tcGlsZSBjb21tYW5kIGBjJyB3aGVuIHVzaW5nIHRoZSBvcHRpb24gYG91dGRpcicuCi0KLVRoZXJlIGV4aXN0cyB0d28gd29ya2Fyb3VuZHMgZm9yIHRoaXMgYnVnOgotCi0gIDEpIFBsYWNlIHRoZSBkaXJlY3RvcnkgaW4gdGhlIEVybGFuZyBsb2FkIHBhdGguCi0KLSAgMikgU2V0IHRoZSBFbWFjcyB2YXJpYWJsZSBgZXJsYW5nLWNvbXBpbGUtdXNlLW91dGRpcicgdG8gbmlsLgotICAgICBUbyBkbyBzbywgcGxhY2UgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgYH4vLmVtYWNzJy1maWxlOgotICAgICAgICAoc2V0cSBlcmxhbmctY29tcGlsZS11c2Utb3V0ZGlyIG5pbCkiCi0gIChpbnRlcmFjdGl2ZSkKLSAgKHNhdmUtc29tZS1idWZmZXJzKQotICAob3IgKGluZmVyaW9yLWVybGFuZy1ydW5uaW5nLXApCi0gICAgICAoc2F2ZS1leGN1cnNpb24KLQkoaW5mZXJpb3ItZXJsYW5nKSkpCi0gIChvciAoaW5mZXJpb3ItZXJsYW5nLXJ1bm5pbmctcCkKLSAgICAgIChlcnJvciAiRXJyb3Igc3RhcnRpbmcgaW5mZXJpb3IgRXJsYW5nIHNoZWxsLiIpKQotICAobGV0ICgoZGlyIChmaWxlLW5hbWUtZGlyZWN0b3J5IChidWZmZXItZmlsZS1uYW1lKSkpCi0JOzs7IChmaWxlIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IChidWZmZXItZmlsZS1uYW1lKSkpCi0JKG5vZXh0IChzdWJzdHJpbmcgKGJ1ZmZlci1maWxlLW5hbWUpIDAgLTQpKQotCTs7IEhvcGVmdWxseSwgbm9vbmUgZWxzZSB3aWxsIGV2ZXIgdXNlIHRoZXNlLi4uCi0JKHRtcHZhciAiVG1wNzIzNiIpCi0JKHRtcHZhcjIgIlRtcDg3NDIiKQotCWVuZCkKLSAgICAoaW5mZXJpb3ItZXJsYW5nLWRpc3BsYXktYnVmZmVyKQotICAgIChpbmZlcmlvci1lcmxhbmctd2FpdC1wcm9tcHQpCi0gICAgKHNldHEgZW5kIChpbmZlcmlvci1lcmxhbmctc2VuZC1jb21tYW5kCi0JICAgICAgIChpZiBlcmxhbmctY29tcGlsZS11c2Utb3V0ZGlyCi0JCSAgIChmb3JtYXQgImMoXCIlc1wiLCBbe291dGRpciwgXCIlc1wifV0pLiIgbm9leHQgZGlyKQotCQkgKGZvcm1hdAotCQkgIChjb25jYXQKLQkJICAgImYoJXMpLCB7b2ssICVzfSA9IGZpbGU6Z2V0X2N3ZCgpLCAiCi0JCSAgICJmaWxlOnNldF9jd2QoXCIlc1wiKSwgIgotCQkgICAiJXMgPSBjKFwiJXNcIiksIGZpbGU6c2V0X2N3ZCglcyksIGYoJXMpLCAlcy4iKQotCQkgIHRtcHZhcjIgdG1wdmFyCi0JCSAgICBkaXIKLQkJICAgIHRtcHZhcjIgbm9leHQgdG1wdmFyIHRtcHZhciB0bXB2YXIyKSkKLQkgICAgICAgbmlsKSkKLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgIChzZXQtYnVmZmVyIGluZmVyaW9yLWVybGFuZy1idWZmZXIpCi0gICAgICAoc2V0cSBjb21waWxhdGlvbi1lcnJvci1saXN0IG5pbCkKLSAgICAgIChzZXRxIGNvbXBpbGF0aW9uLXBhcnNpbmctZW5kIGVuZCkpCi0gICAgKHNldHEgY29tcGlsYXRpb24tbGFzdC1idWZmZXIgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlcikpKQotCi0KLTs7IGBuZXh0LWVycm9yJyBvbmx5IGFjY2VwdHMgYnVmZmVycyB3aXRoIG1ham9yIG1vZGUgYGNvbXBpbGF0aW9uLW1vZGUnCi07OyBvciB3aXRoIHRoZSBtaW5vciBtb2RlIGBjb21waWxhdGlvbi1taW5vci1tb2RlJyBhY3RpdmF0ZWQuCi07OyAoVG8gYWN0aXZhdGUgdGhlIG1pbm9yIG1vZGUgaXMgb3V0IG9mIHRoZSBxdWVzdGlvbiwgc2luY2UgaXQgd2lsbAotOzsgcnVpbiB0aGUgaW5mZXJpb3IgRXJsYW5nIGtleW1hcC4pCi0oZGVmdW4gaW5mZXJpb3ItZXJsYW5nLW5leHQtZXJyb3IgKCZvcHRpb25hbCBhcmdwKQotICAiSnVzdCBsaWtlIGBuZXh0LWVycm9yJy4KLUNhcGFibGUgb2YgZmluZGluZyBlcnJvciBtZXNzYWdlcyBpbiBhbiBpbmZlcmlvciBFcmxhbmcgYnVmZmVyLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKGxldCAoKGRvbmUgbmlsKQotCShidWYgKGFuZCAoYm91bmRwICdjb21waWxhdGlvbi1sYXN0LWJ1ZmZlcikKLQkJICBjb21waWxhdGlvbi1sYXN0LWJ1ZmZlcikpKQotICAgIChpZiAoYW5kIChidWZmZXJwIGJ1ZikKLQkgICAgIChzYXZlLWV4Y3Vyc2lvbgotCSAgICAgICAoc2V0LWJ1ZmZlciBidWYpCi0JICAgICAgIChhbmQgKGVxIG1ham9yLW1vZGUgJ2VybGFuZy1zaGVsbC1tb2RlKQotCQkgICAgKHNldHEgbWFqb3ItbW9kZSAnY29tcGlsYXRpb24tbW9kZSkpKSkKLQkodW53aW5kLXByb3RlY3QKLQkgICAgKHByb2duCi0JICAgICAgKHNldHEgZG9uZSB0KQotCSAgICAgIChuZXh0LWVycm9yIGFyZ3ApKQotCSAgKHNhdmUtZXhjdXJzaW9uCi0JICAgIChzZXQtYnVmZmVyIGJ1ZikKLQkgICAgKHNldHEgbWFqb3ItbW9kZSAnZXJsYW5nLXNoZWxsLW1vZGUpKSkpCi0gICAgKG9yIGRvbmUKLQkobmV4dC1lcnJvciBhcmdwKSkpKQotCi0KLShkZWZ1biBpbmZlcmlvci1lcmxhbmctY2hhbmdlLWRpcmVjdG9yeSAoJm9wdGlvbmFsIGRpcikKLSAgIk1ha2UgdGhlIGluZmVyaW9yIGVybGFuZyBjaGFuZ2UgZGlyZWN0b3J5LgotVGhlIGRlZmF1bHQgaXMgdG8gZ28gdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBidWZmZXIuIgotICAoaW50ZXJhY3RpdmUpCi0gIChvciBkaXIgKHNldHEgZGlyIChmaWxlLW5hbWUtZGlyZWN0b3J5IChidWZmZXItZmlsZS1uYW1lKSkpKQotICAob3IgKGluZmVyaW9yLWVybGFuZy1ydW5uaW5nLXApCi0gICAgICAoZXJyb3IgIk5vIGluZmVyaW9yIEVybGFuZyBpcyBydW5uaW5nLiIpKQotICAoaW5mZXJpb3ItZXJsYW5nLWRpc3BsYXktYnVmZmVyKQotICAoaW5mZXJpb3ItZXJsYW5nLXdhaXQtcHJvbXB0KQotICAoaW5mZXJpb3ItZXJsYW5nLXNlbmQtY29tbWFuZCAoZm9ybWF0ICJjZCgnJXMnKS4iIGRpcikgbmlsKSkKLQwKLTs7IEFsaWFzZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBFcmxhbmcgTW9kZS4KLTs7Ci07OyBVbmZvcnR1YW50ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBFbWFjcyBkb2Vzbid0IGhhdmUgYGRlZmFsaWFzJyBhbmQKLTs7IGBtYWtlLW9ic29sZXRlJyBzbyB3ZSBoYXZlIHRvIGRlZmluZSBvdXIgb3duIGBvYnNvbGV0ZScgZnVuY3Rpb24uCi0KLShkZWZ1biBlcmxhbmctb2Jzb2xldGUgKHN5bSBuZXdkZWYpCi0gICJNYWtlIHRoZSBvYnNvbGV0ZSBmdW5jdGlvbiBTWU0gcmVmZXIgdG8gdGhlIGRlZmluZWQgZnVuY3Rpb24gTkVXREVGLgotCi1TaW1wbGlmaWVkIHZlcnNpb24gb2YgYSBjb21iaW5hdGlvbiBgZGVmYWxpYXMnIGFuZCBgbWFrZS1vYnNvbGV0ZScsCi1pdCBhc3N1bWVzIHRoYXQgTkVXREVGIGlzIGxvYWRlZC4iCi0gIChmc2V0IHN5bSAoc3ltYm9sLWZ1bmN0aW9uIG5ld2RlZikpCi0gIChpZiAoZmJvdW5kcCAnbWFrZS1vYnNvbGV0ZSkKLSAgICAgIChtYWtlLW9ic29sZXRlIHN5bSBuZXdkZWYpKSkKLQotCi0oZXJsYW5nLW9ic29sZXRlICdjYWxjdWxhdGUtZXJsYW5nLWluZGVudCAnZXJsYW5nLWNhbGN1bGF0ZS1pbmRlbnQpCi0oZXJsYW5nLW9ic29sZXRlICdjYWxjdWxhdGUtZXJsYW5nLXN0YWNrLWluZGVudAotCQkgJ2VybGFuZy1jYWxjdWxhdGUtc3RhY2staW5kZW50KQotKGVybGFuZy1vYnNvbGV0ZSAnYXQtZXJsYW5nLWtleXdvcmQgJ2VybGFuZy1hdC1rZXl3b3JkKQotKGVybGFuZy1vYnNvbGV0ZSAnYXQtZXJsYW5nLW9wZXJhdG9yICdlcmxhbmctYXQtb3BlcmF0b3IpCi0oZXJsYW5nLW9ic29sZXRlICdiZWdpbm5pbmctb2YtZXJsYW5nLWNsYXVzZSAnZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCi0oZXJsYW5nLW9ic29sZXRlICdlbmQtb2YtZXJsYW5nLWNsYXVzZSAnZXJsYW5nLWVuZC1vZi1jbGF1c2UpCi0oZXJsYW5nLW9ic29sZXRlICdtYXJrLWVybGFuZy1jbGF1c2UgJ2VybGFuZy1tYXJrLWNsYXVzZSkKLShlcmxhbmctb2Jzb2xldGUgJ2JlZ2lubmluZy1vZi1lcmxhbmctZnVuY3Rpb24gJ2VybGFuZy1iZWdpbm5pbmctb2YtZnVuY3Rpb24pCi0oZXJsYW5nLW9ic29sZXRlICdlbmQtb2YtZXJsYW5nLWZ1bmN0aW9uICdlcmxhbmctZW5kLW9mLWZ1bmN0aW9uKQotKGVybGFuZy1vYnNvbGV0ZSAnbWFyay1lcmxhbmctZnVuY3Rpb24gJ2VybGFuZy1tYXJrLWZ1bmN0aW9uKQotKGVybGFuZy1vYnNvbGV0ZSAncGFzcy1vdmVyLWVybGFuZy1jbGF1c2UgJ2VybGFuZy1wYXNzLW92ZXItZnVuY3Rpb24pCi0oZXJsYW5nLW9ic29sZXRlICduYW1lLW9mLWVybGFuZy1mdW5jdGlvbiAnZXJsYW5nLW5hbWUtb2YtZnVuY3Rpb24pCi0KLQotOzsgVGhlIGVuZC4uLgotCi0ocHJvdmlkZSAnZXJsYW5nKQotCi0ocnVuLWhvb2tzICdlcmxhbmctbG9hZC1ob29rKQotCi07OzsgZXJsYW5nLmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy91dGlsaXRpZXMvYXBwZ2VuIGIvbGliL2VybC90b29scy91dGlsaXRpZXMvYXBwZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjE5MjIyLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvdXRpbGl0aWVzL2FwcGdlbgorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0KLWlmIFsgJCMgLW5lIDIgXTt0aGVuCi0JZWNobyAiIgotCWVjaG8gInVzYWdlOiAkMCA8YXBwbmFtZT4gPHByZWZpeD4iCi0JZWNobyAiIgotCWVjaG8gImFwcG5hbWUgaXMgdGhlIHRpdGxlIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBnZW5lcmF0ZWQiCi0JZWNobyAicHJlZml4IGlzIHRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIGFsbCBmaWxlcyBpbiIKLQllY2hvICJ0aGUgYXBwbGljYXRpb24gZHVlIHRvIGVybGFuZ3MgbGFjayBvZiBhIHBhY2thZ2Ugc3RydWN0dXJlLiAgVGhlIHByZWZpeCIKLQllY2hvICJpcyB0eXBpY2FseSB0aGUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggd29yZCBpbiB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24iCi0JZWNobyAiIgotCWVjaG8gImV4YW1wbGU6ICQwIGNoYXRfc2VydmVyIGNzIgotCWVjaG8gIiIKLQlleGl0IDEKLWZpCi0KLUFQUF9OQU1FPSQxCi1BUFBfTkFNRV9VUFBFUl9DQVNFPSQoZWNobyAkQVBQX05BTUUgfCB0ciBhLXogQS1aKQotUFJFRklYPSQyCi0KLWNkIC4uLy5hcHBnZW4KLWVjaG8gYHB3ZGAKLQotY3AgLXIgYmxhbmtfYXBwICRBUFBfTkFNRQotY3AgLXIgYmxhbmtfYXBwX3JlbCAiJEFQUF9OQU1FIl9yZWwKLQotY2QgIiRBUFBfTkFNRSJfcmVsCi1scyBibGFua19hcHAqIHwgLi4vcmVuYW1lLnNoIGJsYW5rX2FwcCAkQVBQX05BTUUKLWNkIC4uCi0KLSMgVGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSByZWxlYXNlCi0uL3N1YnN0aXR1dGUuc2ggJSVBUFBfTkFNRSUlICRBUFBfTkFNRSAiJEFQUF9OQU1FIl9yZWwvIiRBUFBfTkFNRSJfcmVsLnJlbC5zcmMKLQotCi1jZCAkQVBQX05BTUUvc3JjCi1scyBiYSogfCAuLi8uLi9yZW5hbWUuc2ggYmEgJFBSRUZJWAotbHMgYmxhbmtfYXBwKiB8IC4uLy4uL3JlbmFtZS5zaCBibGFua19hcHAgJEFQUF9OQU1FCi1jZCAtCi0KLSMgVGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvbgotLi9zdWJzdGl0dXRlLnNoICUlQVBQX05BTUVfVVBQRVJfQ0FTRSUlICRBUFBfTkFNRV9VUFBFUl9DQVNFICRBUFBfTkFNRS9NYWtlZmlsZQotLi9zdWJzdGl0dXRlLnNoICUlQVBQX05BTUVfVVBQRVJfQ0FTRSUlICRBUFBfTkFNRV9VUFBFUl9DQVNFICRBUFBfTkFNRS92c24ubWsKLQotIyBUaGUgc3JjIGRpcmVjdG9yeSBvZiB0aGUgYXBwbGljYXRpb24KLS4vc3Vic3RpdHV0ZS5zaCAlJUFQUF9OQU1FJSUgJEFQUF9OQU1FICRBUFBfTkFNRS9zcmMvTWFrZWZpbGUKLS4vc3Vic3RpdHV0ZS5zaCAlJUFQUF9OQU1FX1VQUEVSX0NBU0UlJSAkQVBQX05BTUVfVVBQRVJfQ0FTRSAkQVBQX05BTUUvc3JjL01ha2VmaWxlCi0uL3N1YnN0aXR1dGUuc2ggJSVQRlglJSAkUFJFRklYICRBUFBfTkFNRS9zcmMvTWFrZWZpbGUKLQotLi9zdWJzdGl0dXRlLnNoICUlQVBQX05BTUUlJSAkQVBQX05BTUUgJEFQUF9OQU1FL3NyYy8iJEFQUF9OQU1FIi5lcmwKLS4vc3Vic3RpdHV0ZS5zaCAlJVBGWCUlICRQUkVGSVggJEFQUF9OQU1FL3NyYy8iJEFQUF9OQU1FIi5lcmwKLS4vc3Vic3RpdHV0ZS5zaCAlJVBGWCUlICRQUkVGSVggJEFQUF9OQU1FL3NyYy8iJFBSRUZJWCJfc3VwLmVybAotLi9zdWJzdGl0dXRlLnNoICUlQVBQX05BTUUlJSAkQVBQX05BTUUgJEFQUF9OQU1FL3NyYy8iJFBSRUZJWCJfc3VwLmVybAotLi9zdWJzdGl0dXRlLnNoICUlUEZYJSUgJFBSRUZJWCAkQVBQX05BTUUvc3JjLyIkUFJFRklYIl9zZXJ2ZXIuZXJsCi0uL3N1YnN0aXR1dGUuc2ggJSVBUFBfTkFNRSUlICRBUFBfTkFNRSAkQVBQX05BTUUvc3JjLyIkUFJFRklYIl9zZXJ2ZXIuZXJsCi0KLSMgaW5jbHVkZSBkaXJlY3RvcnkKLW12ICRBUFBfTkFNRS9pbmNsdWRlL2JsYW5rX2FwcC5ocmwgJEFQUF9OQU1FL2luY2x1ZGUvIiRBUFBfTkFNRSIuaHJsCi0KLWZpbmQgJEFQUF9OQU1FIC1uYW1lICIuc3ZuIiB8IHhhcmdzIHJtIC1yCi1tdiAkQVBQX05BTUUgLi4vLi4vbGliCi1tdiAiJEFQUF9OQU1FIl9yZWwgLi4vLi4vcmVsZWFzZQotCi1lY2hvICIiCi1lY2hvICIkQVBQX05BTUUgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBwbGFjZWQgdW5kZXIgbGliLyRBUFBfTkFNRSIKLWVjaG8gJEFQUF9OQU1FIl9yZWwgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBwbGFjZWQgdW5kZXIgcmVsZWFzZS8kQVBQX05BTUUiIl9yZWwiCi1lY2hvICIiCi0KLWNkIC4uL3V0aWxpdGllcwpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy91dGlsaXRpZXMvY2xlYW5fcmVsZWFzZSBiL2xpYi9lcmwvdG9vbHMvdXRpbGl0aWVzL2NsZWFuX3JlbGVhc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyMDI2OTAuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90b29scy91dGlsaXRpZXMvY2xlYW5fcmVsZWFzZQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLWlmIFsgJCMgLWVxIDEgXTsgdGhlbgotCVJFTEVBU0VfTkFNRT0kMQotZWxzZQotCVJFTEVBU0VfTkFNRT0kKGJhc2VuYW1lICQoZGlybmFtZSAkKGRpcm5hbWUgJChkaXJuYW1lICQod2hpY2ggJDApKSkpKQotZmkKLQotTE9DQUw9JChkaXJuYW1lICQod2hpY2ggJDApKQotCi1lY2hvICRMT0NBTAotZWNobyAkUkVMRUFTRV9OQU1FCi1jZCAkTE9DQUwKLQotZWNobyAiCi0tbW9kdWxlKGNsZWFuX3JlbGVhc2UpLiAKLS1leHBvcnQoW2NsZWFuX3JlbGVhc2UvMV0pLiAKLQotY2xlYW5fcmVsZWFzZShbUmVsZWFzZU5hbWVdKSAtPiAKLSAgICBSZWxGaWxlID0gYXRvbV90b19saXN0KFJlbGVhc2VOYW1lKSArKyBcIi5yZWxcIiwKLSAgICBjYXNlIGZpbGU6Y29uc3VsdChSZWxGaWxlKSBvZgotCXtvaywgW3tyZWxlYXNlLCB7UmVsTmFtZSwgUmVsVnNufSwgRXJ0c1NwZWMsIFJlbGVhc2VTcGVjc31dfSAtPiBkb19yZXN0KFJlbEZpbGUsIFJlbGVhc2VTcGVjcyk7Ci0Je2Vycm9yLCBSZWFzb259IC0+IGlvOmZvcm1hdChcIkVSUk9SIC0gQ291bGQgbm90IGZpbmQgZmlsZSB+c35uXCIsIFtSZWxGaWxlXSksIGV4aXQoUmVhc29uKQotICAgIGVuZCwKLSAgICBvczpjbWQoXCJjZCAuLi87cm0gLXJmIFwiICsrIHN0cmluZzpzdHJpcChvczpjbWQoXCJiYXNlbmFtZSBgcHdkYFwiKSkpLgotCSAgICAgCi1kb19yZXN0KFJlbEZpbGUsIFJlbGVhc2VTcGVjcykgLT4KLSAgICBpbzpmb3JtYXQoXCJGaW5kaW5nIE9ycGhhbnMgaW4gfnAgYW1vbmcgY3VycmVudCByZWxlYXNlIHNwZWNzIH5wfm5cIiwgW1JlbEZpbGUsIFJlbGVhc2VTcGVjc10pLAotICAgIHtvaywgRmlsZU5hbWVMaXN0fSAgICA9IGZpbGU6bGlzdF9kaXIoXCIuLi9cIiksCi0gICAgRGlycyA9IFtGaWxlTmFtZSB8fCBGaWxlTmFtZSA8LSBGaWxlTmFtZUxpc3QsIGZpbGVsaWI6aXNfZGlyKFwiLi4vXCIgKysgRmlsZU5hbWUpXSAtLQotCSAgIFtzdHJpbmc6c3RyaXAob3M6Y21kKFwiYmFzZW5hbWUgYHB3ZGBcIiksIHJpZ2h0LCAkXG4pXSwKLSAgICBCaWdMaXN0T2ZSZWxlYXNlU3BlY3MgPSBsaXN0czpmb2xkbChmdW4oRGlyLCBBY2MpIC0+IAotCQkJCQkJT3RoZXJSZWxGaWxlID0gXCIuLi9cIiArKyBEaXIgKysgXCIvXCIgKysgUmVsRmlsZSwKLQkJCQkJCWlvOmZvcm1hdChcIkNoZWNraW5nIGV4dGVybmFsIHJlbGVhc2UgZmlsZSB+cH5uXCIsIFtPdGhlclJlbEZpbGVdKSwKLQkJCQkJCWNhc2UgZmlsZTpjb25zdWx0KE90aGVyUmVsRmlsZSkgb2YKLQkJCQkJCSAgICB7b2ssIFt7cmVsZWFzZSwge1JlbE5hbWUsIFJlbFZzbn0sIEVydHNTcGVjLCBSZWxlYXNlU3BlY3NffV19IC0+IAotCQkJCQkJCUFjYyArKyBSZWxlYXNlU3BlY3NfOwotCQkJCQkJICAgIF8gIC0+IAotCQkJCQkJCUFjYwotCQkJCQkJZW5kIGVuZCwgW10sIERpcnMpLAotICAgIE9ycGhhbnMgPSBSZWxlYXNlU3BlY3MgLS0gQmlnTGlzdE9mUmVsZWFzZVNwZWNzLAotICAgIGlvOmZvcm1hdChcIlJlbW92aW5nIG9ycGhhbiByZWxlYXNlIHNwZWNzIH5wIGZyb20gLi4vLi4vbGliIH5uXCIsIFtPcnBoYW5zXSksCi0gICAgbGlzdHM6Zm9yZWFjaChmdW4oT3JwaGFuKSAtPiAKLQkJCSAgb3M6Y21kKFwicm0gLXJmIC4uLy4uL2xpYi9cIiArKyBhdG9tX3RvX2xpc3QoZWxlbWVudCgxLCBPcnBoYW4pKSArKyBcIi1cIiArKyBlbGVtZW50KDIsIE9ycGhhbikpIAotCQkgIGVuZCwgT3JwaGFucykuCi0iID4gY2xlYW5fcmVsZWFzZS5lcmwKLQotZXJsYyBjbGVhbl9yZWxlYXNlLmVybAotCi1DTUQ9ImVybCAtcyBjbGVhbl9yZWxlYXNlIGNsZWFuX3JlbGVhc2UgJFJFTEVBU0VfTkFNRSAtcyBlcmxhbmcgaGFsdCAtbm9zaGVsbCIKLSRDTUQKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvdXRpbGl0aWVzL2Vkb2MgYi9saWIvZXJsL3Rvb2xzL3V0aWxpdGllcy9lZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzJmMjYxLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdG9vbHMvdXRpbGl0aWVzL2Vkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIS9iaW4vc2gKLWlmIFsgIiQjIiAtbmUgIjEiIF0KLXRoZW4KLQllY2hvICRVU0FHRQotCWV4aXQgMQotZmkKLQotQ1VSUkVOVF9ESVI9YHB3ZGAKLWVjaG8gJENVUlJFTlRfRElSCi0KLSMgRXN0YWJsaXNoIHRoZSBvdHAgYmFzZSBkaXJlY3RvcnkuCi1NWV9DTUQ9YHdoaWNoICQwYAotTVlfQ01EX0RJUj1gZGlybmFtZSAkTVlfQ01EYAotT1RQX0JBU0VfRElSPSRNWV9DTURfRElSLy4uLy4uCi0KLWVybCAtbm9zaGVsbCAtcHogJE9UUF9CQVNFX0RJUi9saWIvZnNsaWIvZWJpbiAtcyBmc19saWIgc19hcHBseSBlZG9jIGFwcGxpY2F0aW9uICIkMSIuICAiXCIuLi8uLi8kMSJcIi4gW10uIiAiIC1zIGluaXQgc3RvcCB8IGVncmVwICIoRVhJVHx0ZXJtaW5hdGluZykiCmRpZmYgLS1naXQgYS9saWIvZXJsL2xpYi90aHJpZnQvdnNuLm1rIGIvbGliL2VybC92c24ubWsKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvbGliL3RocmlmdC92c24ubWsKcmVuYW1lIHRvIGxpYi9lcmwvdnNuLm1rCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvRXJsQ2xpZW50LnJiIGIvdHV0b3JpYWwvZXJsL0VybENsaWVudC5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmMTMwMC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9lcmwvRXJsQ2xpZW50LnJiCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcnVieQotCi0kOi5wdXNoKCcuLi9nZW4tcmInKQotCi1yZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3Rzb2NrZXQnCi1yZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvdGJpbmFyeXByb3RvY29sJwotCi1yZXF1aXJlICdDYWxjdWxhdG9yJwotCi1iZWdpbgotICAKLSAgdHJhbnNwb3J0ID0gVEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyhUU29ja2V0Lm5ldygnbG9jYWxob3N0JywgOTA5MCkpCi0gIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLm5ldyh0cmFuc3BvcnQpCi0gIGNsaWVudCA9IENhbGN1bGF0b3I6OkNsaWVudC5uZXcocHJvdG9jb2wpCi0gIAotICB0cmFuc3BvcnQub3BlbigpCi0gIAotICBjbGllbnQucGluZygpCi0gIHByaW50ICJwaW5nKClcbiIKLSAgCi0gIHN1bSA9IGNsaWVudC5hZGQoMSwxKQotICBwcmludCAiMSsxPSIsIHN1bSwgIlxuIgotICAKLSAgd29yayA9IFdvcmsubmV3KCkKLSAgCi0gIGJlZ2luCi0gICAgd29yay5vcCA9IE9wZXJhdGlvbjo6RElWSURFCi0gICAgd29yay5udW0xID0gMQotICAgIHdvcmsubnVtMiA9IDAKLSAgICBxdW90ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHB1dHMgIldob2EsIHdlIGNhbiBkaXZpZGUgYnkgMCBub3c/IgotICByZXNjdWUgSW52YWxpZE9wZXJhdGlvbiA9PiBpbwotICAgIHByaW50ICJJbnZhbGlkT3BlcmF0aW9uOiAiLCBpby53aHksICJcbiIKLSAgZW5kCi0gIAotICB3b3JrLm9wID0gT3BlcmF0aW9uOjpTVUJUUkFDVAotICB3b3JrLm51bTEgPSAxNQotICB3b3JrLm51bTIgPSAxMAotICBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICBwcmludCAiMTUtMTA9IiwgZGlmZiwgIlxuIgotICAKLSAgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAiTG9nOiAiLCBsb2cudmFsdWUsICJcbiIKLSAgCi0gIHRyYW5zcG9ydC5jbG9zZSgpCi0KLXJlc2N1ZSBURXhjZXB0aW9uID0+IHR4Ci0gIHByaW50ICdURXhjZXB0aW9uOiAnLCB0eC5tZXNzYWdlLCAiXG4iCi1lbmQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsIGIvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwKaW5kZXggMmE0NGUxZC4uYWIyYjA0MCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwKKysrIGIvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwKQEAgLTgsNyArOCw3IEBACiAtaW5jbHVkZSgic2VydmVyL3RFcmxTZXJ2ZXIuaHJsIikuCiAtaW5jbHVkZSgidHJhbnNwb3J0L3RFcmxBY2NlcHRvci5ocmwiKS4KIAotLWluY2x1ZGUoImNhbGN1bGF0b3IuaHJsIikuCistaW5jbHVkZSgiY2FsY3VsYXRvcl90aHJpZnQuaHJsIikuCiAKIC1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzEsIHN0b3AvMSwgcGluZy8wLCBhZGQvMiwgY2FsY3VsYXRlLzIsIGdldFN0cnVjdC8xLCB6aXAvMF0pLgogCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICB9XSksCiAKICAgICBIYW5kbGVyICAgPSA/TU9EVUxFLAotICAgIFByb2Nlc3NvciA9IGNhbGN1bGF0b3IsCisgICAgUHJvY2Vzc29yID0gY2FsY3VsYXRvcl90aHJpZnQsCiAKICAgICBURiA9IHRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk6bmV3KCksCiAgICAgUEYgPSB0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Om5ldygpLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5zaCBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTc2MzUyNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuc2gKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisKK0VSTF9USFJJRlQ9Li4vLi4vbGliL2VybAorCitpZiAhIFsgLWQgJHtFUkxfVEhSSUZUfS9lYmluIF07IHRoZW4KKyAgICBlY2hvICJQbGVhc2UgYnVpbGQgdGhlIFRocmlmdCBsaWJyYXJ5IGJ5IHJ1bm5pbmcgXGBtYWtlJyBpbiAke0VSTF9USFJJRlR9IgorICAgIGV4aXQgMQorZmkKKworaWYgISBbIC1kIC4uL2dlbi1lcmwgXTsgdGhlbgorICAgIGVjaG8gIlBsZWFzZSBydW4gdGhyaWZ0IGZpcnN0IHRvIGdlbmVyYXRlIC4uL2dlbi1lcmwvIgorICAgIGV4aXQgMQorZmkKKworCitlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAuLi9nZW4tZXJsIC1vIC4uL2dlbi1lcmwgLi4vZ2VuLWVybC8qLmVybCAgJiYKKyAgZXJsYyAtSSAke0VSTF9USFJJRlR9L2luY2x1ZGUgLUkgLi4vZ2VuLWVybCAqLmVybCAmJgorICBlcmwgK0sgdHJ1ZSAtcGEgJHtFUkxfVEhSSUZUfS9lYmluIC1wYSAuLi9nZW4tZXJsCmRpZmYgLS1naXQgYS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQgYi90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKaW5kZXggOGFmMDE2YS4uN2IzNzdkNiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisrKyBiL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdApAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9sb2NhbC9iaW4vdGhyaWZ0IC1jcHAgLWphdmEgLXB5IC1waHAgLXJiIC1wZXJsIC14c2QgLXIKKyMhL3Vzci9sb2NhbC9iaW4vdGhyaWZ0IC1jcHAgLWphdmEgLXB5IC1waHAgLXJiIC1wZXJsIC1lcmwgLXhzZCAtcgogIwogIyBUaHJpZnQgVHV0b3JpYWwKICMgTWFyayBTbGVlIChtY3NsZWVAZmFjZWJvb2suY29tKQo=