From 6757ea72685c88c5ceeaae48b90a234a95aa5053 Mon Sep 17 00:00:00 2001 From: David Cooke Date: Wed, 23 Sep 2020 03:00:05 +0100 Subject: [PATCH] yes --- assets/templates/docker-compose.tmpl | 3 +++ cmd/install/main.go | 23 ++++++++++++++++++----- cmd/install/pkged.go | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/assets/templates/docker-compose.tmpl b/assets/templates/docker-compose.tmpl index 97cffec..35321d8 100644 --- a/assets/templates/docker-compose.tmpl +++ b/assets/templates/docker-compose.tmpl @@ -165,6 +165,9 @@ services: - EMAIL_SERVER={{.EmailServer}} - EMAIL_USER={{.EmailUser}} - EMAIL_PASS={{.EmailPass}} + {{if .EmailSSL}} + - EMAIL_SSL=1 + {{end}} {{end}} labels: - traefik.enable=true diff --git a/cmd/install/main.go b/cmd/install/main.go index 024f0df..5ccb7d8 100644 --- a/cmd/install/main.go +++ b/cmd/install/main.go @@ -37,6 +37,7 @@ type options struct { EmailServer string EmailUser string EmailPass string + EmailSSL bool } var installShellFlag = flag.Bool("shell", false, "Whether to install Shell") @@ -46,13 +47,13 @@ var eventNameFlag = flag.String("eventname", "", "The name of the event") var frontendURLFlag = flag.String("frontendurl", "", "The public URL of your shell instance") var apiDomainFlag = flag.String("apidomain", "", "The public URL of your core instance") var userEmailFlag = flag.String("email", "", "The email sent to LetsEncrypt for certificate provisioning") -var emailModeFlag = flag.String("emailmode", "smtp", "How emails should be sent - SMTP, SES or Sendgrid") var AWSAccessKeyIdFlag = flag.String("awsaccesskeyid", "", "AWS Acess Key ID (For mail)") var AWSSecretAccessKeyFlag = flag.String("awsaccesskeysecret", "", "AWS Secret Access Key (For mail)") var sendgridApiKeyFlag = flag.String("sendgridapikey", "", "Sendgrid API Key") var emailServerFlag = flag.String("smtpserver", "", "SMTP Server") var emailUserFlag = flag.String("smtpuser", "", "SMTP User") -var emailPassFlag = flag.String("smptpass", "", "SMTP Password") +var emailPassFlag = flag.String("smtpass", "", "SMTP Password") +var emailSSLFlag = flag.Bool("smtpssl", false, "SMTP SSL") var useWatchtowerFlag = flag.Bool("usewatchtower", false, "Whether to use Watchtower to auto-update RACTF.") var andromedaIPFlag = flag.String("andromedaip", "", "IP users access challenges through") @@ -168,12 +169,24 @@ func main() { installOptions.EmailServer = mustPromptStringIfNotDefault("SMTP Server?", stringValidator, *emailServerFlag) installOptions.EmailUser = mustPromptStringIfNotDefault("SMTP Username?", stringValidator, *emailUserFlag) installOptions.EmailPass = mustPromptStringIfNotDefault("SMTP Password?", stringValidator, *emailPassFlag) + //Is this a bad idea? Almost certainly, but it's 3am and I'm not figuring out a better way + if !(*installShellFlag || *installCoreFlag || *installAndromedaFlag) { + sslPrompt := promptui.Prompt{ + Label: fmt.Sprintf("%s", Yellow("Use SSL for SMTP?")), + IsConfirm: true, + } + ssl, err := sslPrompt.Run() + if err != nil { + fmt.Println(promptError) + return + } + installOptions.EmailSSL = ssl == "Y" + } else { + installOptions.EmailSSL = *emailSSLFlag + } } } - if installOptions.EmailMode == "AWS" { - } - installOptions.SecretKey = GenerateRandomString(64) installOptions.AndromedaKey = GenerateRandomString(64) installOptions.UseWatchtower = *useWatchtowerFlag diff --git a/cmd/install/pkged.go b/cmd/install/pkged.go index 4b41afd..bb5e087 100644 --- a/cmd/install/pkged.go +++ b/cmd/install/pkged.go @@ -9,4 +9,4 @@ import ( "github.com/markbates/pkger/pkging/mem" ) -var _ = pkger.Apply(mem.UnmarshalEmbed([]byte(`1f8b08000000000000ffec5ae98f9bcab2ff5ff87a7d926e3093c1d2fd606cc0109b19b666797a8a80c606d3606bc00b3ecafffed4608f9759ce2427e75ee9291fa230b8babaaaba965f35f5279395f355c50cfe64e8bf71f6c40c98cfe9aa483ee3709b7c1e27dbcf8bd5e7acacea9010a6c7a8c57af5543f8675ca0c18a6c7e861913003e64c305ec5dd2f76f8b448eaeed95cad8e4fb3b08e5366506e08e931561d928419cc435225c7bfcc24ac566547abace48c24d589badbfaf9cf71b27e7eb693aabea1a6af6e56cc567843f7fb9339cabfc8ea74137d8a57c5e7a730aee7177acec2ac6406f5d326e97dc02aca6ab6c2efd17c5eac3e152bdc92a2e4a9ca5a1de127d867be7fffde63e69de87fbe29d2e0735855495d7dae93624dc23aa93ee3559c274f7fc4ab62bdaa924f75b12694033d50fa3f4eea30232dd3b23ba4d716f4982a3b24cce00be8dff79862851366d06741fbf8adceda752c60c11f40f883e56cc00e586100ee3eb1c2fd3d7707bec07f01380080e93159f50d53431d4fb36adaadc7c99619b010723d462d57cc004256e0eec15d8fd14956e6cc00b6e79230038e83f7f73dc6c930338000801ea39c1fbd6fdfd62106cc00f41813539ea0c75817928b24ef14e903e18efeb98af38a19c0bb1e33acb3828a6225317d01c03ddbe7fb54828abee1c05193ef3d66f63ee9b3d2df7bcce8e3a4deb76f9b7253259819fc0fe8811ef8dff6ccd3e4e977ccfdb762aec7ac5b79fe641ef3c5fb621dcdfdb100fcde6370588734da0ad4c42cd946cbd5423bcccad1627d083c8d0d5d9dc487d557752482b890495090a787c56aa18e868bd08569c03a77ea089f7f2bfd66ba54cb51365ca823b1093c1df89e061e32318d26384dbcd957ba5655f46d549a69e8f22426c2c6772179c8ce7b1cd72f2316d6becbe7a73dd5d1b05647713df5c426e28275a0a0266ef83c62f5a7c053053cd16060c55f8fb48ba9352ca716dcc585c086ae49e272b609146119b2a89916a81f2bc22170cd2c714d1214328c268610147215b3ce5107fa0f2cb406d481cb83b824bb88251b3c996dc28909e2119f068a49f53c3cdaabfe6cf4626f1295669378e236a4eb1b7e8527e62e6eaed6017d3c7bb19fef89eb6961a6319b66112b37c11882b84444dbddd8829e5169ae83822c7dcf2431a7919815aaf64c1b9eeeb18d260189333ef55948a6450af0445c868a5c450ada04acf396dd9681a781d00dd63e2b83c0d3cfbccad9262ed02162f76ce0a91bdfd5ebc0ea74f3d9348d943d890a4ca605dae089c6c78ab08e4a43e86cf6b7f721912bafa331fc92343c8a59d4982e4c43772fcc5feaf0aafd3b1b0c29ef3cf434e273e63a62f9c3495ea793778395fb4ee6c9cbf379c31f3afea54602853481ab83d0153671c37772a04e8e69a92f4305d5810d8ffef06be43eda79132ba8895c7943657cf4cc06bb277f167711a7812ea6cffb3d8c87770fe3e1b58e0703cc0e97be29b211bb87918b0e37f1b8c585dc4c390d4699708ac54dcc0acbf0b07ae7b77513dde8dd9eafbdda069eb99c7266e3bba808dd6adb9dfb915631494cfd76a2cf23b67f7794ed4bc2924255c82650505f1df15a54eac077f795c10a75ac08ad2de26698396c4a226597cd3d50ab23ed102aa88a46da9784a53ca1f0a3fc0c5668024b13e61658a825267ef68257e5bb1a8926b3bb4bfbfaac504f0b9d9e338c4b52852eff14297216373ce77be6329c985bdce5a98def6a5560b479f867f4a4eb3a3dc7c7735748edbb98e6dcc67775106442f7fbb03b571a7358911b3c5e2dd442ae302bf371a31ed7a20d2e4813b17c1b0357be206ba2014dc503b261216164205d7eb4843456f22d5eaa17672d5a86a33b26119003d0dc929068cac28381fc2e1719aff084ba862434b7735937ed36f6654cfd5ee2d3c845c2fcb5359d1c920da06839fd532cdf4d1b81ae171d8948114b7307fffa7a886d070ac8c97702e6f4c34376bf4db86a6320513315a1f65db2997b60dbe66ace6fa61c3e4c8ff9999e65e0ee6f62457bae71cfe76a77795d7d93ee14f302c45dbd3bfa2cdf60774f1e9d741b73c6ca9fd45fa67940cf05042e9f23a4cde61e5c7cb52eed3eccf0444b03375887cd73aeda62afab8d71e7339b9bdc76b25b76e9bf6af91c9fa7dcd7441c0281a71da6a5be0adc7d352dcd2a6ef836bf5fe471e1e2f99a67a16f238b5fd2fdb1a7f191423621bb4ffd72b6c1ac0c7c36051187692d2351216791e2fc9c4c870b9b4fea2fd45e344e28af84abd74126aea3c224c968b8b15c9ec6421549fa36f2c46dd4e6dad94225681728b45ecd4e317615b72f70d219f33471a96eaff439d2d29cd0e6edf1eab61e743964044f7abfa847b44e50cce6bbbbc5cc76fe999c7dcad7ca3ef50b545dd7118ad7c0c667a97d5093b8fb7554d454eec3b4c42956f41556048ef20a5c3ef58b3d39da9b448549e3ef87f2db73dea5713bc1c45fbe99db9611a7911798321bfe6bfa1cf362e67bfa4a1dc1a53a52375316a651219781c5ef124bac431737145ba923bf50150ca382509e1b750439752c35ea0866ea78b8998dfabbe9b2ada5bbd9f082b7ab3f511f9b96f810b0f99def89bb4869f1da3a62fbd95fe3e57772ae643eda8eacd94bf87e4e1b61c5c9850724a10753ee72da4d3e54e242d8605a5b6564d913284cafebf385bd860b55d665036a329285a9897281e6458745cbb840c06211dfc5c4b36f48562e3f9840983b003948220f26d4e7b62348c8d9cb8fae96fa2cf5036313b308607afedc6c134fb46d30414bac906d74e5bf58b473d3b201944d499ed35cf7e8b67992ea924685d9442c248122dde9cbe1ee1a978b576b692ef7402dbb5d4d11cf6be569e091dbba209b12b13d283e3ac410f4e58c7b78ed77a03fda79a09950908c25d85fc6aa9323c942fadc00f2d892d0dc945461b6788d47fae84043e8b0deec527edb71f67347122c3406501fcf9a2bfe509e7910d926a279565e62c57fb1d692041b8de12ee27410d07ee1b2a7a0e55516240399a291cbb669c32e8e162f680c03e9360282658ee1cef7f403a63139bcf44da41b0e997950b46c1868a684ac478fd629446b6765bb421e78279c346c7371e8fa8bc093165734d6303310b6d5f282760416f49d074cd9cc6564cbe6dcc9d1c47284874717c1a98749cc19f5956d25d973a0201a40971da8cf2d80020f10a99349f61c202f7d161d625093c421f98d0f8b08ead47fc74e8e1c0fc86303208a0f9efd9fca738a01c3d597b4bfbb8d8536df4d74a22a34cfa1bd3ae2e5b69f91e036509c854a74d9cecd899313e9565f07a00753c296e598b77e6bd3fc1270da3a9064c3726a92dcd8956291c012696d23b135dc1c7b263d62695ed36c1b99c6ed7ea64371d39eea6ca1fcfaec1c1635b4c7bcb191dce622b9c57557f4c8a37dea1bfc25d9760e1da66b6d218b69cce917b1277e08535f609b539d7c8927c7fdfabc66b8780f0ff985bc0ce9beaf622d6a6773dbca5b42c11fe50b2d3bc79a3a120ddf3357ce44a338aeff55193ee3447f945fdaec3dac77ae1d573d9e79e8f29d787843fff77401d16446eb748327e7bb8247effcfc2ecf02ae03c5ac020fa714c74d4b1dc405d95df03fe089b68e276243d725237e1717a808bd94c4873356fe09b9ebd035f348419c4f653dc06e1fe5543bcce1e96ee76ff659675f99bc83278b73cdc2cafe70ecb3dfe9513b79624538600537c1754e6f02d75c9ff3f00fe02097cfe342a803d74c69fc528cef5fbdbbc6b7c77a72ea9bd7912b9781bd5a685c7b677178583a7f7d7f3709b6d104d581771d7fcf3c3221f73d33d5deeb85941fc6fa9dfc67fbbda283b88d39b3a47ef9b0949aa92b5731b5e1e9ee80fa3b67a67169dca9cab1af3dca18b83c1b7ada362a20894ae34a2f87d64b095b26d2e7264a1dd3e16d5a679c035c869e499289717996860d75c7849aec4041a5cf1e901192d2b9ed20c79204a9f5154f076fee21bd5abb2ff91ef3ab96fa9c59bc8ff5f1b9ce9fb03dbb5ffb99707ecfc9d5943553ac48db7fe2cc308bb2b67f60d1f9eee9e338bd0c1479172a3cb9c1d98ba9375cb458fb126317f26b18fb0377d2bf31f66f8cfd1b63ffc6d8bf31f67f12635fd586e6d7e2ec29870f3f80b5b9c0d50edd7d9779f8bb78fb46af7f0473dfecf14b71f70defd7b1f70413bfd4b7b4aee089fe9fc5dfe5e5deb37f0083d3fd31f117ff3c260f3cad8938edf0e2ce78d2e1bb298b9ab8109aa99bd2ba5b059efa9778f657e1b7d763e7fadbc5477daad353ad4f31372d3548f38745cf63942e5e7e5b818baf1feec78e36f28efb65fcf537d4c3f15bebeea7f97d28867ffa3efbc66728af4b9f79db37e44d30d1b6918b72df78f9fdce77f79cef91c34b5c2d5e6038395747f084bd4954066b8a5323176df0d5b7881b5c97138a7335670c281e6f71f915767078c9c905dd744cd1832232f2bd66404aff02076acee406775caeedbee37d6c9f8ed6b0a1e63cdafe6e361ebe297f8bef6441b79cbe30b3871fa235d04298d9eabbb41fc5bbb8102aec4272fb3dfeeadc33611b4f8cede5bbe9edbc0017a4712634d8ed6f9fe75bdadc58ddbdf35bf98bbf4f5f7f4b5bacaffbd1c9e96e40dc60775fddf6f2aac2c348d9d198b9ea2d2edffb6c3b27d4ad5ffcfbdf4c8f59874f49599f87a3ce4350ede4d40fcc28564d552705fe635366f50726145f929fe61359e1afc71381cd7203c80e58ee93c07fb9073ce8dffdc478621fb0fd5f379ed80afec674e2fd6bc38950e079781a23bc07fc1d0bfa42ffb5e1c43b4e10fadc89f459e5d78613df26fd3d9cf8ff7338f165289d47135d8836a167e2516e9298d59bd013db91aa474b8b9c5c1e2329c06adb2620969652bb906bdaeeaa8bb51578320c3bb87af1199bb6546419186b31284d122f5ffb6df5d585b4950ad63e8bf088987cac3842c4f22466d32d1eaeada06dedf88e478efaa16708898b0e2382b77151afa3024bc711ad6d5ce6c294157678249caeba6859d022bab6e0d3e87984652d270a5a3a1da4ebdadd0e261c0224a6584985b925c27834ac83e133ed36eecae93862dbeb06e2283208275050159aa2fb5f9142eac0152096bbab2fda3e3fdac3af23523fc311cf587bbecb83c03547890d6becee41684118b7e5c24ce302133cfceb94dbc563f23b20ff6b13faff070000ffff010000ffff0feb2d7f28310000`))) +var _ = pkger.Apply(mem.UnmarshalEmbed([]byte(`1f8b08000000000000ffec5a5993a3ba92fe2fbc5e9f6e094c75e188fb606cc0d036556c629998e800840d46604781177ca2fffb84c02e2fb59ceabe7de644ccf4434561905299a95cbe94f24f262be7ab8a19fcc9d0bf71f6c40c98cfe9aa483ee3709b7c1e27dbcf8bd5e7acacea9010a6c7a8c57af5543f8675ca0c18a6c7e861913003e63c60bc8abb2f76f8b448eaeed95cad8e4fb3b08e5366506e08e931561d928419cc435225c75f661256abb21babace48c24d56974b7f4f3cf71b27e7eb693aabe194d5fddcc98adf086aef72773e47f91d5e926fa14af8acf4f615ccf2fe49c8559c90ceaa74dd2fb805694d56c85df1bf379b1fa54ac703b14254f55d6ca083fc13ef3fdfbf71e33ef58fff34d96069fc3aa4aeaea739d146b12d649f519afe23c79fa235e15eb55957caa8b35a114e886d2ff38a9c38cb444cb6e935e9bd063aaec9030832f10f03da658e18419f459d03e7eabb3761e0b58f00710fe60391bb0035e1840ee132fdc7f11b8feddbf001c00c0f498acfa86a99e8e9b5935edcae364cb0c5808b91ea3962b6600212b70f7e0aec7e8242b736600db6d499801c7c1fbfb1ee36498194000408f51ce8fdeb76feb100366007a8c89294dd063ac0bc645927772f48170477faee2bc6206f0aec70cebaca0ac58494c5f0070cfde713cd763f48abeb9037cff0e40f6cbf71e337b7fe84966f0bdc78c3e3ed4fbf66d536eaa043383ff023dd003ffdd6e799a3cfd76b97fcae57accbae5e74fe6315fbccfd651dd1ff3bfef3d068775489dad404dcc926db45c2db4c3ac1c2dd687c0d3d8d0d5497c587d554722880b990405797a58ac16ea68b8085d9806ac73a78ef0f95be937d3a55a8eb2e1421d894de0e9c0f734f090896934c169e2cdbed2b9aaa26fa3d24c439727311136be0bc943765ee3387f19b1b0f65d3e3fada98e86b53a8aeba927361117ac03053571c3e711ab3f059e2ae08906032bfe7a1cbb985ac3726ac15d5c086ce89a242e679b401196218b9a6981fab1221c02d7cc12d7244121c368620841215731eb1c65a07f60a135a00e5c1ec425d9452cd9e0c96c134e4c108ff834504c2ae7e1d15ef567a3176b93a8349bc413b7219ddff02b3c31777173350fe8e3d98bf57c4f5c4f0b338dd9348b58b909c610c42522daee4617748f4a731d1464e97b2689398dc4ac50b57bdaf0748d6d3409489cf1a9cf42322d528027e23254e42a52d026609db7f4b60c3c0d846eb0f65919049e7ea655ce3671810e11bb67034fddf8ae5e0756279bcfa669a4ec495460322dd0064f343e568475541a42a7b3ff781d12b9f23a1ac32f49c3a398458de9c23474f7c2fca50cafeabfd3c190d2ce434f233e67ae23963f9cf8753a7e3758b9ef789ebcdc9f37eca1a35f6a24504813b83a085d6113377cc707eaf89896fa3254501dd8f0680fbf86efa39e37b1829ac8953794c747cf6cb07bb2677117711ae87cfabcdec37878f7301e5ecb7830c0ec70699b221bb17b18b9e870e38f5b5cc8cd94d3609409275fdcc4acb00c0fab77bead9be846ee767fedd536f0cce594331bdf4545e856db6edf8f631593c4d46e27fa3c62fb7747debe242c2954856c0205f5d511af45a50e7c775f19ac50c78ad0ea226e8699c3a6245276d9dc03b53ad20ea182aa68a47d49584a130a3f4acf608526b034616e81855a62e2672f6855beab916832bbbbd4afcf0af5b4d0e93ec3b82455e8f24f91226771c373be672ec389b9c55d9cdaf8ae5605461b877f464e3aaf93737cdc7785d4be8b69cc6d7c5707412674df87ddbe529fc38adce0f16aa116728559998f1bf538176d70419a88e55b1fb8b20559130d682a1e900d0b092303e9f2a325a4b1926ff152bdd86bd1321cdd3189801c80e696844453161e0ce477b1c8788526d43524a1b99dcbba69b7be2f636af7129f462e12e6afcde9f8906c0045cbe99f7cf96eda0874bee848448a581a3bf8d7e7436c3b50404ebe1330a71f1eb2fb6dc2551b03899aa908b5ef92cddc03db3656737e33e5f0617a8ccf742f03777fe32bda738e7bde57bb8bebea9be34e3e2f40dce5bba3cdf20d76f7e4d149b73167acfc49fd659a07745f40e0f23942da6ceec1c557eb52efc30c4fb434708375d83cc7aa2df6badc187736b3b9896d27bd6597f6ab96cffe798a7d4dc4211078da615aeaabc0dd57d3d2ace2866fe3fb451c172e9eaf6916fa36b2f8255d1f7b1a1f296413b2fbd42f671bcccac06753107198e6321215721629cecff174b8d0f9a4fe42f545fd84d24ab87a1d64e23a2a4c928c861bcbe5a92f5491a46f234fdc466dac9d2d5482768142f3d5ece463577efb02279d314f1397eaf64a9ee3581a13dab83d5edde6832e868ce049ee17f988e6098ad97c77b798d9cedf13b34ff15ad9a77e81aaeb3c42f11ad8f82cd50f6a1277bf8e8a9af27d989638c58abec28ac0515a81cba77eb127477d93a830a9fffd507c7b8ebbd46f2798f8cb3763db32e234f2025366c37f4d9f7d5ecc7c4f5fa923b85447ea66cac2342ae432b0f85d628975e8e286622b75e417aa826154104a73a38e20a78ea5461dc14c1d0f37b3517f375db6b974371b5ed076f5276a63d3121f0236bff33d7117292d5e5b476c3ffb6bbcfc4ecc95cc47db91357b09df8f6923ac38b9f08024f460ca5d4cbb89874a5c081b4c73ab8c2c7b0285e9757ebed0d770a1caba6c404d46b23035512ed0b8e8b068191708582ce23b9f78b60dc9cae50713087307200749e4c184fadc760409397bf9d1d5529fa576606c6216014cf79f9b6de289b60d26688915b28daeec178b766e5a3680b229c9731aeb1edd364e5259d2a8309b88852450a43b7d39dc5de372f16a2e8de51ea865b7cb29e279ae3c0d3c729b17645322b607c547871882be9c710faf7d07faa39d079a0905c95882fda5af3a39922ca4cf0d208f2d09cd4d4915668bd768a48f0e34840eebcd2ef9b71d673f7724c1426300f5f1acb9a20fe59907916d221a67e52556fc17732d49b0d118ee224e0701ad172e6b0a9a5e65413290291ab96c9b36ecfc68f1628c6120dd4640b0cc31dcf99e7ec0d4278797b68974c321330f8a960d03cd9490f5e8d13c8568eeac6c57c803ef8493866d2c0e5d7f1178d2e26a8c35cc0c846db5bc183b020bface03a66ce632b26573eee4686239c2c3a38be0d4c324e68cfa4ab792ec3950100da0cb0ed4e71640810788d4f1247b0e90973e8b0e31a849e290fcc6864504756abf6327478e07e4b10110c507cff64ff939f980e1ea4b5adfddfa421bef263a51151ae7d05e1df1725bcf48701b28ce4225ba6ce7e6c4c989742baf03d0832961cb72cc5bbbb5697c09386d1d48b2613935496ef44ab148608934b791d81a6e8e35931eb134ae69b68d4ce3763dd3a1b8694f65b6507ebd770e8b1a5a63dee8486e6391dce2baabf1c8a375ea1bf425d9760e1da66b75218b69cce917be277e08535f609b539e7c8927c7fdfa3c67b8780f0ff985bc0ce9baaf622daa6773dbf25b42c11fe50b2d3bfb9a3a120ddf3357ce44a338aeff55193ee3447f945feaec3dac77ce1d57359e79e8e29d787843fef76401d16446f3748327e7b38247effcfc2ecd02ae03c5ac020fa714c74d4b1dc405d95dd03fe089b68e276243e725237e1717a808bd94c4873356fe09beebd035f348419c4f793dc06e1de5943bcce1e96ce73facb3ceb63279074f16e79c8595fde15867bf53a376fcc48a70c00a6e82eb98de04aeb93ec7e11fc0412e9fc7855007ae9952ffa518dfbf7a778d6f8ff9e45437af23572e037bb5d0b8f6cce2f0b074fefafc6e126ca309aa03efdaff9e696442ee7b66aabd570b293f8cf53bfecffa7b4506711b736649edf26129355357ae62aac3d3d901b577ce4ce3d2b85395635d7be431707936f4b46d54401295c6955c0ecd9712b64ca4cf4d943aa6c3db34cf3807b80c3d932413e3722f0d1bea8e0935d981824a9f3d202324a573db418e2509526b2b9e0ede5c437a35775fd23dc6572df539b3781febe3739e3f617b76bff633e1fc9e93ab296ba65891b67fc79e6116656dfdc0a2f3d9d3c7717a1928f22e54787283b317536fb868b1f625c62ee4d730f607cea47f63ecdf18fb37c6fe8db1ff3f636c523ceb4ad66d7bf2062da8cf1e6de95adfdd19ce3f8ad7aff24cf36b31fb94c3871fc0ed5ce06a87eeeccc3cfca7d8fd46aebf05bfdfacf14b31fc0dedd771fc0413bfd4b73447e189febf8be5cbcbb5677f039ea7eb63e22ffe7e7c1f785a1371dae1c5f9f3a4c38a5316357121345337a539bc0a3cf52fb1f1afc282affbcef53dc8476daa9353ad4f3e372d3548e38745f763942e5eded3c0c5d70fd776471d79c7f532fefa3ef670bcb7ddfd34bd0ff9f04f9f8ddfd80ca57569336fdb86bc0926da367251ee1b2fef027d77cff91e39bcc4e8e2051e947375044f389e4465b0a6983772d1065fdd6bdc60c49c50ccac396340b17d8bf1af7088c34b4e2ee8a6638a1e149191ef3503d2f12f30a5e6dce4adabb9dd9de0c7d6e9c61a36d49c47dbdfcdc6c337f96fb1a22ce896d31766f6f043630db41066b6faeed88f62675c08157621b9bddbbfdaf74cd8c613637bf96e7adb7bc005699c090d76fbdbe75e9936365677ef7c2b7ff15df7f5bddc627d5ddb4e4ee70ce206bbfbeaf65c40557818293bea335775cae57b9f6d7b8ebaf98b7fff9be931ebf02929eb73a3d5b9a1aaedc2fa8176c7aaa9eaa4c07f6ccaacfe40b3e3cbe1a7564756b8ffcb4e4760b3dc00b20396fb24f05fee010f7eaad5b10fd8feaf6b756c197fa3d3f1feb5464728f03c3cb524de03fe8e057da1ff5aa3e31d2708fde7eec567915f6b747c7be8ef46c7ff9b8d8e2f5de9dce6e842b4093d138f7293c4acde849ed8b6673d5a5ae4e4f218490156db3201b13495da855cd3d2595dacadc09361d8c1d58b2b715a9e916560acc5a03449bc7ceddbeaab0b695916ac7d16e11131f958718488e549cca65b3c5c5b415b26f21d8d1cf543cf1012171d46046fe3a25e4705968eed5edbb8cc85292becf048381d9bd1b4a045746ec1a7d1733bcc5a4e14b4743a48d795ce1d4c3804484cb1920a734b84f1685807c3e7b1dbb84ba7e3886d8f2e88a3c8209c4041556888ee7f450aa903578058ee8ed16829fe680fbf8e48fd0c473c63edf92e0f02d71c2536acb1bb07a10561dca60b338d0b4cf0f0af436ee78fc96f87fcc79afdff070000ffff010000ffff217d359f73310000`)))