#!/bin/bash template() { base64 -d <<. PE1Eb21haW4ge1NJVEVfTkFNRX0+CiAgICAgICAgTURDb250YWN0RW1haWwgd2VibWFzdGVyQHtT SVRFX05BTUV9CiAgICAgICAgTURDZXJ0aWZpY2F0ZUFncmVlbWVudCBhY2NlcHRlZAogICAgICAg IE1EUmVxdWlyZUh0dHBzIHRlbXBvcmFyeQo8L01Eb21haW4+CjxWaXJ0dWFsSG9zdCAqOjQ0Mz4K CVNlcnZlck5hbWUge1NJVEVfTkFNRX0KCVNlcnZlckFkbWluIHdlYm1hc3RlckB7U0lURV9OQU1F fQoKCURvY3VtZW50Um9vdCAvdmFyL3d3dy9odG1sCgoJIyBBdmFpbGFibGUgbG9nbGV2ZWxzOiB0 cmFjZTgsIC4uLiwgdHJhY2UxLCBkZWJ1ZywgaW5mbywgbm90aWNlLCB3YXJuLAoJIyBlcnJvciwg Y3JpdCwgYWxlcnQsIGVtZXJnLgoJIyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0 aGUgbG9nbGV2ZWwgZm9yIHBhcnRpY3VsYXIKCSMgbW9kdWxlcywgZS5nLgoJI0xvZ0xldmVsIGlu Zm8gc3NsOndhcm4KCglFcnJvckxvZyAkXHtBUEFDSEVfTE9HX0RJUlx9L2Vycm9yLmxvZwoJQ3Vz dG9tTG9nICRce0FQQUNIRV9MT0dfRElSXH0vYWNjZXNzLmxvZyBjb21iaW5lZAoKCSMgRm9yIG1v c3QgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIGNvbmYtYXZhaWxhYmxlLywgd2hpY2ggYXJlCgkj IGVuYWJsZWQgb3IgZGlzYWJsZWQgYXQgYSBnbG9iYWwgbGV2ZWwsIGl0IGlzIHBvc3NpYmxlIHRv CgkjIGluY2x1ZGUgYSBsaW5lIGZvciBvbmx5IG9uZSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdC4g Rm9yIGV4YW1wbGUgdGhlCgkjIGZvbGxvd2luZyBsaW5lIGVuYWJsZXMgdGhlIENHSSBjb25maWd1 cmF0aW9uIGZvciB0aGlzIGhvc3Qgb25seQoJIyBhZnRlciBpdCBoYXMgYmVlbiBnbG9iYWxseSBk aXNhYmxlZCB3aXRoICJhMmRpc2NvbmYiLgoJI0luY2x1ZGUgY29uZi1hdmFpbGFibGUvc2VydmUt Y2dpLWJpbi5jb25mCgoJIyAgIFNTTCBFbmdpbmUgU3dpdGNoOgoJIyAgIEVuYWJsZS9EaXNhYmxl IFNTTCBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuCglTU0xFbmdpbmUgb24KCgkjICAgQSBzZWxmLXNp Z25lZCAoc25ha2VvaWwpIGNlcnRpZmljYXRlIGNhbiBiZSBjcmVhdGVkIGJ5IGluc3RhbGxpbmcK CSMgICB0aGUgc3NsLWNlcnQgcGFja2FnZS4gU2VlCgkjICAgL3Vzci9zaGFyZS9kb2MvYXBhY2hl Mi9SRUFETUUuRGViaWFuLmd6IGZvciBtb3JlIGluZm8uCgkjICAgSWYgYm90aCBrZXkgYW5kIGNl cnRpZmljYXRlIGFyZSBzdG9yZWQgaW4gdGhlIHNhbWUgZmlsZSwgb25seSB0aGUKCSMgICBTU0xD ZXJ0aWZpY2F0ZUZpbGUgZGlyZWN0aXZlIGlzIG5lZWRlZC4KCSNTU0xDZXJ0aWZpY2F0ZUZpbGUg ICAgICAvZXRjL3NzbC9jZXJ0cy9zc2wtY2VydC1zbmFrZW9pbC5wZW0KCSNTU0xDZXJ0aWZpY2F0 ZUtleUZpbGUgICAvZXRjL3NzbC9wcml2YXRlL3NzbC1jZXJ0LXNuYWtlb2lsLmtleQoKCSMgICBT ZXJ2ZXIgQ2VydGlmaWNhdGUgQ2hhaW46CgkjICAgUG9pbnQgU1NMQ2VydGlmaWNhdGVDaGFpbkZp bGUgYXQgYSBmaWxlIGNvbnRhaW5pbmcgdGhlCgkjICAgY29uY2F0ZW5hdGlvbiBvZiBQRU0gZW5j b2RlZCBDQSBjZXJ0aWZpY2F0ZXMgd2hpY2ggZm9ybSB0aGUKCSMgICBjZXJ0aWZpY2F0ZSBjaGFp biBmb3IgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4gQWx0ZXJuYXRpdmVseQoJIyAgIHRoZSByZWZl cmVuY2VkIGZpbGUgY2FuIGJlIHRoZSBzYW1lIGFzIFNTTENlcnRpZmljYXRlRmlsZQoJIyAgIHdo ZW4gdGhlIENBIGNlcnRpZmljYXRlcyBhcmUgZGlyZWN0bHkgYXBwZW5kZWQgdG8gdGhlIHNlcnZl cgoJIyAgIGNlcnRpZmljYXRlIGZvciBjb252aW5pZW5jZS4KCSNTU0xDZXJ0aWZpY2F0ZUNoYWlu RmlsZSAvZXRjL2FwYWNoZTIvc3NsLmNydC9zZXJ2ZXItY2EuY3J0CgoJIyAgIENlcnRpZmljYXRl IEF1dGhvcml0eSAoQ0EpOgoJIyAgIFNldCB0aGUgQ0EgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9u IHBhdGggd2hlcmUgdG8gZmluZCBDQQoJIyAgIGNlcnRpZmljYXRlcyBmb3IgY2xpZW50IGF1dGhl bnRpY2F0aW9uIG9yIGFsdGVybmF0aXZlbHkgb25lCgkjICAgaHVnZSBmaWxlIGNvbnRhaW5pbmcg YWxsIG9mIHRoZW0gKGZpbGUgbXVzdCBiZSBQRU0gZW5jb2RlZCkKCSMgICBOb3RlOiBJbnNpZGUg U1NMQ0FDZXJ0aWZpY2F0ZVBhdGggeW91IG5lZWQgaGFzaCBzeW1saW5rcwoJIwkgIHRvIHBvaW50 IHRvIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlcy4gVXNlIHRoZSBwcm92aWRlZAoJIwkgIE1ha2VmaWxl IHRvIHVwZGF0ZSB0aGUgaGFzaCBzeW1saW5rcyBhZnRlciBjaGFuZ2VzLgoJI1NTTENBQ2VydGlm aWNhdGVQYXRoIC9ldGMvc3NsL2NlcnRzLwoJI1NTTENBQ2VydGlmaWNhdGVGaWxlIC9ldGMvYXBh Y2hlMi9zc2wuY3J0L2NhLWJ1bmRsZS5jcnQKCgkjICAgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBM aXN0cyAoQ1JMKToKCSMgICBTZXQgdGhlIENBIHJldm9jYXRpb24gcGF0aCB3aGVyZSB0byBmaW5k IENBIENSTHMgZm9yIGNsaWVudAoJIyAgIGF1dGhlbnRpY2F0aW9uIG9yIGFsdGVybmF0aXZlbHkg b25lIGh1Z2UgZmlsZSBjb250YWluaW5nIGFsbAoJIyAgIG9mIHRoZW0gKGZpbGUgbXVzdCBiZSBQ RU0gZW5jb2RlZCkKCSMgICBOb3RlOiBJbnNpZGUgU1NMQ0FSZXZvY2F0aW9uUGF0aCB5b3UgbmVl ZCBoYXNoIHN5bWxpbmtzCgkjCSAgdG8gcG9pbnQgdG8gdGhlIGNlcnRpZmljYXRlIGZpbGVzLiBV c2UgdGhlIHByb3ZpZGVkCgkjCSAgTWFrZWZpbGUgdG8gdXBkYXRlIHRoZSBoYXNoIHN5bWxpbmtz IGFmdGVyIGNoYW5nZXMuCgkjU1NMQ0FSZXZvY2F0aW9uUGF0aCAvZXRjL2FwYWNoZTIvc3NsLmNy bC8KCSNTU0xDQVJldm9jYXRpb25GaWxlIC9ldGMvYXBhY2hlMi9zc2wuY3JsL2NhLWJ1bmRsZS5j cmwKCgkjICAgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIChUeXBlKToKCSMgICBDbGllbnQgY2VydGlm aWNhdGUgdmVyaWZpY2F0aW9uIHR5cGUgYW5kIGRlcHRoLiAgVHlwZXMgYXJlCgkjICAgbm9uZSwg b3B0aW9uYWwsIHJlcXVpcmUgYW5kIG9wdGlvbmFsX25vX2NhLiAgRGVwdGggaXMgYQoJIyAgIG51 bWJlciB3aGljaCBzcGVjaWZpZXMgaG93IGRlZXBseSB0byB2ZXJpZnkgdGhlIGNlcnRpZmljYXRl CgkjICAgaXNzdWVyIGNoYWluIGJlZm9yZSBkZWNpZGluZyB0aGUgY2VydGlmaWNhdGUgaXMgbm90 IHZhbGlkLgoJI1NTTFZlcmlmeUNsaWVudCByZXF1aXJlCgkjU1NMVmVyaWZ5RGVwdGggIDEwCgoJ IyAgIFNTTCBFbmdpbmUgT3B0aW9uczoKCSMgICBTZXQgdmFyaW91cyBvcHRpb25zIGZvciB0aGUg U1NMIGVuZ2luZS4KCSMgICBvIEZha2VCYXNpY0F1dGg6CgkjICAgIFRyYW5zbGF0ZSB0aGUgY2xp ZW50IFguNTA5IGludG8gYSBCYXNpYyBBdXRob3Jpc2F0aW9uLiAgVGhpcyBtZWFucyB0aGF0Cgkj ICAgIHRoZSBzdGFuZGFyZCBBdXRoL0RCTUF1dGggbWV0aG9kcyBjYW4gYmUgdXNlZCBmb3IgYWNj ZXNzIGNvbnRyb2wuICBUaGUKCSMgICAgdXNlciBuYW1lIGlzIHRoZSBgb25lIGxpbmUnIHZlcnNp b24gb2YgdGhlIGNsaWVudCdzIFguNTA5IGNlcnRpZmljYXRlLgoJIyAgICBOb3RlIHRoYXQgbm8g cGFzc3dvcmQgaXMgb2J0YWluZWQgZnJvbSB0aGUgdXNlci4gRXZlcnkgZW50cnkgaW4gdGhlIHVz ZXIKCSMgICAgZmlsZSBuZWVkcyB0aGlzIHBhc3N3b3JkOiBgeHhqMzFaTVRaemtWQScuCgkjICAg byBFeHBvcnRDZXJ0RGF0YToKCSMgICAgVGhpcyBleHBvcnRzIHR3byBhZGRpdGlvbmFsIGVudmly b25tZW50IHZhcmlhYmxlczogU1NMX0NMSUVOVF9DRVJUIGFuZAoJIyAgICBTU0xfU0VSVkVSX0NF UlQuIFRoZXNlIGNvbnRhaW4gdGhlIFBFTS1lbmNvZGVkIGNlcnRpZmljYXRlcyBvZiB0aGUKCSMg ICAgc2VydmVyIChhbHdheXMgZXhpc3RpbmcpIGFuZCB0aGUgY2xpZW50IChvbmx5IGV4aXN0aW5n IHdoZW4gY2xpZW50CgkjICAgIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQpLiBUaGlzIGNhbiBiZSB1 c2VkIHRvIGltcG9ydCB0aGUgY2VydGlmaWNhdGVzCgkjICAgIGludG8gQ0dJIHNjcmlwdHMuCgkj ICAgbyBTdGRFbnZWYXJzOgoJIyAgICBUaGlzIGV4cG9ydHMgdGhlIHN0YW5kYXJkIFNTTC9UTFMg cmVsYXRlZCBgU1NMXyonIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCSMgICAgUGVyIGRlZmF1bHQg dGhpcyBleHBvcnRhdGlvbiBpcyBzd2l0Y2hlZCBvZmYgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMs CgkjICAgIGJlY2F1c2UgdGhlIGV4dHJhY3Rpb24gc3RlcCBpcyBhbiBleHBlbnNpdmUgb3BlcmF0 aW9uIGFuZCBpcyB1c3VhbGx5CgkjICAgIHVzZWxlc3MgZm9yIHNlcnZpbmcgc3RhdGljIGNvbnRl bnQuIFNvIG9uZSB1c3VhbGx5IGVuYWJsZXMgdGhlCgkjICAgIGV4cG9ydGF0aW9uIGZvciBDR0kg YW5kIFNTSSByZXF1ZXN0cyBvbmx5LgoJIyAgIG8gT3B0UmVuZWdvdGlhdGU6CgkjICAgIFRoaXMg ZW5hYmxlcyBvcHRpbWl6ZWQgU1NMIGNvbm5lY3Rpb24gcmVuZWdvdGlhdGlvbiBoYW5kbGluZyB3 aGVuIFNTTAoJIyAgICBkaXJlY3RpdmVzIGFyZSB1c2VkIGluIHBlci1kaXJlY3RvcnkgY29udGV4 dC4KCSNTU0xPcHRpb25zICtGYWtlQmFzaWNBdXRoICtFeHBvcnRDZXJ0RGF0YSArU3RyaWN0UmVx dWlyZQoJPEZpbGVzTWF0Y2ggIlxcLig/OmNnaXxzaHRtbHxwaHRtbHxwaHApJCI+CgkJU1NMT3B0 aW9ucyArU3RkRW52VmFycwoJPC9GaWxlc01hdGNoPgoJPERpcmVjdG9yeSAvdXNyL2xpYi9jZ2kt YmluPgoJCVNTTE9wdGlvbnMgK1N0ZEVudlZhcnMKCTwvRGlyZWN0b3J5PgoKCSMgICBTU0wgUHJv dG9jb2wgQWRqdXN0bWVudHM6CgkjICAgVGhlIHNhZmUgYW5kIGRlZmF1bHQgYnV0IHN0aWxsIFNT TC9UTFMgc3RhbmRhcmQgY29tcGxpYW50IHNodXRkb3duCgkjICAgYXBwcm9hY2ggaXMgdGhhdCBt b2Rfc3NsIHNlbmRzIHRoZSBjbG9zZSBub3RpZnkgYWxlcnQgYnV0IGRvZXNuJ3Qgd2FpdCBmb3IK CSMgICB0aGUgY2xvc2Ugbm90aWZ5IGFsZXJ0IGZyb20gY2xpZW50LiBXaGVuIHlvdSBuZWVkIGEg ZGlmZmVyZW50IHNodXRkb3duCgkjICAgYXBwcm9hY2ggeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBm b2xsb3dpbmcgdmFyaWFibGVzOgoJIyAgIG8gc3NsLXVuY2xlYW4tc2h1dGRvd246CgkjICAgIFRo aXMgZm9yY2VzIGFuIHVuY2xlYW4gc2h1dGRvd24gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9z ZWQsIGkuZS4gbm8KCSMgICAgU1NMIGNsb3NlIG5vdGlmeSBhbGVydCBpcyBzZW5kIG9yIGFsbG93 ZWQgdG8gcmVjZWl2ZWQuICBUaGlzIHZpb2xhdGVzCgkjICAgIHRoZSBTU0wvVExTIHN0YW5kYXJk IGJ1dCBpcyBuZWVkZWQgZm9yIHNvbWUgYnJhaW4tZGVhZCBicm93c2Vycy4gVXNlCgkjICAgIHRo aXMgd2hlbiB5b3UgcmVjZWl2ZSBJL08gZXJyb3JzIGJlY2F1c2Ugb2YgdGhlIHN0YW5kYXJkIGFw cHJvYWNoIHdoZXJlCgkjICAgIG1vZF9zc2wgc2VuZHMgdGhlIGNsb3NlIG5vdGlmeSBhbGVydC4K CSMgICBvIHNzbC1hY2N1cmF0ZS1zaHV0ZG93bjoKCSMgICAgVGhpcyBmb3JjZXMgYW4gYWNjdXJh dGUgc2h1dGRvd24gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQsIGkuZS4gYQoJIyAgICBT U0wgY2xvc2Ugbm90aWZ5IGFsZXJ0IGlzIHNlbmQgYW5kIG1vZF9zc2wgd2FpdHMgZm9yIHRoZSBj bG9zZSBub3RpZnkKCSMgICAgYWxlcnQgb2YgdGhlIGNsaWVudC4gVGhpcyBpcyAxMDAlIFNTTC9U TFMgc3RhbmRhcmQgY29tcGxpYW50LCBidXQgaW4KCSMgICAgcHJhY3RpY2Ugb2Z0ZW4gY2F1c2Vz IGhhbmdpbmcgY29ubmVjdGlvbnMgd2l0aCBicmFpbi1kZWFkIGJyb3dzZXJzLiBVc2UKCSMgICAg dGhpcyBvbmx5IGZvciBicm93c2VycyB3aGVyZSB5b3Uga25vdyB0aGF0IHRoZWlyIFNTTCBpbXBs ZW1lbnRhdGlvbgoJIyAgICB3b3JrcyBjb3JyZWN0bHkuCgkjICAgTm90aWNlOiBNb3N0IHByb2Js ZW1zIG9mIGJyb2tlbiBjbGllbnRzIGFyZSBhbHNvIHJlbGF0ZWQgdG8gdGhlIEhUVFAKCSMgICBr ZWVwLWFsaXZlIGZhY2lsaXR5LCBzbyB5b3UgdXN1YWxseSBhZGRpdGlvbmFsbHkgd2FudCB0byBk aXNhYmxlCgkjICAga2VlcC1hbGl2ZSBmb3IgdGhvc2UgY2xpZW50cywgdG9vLiBVc2UgdmFyaWFi bGUgIm5va2VlcGFsaXZlIiBmb3IgdGhpcy4KCSMgICBTaW1pbGFybHksIG9uZSBoYXMgdG8gZm9y Y2Ugc29tZSBjbGllbnRzIHRvIHVzZSBIVFRQLzEuMCB0byB3b3JrYXJvdW5kCgkjICAgdGhlaXIg YnJva2VuIEhUVFAvMS4xIGltcGxlbWVudGF0aW9uLiBVc2UgdmFyaWFibGVzICJkb3duZ3JhZGUt MS4wIiBhbmQKCSMgICAiZm9yY2UtcmVzcG9uc2UtMS4wIiBmb3IgdGhpcy4KCSMgQnJvd3Nlck1h dGNoICJNU0lFIFsyLTZdIiBcXAoJIwlub2tlZXBhbGl2ZSBzc2wtdW5jbGVhbi1zaHV0ZG93biBc XAoJIwlkb3duZ3JhZGUtMS4wIGZvcmNlLXJlc3BvbnNlLTEuMAoKPC9WaXJ0dWFsSG9zdD4K . } dependencies_source() { base64 -d <<. IyEvYmluL2ZhbHNlCgppbnRlcnNlY3Rpb24oKQp7CiAgICAgICAgY29tbSAtMTIgIiRAIgp9Cgpk aWZmZXJlbmNlKCkKewogICAgICAgIGNvbW0gLTIzICIkQCIKfQoKZXh0cmFjdF93b3JkcygpCnsK ICAgICAgICBncmVwIC1vIC1FICdcYlx3K1xiJyB8IHNvcnQgLXUKfQoKaW1tZWRpYXRlX2RlcGVu ZGVuY2llczEoKQp7CiAgICAgICAgaW50ZXJzZWN0aW9uIFwKICAgICAgICAgICAgICAgIDwoY29t cGdlbiAtQSBmdW5jdGlvbiB8IHNvcnQgLXUpIFwKICAgICAgICAgICAgICAgIDwoZGVjbGFyZSAt ZiAiJDEiIHwgZXh0cmFjdF93b3JkcykKfQoKaW1tZWRpYXRlX2RlcGVuZGVuY2llcygpCnsKICAg ICAgICAoZm9yIGYKICAgICAgICBkbwogICAgICAgICAgICAgICAgaW1tZWRpYXRlX2RlcGVuZGVu Y2llczEgIiRmIgogICAgICAgIGRvbmUpIHwgc29ydCAtdQp9CgpyZWN1cnNpdmVfZGVwZW5kZW5j aWVzKCkKewogICAgICAgIGxvY2FsIHNlZW49KCkKICAgICAgICB3aGlsZSBbICQjIC1ndCAwIF0K ICAgICAgICBkbwogICAgICAgICAgICAgICAgc2Vlbis9KCIkQCIpCiAgICAgICAgICAgICAgICBz ZXQgLS0gJChkaWZmZXJlbmNlIDwoaW1tZWRpYXRlX2RlcGVuZGVuY2llcyAiJEAiKSBcCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwocHJpbnRmICclc1xuJyAiJHtzZWVuW0Bd fSIgfCBzb3J0IC11KSkKICAgICAgICBkb25lCiAgICAgICAgcHJpbnRmICclc1xuJyAiJHtzZWVu W0BdfSIKfQo= . } bash_rpc_source() { base64 -d <<. IyEvYmluL2ZhbHNlCgpjb21tYW5kIC12IHJlY3Vyc2l2ZV9kZXBlbmRlbmNpZXMgPi9kZXYvbnVs bCB8fApzb3VyY2UgZGVwZW5kZW5jaWVzLmJhc2gKCiMgSW5wdXQ6ICRCQVNIX1JQQ19SRU1PVEVf REVTVCAtIGhvc3RuYW1lIHBhc3NlZCB0byBzc2ggKHVzZXMgc3NoIGhvc3QgYWxpYXNlcykKIyBJ bnB1dDogJEJBU0hfUlBDX1NTSF9PUFRJT05TIC0gb3B0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8g c3NoICh0aGV5IHByZWNlZGUgJy0tJykKIyBJbnB1dDogIiQwIiAtIGNvcGllZCB0byByZW1vdGUg YmFzaCdzICQwCiMgSW5wdXQ6ICQxIC0gc2hlbGwgc2NyaXB0IHNvdXJjZSBjb2RlIHRvIHJ1biBp biB0aGUgcmVtb3RlIGJhc2gKIyBJbnB1dDogJDIsICQzLCAuLi4gLSBjb21tYW5kIGxpbmUgYXJn dW1lbnRzIHBhc3NlZCB0byB0aGUgcmVtb3RlIGJhc2ggYXMgJDEsICQyLCAuLi4KIyBJbnB1dDog c3RkaW4sIHN0ZG91dCwgc3RkZXJyOiBwYXNzZWQgdG8gdGhlIHJlbW90ZSBiYXNoIG92ZXIgc3No CiMgSW5wdXQ6ICIkU0hFTEwiIC0gcmVtb3RlIHNoZWxsIHRvIGxhdW5jaCAoYmV0dGVyIGJlIGJh c2gpCl9fYmFzaHJwY19fcmVtb3RlX3J1bl9zY3JpcHQoKQp7CiAgICAgICAgbG9jYWwgc2NyaXB0 PSIkMSIKICAgICAgICBzaGlmdAogICAgICAgIEJBU0hfUlBDX1NIRUxMX09QVElPTlM9KC0tbm9y YyAtLW5vcHJvZmlsZSkKICAgICAgICAjIHByaW50ZiAnREVCVUc6PCVzPlxuJyAiJHtCQVNIX1JQ Q19TU0hfT1BUSU9OU1tAXX0iID4mMgogICAgICAgIGV4ZWMgc3NoIFwKICAgICAgICAgICAgICAg ICIke0JBU0hfUlBDX1NTSF9PUFRJT05TW0BdfSIgLS0gXAogICAgICAgICAgICAgICAgIiR7QkFT SF9SUENfUkVNT1RFX0RFU1Q6LWxvY2FsaG9zdH0iIFwKICAgICAgICAgICAgICAgICIkU0hFTEwi ICIke0JBU0hfUlBDX1NIRUxMX09QVElPTlNbQF19IiBcCiAgICAgICAgICAgICAgICAtYyAiJHtz Y3JpcHRAUX0iIFwKICAgICAgICAgICAgICAgICIkMCIgIiR7QEBRfSIKfQoKd2l0aF9zc2hfb3B0 aW9ucygpIHsgX19iYXNocnBjX193aXRoX3NzaF9vcHRpb25zICIkQCI7IH0KX19iYXNocnBjX193 aXRoX3NzaF9vcHRpb25zKCkKewogICAgICAgIGxvY2FsIC1hIEJBU0hfUlBDX1NTSF9PUFRJT05T CiAgICAgICAgd2hpbGUgWyAiJDEiICE9ICctLScgXQogICAgICAgIGRvCiAgICAgICAgICAgICAg ICBpZiBbICQjIC1ndCAwIF0KICAgICAgICAgICAgICAgIHRoZW4KICAgICAgICAgICAgICAgICAg ICAgICAgQkFTSF9SUENfU1NIX09QVElPTlMrPSgiJDEiKQogICAgICAgICAgICAgICAgICAgICAg ICBzaGlmdAogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAg ZmkKICAgICAgICAgICAgICAgID4mMiBwcmludGYgJyVzOiBFcnJvcjogJXNcbicgIiQwIiBcCid3 aXRoX3NzaF9vcHRpb25zKCk6IGV4cGVjdGVkIGFyZ3VtZW50ICItLSIgbm90IGZvdW5kJwogICAg ICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZG9uZQogICAgICAgIHNoaWZ0CiAgICAgICAgIiRA Igp9Cgp3aXRoX3NzaF9vcHRpb24oKSB7IF9fYmFzaHJwY19fd2l0aF9zc2hfb3B0aW9uICIkQCI7 IH0KX19iYXNocnBjX193aXRoX3NzaF9vcHRpb24oKQp7CiAgICAgICAgbG9jYWwgLWEgQkFTSF9S UENfU1NIX09QVElPTlM9KCIke0JBU0hfUlBDX1NTSF9PUFRJT05TW0BdfSIpCiAgICAgICAgQkFT SF9SUENfU1NIX09QVElPTlMrPSgiJDEiKQogICAgICAgIHNoaWZ0CiAgICAgICAgIiRAIgp9Cgoj IFByZXNlcnZlcyB0aGUgcmVzdCBvZiBzdGRpbiBmb3IgdGhlIGNvbW1hbmQuCl9fYmFzaHJwY19f ZXZhbF9zdGRpbigpCnsKICAgICAgICBbICIkMSIgXSAmJiByZWFkIC1OIiQxIiAtciB8fCByZXR1 cm4KCiAgICAgICAgIyBQcmVwYXJlICIkQCIgZm9yIHNjcmlwdCBleGVjdXRpb24gY29udGV4dC4K ICAgICAgICBzaGlmdAoKICAgICAgICAjIEV2ZW4gdW5zZXQgUkVQTFkgdG8gbGVhdmUgcHJpc3Rp bmUgZW52aXJvbm1lbnQuCiAgICAgICAgZXZhbCAidW5zZXQgUkVQTFk7ICRSRVBMWSIKfQoKX19i YXNocnBjX19ydW5fZnVuY3Rpb25fc2ltcGxlKCkKewogICAgICAgIHNjcmlwdF9zb3VyY2U9JChk ZWNsYXJlIC1mICIkMSIgJiYgcHJpbnRmICciJEAiO1xuJykKICAgICAgICBfX2Jhc2hycGNfX3Jl bW90ZV9ydW5fc2NyaXB0ICBcCiAgICAgICAgICAgICAgICAiJHNjcmlwdF9zb3VyY2UiIFwKICAg ICAgICAgICAgICAgICIkQCIKfQoKX19iYXNocnBjX19ub3R0eV9zdGFnZTEoKQp7CiAgICAgICAg WyAiJDEiIF0gJiYKICAgICAgICByZWFkIC1OIiQxIiAtciAmJiAjIFJlYWQgc2NyaXB0IGZyb20g c3RkaW4sIG11bmdlcyBSRVBMWQogICAgICAgIHNoaWZ0ICYmICMgUHJlcGFyZSAiJEAiIGZvciBz Y3JpcHQgZXhlY3V0aW9uIGNvbnRleHQuCiAgICAgICAgZXZhbCAidW5zZXQgUkVQTFk7ICRSRVBM WSIgIyBVbnNldCBtdW5nZWQgUkVQTFkgaW4gZXhlYyBjb250ZXh0Cn0KCl9fYmFzaHJwY19fcmVt b3RlX3J1bl9zdGFnZTFfbm90dHkoKQp7CiAgICAgICAgc3RhZ2UxX3NvdXJjZT0kKAogICAgICAg ICAgICAgICAgZGVjbGFyZSAtZiBfX2Jhc2hycGNfX25vdHR5X3N0YWdlMSB8CiAgICAgICAgICAg ICAgICAgICAgICAgIHNlZCAtRW5lICdzL14gezR9Ly9wJwogICAgICAgICkKICAgICAgICBzdGFn ZTJfc291cmNlPSQxCiAgICAgICAgc2hpZnQKICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmlu dGYgJyVzJyAiJHN0YWdlMl9zb3VyY2UiCiAgICAgICAgICAgICAgICBjYXQKICAgICAgICB9IHwK ICAgICAgICAgICAgICAgIF9fYmFzaHJwY19fcmVtb3RlX3J1bl9zY3JpcHQgXAogICAgICAgICAg ICAgICAgICAgICAgICAiJHN0YWdlMV9zb3VyY2UiICIkeyNzdGFnZTJfc291cmNlfSIgXAogICAg ICAgICAgICAgICAgICAgICAgICAiJEAiCn0KCl9fYmFzaHJwY19fcmVhZF9zdGRpbigpCnsKICAg ICAgICBSRVBMWT0KICAgICAgICByZWFkIC1yIC1OMjE0NzQ4MzY0NyB8fCBbICIkUkVQTFkiIF0K fQoKX19iYXNocnBjX190dHlfc3RhZ2UxKCkKewogICAgICAgIGxvY2FsIFNFVF9URVJNPSIkMSIK ICAgICAgICBsb2NhbCBQUkVMVURFPSJzaGlmdDske0JBU0hfUlBDX1RSQUNFX1JFTU9URTorIHNl dCAteDt9IgogICAgICAgIF9fYmFzaHJwY19fcmVhZF9zdGRpbiA8PEVORAojIFdlIHNhdmVkIHN0 YWdlMiBpbiBURVJNLgojIFN0b3JlIGl0IGluIHBhcmFtZXRlciAxOgpzZXQgLS0gIlwkVEVSTSIg IlwkQCIKIyBSZXN0b3JlIG9yaWdpbmFsIFRFUk06ClRFUk09JHtTRVRfVEVSTUBRfQojIFJ1biBz dGFnZTI6CnNvdXJjZSA8KHByaW50ZiAnJXNcbiVzJyAke1BSRUxVREVAUX0gIlwkMSIpCkVORAog ICAgICAgIHByaW50ZiAnJXMnICIkUkVQTFkiCn0KCl9fYmFzaHJwY19fcmVtb3RlX3J1bl9zdGFn ZTFfdHR5KCkKewogICAgICAgIHN0YWdlMl9zb3VyY2U9JDEKICAgICAgICBzdGFnZTFfc291cmNl PSQoX19iYXNocnBjX190dHlfc3RhZ2UxICIkVEVSTSIgfCBncmVwIC12ICdeIycpCiAgICAgICAg c2hpZnQKICAgICAgICAoCiAgICAgICAgICAgICAgICAjIHByaW50ZiAnREVCVUcyOjwlcz5cbicg IiR7QkFTSF9SUENfU1NIX09QVElPTlNbQF19IiA+JjIKICAgICAgICAgICAgICAgIFRFUk09IiRz dGFnZTJfc291cmNlIiBcCiAgICAgICAgICAgICAgICAgICAgICAgIF9fYmFzaHJwY19fd2l0aF9z c2hfb3B0aW9uIC10IFwKICAgICAgICAgICAgICAgICAgICAgICAgX19iYXNocnBjX19yZW1vdGVf cnVuX3NjcmlwdCBcCiAgICAgICAgICAgICAgICAgICAgICAgICIkc3RhZ2UxX3NvdXJjZSIgIiRA IgogICAgICAgICkKfQoKcmVtb3RlX3J1bl9mdW5jdGlvbigpCnsKICAgICAgICBtYWluPSQxCiAg ICAgICAgIyBmdW5jcz0kKGNvbXBnZW4gLUEgZnVuY3Rpb24pCiAgICAgICAgZnVuY3M9JChyZWN1 cnNpdmVfZGVwZW5kZW5jaWVzICIkbWFpbiIpCiAgICAgICAgc3RhZ2UyX3NvdXJjZT0kKAogICAg ICAgICAgICAgICAgZGVjbGFyZSAtZiAkZnVuY3MKICAgICAgICAgICAgICAgIHByaW50ZiAnIiRA IlxuJwogICAgICAgICkKICAgICAgICBpZiBbIC10IDAgXQogICAgICAgIHRoZW4KICAgICAgICAg ICAgICAgIF9fYmFzaHJwY19fcmVtb3RlX3J1bl9zdGFnZTFfdHR5ICIkc3RhZ2UyX3NvdXJjZSIg IiRAIgogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9fYmFzaHJwY19fcmVtb3RlX3J1bl9z dGFnZTFfbm90dHkgIiRzdGFnZTJfc291cmNlIiAiJEAiCiAgICAgICAgZmkKfQoK . } apply_template() { ctpl -c "$(printf 'SITE_NAME="%s";' "$1")" <(template) } mv_idempotent() { if diff -s "$1" "$2" >/dev/null 2>&1 then rm -- "$1" else mv -v --suffix=~"$(date -Ins)" --backup -T -- "$1" "$2" fi } install_prerequisites() { command -v ctpl >/dev/null && command -v apache2ctl >/dev/null || apt install --no-upgrade ctpl apache2 a2query -m md >/dev/null || a2enmod md >&2 a2query -m ssl >/dev/null || a2enmod ssl >&2 } main() { set -e set -o pipefail install_prerequisites REAL_OUT=/etc/apache2/sites-available/default-ssl.conf TMP_OUT=$REAL_OUT.tmp set -- "$(hostname --fqdn)" apply_template "$1" > "$TMP_OUT" mv_idempotent "$TMP_OUT" "$REAL_OUT" a2query -s default-ssl >/dev/null || a2ensite default-ssl >&2 staging=/etc/apache2/md/staging/$1 domains=/etc/apache2/md/domains/$1 if [ -f "$domains"/pubcert.pem ] # Success! then ls -lR -- "$domains" >&2 elif [ -f "$staging"/pubcert.pem ] # Probably done, just need to reload: then set -x systemctl reload apache2 elif [ -d "$staging" ] # Still trying, probably just need to wait: then ls -lR -- "$staging" >&2 else # Probably first run, just installed: set -x systemctl reload apache2 fi exit } eval "$(dependencies_source)" eval "$(bash_rpc_source)" target=${1:-$(hostname --fqdn)} BASH_RPC_REMOTE_DEST=$target remote_run_function main