]> gitweb.mndrdr.org Git - arelpe.git/commitdiff
Added subscriptions, yo
authorAidan Cornelius-Bell <[email protected]>
Tue, 8 Oct 2024 08:02:49 +0000 (18:32 +1030)
committerAidan Cornelius-Bell <[email protected]>
Tue, 8 Oct 2024 08:02:49 +0000 (18:32 +1030)
60 files changed:
Gemfile
Gemfile.lock
app/assets/images/aidan_about_u.svg [new file with mode: 0644]
app/assets/images/aidan_arrow.svg [new file with mode: 0644]
app/assets/images/aidan_be_premium.svg [new file with mode: 0644]
app/assets/images/aidan_dispatches.svg [new file with mode: 0644]
app/assets/stylesheets/application.css
app/controllers/.DS_Store
app/controllers/mailing_lists_controller.rb [new file with mode: 0644]
app/controllers/pubview_controller.rb
app/controllers/subscriptions_controller.rb [new file with mode: 0644]
app/controllers/users/.DS_Store [copied from app/assets/images/.DS_Store with 100% similarity]
app/controllers/users/confirmations_controller.rb [new file with mode: 0644]
app/controllers/users/registrations_controller.rb
app/helpers/mailing_lists_helper.rb [new file with mode: 0644]
app/helpers/subscriptions_helper.rb [new file with mode: 0644]
app/mailers/.DS_Store [copied from app/assets/images/.DS_Store with 100% similarity]
app/mailers/admin_mailer.rb [new file with mode: 0644]
app/mailers/welcome_mailer.rb [new file with mode: 0644]
app/models/user.rb
app/services/buttondown_service.rb [new file with mode: 0644]
app/views/.DS_Store
app/views/admin_mailer/.DS_Store [copied from app/assets/images/.DS_Store with 100% similarity]
app/views/admin_mailer/new_non_financial_member.html.erb [new file with mode: 0644]
app/views/admin_mailer/new_paid_member.html.erb [new file with mode: 0644]
app/views/devise/base_template.html.erb [deleted file]
app/views/devise/confirmations/new.html.erb
app/views/devise/passwords/new.html.erb
app/views/devise/registrations/edit.html.erb
app/views/devise/registrations/new.html.erb
app/views/devise/sessions/new.html.erb
app/views/layouts/_home_post_links.html.erb [new file with mode: 0644]
app/views/layouts/_navigation_buttons.html.erb [new file with mode: 0644]
app/views/layouts/application.html.erb
app/views/layouts/user_page_template.html.erb [new file with mode: 0644]
app/views/mailing_lists/edit.html.erb [new file with mode: 0644]
app/views/mailing_lists/index.html.erb [new file with mode: 0644]
app/views/mailing_lists/update.html.erb [new file with mode: 0644]
app/views/pubview/index.html.erb
app/views/pubview/join.html.erb
app/views/pubview/post.html.erb
app/views/pubview/show_public.html.erb
app/views/subscriptions/create.html.erb [new file with mode: 0644]
app/views/subscriptions/index.html.erb [new file with mode: 0644]
app/views/subscriptions/new.html.erb [new file with mode: 0644]
app/views/welcome_mailer/welcome_email.html.erb [new file with mode: 0644]
app/views/welcome_mailer/welcome_email.text.erb [new file with mode: 0644]
config/environments/development.rb
config/initializers/stripe.rb [new file with mode: 0644]
config/routes.rb
db/migrate/20241008003544_add_subscription_fields_to_users.rb [new file with mode: 0644]
db/migrate/20241008005649_add_subscription_type_to_users.rb [new file with mode: 0644]
db/migrate/20241008010447_add_support_type_to_users.rb [new file with mode: 0644]
db/schema.rb
test/controllers/mailing_lists_controller_test.rb [new file with mode: 0644]
test/controllers/subscriptions_controller_test.rb [new file with mode: 0644]
test/mailers/admin_mailer_test.rb [new file with mode: 0644]
test/mailers/previews/admin_mailer_preview.rb [new file with mode: 0644]
test/mailers/previews/welcome_mailer_preview.rb [new file with mode: 0644]
test/mailers/welcome_mailer_test.rb [new file with mode: 0644]

diff --git a/Gemfile b/Gemfile
index 59be3ae371519a4a9a80d7f3c645889ee204473a..09f2d0bc2d3180fffcc32ae17ebd2cd4dbdbbe6b 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -22,6 +22,8 @@ gem "httparty"
 gem "dotenv"
 #humanity verification
 gem "hcaptcha"
+# subscribers
+gem "stripe"
 # Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis]
 # gem "kredis"
 #api stuff
index fae35dc17fc0f57c17cd0f4513ba4b9315558884..b9066b79e4aae7109682b99eb4a40ad599935a29 100644 (file)
@@ -291,6 +291,7 @@ GEM
       activesupport (>= 6.1)
       sprockets (>= 3.0.0)
     stringio (3.1.1)
+    stripe (13.0.0)
     thor (1.3.2)
     timeout (0.4.1)
     tzinfo (2.0.6)
@@ -341,6 +342,7 @@ DEPENDENCIES
   rubocop-rails-omakase
   selenium-webdriver
   sprockets-rails
+  stripe
   tzinfo-data
   web-console
 
diff --git a/app/assets/images/aidan_about_u.svg b/app/assets/images/aidan_about_u.svg
new file mode 100644 (file)
index 0000000..7477c08
--- /dev/null
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 868 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;">
+    <g transform="matrix(1,0,0,1,-301.922,-608.702)">
+        <g>
+            <path d="M321.845,625.024L320.327,621.565L320.582,621.244L320.525,631.106L322.689,648.891L323.614,652.658L324.845,655.209L325.102,654.665" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M303.922,621.653L304.924,622.546L308.379,624.15L312.463,623.738L325.436,621.388L331.791,619.441" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M340.916,631.943L336.441,630.776L335.014,631.535L331.925,635.951L330.155,643.857L330.453,648.116L331.177,651.347L333.111,654.805L334.505,656.251L337.092,657.039L340.145,656.962L341.568,656.4L345.132,653.221L350.639,645.054L351.913,640.661L352.117,637.34L351.676,635.805L349.979,632.989L348.609,631.664L346.937,631.004L343.608,630.478L336.456,632.4" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M397.382,634.914L395.845,629.185L394.109,627.327L392.216,626.961L390.93,627.585L389.598,629.189L387.471,633.468L385.631,642.376L385.413,644.858L385.656,649.44L386.512,653.357L387.147,655.047L388.657,656.575L391.199,657.733L393.011,657.531L396.431,656.281L400.451,653.173L402.922,648.55L404.11,642.831L403.953,640.165L402.117,636.004L403.487,638.736L404.86,642.604L405.839,646.24L406.175,649.666L406.794,651.993L409.483,675.544L409.332,680.276L407.333,689.6L404.257,692.285L401.063,691.3L398.912,689.776L397.84,688.612L395.017,684.613L394.713,683.197L394.924,680.793" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M412.594,651.077L414.221,647.821L415.311,646.766L417.016,643.195L418.923,641.056L420.365,638.854L420.887,636.736L422.249,634.234L422.168,633.65L421.251,632.555L419.581,631.802L418.161,632.55L415.583,635.922L413.553,641.285L413.259,643.853L413.48,647.817L414.729,652.868L416.037,654.768L419.825,657.058L422.103,656.797L425.441,655.844L427.05,654.898L428.606,653.312" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M437.811,627.971L436.786,631.518L435.599,640.928L435.759,651.001L437.601,660.313L439.069,663.065" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M433.026,645.303L438.587,642.176L446.611,638.829" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M504.454,635.303L498.717,631.474L496.516,631.19L494.063,630.426L492.811,630.484L490.107,631.455L487.33,633.253L484.444,639.3L484.781,642.068L485.478,644.334L487.345,647.71L489.226,649.431L492.144,651.232L499.165,654.607L502.506,657.178L503.738,659.045L504.807,661.748L504.757,662.514L504.339,662.957L500.036,666.02L498.18,666.869L495.676,667.377L492.083,667.245L489.101,665.874L488.104,664.607" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M510.979,636.571L510.93,648.001L511.491,651.501L513.387,661.612L514.965,664.24L515.799,664.97" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M509.828,651.648L523.414,647.221" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M534.944,644.198L532.991,643.055L530.611,642.36L527.297,646.778L526.139,649.137L525.844,650.84L526.241,654.179L527.864,657.661L528.879,658.54L529.525,658.762L532.797,658.203L533.554,657.778L534.564,655.836" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M535.792,645.753L535.65,646.066L538.891,657.69L541.518,660.089L541.821,659.874" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M547.361,649.994L547.743,649.959L548.463,653.658L549.907,655.957L550.318,654.339L550.196,645.647L550.557,643.293L551.526,640.184L551.433,639.572L552.522,637.468L555.017,636.466L561.911,636.589" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M568.791,634.625L568.743,645.871L569.967,653.875L571.299,656.096" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M569.536,647.009L577.824,645.053L581.179,643.162L583.594,642.281" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M585.92,647.738L589.444,646.516L594.517,641.655L595.392,641.194L597.22,638.702L598.421,635.927L598.065,635.077L595.445,634.557L593.588,635.54L590.234,638.695L589.349,640.278L585.983,649.188L585.683,651.219L586.211,655.846L587.017,657.08L588.631,658.556L589.701,658.872L593.233,658.494L595.96,657.411L598.281,655.017" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M612.546,641.219L612.845,637.741L612.008,637.034L611.524,636.013L610.507,635.478L608.764,635.293L607.969,635.911L606.288,638.344L603.394,646.321L603.174,647.917L603.453,651.341L604.865,655.146L607.689,656.906L609.018,656.713L611.202,655.809L614.391,652.748L616.132,650.353L618.381,645.89" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M622.566,612.478L621.752,613.57L619.837,618.63L618.918,625.533L619.017,640.384L619.589,644.074L619.52,647.659L620.491,653.219L620.411,654.671L621.279,658.639L621.729,659.31" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M632.176,659.972L630.562,661.972L629.115,664.669L625.065,668.12" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M677.193,623.764L676.062,628.892L675.979,634.807L675.643,636.875L675.693,648.913L675.308,652.128L675.409,656.21L676.181,659.345" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M665.312,645.034L668.567,644.864L671.913,642.859L678.277,639.844L680.601,637.987L690.274,633.497L697.54,628.451L698.709,626.766L696.757,626.201L695.844,626.267L691.032,629.916L689.675,631.272L687.153,635.156L684.391,643.813L684.174,645.455L684.453,649.511L685.967,655.051L686.98,656.083L690.221,657.8L693.942,656.778L695.122,656.156L699.126,653.03L700.516,651.048" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M713.694,624.175L712.016,632.971L711.328,639.497L711.466,650.149L712.437,653.778L713.057,654.653L713.552,654.266" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M722.825,626.442L721.458,633.49L721.617,642.556L722.936,650.226L723.926,653.641L724.79,655.104" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M757.618,641.943L757.151,643.014L756.346,650.065L755.74,651.85L755.858,652.838L755.435,652.022L755.522,646.041L757.119,638.001L760.725,628.646L761.872,627.237L762.438,625.445L763.651,628.546L764.64,632.875L764.649,643.799L766.112,647.372L766.096,648.633L769.443,641.504L774.348,633.802L776.072,631.708L776.994,630.042L779.824,627.352L780.732,626.976L780.674,627.654L781.785,631.011L780.893,639.278L781.042,645.823L782.77,649.192L784.269,647.6" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M789.606,638.102L799.27,625.479L800.518,621.909L800.446,621.236L799.035,621.241L797.991,621.867L795.622,624.31L792.695,631.35L790.351,641.846L790.68,646.337L791.503,650.283L792.624,652.145L794.832,653.235L796.496,653.241L801.984,650.904L804.895,649.068L806.96,647.217" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M850.342,631.076L848.173,626.706L845.96,624.563L845.073,624.219L843.154,623.853L840.838,624.841L837.8,627.054L836.483,628.671L833.517,634.858L831.933,641.872L831.713,643.78L831.952,646.759L833.074,651.175L834.959,652.848L835.903,653.234L837.213,653.107L840.191,651.772L844.168,648.308L845.94,645.46L847.505,641.601L849.667,638.193L850.35,634.816L851.292,632.803L851.181,632.1L849.975,635.037L850.132,641.62L851.207,645.697L851.379,647.622L853.032,651.065L853.194,651.193L853.773,650.291" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M867.019,613.875L866.194,615.733L864.588,623.404L862.164,640.124L862.302,646.666L864.912,639.425L865.784,637.917L867.103,636.761L870.713,635.194L872.909,635.364L878.388,638.577L879.104,640.094L879.624,643.129L880.716,646.453L880.589,647.697L879.186,650.649L876.225,653.593L873.364,655.243L868.541,654.992L867.259,654.495L864.368,652.924L864.335,651.843L864.752,651.492" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M890.455,640.673L888.441,639.532L885.7,638.719L884.089,639.79L880.866,645.628L880.663,646.742L880.942,649.536L882.18,652.331L884.528,654.316L887.268,654.121L889.894,653.038L890.675,652.096L892.144,649.766L894.012,642.072L893.88,640.405L892.568,637.859L889.626,636.052" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M904.67,633.909L902.93,636.465L901.816,639.546L901.971,644.3L903.327,649.016L905.239,650.605L906.667,651.112L908.006,650.942L910.987,649.233L914.906,644.768L915.897,642.313L916.744,638.45L917.51,636.909L917.337,634.604" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M924.962,624.063L923.456,631.802L923.331,639.442L924.645,644.428L925.938,646.735" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M918.195,639.552L933.268,634.561L937.329,633.499" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M983.219,626.864L981.361,631.926L981.074,634.503L981.361,639.611L982.326,644.204L983.302,645.706L985.423,647.329L987.266,647.265L988.113,646.858L991.159,644.689L992.312,643.476L994.427,640.107" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M997.426,628.935L996.513,630.114L994.551,634.203L994.322,635.746L994.492,643.071L996.626,658.012L996.621,666.972L995.167,677.119L993.649,682.428L991.546,686.339L988.988,687.893L987.255,687.659L984.602,686.668L983.322,685.745L982.156,683.871L979.702,678.185L979.751,673.627L980.418,671.633" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1011.04,633.612L1008.44,635.056L1007.18,636.389L1004.94,640.634L1004.69,641.828L1004.98,644.274L1006.34,646.823L1007,647.407L1009.75,647.218L1012.43,646.276L1014.6,644.371L1016.73,640.964L1018.67,633.383L1018.1,631.445L1015.76,630.913" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1021.55,631.669L1021.56,636.229L1022.89,640.327L1023.88,641.906L1025.07,642.739L1026.47,643.555L1027.84,643.56L1032.21,641.159L1032.61,640.294L1034.84,637.965L1036.89,633.904L1037.74,629.993L1038.5,628.614L1038.28,627.8" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1043.82,641.278L1043.28,639.275L1043.44,633.665L1045.33,629.432L1047.81,627.33L1050.81,625.883L1051.81,626.075L1052.9,626.885" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1066.24,622.072L1064.4,621.629L1061.31,621.822L1059.09,623.169L1056.2,625.836L1055.65,627.302L1055.95,630.122L1057.22,632.365L1059.12,634.057L1059.98,634.354L1061.38,635.885L1062.28,636.213L1064.59,638.586L1065.32,639.973L1064.93,641.705L1063.58,644.171L1062.77,645.045L1060.96,645.843L1058.37,645.549L1054.89,643.78L1055.03,643.495" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1069.7,637.436L1072.38,636.119L1074.73,634.269L1076.87,633.37L1080.95,630.232L1084.56,626.469L1085.34,625.2L1086.11,623.19L1084.49,622.746L1081.76,623.694L1076.6,627.204L1073.78,631.267L1071.58,635.732L1071.36,636.867L1071.62,639.126L1072.61,642.5L1073.76,643.819L1076.68,645.233L1078.09,645.46L1080.45,645.306L1084.23,643.913L1090.8,639.969" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1103.51,617.972L1103.57,626.521L1103.94,629.397L1105.19,633.593L1105.21,634.72L1107.07,638.041" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1129.98,617.023L1128.12,613.53L1126.06,611.746L1123.71,610.702L1122.81,610.801L1121.12,611.877L1120.24,612.812L1119.42,614.921L1119.54,618.583L1120.56,622.305L1122.4,631.776L1122.28,633.548L1122.98,635.547L1122.89,636.673L1123.56,637.676L1123.59,639.236" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1120.64,628.008L1126.12,626.724L1131.8,626.428" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1144.85,637.513L1145.02,637.438" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1156.1,639.391L1156.17,639.284" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M1167.35,637.44L1167.33,637.439" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M822.976,641.167L862.259,640.808L871.883,640.104L892.435,639.935L920.114,639.023L973.666,638.867L981.791,638.506L994.467,638.51L1009.5,639.671L1025.53,640.169L1059.65,639.946L1107.65,637.596L1117.23,636.184L1123.96,635.744L1143.72,632.799L1145.76,633.302L1147.27,634.113L1147.45,634.509" style="fill:none;fill-rule:nonzero;stroke:rgb(0,241,33);stroke-opacity:0.3;stroke-width:30px;stroke-linecap:butt;stroke-linejoin:bevel;"/>
+        </g>
+    </g>
+</svg>
diff --git a/app/assets/images/aidan_arrow.svg b/app/assets/images/aidan_arrow.svg
new file mode 100644 (file)
index 0000000..e84bdd8
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 206 219" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;">
+    <g transform="matrix(1,0,0,1,-640.852,-219.069)">
+        <g>
+            <path d="M672.989,232.601L684.8,227.424L695.265,224.598L706.718,222.539L724.66,221.069L734.464,221.242L746.877,222.245L768.899,225.426L780.718,228.138L791.805,231.665L797.089,233.868L809.862,240.801L813.516,243.831L818.257,248.629L821.803,253.215L823.088,258.201L823.678,263.153L823.06,266.097L820.986,271.751L816.278,278.498L810.964,284.118L808.213,286.37L797.043,294.26L789.639,298.767L782.759,302.161L766.375,311.19L757.196,315.505L730.395,324.893L719.372,327.073L708.11,328.269L703.815,328.506L697.701,328.34L692.445,327.74L686.405,326.462L683.657,325.559L678.912,323.099L674.095,319.778L672.187,317.541L671.011,314.73L671.444,311.216L672.735,308.605L675.184,305.461L678.038,302.915L681.246,300.919L684.446,298.32L687.348,296.767L693.435,294.032L699.717,290.705L718.959,283.048L727.021,280.394L741.296,277.626L747.757,276.849L765.617,275.72L771.146,275.824L778.456,276.603L791.031,278.953L799.636,281.642L810.079,286.275L817.204,290.101L824.979,294.984L832.648,301.311L836.005,305.176L840.158,311.398L842.08,315.423L843.234,320.319L844.316,327.93L843.63,331.497L842.515,333.527L840.295,339.101L838.402,342.694L834.581,348.383L827.827,356.211L820.933,361.854L814.693,366.162L807.116,370.174L802.003,373.268L768.862,389.464L753.898,395.182L713.594,408.441L689.124,413.662L671.407,416.629L665.227,418.051L658.863,418.731L654.62,418.587L653.772,418.996L652.446,418.898L653.156,418.735L654.323,417.605L657.52,415.465L662.498,412.643L681.227,399.014L684.724,395.759L688.153,393.784L681.162,397.25L675.902,400.654L662.118,408.358L657.457,410.591L646.447,416.994L645.028,418.987L643.241,420.562L643.504,420.522L642.852,421.822L642.986,421.544L644.219,422.249L645.897,422.144L648.314,422.995L651.521,423.562L668.161,428.659L683.752,432.249L689.399,434.251L692.571,435.007L690.26,435.27" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M684.417,396.031L684.371,414.29L685.121,419.888L687.406,427.411L689.349,430.529L690.908,431.997L691.803,432.258" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M667.902,409.322L663.032,412.262L660.482,414.253L657.19,417.093L654.714,419.574L654.647,420.03L659.25,417.567L667.059,411.344L663.97,411.159L660.04,412.583L656.995,414.711L653.751,416.08L651.559,417.783L650.242,418.3L651.729,417.611L655.108,415.233L656.402,414.946L657.832,413.609L659.637,412.577L657.961,413.138L652.473,415.946L649.065,419.306L648.824,419.888L649.094,421.155L651.248,419.63L652.894,419.012L654.374,417.674L656.654,416.604L657.155,415.73L652.338,417.616L653.479,417.446L657.555,415.313L654.541,417.475L653.132,419.02L652.563,419.221L652.482,418.979L654.789,419.355L656.832,418.155L660.587,416.8L662.858,415.095L665.251,413.966L662.765,415.008L658.47,418.46L657.586,418.791L657.546,418.567L658.701,418.382L662.149,416.937L663.983,415.65L669.551,413.28L666.597,414.463L661.25,417.514L658.284,418.812L657.403,420.254L657.438,420.708L658.052,419.612L660.494,417.628L661.879,416.987L663.764,415.531L669.82,412.435L665.212,413.865L661.389,416.62L658.811,417.833L658.955,418.431L660.826,418.319L663.219,416.691L671.611,412.774L659.896,418.476L655.922,422.555L658.014,420.927L661.957,418.701L671.04,414.422L666.99,416.876L664.089,418.182L662.297,419.424L661.012,421.184L663.359,419.212L669.325,416.245L670.504,415.108L672.166,414.586L672.221,414.213L671.032,414.085L667.423,415.478L663.176,418.067L661.024,418.888L662.581,418.872L667.008,417.339L670.874,414.669L673.492,414.031L674.083,413.571L667.129,417.634L661.527,423.39L663.162,423.007L665.832,421.108L670.619,418.767L672.173,417.387L674.061,416.509L670.586,418.138L666.273,421.017L663.677,423.678L664.236,423.349L665.321,423.332L666.219,422.852L667.438,421.543L674.841,417.344L668.977,420.06L665.387,422.273L663.773,423.691L661.648,424.284L661.804,422.365L663.374,419.65L663.226,419.358L661.75,422.118L662.028,421.777L661.882,419.309L664.101,418.35L667.975,418.481L667.564,418.601L667.075,419.669L664.651,421.988L663.832,422.265L660.762,422.146L660.264,419.255L662.089,419.331L663.2,421.191L667.641,423.138L668.303,424.724L669.622,425.238L675.912,425.099L674.414,424.392L674.748,424.576L674.648,422.608L676.41,419.469L675.039,421.677L675.308,423.105L676.014,424.166L675.786,423.912L675.817,421.136L678.579,426.499L678.394,426.152L678.748,425.984L680.594,422.125L680.582,420.582L681.046,419.188L681.378,420.576L682.11,421.836L681.953,422.554L682.431,423.382L682.691,425.245L682.623,423.746L682.256,423.125L682.49,419.194L683.547,422.083L683.476,424.211L684.113,427.762L684.437,426.342L684.172,424.845L684.604,427.555L684.558,427.144L683.339,426.29L682.387,424.532L680.249,423.674L680.708,423.878L679.531,424.183L675.999,423.758L673.359,422.415L672.517,420.55L673.013,418.087L674.071,416.135L678.223,413.683L678.775,412.411L675.267,413.993L672.546,416.001L668.884,417.603L670.013,416.176L678.561,407.935L679.628,405.962L677.02,406.965L674.239,409.629L671.05,411.28L672.2,410.59L673.715,408.982L675.747,405.784L673.704,405.465L669.978,407.521L668.302,409.361L666.42,409.951L667.632,409.33L671.025,406.109L672.175,405.516L672.576,404.803L673.568,404.814L676.522,403.271L679.151,400.729L680.289,400.347L681.637,398.522L680.901,399.848L678.685,401.871L675.62,405.774L674.54,408.061L674.34,409.257L674.458,409.012L676.153,409.189L676.835,408.67L676.841,411.011L673.367,417.071L677.114,415.256L679.035,413.374L680.467,412.62L679.905,413.375L678.639,417.912L678.718,422.833L679.612,424.648L679.493,425.351L681.285,424.851L683.354,419.542L683.067,417.457L681.619,419.113L681.242,421.222L681.375,422.797L682.277,425.652L682.203,426.619L682.236,426.31L680.417,425.471L679.016,423.783L677.746,419.737L676.923,418.218L675.634,418.379L672.951,419.758L672.07,420.727L671.944,421.057L672.17,421.107L670.278,422.011L666.123,421.869L664.549,420.821L665.389,421.396L666.193,421.414L667.862,420.248L671.308,420.461L674.223,421.904L670.752,423.231L668.732,423.096L668.136,423.483L667.006,423.442L665.687,424.106L665.871,423.951L667.679,424.843L672.594,424.683L677.27,427.005L682.635,426.885L680.077,426.927L678.463,427.594L672.498,427.342L674.776,428.39L676.113,428.166L676.649,428.502L678.853,428.468L680.132,429.215L673.159,426.376L665.204,422.382L664.521,422.615L653.374,422.419L656.349,422.429L657.431,423.071L655.419,422.978L653.216,422.516L652.413,422.035L650.183,421.982L656.512,422.001L657.91,422.849L659.658,422.846L667.692,420.178L669.381,419.173L669.674,419.309L672.467,418.122L673.509,418.048L674.571,417.373L678.994,417.04L679.965,416.459L681.476,413.437L681.287,412.306L681.611,408.663L682.111,407.989L682.609,410.043L682.489,418.468L682.486,411.466L682.802,407.889L682.442,408.58L682.17,411.43L681.523,413.125L681.678,414.028L681.617,413.587L682.809,411.395L685.094,404.912L684.928,404.428L682.662,408.462L682.82,410.172L682.419,411.139L683.003,408.727L683.098,404.833L682.386,405.675L681.578,407.297L681.764,408.082L681.453,408.608L681.484,411.008L681.929,405.635L680.129,407.748L680.602,407.441L682.087,403.265L680.827,403.971L677.155,407.612L679.03,405.922L680.517,402.83L680.1,403.665L678.238,405.614L677.883,406.964L680.072,403.337L677.44,409.461L677.545,410.323L676.689,411.709L676.749,412.285L676.059,414.119L676.117,416.092L676.367,415.427L676.262,418.772L676.627,420.603L678.155,423.826L678.185,424.662L679.459,426.697L674.835,424.599L674.849,426.919L676.148,428.783L676.644,430.134L678.789,431.709L680.576,432.455L680.424,432.236L682.07,429.333L681.913,426.94L681.046,425.325L683.774,430.819L681.227,429.569L680.44,428.146L678.897,427.643L676.424,427.623L675.339,427.083L673.953,427.04L673.101,426.549L671.204,426.315L674.92,426.241L678.588,428.109L679.529,429.118L681.99,430.413L677.404,428.185L680.992,428.195L681.563,426.582L681.47,418.85L681.094,418.15L681.002,412.655L680.681,413.76L680.748,420.92L681.329,422.323L681.625,425.793L681.985,426.798L681.885,426.257L683.103,424.069L683.007,423.185L684.088,418.999L684.575,415.606L685.169,414.259L685.375,412.283L685.038,413.101L685.121,416.701L684.723,417.902L684.847,424.985L684.797,422.691L685.923,415.968L685.816,414.359L686.157,413.649L686.116,406.96L688.357,402.875L688.444,401.822L686.308,403.088L684.758,404.766L684.394,405.645L683.398,406.554L682.661,408.186L686.328,401.544L685.544,403.021L685.673,401.041L686.159,398.886L686.666,398.389L686.252,402.825L685.275,405.666L685.415,407.345L685.03,408.472L685.147,409.094L685.083,406.983L685.459,406.477L685.582,405.122L686.867,402.656L686.776,401.307L685.498,403.909L685.666,404.545L686.053,403.281L686.335,398.919L686.4,400.484L685.85,401.369L685.949,402.291L684.979,404.7L684.812,407.377L684.46,407.922L684.515,411.71L685.1,410.101L685.13,408.736L685.631,407.945L686.423,402.135L686.399,401.436L684.909,404.334L685.098,409.456L685.104,408.929L687.548,403.941L687.419,402.159L687.571,400.79L688.235,399.586L688.07,398.507L688.145,400.813L688.132,400.194L689.371,398.175L689.504,395.571L689.11,396.303L689.177,398.673L688.813,399.173L688.839,400.306L687.724,403.29L687.599,408.381L687.225,408.732L687.286,409.528L686.734,410.406L686.6,412.47L686.013,413.314L686.107,417.792L686.46,418.445" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g>
+            <path d="M683.72,429.463L680.095,429.464L678.809,428.436L674.207,426.65L672.604,425.596L666.47,423.397L664.812,423.768" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+    </g>
+</svg>
diff --git a/app/assets/images/aidan_be_premium.svg b/app/assets/images/aidan_be_premium.svg
new file mode 100644 (file)
index 0000000..f6e2d87
--- /dev/null
@@ -0,0 +1,717 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 849 434" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;">
+    <g transform="matrix(1,0,0,1,-277.906,-1512)">
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M311.116,1535.32L313.268,1554.49L314.279,1558.2L314.543,1560.53L315.734,1564.85L317.199,1567.36L318.582,1571.96L319.512,1573.29" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M306.963,1530.29L309.571,1528.81L313.507,1527.66L318.944,1527.8L321.805,1528.47L323.845,1529.31L327.493,1531.74L328.206,1532.55L329.343,1536.25L327.879,1541.15L324.011,1547.47L319.949,1551.55L319.916,1551.25L318.833,1551.74L322.15,1551.58L324.585,1552.85L328.799,1555.8L330.071,1557.17L333.556,1563.35L335.157,1570.14L335.003,1572.03L333.685,1574.61L330.3,1577.47L323.834,1579.16L321.238,1580.4L318.194,1580.98L316.977,1581.54L314.892,1581.39L314.862,1580.56" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M340.252,1562.78L343.045,1561.49L344.281,1560.54L345.383,1558.83L347.862,1556.36L350.524,1551.01L350.351,1550.01L349.194,1548.73L346.727,1547.63L345.869,1547.76L342.417,1550.05L340.454,1553.11L338.231,1559.11L337.911,1561.12L338.126,1564.64L339.516,1570.26L340.517,1571.77L343.523,1574.36L344.459,1574.65L347.749,1574.32L349.485,1573.36L350.951,1571.64" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M367.527,1554.96L362.173,1553.52L360.566,1553.68L358.687,1554.61L355.356,1557.57L354.006,1559.76L353.04,1562.16L353.339,1564.41L354.072,1566.63L356.474,1570.25L360.256,1572.36L361.531,1572.59L363.314,1572.39L368.469,1571.12L370.763,1569.87L372.056,1568.74" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M386.046,1558.18L381.679,1557.02L380.213,1557.24L378.215,1558.36L375.891,1560.9L375.58,1562.3L375.784,1566.03L377.233,1570.56L378.225,1571.71L381.407,1573.77L382.287,1574.01L383.571,1573.81L387.649,1571.92L388.829,1570.11L391.956,1567.05L392.554,1563.1L391.2,1559.91L390.567,1559.4L387.337,1558.05L385.168,1559.07" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M396.015,1563.77L396.604,1566.17L398.036,1569.54L397.9,1571.04L396.388,1569.14L395.888,1567.35L395.873,1560.84L397.898,1555.4L399.212,1554.29L401.799,1553.31L405.151,1556.25L406.275,1558.39L407.897,1565.2L408.774,1567.21L408.769,1568.7L410.088,1565.75L412.18,1559.03L412.921,1557.84L416.73,1553.84L418.466,1553.16L419.342,1553.3L420.054,1554.33L420.644,1556.29L423.244,1569.98L424.416,1573.77L424.867,1574.31L426.173,1574.21L427.781,1572.16" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M433.391,1564.68L435.087,1561.42L435.547,1558.72L436.26,1557.26L436.115,1555.06L435.416,1553.85L433.168,1553.31L432.054,1553.97L430.093,1556.48L428.797,1559.52L428.835,1564.11L429.551,1566.78L432.175,1570.88L436.091,1573.05L438.505,1573.57L440.721,1573.39L443.537,1572.61L444.964,1571.98L447.98,1569.82" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M485.082,1555.28L484.956,1552.34L483.751,1550.66L481.74,1549.73L479.786,1550.95L477.748,1553L476.298,1555.62L476.001,1557.55L476.543,1563.6L477.322,1566.14L478.647,1567.72L482.504,1570.73L483.737,1571.13L485.975,1570.95L488.531,1569.44L490.559,1564.02" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M491.555,1555.22L493.251,1562.91L495.731,1566.45L497.803,1568.22L498.049,1568.15" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M552.587,1554.24L552.663,1555.38L558.272,1572.79L561.646,1579.54" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M546.055,1546.62L547.672,1543.73L553.676,1537.77L556.707,1535.47L561.055,1534.26L561.912,1534.32L564.086,1535.3L566.268,1536.82L567.255,1538.62L568.589,1544.12L568.44,1546.33L567.521,1549.15L563.978,1555.19L562.082,1556.15L560.235,1558.18L559.067,1558.59L557.565,1558.43" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M573.158,1558.33L573.097,1561.86L572.717,1562.75L572.87,1562.49L571.864,1560.9L572.065,1556.75L572.814,1555.49L572.712,1554.46L573.454,1550.58L575.257,1545.52L575.914,1544.69L578.126,1542.45L582.482,1540.61L583.318,1540.7L586.4,1542.51" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M592.156,1554.54L595.79,1553.65L597.507,1551.81L599.315,1548.06L598.962,1545.65L595.898,1544.67L593.395,1546.25L591.061,1548.63L590.189,1550.01L589.198,1553.53L589.363,1556.72L590.513,1561.99L590.914,1563.51L592.536,1565.59L595.007,1567.74L596.418,1568.43L598.611,1568.11L601.308,1566.9L603.675,1563.98" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M609.938,1556.25L610.243,1557.52L610.182,1565.65L608.635,1563.16L608.618,1559.99L610.896,1551.58L612.361,1548.76L614.399,1546.48L614.96,1545.96L617.968,1544.85L618.83,1545.49L621.186,1552.34L621.032,1554.69L621.364,1558.23L621.848,1559.54L621.755,1560.82L622.961,1558.13L622.865,1557.61L624.954,1551.86L626.276,1550.18L628.576,1548.09L632.024,1546.52L632.636,1546.58L634.513,1547.69L634.922,1548.89L635.936,1549.77L636.423,1550.85L637.372,1551.85L637.983,1553.76L639.319,1556.23L640.16,1558.9L641.38,1560.87" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M649.489,1554.6L649.675,1554.48L650.387,1558.82L650.677,1559.22L650.601,1560.21L650.983,1558.88" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M651.553,1540.17L651.466,1540.16" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M657.084,1550.08L658.339,1554.96L660.127,1557.97L661.955,1559.42L664.712,1558.12L666.032,1556.89L667.859,1554.2L670.16,1548.7L671.307,1543.86L672.045,1542.3L671.862,1541.17L669.773,1541.71" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M679.273,1547.67L678.647,1551.81L678.744,1553.91L678.368,1554.45L678.482,1555.7L677.835,1554.44L678.025,1551.31L680.306,1542.72L682.532,1540.62L682.72,1540.07L684.884,1539.57L686.711,1542.46L688.426,1548.33L689.871,1551.5L689.711,1552.5L690.116,1551.23L691.521,1550.08L692.212,1548.76L693.195,1545.8L693.851,1544.97L694.948,1542L695.815,1540.62L696.669,1540.46L698.148,1539.57L700.316,1539.63L705.848,1542.99L707.542,1544.82L708.841,1546.65L710.404,1551.05L711.6,1556.08L712.928,1558.29L714.071,1557.03" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M758.277,1542.93L758.636,1548.9L758.559,1555.34L758.559,1542.15L759.735,1536.95L761.129,1533.71L761.095,1533.98L762.07,1534.55L763.069,1536.41L764.791,1541.56L765.803,1543.66L765.641,1544.61L767.68,1539.29L771.886,1531.47L774.192,1529.42L775.259,1527.78L776.671,1526.83L778.977,1525.83L779.55,1525.88L780.639,1526.84L781.947,1529.46L783.708,1534.47L784.617,1539.74L786.367,1546.3L788.404,1550.56L788.547,1549.83" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M792.85,1546.05L797.58,1543.62L800.562,1540.55L802.971,1536.38L803.745,1533.83L803.619,1532.91L802.862,1531.76L800.102,1530.61L798.128,1531.65L795.808,1533.98L794.358,1536.61L793.945,1538.95L794.119,1542.25L795.667,1546.28L798.772,1548.39L801.035,1548.27L806.463,1546.6L809.409,1543.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M816.051,1539.18L817.428,1544.62L817.249,1550.12L816.311,1548.16L816.513,1541.15L818.26,1534.58L818.879,1533.21L821.039,1531.35L823.323,1530.33L824.173,1530.43L825.337,1531.19L826.528,1533.15L828.549,1539.58L828.543,1543.38L829.588,1540.75L835.898,1531.56L837.201,1530.84L838.644,1529.26L839.916,1528.94L842.365,1531.23L844.35,1540.64L845.787,1545.5L846.768,1547.44L847.933,1545.53" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M858.886,1520.14L857.509,1525.08L857.385,1536.95L858.136,1538.77L858.573,1542.12L858.547,1541.66L859.651,1539.55" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M859.48,1530.74L865.213,1529.18L867.622,1529.36L873.149,1531.29L875.019,1533.1L876.504,1536.21L875.423,1539.19L872.307,1543.94L866.52,1547.76L864.807,1548.16L861.924,1548.03L860.446,1547.18L860.138,1546.61L860.349,1545.12L860.861,1544.24" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M876.265,1537.97L877.524,1537.36L880.294,1536.75L881.392,1535.51L884.927,1533.4L886.477,1531.33L887.813,1528.79L887.458,1528.35L884.932,1528.02L880.551,1532.12L877.719,1538.47L877.515,1539.58L877.732,1541.84L878.304,1543.39L879.617,1544.91L883.747,1547.61L884.798,1547.82L886.694,1547.61L891.109,1546.33L893.317,1544.21L894.17,1542.84" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M896.168,1543.99L895.482,1540.72L895.65,1538.53L896.563,1535.49L898.419,1531.69L901.607,1527.8L904.416,1525.54L907.422,1524.37L909.562,1523.09L912.618,1522.01L916.346,1521.36" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M926.991,1512L931.942,1508.54L934.264,1508L937.338,1506.78L938.691,1506.95L941.816,1508.64L943.878,1512.41L945.045,1515.57L944.863,1517.56L940.825,1523.94L937.914,1526.95L936.939,1528.61L933.473,1531.82L932.917,1533.26L933.014,1537.2L933.557,1539.32L935.77,1543.4L937.122,1543.66" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M935.098,1556.67L935.196,1556.63" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M537.008,1556.07L537.034,1556.33L551.916,1552.56L557.199,1551.71L577.102,1549.88L588.231,1548.3L601.077,1546.92L619.245,1546.26L666.648,1542.98L738.522,1540.46L746.527,1540.53L774.224,1539.45L785.094,1539.4L865.665,1535.66L877.648,1535.83L883.571,1535.29L909.236,1535.37L911.114,1535.73L914.93,1535.63L915.667,1536.01L915.159,1535.54" style="fill:none;fill-rule:nonzero;stroke:rgb(242,158,255);stroke-opacity:0.5;stroke-width:30px;stroke-linecap:butt;stroke-linejoin:bevel;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M368.446,1637.07L371.298,1636.48L379.226,1636.6L380.396,1636.97L385.094,1637.19" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M419.73,1628.59L421.611,1632.41L423.537,1637.66L425.277,1644.39L427.179,1658.66L426.987,1662.38L425.698,1666.76L424.737,1667.94L422.109,1670.03L418.013,1668.57L416.619,1667.62L411.391,1659.79" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M405.952,1631.12L412.624,1629.79L415.72,1629.88L419.195,1629.36L423.1,1628.02L425.217,1626.75" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M439.179,1637.93L436.745,1637.3L434.81,1637.44L432.578,1639.06L431.845,1640.87L431.991,1643.83L433.728,1648.42L437.01,1651.65L438.466,1651.96L440.104,1651.76L442.234,1650.66L443.111,1649.72L444.702,1643.49L444.627,1642.38L442.776,1638.43L441.796,1637.61L438.923,1636.35L437.887,1636.49" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M452.604,1642.56L454.006,1648.31" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M448.704,1631.27L448.602,1631.27" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M458.241,1643.12L458.71,1644.94L458.764,1647.78L458.372,1646.97L458.492,1644.29L460.942,1636.62L462.235,1634.25L464.865,1633.09L466.13,1633.24L467.95,1634.14L469.591,1635.94L471.801,1643.38L473.441,1646.48" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M508.345,1636.05L504.553,1631.84L499.607,1629.57L498.398,1629.71L497.018,1630.63L496.475,1631.61L495.003,1632.98L494.568,1634.79L494.713,1640L496.295,1645.62L496.718,1646.76L499.461,1649.68L500.522,1649.58L503.537,1647.55L505.317,1645.73L507.03,1642.4" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M507.676,1636.62L507.541,1636.93L508.808,1640.82L510.545,1643.06L511.206,1642.9" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M521.853,1629L518.025,1630.3L516.14,1632.97L516.334,1634.92L517.897,1637.38L520.369,1638.76L526.147,1640.7L529.576,1642.69L528.605,1642.79L526.985,1643.89L525.166,1644.59L522.761,1645.13L521.099,1645.04" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M557.204,1634.55L554.53,1632.25L552.065,1630.91L550.556,1630.63L549.532,1630.05L548.622,1630.13L546.861,1631.18L544.839,1633.26L544.729,1633.7L544.534,1634.64L544.755,1637.19L546.275,1640.82L549.324,1643.78L551.371,1644.77L552.779,1644.58L555.125,1643.29L557.79,1636.92L557.611,1637.1L558.05,1638.28L558.948,1639.79L560.797,1640.85L561.114,1640.71" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M591.682,1622.51L586.613,1619.07L584.158,1618.54L582.84,1617.75L581.35,1617.92L578.613,1619.13L578.056,1620.77L579.244,1623.8L580.469,1628.89L583.527,1636.26L584.06,1638.94L585.536,1642.64L586.833,1644.09L586.885,1644.36L586.638,1644.16L585.779,1642.42" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M581.4,1634.5L585.099,1636.11L586.792,1635.84" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M601.632,1631.41L597.651,1630.09L595.581,1631.21L594.717,1634.1L594.861,1637.54L596.296,1641.05L598.471,1643.22L599.063,1643.43L600.747,1643.16L602.495,1642.21L603.27,1640.96L604.965,1636.05L604.772,1633.53L603.316,1630.57L601.516,1629.59L600.426,1629.43" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M610.156,1640.72L609.498,1636.88L609.597,1631.26L610.114,1628.48L610.896,1627.3L611.769,1627.2" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M618.247,1638.21L618.858,1640.56L618.752,1642.66L618.342,1641.6L618.435,1636.88L618.809,1636.06L618.785,1634.8L621.257,1628.48L622.688,1630.92L624.813,1637.31L625.396,1638.28L625.373,1640.11L625.788,1638.81L625.704,1637.64L626.73,1635.73L626.773,1634.33L628.868,1628.46L629.96,1626.64L630.573,1627.16L631.22,1628.5L634.819,1641.74L635.838,1643.29L636.847,1643.4" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M666.883,1630.4L664.099,1628.52L661.938,1627.5L658.315,1626.69L657.414,1626.75L654.684,1627.84L651.384,1630.97L650.839,1632.39L651.127,1634.86L652.104,1637.86L653.687,1639.83L656.157,1641.79L657.989,1642.94L659.334,1643.25L661.58,1643.02L664.351,1641.54L666.548,1635.5L667.132,1633.09L666.96,1630.81L665.386,1626.98L664.546,1626.34L663.062,1626.03L661.884,1625.36L660.749,1625.5L660.183,1625.9" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M681.669,1616.04L677.818,1615L676.658,1614.24L675.553,1614.4L674.833,1616.46L674.996,1619.79L675.861,1622.69L677.7,1632.08L678.57,1635.29L681.054,1640.38" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M675.316,1632.25L679.761,1631.23L683.481,1629.86" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M714.597,1628.45L714.69,1631.38L715.055,1632.59L715.134,1637.37L713.953,1635.47L713.226,1633.26L713.54,1624.67L715.663,1618.2L716.682,1616.38L719.295,1615.74L720.162,1616.63L721.31,1620.04L723.929,1629.72L723.913,1632.78L724.364,1631.48L724.271,1630.53L724.755,1629.47L724.998,1625.6L726.544,1620.02L727.843,1617.37L727.686,1617.16L729.443,1616.35L731.187,1618.77L732.698,1622.55L734.5,1631.3L735.526,1634.66L736.544,1636.25L736.424,1635.87L737.091,1634.21" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M738.568,1622.69L738.3,1622.67L738.444,1626.5L740.157,1632.01L741.019,1633.44L742.033,1634.33L743.497,1634.34L744.674,1633.59L745.753,1632.39L748.992,1622.54L748.857,1618.9L748.478,1618.34" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M753.68,1608.43L757.111,1626.15L758.993,1631.23L758.865,1631.9L758.821,1631.12" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M751.404,1620.56L754.485,1621.46L756.447,1621.23L757.806,1620.36L758.34,1620.42" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M761.692,1623.56L764.376,1628.41L766.971,1631.62L767.637,1633.2L769.206,1633.67L769.913,1633.08L772.435,1629.18L773.032,1626.68L775.067,1621.64L776.06,1617.25L777.255,1614.84L777.123,1614.52L775.051,1614.5" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M786.077,1620.16L782.499,1619.13L780.86,1621.66L780.622,1622.52L780.759,1625.91L782.747,1629.84L783.979,1630.32L784.843,1630.25L785.656,1629.59L788.696,1622.58L788.686,1621.4L788.709,1623.33L789.097,1623.9L789.226,1625.21L791.592,1629.85L791.758,1629.98L792.314,1629.25" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M798.606,1606.6L798.561,1612.04L798.948,1613.35L799.037,1616.71L801.312,1625.55" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M838.307,1612.78L835.52,1611.1L833.94,1610.61L833.121,1611.13L831.181,1613.31L830.766,1615.23L830.895,1619.74L832.474,1624.99L835.501,1627.98L836.369,1628.31L838.237,1628.16L838.888,1627.79L840.125,1625.05" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M840.683,1616.75L842.801,1621.14L843.718,1624.57L845.208,1627.31L845.372,1627.44L845.618,1627" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M852.597,1618.19L853.359,1621.57L854.206,1623.76L855.521,1625.95" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M855.124,1605.62L854.707,1606.64L854.997,1609.51" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M870.15,1615.92L868.546,1613.61L867.611,1612.9L867.79,1613.18L866.516,1613.03L865.116,1613.71L864.046,1614.98L863.228,1617.78L863.363,1621.16L864.247,1623.79L865.481,1626.01L866.457,1626.46L868.531,1625.75L871.147,1622.36L872.312,1619.73" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M875.123,1591.39L873.74,1597.5L873.904,1612.17L874.36,1621.51L874.895,1623.05L874.934,1624.69L875.35,1625.04" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M887.772,1626.93L885.716,1631.26L885.445,1632.61L884.288,1635.19" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M938.125,1605.08L937.023,1601.59L933.462,1597.47L929.405,1595.63L926.806,1596.97L925.925,1597.89L925.508,1599.05L926.011,1603.77L928.959,1617.57L930.692,1621.36L930.602,1621.74" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M923.406,1616.9L926.632,1616.72L932.41,1614.38" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M944.186,1615.35L944.388,1613.49L945.514,1611.05L945.411,1610.59L946.804,1608.03L952.564,1604.93L953.078,1605.27" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M952.708,1613.86L955.82,1613.09L957.879,1611.98L959.992,1608.33L959.851,1608.05L960.533,1606.96L960.417,1606.47L958.653,1606.15L956.659,1607.38L954.621,1609.47L953.788,1612.43L953.914,1615.76L955.492,1619.27L958.11,1621.67L959.823,1621.32L960.993,1620.66L962.434,1618.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M965.833,1613.27L968.661,1612.12L969.856,1610.95L971.021,1610.33L973.285,1608.2L974.657,1605.65L972.296,1606.54L970.155,1609.25L968.996,1613.84L969.145,1616.6L969.518,1617.72L970.602,1620.08L973.495,1621.93L974.375,1622.15L977.282,1621.35L979.13,1620.37L979.891,1619.54" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1010.59,1600.69L1010.74,1598.05L1009.35,1595.09L1007.91,1593.51L1005.33,1592.42L1003.31,1593.61L1001.4,1595.57L998.988,1600.52L997.882,1604.46L998.156,1607.55L999.813,1614.47L1003.18,1620.05" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M998.176,1612.96L1007.74,1612.96L1010.03,1612.12" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1021.15,1608.87L1017.56,1609.6L1015.08,1612.01L1014.73,1612.84L1014.91,1615.35L1016.79,1618.57L1018.25,1619.11L1019.31,1618.98L1021.81,1617.69L1024.17,1612.95L1023.8,1610.11L1022.03,1606.77L1021.62,1606.6" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1027.45,1619.04L1026.72,1616.33L1026.95,1612.15L1028.11,1608.74L1029.09,1607.12L1032.87,1605.22" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1036.16,1610.17L1038.13,1609.21L1040.32,1608.69L1041,1608.19L1044.17,1605.08L1046.11,1600.84L1043.43,1600.54L1039.55,1603.95L1037.5,1606.92L1036.04,1609.74L1035.64,1611.97L1035.78,1616.14L1037.5,1620.14L1039.12,1621.52L1039.72,1621.74L1041.12,1621.48L1043.35,1620.53L1045.91,1616.72" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1053.34,1600.01L1053.29,1613.66L1054.23,1617.29L1054.73,1618.01L1055.83,1617.84L1056.98,1617.21L1058.5,1615.6L1059.73,1612.77L1060.56,1609.83L1061.64,1607.62L1062.53,1604.03L1063.47,1602.34" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1067.78,1612.01L1071.74,1608.15L1074.99,1602.13L1075.87,1599.84L1075.76,1599.19L1075.64,1599.38L1073.63,1599.01L1072.26,1599.92L1070.26,1602.01L1069.08,1603.83L1068.41,1607.07L1068.52,1611.77L1069.07,1612.93L1069.04,1613.76L1070.39,1616.17L1071.34,1616.36L1072.59,1615.54L1074.3,1613.76L1076.78,1610" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1083.97,1611.72L1085.74,1604.07L1088.69,1598.55L1090.99,1595.8L1092.69,1594.65L1094.87,1592.43L1097.35,1591.06" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M353.123,1720.52L353.109,1720.8L367.317,1720.68L368.583,1720.13" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M411.568,1714.26L407.563,1711.89L405.095,1711.32L403.384,1711.6L401.684,1712.54L399.647,1714.65L399.23,1716.11L399.363,1720.12L400.679,1723.47L402.857,1726.45L405.181,1727.67L407.886,1729.69L409.29,1730.1L411.152,1729.91L412.705,1729.08L414.285,1727.54L415.412,1725.56" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M417.665,1692.77L417.024,1694.99L417.214,1699.3L416.829,1700.91L416.885,1706.24L417.951,1711.53L417.848,1713.16L418.613,1717.06L419.64,1720.39L420.895,1722.29" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M434.587,1712.51L428.529,1710.43L427.191,1710.57L424.861,1712.37L424.316,1713.8L424.44,1716.17L424.801,1717.14L426.253,1719.66L430.651,1722.35L432.219,1722.78L435.429,1722.62L437.267,1721.49L438.31,1720.21L439.627,1716.2L439.558,1715.32L437.619,1711.95L434.944,1710.82L433.907,1710.83" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M447.011,1717.02L446.285,1713.92L446.452,1712.67L447.774,1709.28L448.308,1708.32L451.678,1707.2L453.809,1709.15L454.614,1710.43L456.127,1714.75L458.662,1719.56" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M474.103,1712.65L471.376,1711.14L466.958,1709.7L464.87,1710.06L463.642,1712.48L464.037,1716.17L464.874,1717.58L466.032,1718.72L467.066,1719.32L468.309,1720.66L469.314,1720.95L472.514,1720.78L477.008,1718.72L479.333,1714.07L479.189,1712.12L478.821,1711.45L478.923,1713.89L481.751,1719.64" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M488.667,1697.84L491.941,1715.84L492.67,1718.35L494.274,1721.08" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M491.859,1713.2L494.975,1712.47L496.07,1711.61L498.119,1710.97L499.102,1710L500.449,1709.43L501.621,1708.01L503.391,1704.66L503.672,1702.79L502.9,1702.64L501.884,1702.63L500.794,1705.59L500.944,1709.55L502.394,1713.8L503.384,1715.23L505.772,1717.28L509.767,1719.49L513.422,1719.34L515.699,1718.67L517.248,1717.52" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M565.291,1703.57L560.245,1702.21L559.495,1702.32L557.087,1703.44L554.564,1706.04L553.84,1707.92L554.016,1710.76L555.428,1714.11L560.259,1717.71L562.086,1718.12L565.38,1717.97L567.388,1716.69L567.957,1716.74L570.176,1711.79L570.002,1709.88L569.264,1708.68L568.167,1705.17L567.402,1704.23L563.244,1702.37L561.366,1702.55L560.244,1703.15" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M574.934,1710.25L575.887,1713.73L576.862,1715.08L576.657,1713.2L576.899,1705.89L578.732,1701.41L580.05,1700.93L580.925,1700.97L585.11,1705.04L587.636,1710.1L588.71,1713.32L590.497,1716.36" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M602.964,1701.52L598.678,1700.22L596.748,1701.16L595.705,1703.43L595.887,1705.84L597.43,1710.11L598.727,1712.48L599.708,1713.3L600.81,1713.67L602.949,1713.62L604.803,1712.73L605.137,1712.02" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M612.529,1707.16L615.858,1704.81L617.6,1702.7L619.314,1699.28L619.14,1697.43L618.684,1696.57L615.388,1695.35L613.095,1696.79L611.006,1699.43L610.064,1702.69L610.22,1706.9L611.512,1711.91L612.805,1714.16L614.624,1716.12L620.458,1719.1L624.818,1717.81L625.344,1717.29" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M661.992,1684.35L660.603,1686.5L659.35,1689.76L659.062,1692.39L659.227,1696.25L660.211,1702.96L662.58,1710.64L666.174,1715.84L666.948,1717.51L670.315,1721.63L674.025,1724.01L675.788,1723.84L676.489,1723.44" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M685.154,1699.16L681.864,1698.23L681.376,1697.84L680.677,1698L678.583,1699.35L678.039,1701.01L678.176,1704.64L679.612,1709.32L682.348,1711.64L683.503,1712.08L685.231,1711.89L686.849,1710.99L688.142,1707.9L688.439,1706.99L688.233,1704.86L686.181,1699.98" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M693.91,1707.74L693.56,1705.82L693.64,1699.97L694.021,1698.37L694.977,1696.93L697.741,1695.9L698.694,1695.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M724.285,1699.98L725.966,1708.4L726.532,1709.51L727.862,1710.6L728.681,1710.85L729.752,1710.64L731.155,1709.77L734.069,1701.54L733.933,1697.71L734.302,1700.62L735.534,1704.68L736.985,1707.25L739.28,1709.22L740.723,1709.25L741.511,1708.87L742.264,1707.88L744.217,1701.83L744.065,1697.32L743.362,1695.89" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M748.882,1691.84L749.091,1691.8L748.654,1692.88L748.62,1694.36L748.904,1700.16L750.177,1703.77L750.079,1704.75L750.879,1706.33L751.068,1707.83L751.193,1706.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M749.63,1702.79L752.794,1701.76L753.707,1702.27L756.52,1704.64L759.029,1709.13L759.573,1709.54L759.815,1709.39" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M764.537,1702.1L767.891,1698.8L768.876,1695.77L766.887,1695.59L765.229,1696.65L764.267,1697.92L763.529,1700.41L763.667,1704.19L764.685,1707.58L765.684,1709.11L768.721,1711.62L769.975,1712.15L771.117,1711.94L772.651,1711.02L773.467,1710.1L773.973,1708.67" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M776.173,1701.07L777.313,1705.64L777.073,1707.77L777.098,1705.12L779.71,1698.02L781.873,1694.8L784.767,1693.39L785.369,1693.43L786.22,1694.05L788.052,1696.37L788.521,1698.71L791.011,1704.31" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M807.889,1690.39L807.992,1693.66L810.727,1704.8L812.947,1706.37L814.364,1705.55L815.492,1704.09" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M821.361,1683.77L821.29,1685.83L822.629,1691.49L822.818,1693.75L823.036,1709.86L822.137,1712.61L819.857,1715.46L817.824,1716.27L814.928,1716.16L812.054,1714.58" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M830.479,1695.46L829.242,1700L829.466,1702.73L830.877,1705.57L831.465,1705.87L832.177,1705.76L834.971,1703.6L837.223,1700.1L838.807,1694.63L838.641,1693.4L838.589,1693.69L836.627,1693.35" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M846.076,1691.53L846.087,1695.89L847.553,1699.49L850.308,1701.58L853.195,1700.6L854.202,1699.37L855.916,1695.97L857.374,1689.46L857.202,1686.97L856.179,1685.38" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M877.011,1687.87L876.956,1693.86L878.283,1699.04L879.267,1700.45L881.285,1702.16L882.68,1702.38L884.217,1701.1L886.372,1697.08L888.372,1691.64L888.937,1688.35L889.837,1685.81L889.662,1684.54L889.165,1686.02L889.297,1689.71L890.591,1693.47L891.86,1695.87L892.463,1696.11L893.742,1695.98L894.554,1695.35L897.509,1687.31L897.382,1685.35L896.839,1684.61" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M908.826,1688.15L907.588,1684.41L906.843,1684.13L905.374,1684.45L904.384,1687.43L904.49,1692.2L906.946,1696.67L908.184,1696.54L908.967,1695.94L911.006,1691.85L911.14,1689.24" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M913.034,1687.17L914.372,1692.61L914.461,1696.42L915.063,1694.78L915.181,1692.81" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M919.726,1687.44L921.962,1692.87L921.824,1691.59L922.403,1690.7L923.473,1687.15L924.783,1684.76L926.963,1681.96L931.263,1678.71L934.748,1678.13L935.904,1678.9L938.097,1686.08L937.899,1689.25L937.947,1692.75L938.159,1692.06" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M947.543,1677.3L949.385,1685.2L949.3,1686.23L950.058,1688.37L950.148,1690.16" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M947.17,1686.04L950.869,1686.04L951.582,1685.51L954.595,1684.41" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M958.594,1668.72L962.822,1674.18L964.242,1677.4L965.313,1683.23L965.214,1685.64L963.463,1691.07L961.417,1694.99L959.902,1696.5L959.557,1697.77" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M346.91,1791.11L349.633,1792.16L351.333,1792.46L356.657,1792.15L361.247,1792.22L363.379,1792.59" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M394.205,1774.46L397.896,1792.89L399.056,1796.51L400.023,1798.05" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M396.543,1791.1L396.142,1791.07L399.275,1789.09L402.31,1788.17L405.777,1788.28L408.047,1788.95L410.654,1790.23L411.212,1790.86L413.405,1795.44L413.379,1797.54L414.129,1798.55" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M420.853,1791.34L423.124,1789.47L424.253,1787.74L425.43,1785.35L425.058,1784.06L422.733,1783.19L422.159,1783.25L420.536,1784.4L419.384,1787.06L419.509,1790.55L420.156,1792.83L421.249,1795.1L425.125,1798.95L426.013,1799.26L430.072,1799.09L432.937,1797.19" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M438.687,1778.97L438.627,1783.51L441.077,1795.58L443.667,1800.3L444.134,1800.32" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M448.657,1788.64L450.294,1792.83L451.642,1798.31L453.844,1802.73" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M447.237,1785.3L451.974,1781.82L453.755,1781.44L455.972,1780.23L456.564,1780.4L458.188,1783.1L457.995,1784.44L456.008,1788.67L454.152,1790.53" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M491.445,1794.61L493.966,1785.48L493.887,1784.92L494.734,1783.09L495.529,1783.88L497.289,1788.83L498.91,1791.62L498.923,1790.77L499.933,1788.99L500.911,1786.01L504.402,1780.95L504.929,1779.57L507.584,1778.35L508.104,1778.38L509.828,1781.88L512.234,1790.85L513.396,1792.7L513.603,1791.46" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M520.048,1785.74L523.025,1784.11L524.771,1782.22L525.508,1779.5L527.439,1776.02L527.1,1774.95L525.617,1774.38L524.879,1774.39L523.678,1775.21L523.276,1776.31L522.582,1776.99L521.674,1779.97L521.83,1783.9L523.25,1787.79L525.453,1790.16L528.73,1792.16L532.631,1792.17L534.519,1790.49" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M574.006,1783.69L573.681,1783.58L572.344,1780.38L569.77,1777.74L567.445,1776.75L566.851,1776.81L565.683,1777.63L563.679,1780.55L563.261,1782.58L563.437,1786.03L564.847,1790.92L567.586,1793.42L568.448,1793.76L569.979,1793.39L571.286,1792.69L572.073,1791.77L573.501,1789.48L575.263,1785.43" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M575.322,1760.37L575.277,1768.05L576.114,1774.6L576.066,1776.62L577.021,1781.44L576.938,1782.71L578.028,1786.25L579.035,1787.91L579.285,1787.17" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M591.086,1774.74L587.71,1774.92L585.762,1776.74L585.286,1778.24L585.601,1782.26L587.141,1785.29L588.468,1786.42L589.362,1786.73L590.758,1786.51L592.362,1785.46L594.382,1780.08L594.202,1778L592.717,1775.49L589.756,1774.19L588.57,1774.91" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M628.79,1759.95L628.916,1763.16L632.345,1784.36L633.366,1787.82L634.331,1789.15" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M624.466,1776.29L627.961,1776.3L633.797,1774.2L637.983,1770.71" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M643.419,1761.94L644.456,1772.7L645.7,1778.69L647.184,1783.39L647.431,1783.49L647.241,1781.92L647.931,1778.4L649.044,1776.78L649.245,1775.78L650.869,1775.25L651.948,1775.29L653.868,1776.37L656.079,1778.53L656.792,1780.23L657.472,1780.93L657.747,1780.93L657.601,1780.74" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M663.488,1777.02L663.516,1777" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M666.027,1763.47L666.863,1763.65" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M682.95,1759.96L679.37,1762.2L677.495,1764.3L676.866,1765.74L677.021,1767.7L678.009,1769.02L680.744,1771.49L682.19,1772.4L684.22,1774.49L685.314,1776.89L685.251,1777.83L684.032,1779.81L682.167,1781.5L679.305,1782.76L678.323,1782.62" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M724.556,1762.34L721.584,1758.32L718.891,1756.89L717.666,1757.03L716.513,1757.77L715.573,1760.28L715.676,1766.47L716.047,1769.48L717.84,1778.38L718.853,1781.43L719.719,1783L719.883,1783.14L719.762,1782.73L720.427,1781.07" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M715.749,1773.34L718.878,1775.57L720.281,1775.86L722.439,1775.7L724.221,1774.72" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M730.441,1769.4L732.058,1775.89L732.794,1777.54L734.393,1779.09L734.948,1780.18L735.963,1780.35L737.166,1779.5L740.299,1770.82L740.16,1767.58" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M744.994,1757L745.689,1760.23L746.181,1765.93L748.778,1773.63" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M754.264,1755.85L755.552,1761.47L755.445,1763.07L756.395,1767.42L756.452,1769.49L757.119,1771.46L757.103,1773.57" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M790.798,1756.58L792.118,1769.76L793.209,1774.02L793.354,1776.23" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M785.465,1767.42L789.668,1769.12L791.499,1768.75L794.813,1767.15L796.211,1766.12" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M800.926,1768.19L802.23,1771.99L802.192,1772.88" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M802.097,1755.87L802.019,1755.88" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M811.562,1772.08L812.198,1769.61L814.772,1762.78L816.32,1762.63L816.982,1762.99L819.997,1768.82L820.037,1767.97L821.17,1765.84L822.599,1761.51L823.843,1759.26L825.407,1758.63L825.847,1758.84L826.556,1760.1L828.836,1766.13L829.885,1767.82" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M834.962,1761.49L837.449,1758.03L837.748,1756.53L838.359,1755.66L838.232,1754.91L836.299,1756.65L835.927,1757.92L836.115,1762.1L837.547,1767.12L838.866,1769.03L842.699,1771.48L843.862,1771.49" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M857.952,1771.48L857.591,1774.66L856.54,1778.92L855.795,1780.72" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M906.4,1746.82L900.802,1745.3L899.151,1745.5L895.64,1747.29L892.604,1750.38L892.391,1751.31L892.676,1752.99L894.083,1755.91L897.737,1758.67L902.303,1760.24L905.627,1761.79L906.185,1762.42L906.936,1762.66L907.794,1764.93L907.662,1766L906.328,1768.26L902.385,1771.64L900.085,1772.45L898.124,1772.32L897.267,1771.8L896.35,1770.19" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M912.641,1754.59L912.582,1757.87L914.192,1762.85L917.158,1765.29L918.42,1765.18L921.001,1764.1L923.304,1760.89L924.752,1757.96L925.299,1755.18L926.791,1751.8L926.595,1750.93" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M929.598,1739.25L930.611,1743.65L930.636,1745.22L933.453,1755.58L935.291,1759.34" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M936.84,1752.5L942.543,1750.72L945.751,1752.25L947.188,1753.78L948.812,1757.68L948.659,1759.42L947.59,1761.46L944.889,1764.18L944.044,1764.48L941.431,1764.13L938.76,1762.99" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M959.858,1745.32L957.464,1744.76L954.48,1744.89L951.446,1748.03L951.141,1749.39L951.313,1751.81L952.742,1754.32L955.211,1755.42L955.781,1755.36L957.499,1756.13L958.386,1756.05L959.671,1756.7L960.143,1757.14L961.846,1761L961.74,1761.79L961.116,1762.75L958.358,1764.03L953.814,1763.91" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M974.944,1750.24L971.815,1750.07L968.991,1752.83L968.651,1754.2L968.832,1757.98L970.689,1761.23L971.297,1761.52L973.49,1760.61L975.32,1757.97" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M983.116,1755.33L984.081,1758.25L983.837,1759.46L983.883,1755.69L984.625,1753.9L984.569,1753.04L985.921,1749.27L987.067,1747.19L987.725,1746.61L991.144,1745.18L992.659,1745.34L993.417,1746.02" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M997.288,1754.36L997.354,1759.59" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1000.61,1738.12L1000.51,1738.14" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1006.56,1736.3L1006.49,1753.62L1006.68,1754.91L1007.53,1756.41L1007.5,1757.8" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1008.01,1748.98L1010.62,1747.49L1013.67,1746.64L1014.58,1746.72L1016.91,1748.03L1018.07,1749.26L1019.52,1752.35L1019.35,1753.75L1017.93,1756.71L1014.6,1760.08L1013.17,1760.62L1010.25,1760.36L1009.29,1759.68" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1022.73,1749.68L1027.13,1746.45L1028.69,1743.49L1026.16,1744.72L1022.87,1748.68L1022.45,1750.43L1022.59,1755.01L1024.04,1759.55L1025.02,1760.75L1026.95,1762.3L1027.93,1762.71L1029.29,1762.5L1031.83,1760.55" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M306.729,1846.64L305.469,1848.75L303.163,1854.95L299.903,1861.51L298.415,1866L296.814,1868.51" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M290.771,1851.35L293.331,1854.5L299.011,1859.47L304.687,1865.13L306.881,1866.69L308.491,1868.32L310.383,1869.49" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M298.669,1849.1L298.361,1849.09L298.482,1845.86L299.708,1850.12L302.402,1867.87L303.425,1871.32L304.02,1871.9" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M284.369,1861.62L286.168,1861.61L290.971,1862.79L296.197,1862.57L301.082,1861.04L302.57,1859.32" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M350.134,1851.37L350.086,1848.22L349.699,1847.58L346.796,1846.39L345.729,1846.57L343.136,1847.98L340.826,1850.55L339.991,1853.77L340.09,1855.59L339.74,1857.44L340.006,1863.46L341.122,1868.36L341.679,1870.47L342.676,1872.13L343.89,1873.71L346.171,1875.65L349.398,1875.65L355.291,1873.37" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M369.551,1857.4L367.034,1856.8L364.762,1856.96L361.569,1858.67L360.072,1860.25L359.547,1861.63L359.684,1864.6L360.974,1867.95L361.621,1868.79L364.068,1870.94L367.189,1872.87L368.481,1873.17L369.902,1872.97L371.689,1871.75" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M372.734,1861.76L373.983,1864.33L374.591,1866.48L376.017,1869.08L376.444,1869.13" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M380.088,1862.82L381.565,1867.08L382.542,1868.57L382.402,1863.72L384.283,1857.84L385.072,1856.6L387.49,1855.56L388.344,1855.67L391.979,1858.15L392.944,1859.36L394.251,1863.73L396.013,1867.78L396.005,1869.35L396.202,1867.66" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M410.396,1857.96L406.818,1857.08L406.192,1857.21L403.107,1859.83L402.578,1861.76L402.723,1864.73L404.293,1868.92L407.039,1871.33L408.353,1871.8L410.493,1871.76" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M418.36,1861.91L420.262,1860.59L421.916,1858.66L423.692,1855.16L423.125,1854.03L420.684,1853.53L418.806,1855.15L417.625,1858.23L417.751,1864.6L419.345,1869.47L423.976,1874.3L424.571,1874.5L426.558,1873.89L428.699,1871.61" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M433.612,1851.21L433.535,1853.16L436.293,1866.66L438.383,1872.16" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M483.717,1855.01L482.253,1851.36L480.676,1850.99L477.907,1849.51L477.305,1849.6L475.458,1850.77L472.685,1854.62L472.257,1856.83L472.439,1860.23L473.703,1864.71L475.904,1868.5L479.414,1871.01L480.734,1871.34L482.623,1871.15L483.759,1870.32L485.711,1865.12L485.524,1863.04" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M485.185,1855.28L486.348,1859.53L487.711,1862.92L488.801,1864.73" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M492.834,1855L494.432,1859.86L495.868,1862.3L495.317,1861.45L495.352,1860.09L494.861,1859.32L494.989,1854.57L495.351,1852.53L497.304,1848.73L498.622,1848.29L500.344,1848.96L502.565,1853.76L505.285,1857.95L505.674,1859.61L507.106,1862.1" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M509.816,1851.08L512.075,1859.81L514.656,1862.45L515.566,1862.77L516.873,1862.56L517.612,1862.08L518.905,1859.28L520.918,1853.33" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M521.259,1845.54L520.655,1847.33L520.812,1854.1L522.368,1861.2L526.992,1876.98L528.443,1880.97L530.352,1891.42L530.154,1893.93L529.005,1896.24L527.411,1897.47L525.31,1897.34L522.339,1896.49L519.469,1894.96L514.674,1891.06L512.989,1889.39L511.078,1885.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M560.992,1843.88L563.366,1856.64L563.29,1858.07L564.649,1861.72" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M555.636,1851.91L559.519,1853.98L561.59,1853.65L565.092,1852.2L567.271,1850.08" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M573.234,1851.38L573.81,1853.92L574.583,1855.37L574.537,1856.02" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M572.271,1839.35L572.756,1842.84L573.231,1843.4" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M582.104,1851.74L583.283,1856.54L583.088,1860.07L582.009,1857.84L582.211,1852.54L582.393,1851.04L583.553,1848.3L583.578,1846.99L584.662,1844.59L586.271,1844.27L587.326,1845.17L591.07,1852.45L590.946,1852.01L591.716,1850.37L591.797,1848.4L592.824,1846.3L594.126,1845.97L594.95,1846.5L597.545,1850.61L598.86,1854.85L600.734,1858.45" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M604.645,1853.38L607.19,1850.21L607.633,1848L608.434,1846.21L608.093,1844.69L606.426,1844.24L604.659,1845.35L603.541,1846.61L602.69,1848.52L602.807,1853.21L603.373,1854.75L603.618,1856.76L604.541,1859.2L607.29,1861.73L609.667,1863.09L611.932,1862.81L613.663,1861.86L617.588,1858.71" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M635.179,1855.85L646.394,1855.14" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M667.778,1858.65L668.252,1860.72L668.336,1866.56L668.274,1864.6L667.71,1863.84L667.434,1862.71L667.573,1860.9L667.217,1859.08L667.267,1851.95L668.026,1848.86L668.693,1848.13L672.761,1846.28L673.614,1846.4L676.142,1847.77L677.705,1849.41L679.293,1853.91L680.881,1859.9L682.483,1863.44L682.403,1863.99L683.051,1862.48" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M694.399,1850.23L690.815,1849.51L689.243,1851.42L688.762,1853.08L688.899,1856.34L690.057,1859.4L691.353,1861.06L693.344,1862.84L694.22,1863.18L695.311,1863.01L697.582,1861.52L699.853,1857.85L701.904,1847.69L701.828,1846.63L700.659,1844.26L699.711,1843.34L697.989,1842.67L697.051,1842.75L695.189,1843.53L692.489,1845.08L691.422,1846.06" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M731.258,1852.33L730.861,1852.33L731.026,1859.63L731.025,1852.43L730.646,1851.49L730.755,1847.42L730.364,1846.91L730.447,1844.23L730.976,1843.48L733.408,1842.46L733.937,1842.54L736.246,1843.93L739.428,1847.12L742.184,1855.25L742.309,1858.8L742.581,1858.85" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M747.748,1852.02L750.583,1848.2L752.036,1847.19L754.661,1842.22L754.835,1841.31L753.625,1841.02L752.824,1841.22L751.693,1841.97L750.039,1843.79L748.433,1848.13L748.567,1852.67L750.885,1856.77L752.217,1857.22L756.371,1857.12L756.773,1856.78" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M762.003,1853.29L765.369,1850.96L768.511,1847.07L769.539,1843.59L770.877,1841.08L770.717,1840.36L769.416,1839.87L768.009,1839.93L764.069,1843.33L763.086,1846.12L763.39,1853.27L764.662,1855.23L767.132,1857.55L768.167,1857.88L770.591,1857.81L773.182,1856.4L774.08,1855.62L774.592,1854.54" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M786.718,1846.52L784.374,1843.79L782.196,1843.29L780.444,1844.74L779.623,1847.06L779.731,1851.64L781.601,1858.02L784.279,1860.71L786.346,1859.89L787.83,1855.53L791.303,1838.14L791.303,1829.98L790.597,1828.66L789.702,1830.29L789.853,1838.96L790.924,1843.53L790.828,1844.87L791.247,1847.51L791.847,1849.61L792.2,1849.79" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M830.035,1830.05L830.014,1837.14L831.595,1845.37L831.506,1846.74L832.929,1851.49L832.898,1852.7" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M826.331,1842.48L829.442,1843.69L833.438,1843.28" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M845.247,1839.09L843.004,1841.59L841.466,1845.06L841.314,1847.79L842.935,1852.88L844.855,1854.92L845.512,1855.17L846.965,1854.94L847.824,1854.42L850.131,1851.14L851.582,1846.57L851.43,1844.87L850.358,1842.49L849.095,1841.53L846.241,1840.23L844.925,1840.4L844.944,1840.78" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M882.496,1829.36L883.514,1835.87L883.434,1843.84L884.023,1846.35L884.357,1851.07L885.016,1852.37" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M877.472,1842.48L879.28,1843.02L881.655,1842.89L887.663,1840.23L888.838,1839.06" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M899.284,1837.13L899.246,1833.66L898.889,1832.83L897.039,1832.97L895.867,1834.02L894.179,1839.71L894.351,1846.55L896.205,1850.33L896.816,1850.66L898.162,1850.45L899.332,1849.05L902.013,1839.92L901.867,1836.71L901.881,1839.34L902.45,1840.1L902.684,1841.51L904.614,1845.15L905.202,1844.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M910.177,1828.12L910.878,1832.1L910.894,1834.62L911.884,1837.93L911.878,1841.51L912.198,1844.33L912.729,1845.14L912.597,1846.59" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M915.983,1828.52L916.292,1830.54L918.231,1837.25L918.109,1838.48L919.028,1841.75L920.805,1841.26L928.026,1833.34L930.74,1830.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M926.465,1837.82L927.466,1840.4L931.259,1847.26L933.625,1849.32L935.031,1849.81" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M964.234,1828.38L965.918,1835.42L965.825,1836.52L966.638,1839.94L966.829,1843.56L967.662,1845.81" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M961.196,1837.83L964.585,1839.07L966.531,1838.82L968.729,1837.76L972.287,1835.42L973.984,1834.77" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M983.892,1832.77L981.138,1836.68L979.546,1841.8L979.749,1844.96L981.411,1848.21L982.374,1848.65L983.653,1848.49L984.49,1847.94L985.359,1846.33L987.502,1838.4L987.338,1836.5L985.863,1834.02L983.443,1833.08L980.951,1833.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1019.43,1833.04L1017.69,1832.62L1015.4,1833.64L1013.53,1836.9L1013.03,1839.3L1013.21,1841.9L1013.93,1843.26L1013.84,1843.7L1014.75,1845.42L1015.37,1845.73L1016.88,1845.1L1019.01,1840.3" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1019.14,1837.35L1019.83,1841.31L1022.12,1848.09L1023.43,1850.48L1024.4,1850.9" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1040.45,1819.09L1040.92,1825.36L1042.42,1833.16L1042.74,1838.59L1043.51,1841.16" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1041.34,1834.45L1043.78,1832.75L1046.17,1831.98L1047.28,1832.08L1050.4,1833.58L1053.46,1836.6L1055.77,1841.04L1055.76,1842.38" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1060.18,1830.23L1061.17,1834.45L1062.84,1837.93L1063.76,1838.31L1064.66,1838.22L1065.15,1837.83L1067.03,1837.42L1067.95,1836.82L1070.52,1830.22L1070.38,1827.16L1069.86,1826.44" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1077.02,1832.71L1077.06,1837.82L1076.69,1838.28L1076.79,1838.96L1076.77,1836.83L1077.3,1834.86L1077.25,1833.24L1077.84,1829.39L1079.19,1825.76L1079.79,1825.91L1082.28,1831.73L1082.08,1833.28L1082.3,1834.86L1084.58,1828.51L1086.16,1825.34L1088.02,1823.54L1089.78,1822.71L1090.64,1823.13L1092.7,1827.25L1093.43,1829.01L1093.6,1830.96" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1103.67,1824.58L1100.98,1827.79L1099.3,1831.62L1098.96,1833.29L1099.13,1835.88L1100.29,1837.65L1101.69,1836.76L1102.18,1836.19L1102.82,1834.35L1104.75,1832.16L1105.28,1829.95L1106.54,1827.42L1105.75,1828.63L1105.76,1829.33L1106.66,1830.93L1107.11,1832.76L1107.95,1834.35L1108.35,1834.35" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1113.76,1823.45L1114,1833.58L1114.25,1833.62L1114.88,1831.77L1116.75,1824.4L1117.77,1822.36L1119.7,1821.69L1121.08,1822.51L1122.84,1824.37L1124.29,1826.59L1125.73,1831.22L1126.6,1832.69L1126.48,1833.41" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M560.487,1905.72L560.956,1905.69L562.062,1903.84L564.712,1901.66L567.716,1894.74L567.558,1894.16L565.28,1894.36L560.826,1897.85L556.282,1906.26L556.079,1907.38L556.359,1910.55L557.339,1914.47L559.228,1917.06L562.961,1919.49L563.837,1919.7L566.906,1919.46L568.788,1918.37L569.295,1917.08" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M573.999,1900.9L575.436,1908.44L576.847,1911.84L577.293,1914.14L577.933,1915.06L579.65,1916.16L579.913,1916.89L580.426,1916.78L582.241,1911.22L584.37,1900.39L585.55,1896.74L585.281,1896.16" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M588.56,1905.12L591.13,1904.55L593.731,1903.16L594.328,1903.17L595.265,1901.29L595.234,1900.08L592.676,1899.21L592.13,1899.28L589.031,1902.08L588.045,1905.01L588.192,1908.1L589.891,1912.73L590.895,1914L593.873,1916.36L594.848,1916.59L596.1,1916.33L597.721,1915.51L599.089,1911.78" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M604.348,1912.47L604.371,1908.47L605.854,1904.72L606.998,1902.8L608.428,1902.45L608.75,1902.61" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M613.658,1901.34L615.005,1907.35L615.976,1908.88L619.103,1912.3L619.727,1912.52L620.864,1912.24L621.236,1911.71" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M623.571,1899.5L622.46,1903.47L622.664,1907.66L623.543,1910.66L623.465,1912.13L624.684,1919.45L626.125,1925.12L626.564,1928.9L628.436,1938.33L628.278,1940.58L627.229,1943.41L624.513,1946.07L623.594,1946.29L621.315,1946.04L617.135,1944.11L613.657,1941.42L611.692,1938.49L608.888,1932.9L608.569,1931.56L608.805,1929.81" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M630.236,1896.38L630.924,1899.6L630.876,1900.79L632.646,1908.11L633.513,1910.93L634.679,1912.82" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M626.028,1908.52L630.585,1905.24L633.073,1903.88L633.799,1902.99" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M641.791,1894.71L642.996,1904.48L644.107,1907.64L644.096,1910.04L644.342,1910.1L644.409,1908.21L645.251,1906.72L645.389,1905.56L646.613,1905.58L647.762,1906.12L650.335,1908.85L650.832,1908.91L651.587,1909.71" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M658.406,1907.28L658.438,1907.26" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M659.494,1895.69L659.444,1895.7" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M663.437,1907.7L664.432,1904.77L665.495,1903.65L665.871,1902.36L669.545,1898.26L674.095,1896.1L676.865,1896.13L678.279,1897L680.029,1899.66L683.502,1909.11L683.479,1910.87L683.936,1908.73" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M693.377,1901.19L691.732,1903.29L690.243,1906.94L690.133,1907.86L691.26,1910.29L692.807,1911.75L693.251,1911.8L694.497,1910.97" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M696.019,1899.61L695.409,1901.4L695.557,1904.51L696.277,1905.66L697.985,1911.78L700.314,1926.39L700.185,1928.75L698.121,1937.74L696.711,1939.87L694.648,1941.52L690.967,1940.39L690.154,1939.78L688.034,1937.11L685.828,1932.64L683.383,1923.87" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M727.244,1900.56L728.606,1906.49L730.617,1910.52" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M728.052,1894L727.979,1894.01" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M743.956,1895.43L738.96,1897.44L738.892,1899.67L740.669,1901.33L742.217,1901.86L743.63,1902.83L745.407,1903.33L746.256,1904.23L747.672,1904.99L749.534,1906.97L750.441,1908.69L750.443,1909.87L749.528,1911.35L747.955,1911.84L744.512,1911.76L741.622,1910.79" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M782.09,1898.66L778.215,1898.51L776.683,1899.25L773.932,1901.92L773.343,1902.82L773.035,1904.19L773.803,1908.25L774.253,1909.41L775.559,1910.85L779.727,1913.41L781.477,1913.11L783.89,1912.11L785.474,1909.76L786.948,1903.16L786.838,1901.53L785.264,1897.98L784.252,1897.89L782.184,1896.94" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M793.919,1901.62L793.93,1899.74L795.938,1892.71L796.818,1891.27L798.897,1891.03L799.717,1891.59L804.384,1897.86L805.115,1899.52L805.721,1902.31L806.98,1904.37" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M835.297,1886.97L838.396,1906.21L839.273,1908.91L839.955,1910.26L839.846,1909.66" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M832.959,1894.71L836.104,1895.76L837.507,1895.56L839.941,1894.27L841.722,1893.73L843.021,1892.15" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M845.16,1893.11L846.566,1900.08L847.806,1904.81L848.554,1906.44L848.356,1907.59L850.563,1901.88L851.148,1901.11L851.112,1901.38L852.568,1902.23L855.789,1905.68L858.061,1909.87" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M861.918,1902.58L863.273,1900.67L865.02,1899.3L865.427,1897.64L866.023,1896.75L865.921,1896.39L864.745,1896.92L863.654,1898.02L863.336,1899.29L863.519,1902.54L864.366,1905.28L866.394,1907.68L868.724,1909.06L869.595,1909.26L870.872,1909.06L873.039,1907.88" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M895.422,1896.4L896.83,1904.07L896.994,1907.47L898.402,1912.31L899.407,1913.73L900.013,1913.53L901.007,1912.41L902.862,1907.14L904.325,1899.28L905.548,1895.35L905.497,1898.65L906.41,1900.63L906.773,1903.01L907.523,1904.97L909.384,1906.07L910.432,1905.96L912.051,1904.35L912.992,1902.91L915.312,1896.65L916.883,1894.44L917.307,1892.4L917.753,1891.82L916.639,1892.15" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M917.93,1900.92L920.921,1899.29L922.402,1897.68L923.716,1894.46L923.389,1893.46L921.509,1892.74L920.252,1893.3L918.675,1897.02L918.841,1902.03L920.843,1907.24L923.357,1909.33L924.916,1908.83L926.928,1907.06L928.089,1905.24L929.202,1902.6" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M934.671,1881.05L934.618,1901.43L935.661,1903.24L936.058,1901.62" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M937.889,1896.82L942.636,1895.03L943.673,1895.17L945.213,1896.11L946.077,1897.76L946.431,1899.21L945.697,1900.95L944.525,1901.41L943.217,1902.77L941.308,1903.54L940.149,1903.42L938.104,1904.1L937.441,1904.02" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M955.933,1890.63L953.39,1890.98L951.739,1891.92L950.005,1893.6L949.292,1895.28L949.435,1896.27L950.464,1898.12L951.521,1898.82L954.173,1899.62L956.185,1900.61L957.144,1901.52L958.83,1904.82L958.821,1906.46L956.518,1907.38L954.642,1907.2L954.047,1907.6L951.872,1907.51" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M963.342,1896.11L962.162,1900.9L962.329,1903.89" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M964.815,1885.4L964.745,1885.42" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M972.845,1888.66L973.003,1899.86L973.586,1900.91L973.953,1902.85L974.057,1901.73" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M970.304,1897.93L972.99,1896.07L975.811,1894.6L979.679,1893.46L980.783,1892.73L981.041,1892.87" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M984.589,1892.9L988.562,1891.13L993.008,1887.32L995.195,1883.22L994.62,1882.41L992.82,1882.12L991.26,1882.93L989.645,1884.66L986.799,1890.23L986.585,1891.33L986.862,1895.22L988.106,1898.92L988.654,1899.87L989.99,1901.02L990.761,1901.24L992.202,1901.04L993.906,1900.27L995.707,1898.33" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1004.7,1877.13L1004.6,1881.51L1004.25,1883.03L1004.31,1894.52L1005.36,1896.59" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1003.1,1908.11L1003.17,1908.09" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1049.49,1891.01L1049.14,1890.84L1052.23,1890.21L1056.61,1888.1L1057.91,1886.98L1059.5,1884.21L1059.89,1882.31L1059.23,1881.52L1055.91,1879.93L1054.97,1879.66L1053.53,1879.79L1050.98,1880.84L1047.07,1883.46L1044.86,1886.13L1042.3,1891.33L1041.99,1893.01L1042.34,1899.79L1043.33,1903.11L1044.93,1904.35L1046.34,1905.21L1047.84,1905.56L1049.71,1905.4L1052.57,1904.5L1054.87,1903.28L1057.77,1901.01L1060.09,1898.02" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1064.91,1884.84L1068.05,1884.12L1072.32,1882.32L1078.63,1882.33L1079.19,1882.66L1079.97,1884.51L1079.92,1885.07L1078.45,1887.23L1077.2,1888.37L1075.17,1891.51L1070.53,1900.17L1069.44,1903.56L1069.55,1905.12L1069.52,1904.77L1070.79,1905.38L1080.96,1905.15" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1097.41,1891.05L1098.41,1896.47L1098.52,1903.56L1099.07,1904.27L1099.15,1905.06L1099.33,1905.19L1099.46,1904.62" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1094.95,1886.68L1097.55,1884.82L1098.84,1883.24L1101.35,1882.71L1102.15,1882.24L1103.37,1882.35L1105.34,1884.2L1107.36,1888.82L1107.38,1891.94L1106.09,1892.4L1103.47,1894.44L1099.53,1896.23" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1114.85,1889.51L1118.89,1889.33L1119.98,1888.66L1123.85,1887.27L1125.57,1888.46L1127.03,1888.83L1127.61,1890.71L1127.51,1891.52L1126.2,1893.64L1122.28,1897.38L1119.66,1901.35L1117.22,1904.2L1115.04,1907.87L1113.58,1909.17L1113.12,1911.04L1113.22,1910.86L1114.79,1911.57L1116.77,1911.46L1119.37,1910.44L1120.21,1910.54L1122.41,1909.8L1126.12,1909.12L1128.41,1909.07" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999389,0.034953,-0.034953,0.999389,60.78,-23.6859)">
+            <path d="M1048.37,1920.22L1048.69,1920.56L1052.58,1921.42L1073.5,1922.71L1101.64,1923.24L1128.03,1922.82L1131.3,1922.51" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+    </g>
+</svg>
diff --git a/app/assets/images/aidan_dispatches.svg b/app/assets/images/aidan_dispatches.svg
new file mode 100644 (file)
index 0000000..fefa5fe
--- /dev/null
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 950 119" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;">
+    <g transform="matrix(1,0,0,1,-293.651,-891.79)">
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M338.666,941.958L339.092,941.818L338.527,943.064L338.486,944.184L338.645,959.731L340.242,971.631L341.383,976.854L342.07,977.232L342.85,978.507L344.014,978.581L344.93,977.298L345.455,975.431L347.405,966.334L348.601,955.091L350.081,946.268L349.893,943.817L350.108,943.193L350.092,952.323L351.734,963.87L353.013,968.124L355.572,973.155L357.399,975.709L359.459,977.41L360.377,977.61L361.835,976.87L363.269,974.399L364.618,970.598L366.58,961.793L368.043,948.81L367.878,940.753L367.4,937.851L366.658,936.571" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M381.688,960.322L380.598,956.829L379.348,954.56L376.61,953.268L375.127,954.197L373.416,956.557L371.398,962.826L370.979,966.681L371.33,972.514L372.287,975.861L375.009,978.432L375.955,978.654L377.656,978.428L379.96,976.619L382.24,972.552L383.694,966.386L384.413,964.854L384.232,963.712L383.563,965.478L383.723,969.036L385.319,971.705L386.669,970.139" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M388.25,961.979L390.91,970.379L392.264,972.667L392.378,969.446L395.582,955.851L398.922,951.214L401.673,950.25L402.827,951.354L404.131,956.156L405.147,961.505L404.96,964.911L405.34,966.177L405.424,971.39L405.84,970.103" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M415.934,943.523L416.412,948.665L417.042,951.225L417.085,953.901L417.75,957.378L417.69,959.046L418.637,963.738L418.638,966.605L419.133,968.691L419.233,970.99" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M411.907,959.754L417.937,958.336L420.963,956.758L426.855,954.393" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M458.564,957.778L458.451,959.018L458.838,961.304L458.799,970.17L458.757,960.635L459.618,954.841L459.522,952.492L461.37,944.148L462.385,940.516L463.109,939.372L466.657,937.976L467.414,938.021L468.142,938.628L469.462,940.665L470.936,943.968L472.66,950.121L473.347,955.913L474.844,963.505L476.001,966.605L475.87,967.236L476.336,964.612" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M477.939,958.521L479.189,957.93L481.217,956.293L485.693,950.042L487.152,945.396L487.038,944.122L486.11,942.767L484.218,942.196L482.253,943.516L480.658,950.066L480.825,956.254L482.11,963.085L484.391,967.829L485.548,969.382L487.587,971.258L488.179,971.48L489.346,971.239L490.208,970.683L493.711,965.784L496.709,958.994" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M502.285,943.12L501.326,946.326L501.145,948.584L501.217,956.618L501.965,959.094L501.906,959.989L503.388,962.812L504.548,962.792L505.04,962.084L506.642,958.24L509.315,948.111L510.494,945.879L510.297,948.813L510.871,953.606L512.099,958.613L513.851,961.478L515.841,963.211L517.017,963.68L518.178,963.508L519.603,962.111L520.792,960.083L524.086,950.878L524.782,946.564L525.705,943.198L525.224,936.913" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M575.357,951.138L575.627,950.205L575.528,947.03L573.808,942.013L571.602,940.087L568.971,939.086L566.997,939.959L565.245,941.237L563.096,944.016L561.839,947.173L560.525,951.847L560.332,953.62L560.549,957.295L561.679,962.056L563.27,964.403L565.758,966.299L569.197,965.155L571.777,962.653L574.22,958.038L574.924,954.69" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M580.697,913.51L579.494,915.712L577.954,921.082L577.201,929.189L577.315,937.953L579.308,951.376L581.063,958.712L580.939,960.897" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M587.137,948.498L588.621,953.725L588.386,955.152L588.81,955.931L588.981,955.32" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M589.957,932.41L589.885,934.182L590.283,935.106L590.838,935.418" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M603.94,939.766L600.187,940.791L597.607,942.116L597.298,942.902L597.486,944.193L598.495,945.803L601.93,948.448L603.85,948.906L609.033,951.442L611.523,953.4L612.63,954.524L613.602,957.466L612.301,959.868L609.584,962.251L607.724,962.664L602.269,962.573L601.459,961.851L601.478,960.874" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M622.691,942.272L622.642,955.552L624.34,960.144L624.437,959.376" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M617.772,936.48L619.394,933.61L620.654,932.505L622.954,931.223L631.605,929.193L633.916,929.353L634.718,929.742L637.025,931.636L638.1,934.392L636.772,937.535L635.221,939.969L631.488,943.42L629.675,943.825" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M649.003,944.121L648.007,942.151L646.49,940.48L644.705,937.506L644.084,937.007L642.635,936.597L641.757,937.266L639.401,939.537L638.533,940.899L635.984,947.5L635.682,949.471L635.867,951.537L636.773,954.369L637.738,955.688L641.518,957.866L643.226,957.77L645.809,956.724L647.996,955.217L649.685,952.904L651.479,946.428L651.292,945.488L649.253,948.62L649.48,952.688L651.628,956.299L653.277,956.169L654.403,955.468" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M662.41,925.782L662.837,934.456L664.389,944.539L664.297,946.056L665.552,952.109L665.466,953.355L666.614,957.008" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M658.061,946.079L661.319,944.855L669.128,942.842L674.365,940.886" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M684.128,928.768L680.78,930.563L678.885,933.079L675.827,943.589L675.523,945.94L675.749,950.118L676.997,954.872L678.898,956.425L680.331,957.132L681.676,956.939L683.784,955.644L686.391,952.203" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M690.235,928.765L690.154,933.471L689.468,939.034L689.582,953.623L690.519,956.826L691.243,956.795L692.154,955.632L694.498,950.421L695.067,947.657L696.558,945.295L698.596,944.584L699.397,944.876L701.036,946.393L702.28,948.428L703.082,950.618L703.704,951.44L705.378,956.498L706.679,958.877L707.302,958.772L708.226,957.591" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M712.417,950.171L716.054,948.26L719.635,943.981L721.284,940.426L721.858,937.319L722.456,935.857L721.562,934.305L720.198,934.235L719.651,934.666L718.289,937.221L715.396,944.81L714.842,949.202L715.177,953.922L715.984,956.936L717.302,958.592L719.366,960.095L720.331,960.333L721.655,960.159L727.196,956.47L730.816,953.137" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M746.309,927.63L741.539,928.933L738.071,931.601L736.137,933.908L733.947,938.714L734.112,940.565L734.464,941.154L736.787,942.684L741.33,944.906L744.348,946.947L745.898,948.614L746.784,951.617L746.728,952.451L744.589,956.158L742.645,957.647L739.645,959.303L736.453,959.098L734.34,958.155L733.39,956.747" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M805.259,939.736L800.516,932.971L798.393,931.04L796.392,930.224L794.554,930.923L792.298,932.671L789.473,937.888L787.06,947.592L787.702,952.498L788.447,955.181L789.089,955.918L791.742,957.719L792.659,957.96L793.951,957.772L795.223,957.161L798.259,954.515L802.589,948.621" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M809.195,908.876L807.685,914.923L805.808,931.163L805.955,943.047L806.85,946.96L806.817,950.554L807.95,953.229L807.831,952.81L808.384,951.573" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M815.75,944.124L819.152,941.755L819.931,940.391L820.289,938.996L822.399,935.848L823.475,933.344L824.749,927.225L824.425,925.704L823.715,924.589L823.102,924.253L821.994,924.267L821.067,924.876L818.546,927.436L816.898,930.746L814.959,937.997L815.162,943.957L816.533,950.543L818.158,953.046L819.017,953.666L821.342,954.882L823.074,954.776L825.36,953.913L826.682,952.983L830.654,948.634L832.002,946.059" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M841.938,912.964L840.083,917.516L838.253,930.456L838.592,947.849L838.918,949.838L839.407,950.806L839.413,952.218L840.296,949.593" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M847.794,939.338L847.818,950.562L848.243,951.213" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M848.323,921.411L846.895,925.127L847.16,926.813" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M853.878,930.479L856.364,942.51L857.129,950.618L857.824,951.672L857.716,952.483L858.042,952.927L858,952.668L858.85,952.132L859.703,950.112L860.668,949.147L862.196,946.031L864.819,938.703L867.414,933.498L867.904,931.338L869.373,928.107L870.066,925.602" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M875.195,940.87L877.702,937.516L878.533,937.203L879.233,936.474L881.438,932.031L881.268,930.599L878.211,929.831L876.534,930.96L874.486,933.019L873.614,934.397L871.021,939.771L870.468,943.815L870.611,948.236L870.938,950.403L871.746,952.714L874.799,955.5L878.277,955.46L880.841,954.507L882.572,954.337L883.864,953.451" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M885.641,941.592L886.119,941.582L886.792,946.151L886.936,951.419L886.012,949.442L886.212,943.015L887.276,941.343L888.096,938.592L889.723,936.526L894.344,933.567L898.979,932.016L900.113,932.371" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M900.515,944.98L904.702,943.147L905.383,942.345L907.63,940.872L910.525,936.516L912.272,932.041L911.927,930.916L909.626,929.736L907.951,930.682L905.549,932.923L901.607,941.848L901.044,945.365L901.194,948.898L902.47,952.636L905.559,955.385L906.271,955.585L908.134,955.324L911.276,954.228L914.941,952.399L917.793,950.142" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M928.718,935.802L924.383,934.509L921.469,935.934L917.816,941.161L915.421,947.745L915.717,950.733L916.26,952.027L917.296,953.516L918.828,954.932L919.717,955.259L921.467,955.035L924.604,953.418L925.789,952.127L928.092,948.106" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M938.903,909.422L937.117,912.009L934.653,920.526L932.304,930.909L931.893,936.44L932.074,942.824L933.202,949.623L934.324,954.173L935.346,955.518L935.8,955.171" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M971.385,945.226L969.655,951.907L969.696,953.221L970.437,951.13L971.418,945.578L972.28,939.584L972.201,937.999L972.8,933.606L972.716,930.803L973.082,928.684L974.889,924.856L977.694,923.554L978.647,923.678L981.265,925.128L983.032,927.948" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M986.315,939.287L987.261,943.875L987.073,949.709L987.269,949.845L987.456,949.068" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M989.162,929.732L989.087,929.751" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1006.21,933.282L1005.11,932.578L1001.68,931.812L1000.27,932.375L998.302,934.265L996.982,936.667L994.782,943.151L994.458,945.686L994.67,948.831L995.541,952.245L996.501,953.773L999.292,955.292L1001.56,955.218L1005.04,953.836L1007.92,951.518L1011.01,945.494L1012.71,937.853L1012.56,936.264L1011.89,935.121L1010.4,934.608L1010.28,939.492L1011.58,942.842L1012.42,946.409L1013.45,951.794L1014.75,961.919L1014.58,966.487L1013.15,977.44L1010.38,984.333L1008.97,986.637L1006.56,988.24L1004.73,988.005L1002.58,987.14L999.554,984.713L997.091,979.717L996.393,976.959L997.086,970.467" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1020.47,919.578L1019.21,925.401L1018.29,932.769L1018.37,941.375L1018.75,942.435L1018.84,944.346L1019.56,945.315L1019.81,944.089L1021.44,942.269L1022.52,939.071L1024.82,934.854L1026.47,933.166L1028.96,932.316L1030.67,933.655L1033.87,945.217L1035.32,947.911L1035.62,948.134L1036.55,947.842" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1044.95,927.624L1045.89,934.681L1045.96,937.757L1048.07,949.045L1048.12,951.095L1048.81,953.077L1048.8,954.577" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1042.64,941.296L1049.06,937.572L1052.53,934.673L1054.34,933.55L1062.72,929.635" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1099.74,917.784L1099.29,918.981L1099.41,927.768L1099.01,931.667L1099.1,936.439L1099.48,938.01L1099.56,941.895L1099.89,943.079L1099.78,945.712L1100.01,946.003" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1093.51,934.823L1097.38,933.943L1099.01,933.921L1104.13,932.562L1108.22,931.061" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1115.92,925.952L1112.61,928.972L1111.75,930.201L1110.06,936.116L1110.26,937.82L1111.5,940.762L1114.61,942.808L1116.73,942.545L1118.69,941.952L1120.99,940.681L1124.42,937.303L1126.57,933.431L1127.41,928.918L1126.55,926.808L1124.59,925.248L1123.65,924.685L1119.23,923.889L1117.62,923.981L1113.59,925.349L1112.15,926.819" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1148.87,921.308L1147.65,924.408L1146.92,927.963L1147.09,931.284L1148.39,935.109L1150.63,936.574L1152.89,936.478L1157.05,934.66L1159.93,931.841" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1166.51,917.065L1164.81,920.636L1164.5,922.293L1164.79,925.454L1164.71,931.67L1165.09,933.404L1165.21,937.138L1164.79,948.229L1162.79,959.241L1159.51,966.492L1158.94,967.231L1156.63,968.677L1155.7,968.923L1154.43,968.746L1151.38,967.67L1148.59,964.475L1145.76,956.011L1145.43,953.559L1145.66,949.497L1146.63,946.289" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1178.25,923.97L1174.43,924.713L1172.19,928.69L1171.96,929.65L1172.18,931.879L1173.43,934.211L1174.74,935.381L1175.56,935.597L1179.06,934.802L1181.99,932.868L1185.05,929.269L1186.79,925.813L1187.36,924.384L1188.13,920.506L1188.08,919.526L1187.44,918.729L1184.58,917.12L1182.98,917.821L1181.93,919.685L1182.07,919.983" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1190.93,924.416L1193.22,929.28L1196.88,932.981L1198.78,932.777L1200.69,932.094L1203.35,929.456L1205.49,925.914L1206.59,923.712L1207.73,919.56L1208.81,917.729" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1213.79,907.933L1219.91,905.833L1222.24,905.991L1223.1,906.501L1223.9,906.474L1226.59,907.446L1227.9,910.225L1227.72,911.566L1225,916.656L1224.18,917.513L1222.54,920.881L1222.73,922.501L1223.27,923.372L1224.21,923.786L1225.27,923.669" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M1221.91,937.786L1221.95,937.783" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M980.424,951.839L986.005,951.853L1005.9,949.896L1020.56,947.463L1048.73,943.401L1078.09,939.724L1095.61,938.056L1125.4,933.532L1154.24,930.036L1165.29,929.043L1184.33,926.175L1205.17,923.917L1220.02,923.068L1227.56,922.33" style="fill:none;fill-rule:nonzero;stroke:rgb(255,195,140);stroke-opacity:0.5;stroke-width:30px;stroke-linecap:butt;stroke-linejoin:bevel;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M317.994,960.643L313.096,959.161L311.89,959.323L309.177,960.671L307.794,962.174L305.94,965.556L304.605,970.005L303.445,975.478L303.636,982.426L304.772,994.572L306.641,1004.61L311.5,1022.01" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M312.471,1022.31L315.178,1016.84L316.685,1014.7L319.358,1007.83L320.592,1005.67L319.801,1007.03L318.745,1008.03L318.102,1010.48L315.006,1015.93L314.348,1018.8L312.41,1023.07L312.596,1024.38L312.561,1024.01L311.91,1024.43L309.487,1024.35L307.284,1023.02L303.144,1018.03L299.609,1010.67" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M297.19,1007.47L296.999,1007.24L301.205,1006.32L306.592,1003.64L306.938,1005.99L306.144,1006.85L304.958,1009.49L303.889,1010.44L303.783,1010.88L310.736,1007.45L309.58,1008.18L307.824,1010.21L308.206,1009.78L311.673,1008.2L312.89,1007.19L311.021,1008.45L309.633,1009.91L309.364,1010.01L309.353,1009.73L309.112,1010.74L311.318,1009.55L312.77,1008L311.62,1008.75L308.38,1011.97L307.704,1013.82L311.24,1010.45L311.578,1009.59L312.493,1008.76L313.499,1007.17L312.188,1007.89L309.258,1010.85L308.107,1013.69L308.195,1014.1L309.541,1013.18L312.763,1007.6L310.291,1010.13L308.367,1012.79L307.058,1015.5L307.133,1015.93L310.527,1009.06L310.533,1008.31L308.56,1009.39L306.909,1011.18L305.33,1013.95L305.414,1014.38L306.638,1011.66L306.747,1008.97L306.904,1012.67L307.252,1014.09L307.185,1013.57L308.512,1010.96L307.495,1013.36L307.67,1014.77L307.657,1014.44L308.519,1014.51L309.498,1013.97L310.635,1012.68L312.598,1009.08L310.819,1012.68L310.99,1013.81L310.625,1014.78L312.658,1010.69L313.179,1008.85L309.105,1012.53L308.671,1013.67" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M456.007,926.821L453.841,923.739L450.52,920.193L442.577,912.829L433.853,905.9" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M483.147,924.108L483.292,922.976L485.349,917.447L488.744,904.633L490.123,897.347" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M523.314,923.588L526.608,919.533L532.29,910.883L535.974,905.994L537,903.906" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M448.621,986.572L448.659,986.683" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M448.252,982.009L441.511,990.036L438.682,995.185L437.964,995.928" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M477.886,987.348L478.895,994.089L478.794,996.055L479.748,1002.11L479.701,1003.5L480.318,1005.47" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+        <g transform="matrix(0.999366,0.0356156,-0.0356156,0.999366,34.7142,-26.9875)">
+            <path d="M507.228,989.49L509.966,994.891L512.943,999.547L514.82,1001.12L516.406,1001.85L520.834,1003.03" style="fill:none;fill-rule:nonzero;stroke:black;stroke-width:4px;"/>
+        </g>
+    </g>
+</svg>
index 3c95e20b576dbaddcbf9683c911351b23f286daa..79890274f102af50df6d9507e9eb0daaa1bfe2d5 100644 (file)
@@ -271,6 +271,16 @@ footer p {
   padding: 20px;
 }
 
+.aidans_arrow {
+  max-width: 70px;
+  float: right;
+  padding: 20px;
+}
+
+.aidan_about_u {
+  max-width: 360px;
+}
+
 .post .container p img {
   max-width: 170px;
   float: right;
index 315c1665a4684e485a1757f3c7fc54257a4f7f4d..b0dba72bd3c05913d77d88c48d0bea9558af7e94 100644 (file)
Binary files a/app/controllers/.DS_Store and b/app/controllers/.DS_Store differ
diff --git a/app/controllers/mailing_lists_controller.rb b/app/controllers/mailing_lists_controller.rb
new file mode 100644 (file)
index 0000000..39144be
--- /dev/null
@@ -0,0 +1,36 @@
+class MailingListsController < ApplicationController
+  before_action :authenticate_user!
+
+  def index
+    @user = current_user
+    @buttondown_status = @user.buttondown_status
+    @is_paid_user = @user.paid_user?
+  end
+
+  def subscribe
+    result = ButtondownService.new.subscribe(current_user)
+    if result
+      redirect_to mailing_lists_path, notice: "Successfully subscribed to the mailing list."
+    else
+      redirect_to mailing_lists_path, alert: "Failed to subscribe. Please try again later."
+    end
+  end
+
+  def unsubscribe
+    result = ButtondownService.new.unsubscribe(current_user)
+    if result
+      redirect_to mailing_lists_path, notice: "Successfully unsubscribed from the mailing list."
+    else
+      redirect_to mailing_lists_path, alert: "Failed to unsubscribe. Please try again later."
+    end
+  end
+
+  def sync_status
+    result = ButtondownService.new.update_subscriber(current_user)
+    if result
+      redirect_to mailing_lists_path, notice: "Successfully synced subscription status."
+    else
+      redirect_to mailing_lists_path, alert: "Failed to sync subscription status. Please try again later."
+    end
+  end
+end
\ No newline at end of file
index c1aa55530b09ad934c40c417cccd4f00b3505a0c..e947fcb1181e49a402aafd2e1f97b9e1d5e4b22f 100644 (file)
@@ -1,5 +1,4 @@
 class PubviewController < ApplicationController
-  before_action :set_pages, only: [:index, :show_public]
   
   def index    
     @per_page = 15
@@ -68,14 +67,4 @@ class PubviewController < ApplicationController
     word_count = content.split.size
     (word_count / 200.0).ceil
   end
-  
-  def set_pages
-    @pages = Page.where(visibility: :visible)
-     .order(Arel.sql("CASE 
-                      WHEN title = 'About' THEN 1 
-                      WHEN title = 'Sponsorship' THEN 2 
-                      ELSE 3 
-                      END"))
-     .limit(2)
-  end
 end
diff --git a/app/controllers/subscriptions_controller.rb b/app/controllers/subscriptions_controller.rb
new file mode 100644 (file)
index 0000000..a601317
--- /dev/null
@@ -0,0 +1,107 @@
+class SubscriptionsController < ApplicationController
+  before_action :authenticate_user!
+
+  def index
+    @user = current_user
+    @subscription_status = @user.subscription_status
+    @support_type = @user.support_type
+    @last_payment_date = @user.last_payment_at
+    @last_payment_amount = @user.payment_amount
+
+    if @user.stripe_customer_id.present?
+      Stripe.api_key = Rails.configuration.stripe[:secret_key]
+      @payments = Stripe::PaymentIntent.list(customer: @user.stripe_customer_id)
+      @portal_session = create_portal_session if @user.subscription_status == 'active'
+    else
+      @payments = []
+    end
+  end
+
+  def new
+  end
+
+  def create
+    support_type = params[:support_type]
+    payment_amount = params[:payment_amount]&.gsub(/[^0-9.]/, '')&.to_f
+
+    if support_type == 'non_financial'
+      current_user.update(support_type: 'non_financial')
+      AdminMailer.new_non_financial_member(current_user).deliver_later
+      redirect_to subscriptions_path, notice: 'Thank you for your non-financial support!'
+    elsif ['one_time', 'ongoing'].include?(support_type)
+      begin
+        process_payment(support_type, payment_amount)
+        AdminMailer.new_paid_member(current_user).deliver_later
+        redirect_to subscriptions_path, notice: 'Thank you for your support, it means the world to me! I will be in touch.'
+      rescue Stripe::CardError => e
+        flash.now[:error] = e.message
+        render :new
+      rescue Stripe::StripeError => e
+        flash.now[:error] = "An error occurred while processing your payment: #{e.message}"
+        render :new
+      rescue => e
+        flash.now[:error] = "An unexpected error occurred: #{e.message}"
+        render :new
+      end
+    else
+      flash.now[:error] = 'Invalid support type'
+      render :new
+    end
+  end
+
+  private
+  
+  def create_portal_session
+    Stripe::BillingPortal::Session.create({
+      customer: current_user.stripe_customer_id,
+      return_url: subscriptions_url,
+    })
+  end
+
+  def process_payment(support_type, amount)
+    amount_cents = (amount * 100).to_i
+
+    Stripe.api_key = Rails.configuration.stripe[:secret_key]
+
+    if current_user.stripe_customer_id.blank?
+      customer = Stripe::Customer.create({
+        email: current_user.email,
+        source: params[:stripeToken]
+      })
+      current_user.update(stripe_customer_id: customer.id)
+    else
+      customer = Stripe::Customer.retrieve(current_user.stripe_customer_id)
+      Stripe::Customer.update(customer.id, {
+        source: params[:stripeToken]
+      })
+    end
+
+    if support_type == 'ongoing'
+      product = Stripe::Product.create(name: 'Ongoing Support')
+      price = Stripe::Price.create({
+        unit_amount: amount_cents,
+        currency: 'aud',
+        recurring: {interval: 'year'},
+        product: product.id,
+      })
+
+      subscription = Stripe::Subscription.create({
+        customer: customer.id,
+        items: [{price: price.id}],
+      })
+      current_user.update(subscription_status: 'active', buttondown_status: 'premium', support_type: 'ongoing')
+    else
+      payment_intent = Stripe::PaymentIntent.create({
+        amount: amount_cents,
+        currency: 'aud',
+        customer: customer.id,
+        payment_method_types: ['card'],
+        description: 'One-time donation',
+        confirm: true,
+      })
+      current_user.update(subscription_status: 'one_time', buttondown_status: 'premium', support_type: 'one_time')
+    end
+
+    current_user.update(last_payment_at: Time.current, payment_amount: amount)
+  end
+end
\ No newline at end of file
diff --git a/app/controllers/users/confirmations_controller.rb b/app/controllers/users/confirmations_controller.rb
new file mode 100644 (file)
index 0000000..7f846c7
--- /dev/null
@@ -0,0 +1,17 @@
+class Users::ConfirmationsController < Devise::ConfirmationsController
+  def show
+       super do |resource|
+         if resource.errors.empty?
+               resource.post_confirmation_setup if resource.respond_to?(:post_confirmation_setup)
+               set_flash_message!(:notice, :confirmed_and_subscribe)
+               redirect_to new_subscription_path and return
+         end
+       end
+  end
+
+  protected
+
+  def after_confirmation_path_for(resource_name, resource)
+       new_subscription_path
+  end
+end
index 837c1c3de30228b1a44b0fd4f9cad7f1c2bd69fe..5a12454c43b35eaad53d3c86a08c37c9b84e9a90 100644 (file)
@@ -1,8 +1,66 @@
 class Users::RegistrationsController < Devise::RegistrationsController
-  prepend_before_action :check_captcha, only: [:create]
+  prepend_before_action :check_captcha, only: [:create], if: -> { Rails.configuration.hcaptcha_enabled }
+
+  def create
+       super do |user|
+         if ['one_time', 'ongoing'].include?(params[:user][:support_type])
+               process_payment(user)
+         else
+               user.update(buttondown_status: 'unpaid')
+         end
+       end
+  end
 
   private
 
+  def sign_up_params
+       params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :subscribe_to_newsletter, :payment_amount, :support_type)
+  end
+
+  def process_payment(user)
+       amount = (params[:user][:payment_amount].to_f * 100).to_i # Convert to cents
+       
+       begin
+         customer = Stripe::Customer.create({
+               email: user.email,
+               source: params[:stripeToken]
+         })
+
+         user.update(stripe_customer_id: customer.id)
+
+         if params[:user][:support_type] == 'ongoing'
+               subscription = Stripe::Subscription.create({
+                 customer: customer.id,
+                 items: [{
+                       price_data: { 
+                         unit_amount: amount,
+                         currency: 'usd',
+                         recurring: { interval: 'year' },
+                         product: 'prod_your_product_id_here' # Replace with your actual product ID
+                       }
+                 }],
+               })
+               user.update(subscription_status: 'active', buttondown_status: 'premium')
+         else
+               charge = Stripe::Charge.create({
+                 amount: amount,
+                 currency: 'usd',
+                 customer: customer.id,
+                 description: 'One-time donation'
+               })
+               user.update(subscription_status: 'one_time', buttondown_status: 'premium')
+         end
+
+         user.update(last_payment_at: Time.current, payment_amount: amount / 100.0)
+       rescue Stripe::CardError => e
+         flash[:error] = e.message
+         user.update(buttondown_status: 'unpaid')
+       rescue Stripe::StripeError => e
+         flash[:error] = "An error occurred while processing your payment: #{e.message}"
+         user.update(buttondown_status: 'unpaid')
+       end
+  end
+
   def check_captcha
        unless verify_hcaptcha
          self.resource = resource_class.new sign_up_params
@@ -12,8 +70,4 @@ class Users::RegistrationsController < Devise::RegistrationsController
          respond_with_navigational(resource) { render :new }
        end
   end
-  
-  def sign_up_params
-         params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
-       end
 end
\ No newline at end of file
diff --git a/app/helpers/mailing_lists_helper.rb b/app/helpers/mailing_lists_helper.rb
new file mode 100644 (file)
index 0000000..46bdf7f
--- /dev/null
@@ -0,0 +1,2 @@
+module MailingListsHelper
+end
diff --git a/app/helpers/subscriptions_helper.rb b/app/helpers/subscriptions_helper.rb
new file mode 100644 (file)
index 0000000..9ace045
--- /dev/null
@@ -0,0 +1,2 @@
+module SubscriptionsHelper
+end
diff --git a/app/mailers/admin_mailer.rb b/app/mailers/admin_mailer.rb
new file mode 100644 (file)
index 0000000..7cc3054
--- /dev/null
@@ -0,0 +1,11 @@
+class AdminMailer < ApplicationMailer
+  def new_paid_member(user)
+    @user = user
+    mail(to: ENV['ADMIN_EMAIL'], subject: 'mind reader :: New Paid Member')
+  end
+
+  def new_non_financial_member(user)
+      @user = user
+      mail(to: ENV['ADMIN_EMAIL'], subject: 'mind reader :: New Non-Financial Member')
+    end
+end
diff --git a/app/mailers/welcome_mailer.rb b/app/mailers/welcome_mailer.rb
new file mode 100644 (file)
index 0000000..a99f9d1
--- /dev/null
@@ -0,0 +1,25 @@
+class WelcomeMailer < ApplicationMailer
+  def welcome_email(user)
+  @user = user
+  @paid = user.paid_user?
+  @subscription_type = determine_subscription_type(user)
+  mail(to: @user.email, subject: 'Welcome to mind reader')
+  end
+
+  private
+
+  def determine_subscription_type(user)
+  case user.buttondown_status
+  when 'premium'
+    'Premium'
+  when 'trialed'
+    'Trial'
+  when 'gifted'
+    'Gifted'
+  when 'regular'
+    'Regular'
+  else
+    'Free'
+  end
+  end
+end
\ No newline at end of file
index 4fd5fc60cd0ab608e66bc47ba2ebec59951df62a..d21d2edc56b5ac961d2e8a0eaabf820f2a5783e4 100644 (file)
@@ -8,6 +8,27 @@ class User < ApplicationRecord
   validates :first_name, presence: true
   validates :last_name, presence: true
   
+  attribute :subscribe_to_newsletter, :boolean, default: false
+  attribute :stripe_customer_id, :string
+  attribute :subscription_status, :string
+  attribute :subscription_type, :string
+  attribute :last_payment_at, :datetime
+  attribute :payment_amount, :decimal
+  attribute :buttondown_status, :string, default: 'unactivated'
+  attribute :support_type, :string
+  
+  def one_time_donor?
+    subscription_status == 'one_time'
+  end
+  
+  def ongoing_subscriber?
+    subscription_status == 'active'
+  end
+  
+  def non_financial_supporter?
+    support_type == 'non_financial'
+  end
+  
   def full_name
     "#{first_name} #{last_name}"
   end
@@ -15,4 +36,27 @@ class User < ApplicationRecord
   def admin?
     admin
   end
+  
+  def paid_user?
+    ['premium', 'gifted', 'trialed', 'churning', 'paused', 'past_due'].include?(buttondown_status) ||
+    subscription_status == 'active' || subscription_status == 'one_time'
+  end
+  
+  def active_subscriber?
+    ['premium', 'trialed', 'gifted'].include?(buttondown_status)
+  end
+  
+  def post_confirmation_setup
+    sync_with_buttondown if subscribe_to_newsletter?
+    send_welcome_email
+  end
+  
+  private
+  def sync_with_buttondown
+    ButtondownService.new.subscribe(self)
+  end
+  
+  def send_welcome_email
+    WelcomeMailer.welcome_email(self).deliver_later
+  end
 end
diff --git a/app/services/buttondown_service.rb b/app/services/buttondown_service.rb
new file mode 100644 (file)
index 0000000..e2b01bb
--- /dev/null
@@ -0,0 +1,64 @@
+class ButtondownService
+  include HTTParty
+  base_uri 'https://api.buttondown.email/v1'
+
+  def initialize
+       @options = { 
+         headers: { 
+               'Authorization' => "Token #{ENV['BUTTONDOWN_API_KEY']}",
+               'Content-Type' => 'application/json',
+               'Accept' => 'application/json'
+         }
+       }
+  end
+
+  def subscribe(user)
+       body = {
+         email_address: user.email,
+         notes: user.paid_user? ? 'Paid subscriber' : 'Free subscriber',
+         type: determine_subscriber_type(user),
+         metadata: {
+               name: user.full_name
+         }
+       }
+       response = self.class.post('/subscribers', @options.merge(body: body.to_json))
+       update_user_buttondown_status(user, response) if response.success?
+       response.success?
+  end
+
+  def update_subscriber(user)
+       body = {
+         notes: user.paid_user? ? 'Paid subscriber' : 'Free subscriber',
+         type: determine_subscriber_type(user),
+         metadata: {
+               name: user.full_name
+         }
+       }
+       response = self.class.patch("/subscribers/#{user.email}", @options.merge(body: body.to_json))
+       update_user_buttondown_status(user, response) if response.success?
+       response.success?
+  end
+
+  def unsubscribe(user)
+       response = self.class.delete("/subscribers/#{user.email}", @options)
+       user.update(buttondown_status: 'unactivated') if response.success?
+       response.success?
+  end
+
+  private
+
+  def determine_subscriber_type(user)
+       if user.paid_user?
+         'gifted'
+       elsif user.buttondown_status == 'unactivated'
+         'regular'
+       else
+         user.buttondown_status
+       end
+  end
+
+  def update_user_buttondown_status(user, response)
+       buttondown_data = JSON.parse(response.body)
+       user.update(buttondown_status: buttondown_data['type'])
+  end
+end
\ No newline at end of file
index 17558727d6ad1b7c3a7b504413754349481d4e45..ffc9d063e7ad503e4b9cda123a8da21472b1055c 100644 (file)
Binary files a/app/views/.DS_Store and b/app/views/.DS_Store differ
diff --git a/app/views/admin_mailer/new_non_financial_member.html.erb b/app/views/admin_mailer/new_non_financial_member.html.erb
new file mode 100644 (file)
index 0000000..26212f1
--- /dev/null
@@ -0,0 +1,13 @@
+<h1>New Paid Member</h1>
+
+<p>A new user has become a paid member:</p>
+
+<ul>
+  <li><strong>Name:</strong> <%= @user.full_name %></li>
+  <li><strong>Email:</strong> <%= @user.email %></li>
+  <li><strong>Subscription Type:</strong> <%= @user.subscription_type %></li>
+  <li><strong>Payment Amount:</strong> $<%= @user.payment_amount %></li>
+  <li><strong>Payment Date:</strong> <%= @user.last_payment_at.strftime("%B %d, %Y") %></li>
+</ul>
+
+<p>Please ensure that their account is properly set up and they have access to all paid member benefits.</p>
\ No newline at end of file
diff --git a/app/views/admin_mailer/new_paid_member.html.erb b/app/views/admin_mailer/new_paid_member.html.erb
new file mode 100644 (file)
index 0000000..43bb8ba
--- /dev/null
@@ -0,0 +1,5 @@
+<h1>Admin#new_paid_member</h1>
+
+<p>
+  <%= @greeting %>, find me in app/views/admin_mailer/new_paid_member.html.erb
+</p>
diff --git a/app/views/devise/base_template.html.erb b/app/views/devise/base_template.html.erb
deleted file mode 100644 (file)
index 7c29747..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<div class="container">
-  <h1><%= yield(:title) %></h1>
-  
-  <%= yield(:form_content) %>
-  
-  <div class="devise-links links">
-       <%= render "devise/shared/links" %>
-    <%= link_to "Home", root_url, class: "button" %>
-  </div>
-</div>
-
-<style>
-  .container {
-       max-width: 400px;
-    background: var(--post-bg);
-       margin: 40px auto 0 auto;
-       padding: 20px;
-    border-radius: 4px;
-    box-shadow: rgba(70, 70, 70, 0.50) 10px 10px 5px;
-  }
-  h1 {
-       text-align: center;
-       margin-bottom: 20px;
-  }
-  .field {
-       margin-bottom: 15px;
-  }
-  .field label {
-       display: block;
-       margin-bottom: 5px;
-  }
-  .field input[type="email"],
-  .field input[type="password"] {
-       width: 100%;
-       padding: 8px;
-       border: 1px solid #ddd;
-       border-radius: 4px;
-  }
-  .actions {
-       margin-top: 20px;
-  }
-  .links {
-       margin-top: 20px;
-  }
-  .links a {
-       text-decoration: none;
-    margin-bottom: 4px;
-  }
-</style>
\ No newline at end of file
index 4681e7c2488237ac02c3d4ed62e5eccd984e87f4..d8f5bf0b1f6b0467f10d907f10f32e74ce61cf74 100644 (file)
@@ -16,4 +16,4 @@
   <% end %>
 <% end %>
 
-<%= render template: 'devise/base_template' %>
\ No newline at end of file
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
index 5c7c5e0db3b43b4146666d392a2e3741422bd145..6e966ac5f4f715d29591382f0b942253cc675125 100644 (file)
@@ -15,4 +15,4 @@
   <% end %>
 <% end %>
 
-<%= render template: 'devise/base_template' %>
\ No newline at end of file
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
index 3d35d10d43135af789fbacfcd707609d0eec0416..3d44108eeff5458e70d497b07b6b287b383a3673 100644 (file)
@@ -3,6 +3,19 @@
 <% content_for :form_content do %>
   <p>Welcome back, <%= resource.first_name %>. Your email address is <%= resource.confirmed? ? "confirmed":"not yet confirmed, please check your email soon" %>.</p>
   
+  <% if current_user %>
+    <% if current_user.ongoing_subscriber? %>
+      <p>Thank you for your ongoing support!</p>
+    <% elsif current_user.one_time_donor? %>
+      <p>Thank you for your one-time donation!</p>
+    <% elsif current_user.non_financial_supporter? %>
+      <p>Thank you for your non-financial support!</p>
+    <% else %>
+      <p>Consider supporting mind reader to access premium features!</p>
+    <% end %>
+  <% end %>
+
+  
   <p>Are you looking to get emails with new dispatches? You still need to register and confirm your email by following <a href="/about">instructions here</a>.</p>
   
   <p>On this page below you can modify your registration.</p>
     </div>
   <% end %>
   <%= button_to "Log out", destroy_user_session_path, method: :delete %>
-  <% if current_user&.admin? %>
-  <h3>Keys to the kingdom</h3>
-  <p>As an author and administrator of mind reader you cannot delete your account here. You need to remove administrative privileges first, then you may modify your account.</p>
-  <p>Privilege destruction can only be done from the rails console.</p>
+  <% if current_user&.admin? or current_user&.support_type? %>
+  <h3>Account tools</h3>
+  <p>You can <%= link_to "stop receiving mind reader emails", mailing_lists_path %> by clicking the link on this page at any time.</p>
+  <p>You cancel your financial support <%= link_to "on this page", subscriptions_path %> at any time without contacting a human.</p>
+  <h3>Account removal</h3>
+  <p>As an author, member, or past financial contributor to mind reader you cannot delete your account here. You will need to contact Aidan to request deletion, this way we can ensure you do not incur any expense or friction when leaving.</p>
+  <p><a href="mailto:[email protected]">Contact me here</a> and I will remove your account, subscriptions, emails and any associated data within 96 hours.</p>
   <% else %>
   <h3>Cancel my account</h3>
   <p>If you wish, you may delete your registration with this website. Please be aware, by doing this you will lose access to any content you have purchased or been granted. You will <em>not</em> be unsubscribed from dispatches at the same email address as this is a separate system.</p>
@@ -66,4 +82,4 @@
   <% end %>
 <% end %>
 
-<%= render template: 'devise/base_template' %>
\ No newline at end of file
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
index c9efc47b862d513ae4a4485cddb2773746e155eb..6cfcf9f588f34644f680d10804f1f9569b55c121 100644 (file)
@@ -1,17 +1,19 @@
 <% content_for :title do %>Sign up<% end %>
-
 <% content_for :form_content do %>
   <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
     <%= render "devise/shared/error_messages", resource: resource %>
-
-    <div class="field">
-      <%= f.label :first_name %>
-      <%= f.text_field :first_name, autofocus: true %>
-    </div>
-
-    <div class="field">
-      <%= f.label :last_name %>
-      <%= f.text_field :last_name %>
+    
+    <%= image_tag "aidan_about_u.svg", class: "aidan_about_u", alt: "To get started, tell me about yourself:" %>
+    
+    <div class="field-group">
+      <div class="field">
+        <%= f.label :first_name %>
+        <%= f.text_field :first_name, autofocus: true %>
+      </div>
+      <div class="field">
+        <%= f.label :last_name %>
+        <%= f.text_field :last_name %>
+      </div>
     </div>
 
     <div class="field">
       <%= f.email_field :email, autocomplete: "email" %>
     </div>
 
-    <div class="field">
-      <%= f.label :password %>
-      <% if @minimum_password_length %>
-      <em>(<%= @minimum_password_length %> characters minimum)</em>
-      <% end %>
-      <%= f.password_field :password, autocomplete: "new-password" %>
-    </div>
-
-    <div class="field">
-      <%= f.label :password_confirmation %>
-      <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
+    <div class="field-group">
+      <div class="field">
+        <%= f.label :password %>
+        <%= f.password_field :password, autocomplete: "new-password", placeholder: @minimum_password_length ? "#{@minimum_password_length} characters minimum" : "" %>
+      </div>
+  
+      <div class="field">
+        <%= f.label :password_confirmation %>
+        <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
+      </div>
     </div>
     
+    <%= image_tag "aidan_dispatches.svg", class: "aidan_about_u", alt: "Want new dispatches delivered right to you?" %>
+    
+    <div class="field checkbox">
+      <%= f.check_box :subscribe_to_newsletter %>
+      <%= f.label :subscribe_to_newsletter, "I want to receive mind reader dispatches by email newsletter", id: "sub" %>
+    </div>
+    <p>Note: you may be sent two confirmation emails – one to confirm your registration, one to confirm your mailing list preferences.</p>
+
+    <% if Rails.env.production? %>
     <div class="field">
       <%= hcaptcha_tags %>
     </div>
+    <% end %>
 
     <div class="actions">
-      <%= f.submit "Sign up" %>
+      <%= f.submit "Sign up", class: "button primary" %>
     </div>
   <% end %>
 <% end %>
 
-<%= render template: 'devise/base_template' %>
\ No newline at end of file
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
index 05b72a22d7e9752b1632bf4cdc04cf42b4f743fd..a471d0da6f6f6dd08ba2c031fa1e4b407fa83df6 100644 (file)
@@ -25,4 +25,4 @@
   <% end %>
 <% end %>
 
-<%= render template: 'devise/base_template' %>
\ No newline at end of file
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
diff --git a/app/views/layouts/_home_post_links.html.erb b/app/views/layouts/_home_post_links.html.erb
new file mode 100644 (file)
index 0000000..0d43f21
--- /dev/null
@@ -0,0 +1,8 @@
+<% if !@post&.short_dispatch? %>
+<% if @post&.title? %><h3>Follow via RSS, Email or Membership...</h3><% end %>
+<p><span class="callout">→ Prefer email or want to sponsor?</span> Learn about supporting my work and joining the free mailing list <%= link_to "right here <abbr title=\"internal link\">&swarr;&#xFE0E;</abbr>".html_safe, "/join/" %>.</p>
+<p><span class="callout">→ Prefer RSS?</span> you can subscribe to a combined <%= link_to "bookmarks+dispatches feed here <abbr title=\"internal link\">&swarr;&#xFE0E;</abbr>".html_safe, rss_path %> or <%= link_to "full text dispatches only feed here <abbr title=\"external link\">&nearr;&#xFE0E;</abbr>".html_safe, dispatches_rss_path %>.</p>
+<% end %>
+<% if @post %>
+<p><%= link_to "↑ Back to top", "#top" %> or <%= link_to "↼ Back to some other dispatches...", "#{root_path}?filter=posts" %></p>
+<% end %>
\ No newline at end of file
diff --git a/app/views/layouts/_navigation_buttons.html.erb b/app/views/layouts/_navigation_buttons.html.erb
new file mode 100644 (file)
index 0000000..f4d1725
--- /dev/null
@@ -0,0 +1,19 @@
+<div class="filter-buttons">
+  <%= link_to "All", root_path(filter: 'all'), class: "button #{@filter == 'all' ? 'active' : ''}" %>
+  <%= link_to "Dispatches", root_path(filter: 'posts'), class: "button #{@filter == 'posts' ? 'active' : ''}" %>
+  <%= link_to "Bookmarks", root_path(filter: 'bookmarks'), class: "button #{@filter == 'bookmarks' ? 'active' : ''}" %>
+  <%= link_to "About", public_page_path("about"), class: "button #{@page.is_a?(Page) && @page.slug == 'about' ? 'active' : ''}" %>
+  
+  <% if !current_user %>
+  <%= link_to "Join mind reader", join_path, class: "button" %>
+  <% else %>
+  <%= link_to "Manage membership", subscriptions_path, class: "button #{controller_name == 'subscriptions' ? 'active' : ''}" %>
+  <%= link_to "Manage emails", mailing_lists_path, class: "button #{controller_name == 'mailing_lists' ? 'active' : ''}" %>
+  <% end %>
+  
+  <% if current_user&.admin? %>
+  <%= link_to "Manage Posts", posts_path, class: "button" %>
+  <%= link_to "Manage Pages", pages_path, class: "button" %>
+  <%= link_to "Manage API Keys", api_keys_path, class: "button" %>
+  <% end %>
+</div>
\ No newline at end of file
index bc10708958768656c061cf26f43b87492f22d12b..9571de8d1b158ac427e804c6966f3954b0f8512a 100644 (file)
     <%= yield %>
 
     <footer>
-      <p class="account"><% if current_user&.first_name? %>Welcome back, <%= link_to current_user.first_name, edit_user_registration_path %>. <% if current_user&.admin? %>You hold the keys to the kingdom.<% end %><% else %> You are not logged in. <%= link_to "Change that?", new_user_session_path %><% end %></span></p>
+      <p class="account"><% if current_user&.first_name? %>Welcome back, <%= link_to current_user.first_name, edit_user_registration_path %>. <% if current_user&.admin? %>You hold the keys to the kingdom.<% end %> <% if current_user&.paid_user? %> Thank you, your financial support makes this work possible.<% elsif current_user&.active_subscriber? %>Thank you for your ongoing support.<% end %><% else %> You are not logged in. <%= link_to "Change that?", new_user_session_path %><% end %></span></p>
       <p>© <%= Time.current.year %> <%= link_to "Aidan Cornelius-Bell", "https://aidan.cornelius-bell.com" %>, CC-NC-SA.</p>
       <p>This site is managed from the sovereign Yarta of the Kaurna Miyurna, with respect and gratitude for the custodianship of Elders past and present of the many Countries it may appear upon.</p>
       <p>For legal purposes: any views expressed directly on this website are my own and not reflective of those of any employers, colleagues or affiliates. Links provided remain the views and intellectual property of their respective owners.</p>
     </footer>
+    <%= yield :javascript %>
   </body>
 </html>
\ No newline at end of file
diff --git a/app/views/layouts/user_page_template.html.erb b/app/views/layouts/user_page_template.html.erb
new file mode 100644 (file)
index 0000000..bab9cee
--- /dev/null
@@ -0,0 +1,152 @@
+<div class="container" id="top">
+  <%= link_to root_path do %>
+  <%= image_tag "icon-512.png", class: "logo" %>
+  <% end %>
+  <% content_for :title %>
+  <h1><%= content_for :title %></h1>
+  
+  <%= render partial: "layouts/navigation_buttons" %>
+</div>
+
+<div class="post">  
+  <div class="container">
+    <%= yield(:form_content) %>
+  </div>
+</div>
+
+<div class="container links">
+  <%= render partial: 'devise/shared/links' %>
+  <%= link_to "Home", root_url, class: "button" %>
+</div>
+
+
+<style>
+  h1 {
+    margin-bottom: 30px;
+    color: var(--dark-text);
+  }
+
+  .field-group {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 15px;
+  }
+  
+  .field-group .field {
+    flex: 1 1 calc(50% - 15px);
+    min-width: 120px;
+  }
+  .field {
+    margin-bottom: 20px;
+  }
+  
+  .field label {
+    display: block;
+    margin-bottom: 5px;
+    color: var(--dark-text);
+  }
+  
+  .field input[type="text"],
+  .field input[type="email"],
+  .field input[type="password"],
+  .field input[type="number"],
+  .field select {
+    width: 100%;
+    padding: 10px;
+    border: 1px solid var(--light-text);
+    border-radius: 4px;
+    background-color: var(--body-bg);
+    color: var(--body-text);
+    box-sizing: border-box;
+    font-size: 16px; /* Ensure consistent font size */
+  }
+  
+  .field label {
+    display: block;
+    margin-bottom: 5px;
+    color: var(--dark-text);
+  }
+
+  .field input[type="text"],
+  .field input[type="email"],
+  .field input[type="password"],
+  .field input[type="number"],
+  .field select {
+    width: 100%;
+    padding: 10px;
+    border: 1px solid var(--light-text);
+    border-radius: 4px;
+    background-color: var(--body-bg);
+    color: var(--body-text);
+    background: #fff;
+  }
+
+  .field.checkbox {
+    display: flex;
+    align-items: center;
+  }
+
+  .field.checkbox input {
+    margin-right: 10px;
+  }
+
+  .actions {
+    margin-top: 30px;
+  }
+
+  .links .button {
+    margin-top: 5px;
+  }
+  
+  #sub {
+    margin-top: 8px;
+  }
+  
+  .subscription-info {
+    background-color: var(--quote-bg);
+    padding: 1em;
+    margin-bottom: 1em;
+    border-radius: 4px;
+  }
+  
+  .payment-history {
+    width: 100%;
+    border-collapse: collapse;
+    margin-top: 1em;
+  }
+  
+  .payment-history th,
+  .payment-history td {
+    padding: 0.5em;
+    text-align: left;
+    border-bottom: 1px solid var(--quote-bg);
+  }
+  
+  .payment-history th {
+    background-color: var(--quote-bg);
+    font-weight: bold;
+  }
+  
+  .subscription-actions {
+    margin-top: 1em;
+  }
+
+  #card-element {
+    padding: 10px;
+    border: 1px solid var(--light-text);
+    border-radius: 4px;
+    background-color: #fff;
+  }
+
+  #card-errors {
+    color: #fa755a;
+    text-align: center;
+    margin-top: 10px;
+  }
+
+  .h-captcha {
+    display: flex;
+    justify-content: center;
+    margin-top: 20px;
+  }
+</style>
\ No newline at end of file
diff --git a/app/views/mailing_lists/edit.html.erb b/app/views/mailing_lists/edit.html.erb
new file mode 100644 (file)
index 0000000..12136ff
--- /dev/null
@@ -0,0 +1,2 @@
+<h1>MailingLists#edit</h1>
+<p>Find me in app/views/mailing_lists/edit.html.erb</p>
diff --git a/app/views/mailing_lists/index.html.erb b/app/views/mailing_lists/index.html.erb
new file mode 100644 (file)
index 0000000..3961721
--- /dev/null
@@ -0,0 +1,29 @@
+<% content_for :title do %>Your mailing list membership<% end %>
+<% content_for :form_content do %>
+
+<% if @buttondown_status == 'unactivated' %>
+  <p>You are not currently subscribed to our mailing list.</p>
+  <%= button_to "Subscribe", subscribe_mailing_lists_path, method: :post, class: "button" %>
+<% else %>
+  <p>Your current subscription status: <strong><%= @buttondown_status.titleize %></strong></p>
+  
+  <% if @is_paid_user %>
+    <p>You are a paid subscriber. Thank you for your support!</p>
+    <% if @buttondown_status != 'gifted' %>
+      <p>Your mailing list status is not synced with your paid status. Click below to sync:</p>
+      <%= button_to "Sync Subscription Status", sync_status_mailing_lists_path, method: :post, class: "button" %>
+    <% end %>
+  <% end %>
+  
+  <%= button_to "Unsubscribe", unsubscribe_mailing_lists_path, method: :delete, class: "button danger", data: { confirm: "Are you sure you want to unsubscribe?" } %>
+<% end %>
+
+<% if @is_paid_user && @buttondown_status != 'gifted' %>
+  <p>Your account is marked as a paid user, but your mailing list status is not synced. Click below to sync your status:</p>
+  <%= button_to "Sync Subscription Status", sync_status_mailing_lists_path, method: :post, class: "button" %>
+<% end %>
+
+
+<% end %>
+
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
diff --git a/app/views/mailing_lists/update.html.erb b/app/views/mailing_lists/update.html.erb
new file mode 100644 (file)
index 0000000..583f631
--- /dev/null
@@ -0,0 +1,2 @@
+<h1>MailingLists#update</h1>
+<p>Find me in app/views/mailing_lists/update.html.erb</p>
index d2005a24e805703a0ebd60474e667cd12dc2b320..8758f1034a849f04b869e136872517b9f2d896a4 100644 (file)
@@ -6,20 +6,7 @@
   <p class="subheading"><small>Aidan’s anti-capitalist posting and sharing project</small></p> 
 </div>
 
-<div class="filter-buttons">
-  <%= link_to "All", root_path(filter: 'all'), class: "button #{@filter == 'all' ? 'active' : ''}" %>
-  <%= link_to "Dispatches", root_path(filter: 'posts'), class: "button #{@filter == 'posts' ? 'active' : ''}" %>
-  <%= link_to "Bookmarks", root_path(filter: 'bookmarks'), class: "button #{@filter == 'bookmarks' ? 'active' : ''}" %>
-  <%= link_to "Join mind reader", join_path, class: "button" %>
-  <% @pages.each do |pg| %>
-  <%= link_to "#{pg.title}", public_page_path(pg.slug), class: "button" %>
-  <% end %>
-  <% if current_user&.admin? %>
-  <%= link_to "Manage Posts", posts_path, class: "button" %>
-  <%= link_to "Manage Pages", pages_path, class: "button" %>
-  <%= link_to "Manage API Keys", api_keys_path, class: "button" %>
-  <% end %>
-</div>
+<%= render partial: "layouts/navigation_buttons" %>
 
 <div class="post">
   <ul class="container">
@@ -55,8 +42,6 @@
 <div class="container">
   <%= paginate @items %>
   <p class="links">
-       <span class="callout">→ Sponsorship</span> like what you've read? Learn about <%= link_to "supporting it here <abbr title=\"external link\">&nearr;&#xFE0E;</abbr>".html_safe, "/sponsor/" %>.<br>
-       <span class="callout">→ Prefer email?</span> <%= link_to "subscribe to my mailing list <abbr title=\"external link\">&nearr;&#xFE0E;</abbr>".html_safe, "https://buttondown.com/acb" %> to get fresh ideas in your inbox (you email masochist, you).<br>
-       <span class="callout">→ Prefer RSS?</span> you can subscribe to a combined <%= link_to "bookmarks+dispatches feed here <abbr title=\"internal link\">&swarr;&#xFE0E;</abbr>".html_safe, rss_path %> or <%= link_to "full text dispatches only feed here <abbr title=\"external link\">&nearr;&#xFE0E;</abbr>".html_safe, dispatches_rss_path %>.
+       <%= render partial: "layouts/home_post_links" %>
   </p>
 </div>
index 4b9f93e45bcca7826e1ba07693b2135bbf491fd1..ddfa5ac150cd5dbe7b4f720f7feaee648bb03e3a 100644 (file)
 <div class="post">
   <div class="container">
        <%= image_tag "growchart.svg", class: "porter" %>
-       <h3>Below you can join mind reader and receive new dispatches via email.</h3>
+       <h3>Below you can join mind reader and sign up to receive new dispatches via email.</h3>
        <p>Joining by email means you never have to visit this (admittedly beautiful) website ever again. You’ll receive new posts straight in your email inbox. Bookmarks, however, are sent in digest to subscribers only – so if you’d like to see those, come back or keep reading.</p>
-       <p>Optionally, once you’ve signed up and confirmed your email address you are able to subscribe to mind reader financially by entering any non $0 AUD amount you wish. You are under no obligation to do this! Paid subscribers receive a digest of bookmarks and a monthly update from me on the state of the world that regular members miss out on.</p>
-       <p>If you’re looking to cancel an existing membership or subscription, please go to <a href="https://buttondown.com/acb">Buttondown</a>.</p>
-       <form action="https://buttondown.com/api/emails/embed-subscribe/acb" method="post" target="popupwindow" onsubmit="window.open('https://buttondown.com/acb', 'popupwindow')" class="embeddable-buttondown-form">
-       <label for="bd-email">Enter your email</label>
-       <input type="email" name="email" id="bd-email" />
-       <input type="submit" value="Subscribe" />
-       </form>
+       <p>Optionally, once you’ve signed up and confirmed your email address you are able to subscribe to mind reader financially by entering any non $0 AUD amount you wish. You are under no obligation to do this! Paid subscribers may opt to receive a digest of bookmarks and a monthly update from me on the state of the world that regular members miss out on.</p>
+       <p>If you’re looking to cancel an existing membership or subscription, <%= link_to "please click here", subscriptions_path %>.</p>
+       <%= image_tag "aidan_arrow.svg", class: "aidans_arrow" %>
+       <p>To get started with mind reader membership, first register for an account on this website. Don’t worry, I’ll guide you through each step of the process! Just click on that button below:</p>
+       <p><%= link_to "Get started, free forever", new_user_registration_path, class: "button" %></p>
   </div>
 </div>
index 8dc884944d235c38cd96837d8f6da5e82222f8e0..02124d449cbba4942fa4980f624bfdc29ca46408 100644 (file)
 </div>
 
 <div class="container" id="bottom">
-  <% if [email protected]_dispatch?%>
-  <h3>Follow via email</h3>
-  <iframe scrolling="no" style="width:100%!important;height:220px;border:1px #ccc solid !important" src="https://buttondown.email/acb?as_embed=true"></iframe><br>
-  <h3>More stuff from Aidan</h3>
-  <p><span class="callout">→ Circular economy</span>: if this work has been of interest to you, please consider subsidising my existence, <em>no subscriptions</em>: <%= link_to "click here to donate with PayPal <abbr title=\"external link\">&nearr;&#xFE0E;</abbr>".html_safe, "https://paypal.me/aidancornelius/10.00/" %> or <%= link_to "here for more options and information <abbr title=\"external link\">&swarr;&#xFE0E;</abbr>".html_safe, "/sponsor/" %>.</p>
-  <p><span class="callout">→ Stay updated</span>: email masochists amongst us may receive my dispatches directly in their inbox with the form below. Alternatively, you are able to subscribe in an RSS reader via the <%= link_to "feed <abbr title=\"internal link\">&swarr;&#xFE0E;</abbr>".html_safe, "https://mndrdr.org/feed/dispatches/" %> to keep your inbox sanity.</p>
-  <% end %>
-  <p><%= link_to "↑ Back to top", "#top" %> or <%= link_to "↼ Back to some other dispatches...", "#{root_path}?filter=posts" %></p>
+  <%= render partial: "layouts/home_post_links" %>
 </div>
\ No newline at end of file
index 0e67bd17c8c89124ec93741cc4972f7cdbffa02c..a5530530ab3f27e08315a4d8e4f06e00f3a3fe91 100644 (file)
@@ -8,13 +8,7 @@
 </div>
 
 <div class="filter-buttons">
-  <%= link_to "Home", root_path(filter: 'all'), class: "button #{@filter == 'all' ? 'active' : ''}" %>
-  <%= link_to "Dispatches", root_path(filter: 'posts'), class: "button #{@filter == 'posts' ? 'active' : ''}" %>
-  <%= link_to "Bookmarks", root_path(filter: 'bookmarks'), class: "button #{@filter == 'bookmarks' ? 'active' : ''}" %>
-  <%= link_to "Join mind reader", join_path, class: "button" %>
-  <% @pages.each do |pg| %>
-  <%= link_to "#{pg.title}", public_page_path(pg.slug), class: "button #{params[:slug] == pg.slug ? 'active' : ''}" %>
-  <% end %>
+  <%= render partial: "layouts/navigation_buttons" %>
 </div>
 
 <div class="post">
diff --git a/app/views/subscriptions/create.html.erb b/app/views/subscriptions/create.html.erb
new file mode 100644 (file)
index 0000000..b88739c
--- /dev/null
@@ -0,0 +1,2 @@
+<h1>Subscriptions#create</h1>
+<p>Find me in app/views/subscriptions/create.html.erb</p>
diff --git a/app/views/subscriptions/index.html.erb b/app/views/subscriptions/index.html.erb
new file mode 100644 (file)
index 0000000..886e5f2
--- /dev/null
@@ -0,0 +1,57 @@
+<!-- app/views/subscriptions/index.html.erb -->
+<% content_for :title do %>Your memberships and subscription status<% end %>
+<% content_for :form_content do %>
+<% if !@subscription_status.present? %>
+  <p>Hi <%= current_user.first_name if current_user&.first_name.present? %>, thank you for being interested in supporting mind reader! To get started click the big button below.</p>
+<% else %>
+  <div class="subscription-info">
+       <p><strong>Current Status:</strong> <%= @subscription_status.titleize if @subscription_status.present? %></p>
+       <p><strong>Support Type:</strong> <%= @support_type.titleize if @support_type.present? %></p>
+       <% if @last_payment_date %>
+         <p><strong>Last Payment Date:</strong> <%= @last_payment_date.strftime('%B %d, %Y') %></p>
+       <% end %>
+       <% if @last_payment_amount %>
+         <p><strong>Last Payment Amount:</strong> AU$<%= sprintf('%.2f', @last_payment_amount) %></p>
+       <% end %>
+       <p>If you are a mailing list subscriber, <%= link_to "check that your premium status", mailing_lists_path %> has transferred so that you get bonus mail for premium members. Please be aware that data here are slightly delayed – don’t panic if things are not yet up to date!</p>
+  </div>
+  
+  <% if @portal_session %>
+       <p>
+         <%= link_to "Manage your subscription", @portal_session.url, class: "button", data: { turbo: false } %>
+       </p>
+  <% end %>
+  <% end %>
+
+  <% if @payments.present? %>
+       <h3>Payment History</h3>
+       <table class="payment-history">
+         <thead>
+               <tr>
+                 <th>Date</th>
+                 <th>Amount</th>
+                 <th>Status</th>
+               </tr>
+         </thead>
+         <tbody>
+               <% @payments.each do |payment| %>
+                 <tr>
+                       <td><%= Time.at(payment.created).strftime('%B %d, %Y') %></td>
+                       <td>AU$<%= sprintf('%.2f', payment.amount / 100.0) %></td>
+                       <td><%= payment.status.titleize %></td>
+                 </tr>
+               <% end %>
+         </tbody>
+       </table>
+  <% else %>
+       <p>No payment history available.</p>
+  <% end %>
+
+  <% if @subscription_status != 'active' %>
+       <div class="subscription-actions">
+         <%= link_to "Subscribe", new_subscription_path, class: "button primary" %>
+       </div>
+  <% end %>
+<% end %>
+
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
diff --git a/app/views/subscriptions/new.html.erb b/app/views/subscriptions/new.html.erb
new file mode 100644 (file)
index 0000000..7904959
--- /dev/null
@@ -0,0 +1,157 @@
+<% content_for :title do %>Subscribe to mind reader<% end %>
+
+<% content_for :form_content do %>
+  <h3>Become a premium member?</h3>
+  <p><em>What’s that?</em> Premium members are those who want more than just the email – you think there’s something to this project, and want to see it thrive! Thanks for even considering it, you legendary person.</p>
+  <p>There are <em>three kinds of membership</em>:</p>
+  <ol>
+         <li>Non-financial support, or “mutual aid” – you’re a practicing activist, working hard in communities to create grassroots change, and you’re very welcome to this community. Don’t even think twice about paying – free premium features forever!</li>
+         <li>One-time donation – or, as many times as you like, you like some of the work I’ve done here and want to let me know what I have done matters to you. You have my undying appreciation, and forever access to premium features.</li>
+         <li>Ongoing support – an annual subscription for as much as you can manage, you want me to commit more time to doing this work and are willing to become a patron of my work. You’ll have premium features forever, even if you end your subscription. This takes me one step closer to being able to craft daily change making theory.</li>
+  </ol>
+  
+  <% flash.each do |type, message| %>
+         <div class="flash <%= type %>">
+               <%= message %>
+         </div>
+       <% end %>
+  
+  <%= form_tag subscriptions_path, id: 'payment-form' do %>
+       <div class="field">
+         <%= label_tag :support_type, "Support Type" %>
+         <%= select_tag :support_type, 
+                 options_for_select([
+                       ['Non-financial support', 'non_financial'], 
+                       ['One-time donation', 'one_time'], 
+                       ['Ongoing support (annual)', 'ongoing']
+                 ], 'non_financial'), 
+                 class: 'support-type-select' 
+         %>
+       </div>
+
+       <div id="payment-fields" style="display: none;">
+         <div class="field support-amount">
+               <%= label_tag :payment_amount, "Support amount" %>
+               <%= text_field_tag :payment_amount, nil, class: 'currency-input', placeholder: "AU$0.00" %>
+         </div>
+         
+         <div class="field">
+               <label for="card-element">Credit or debit card</label>
+               <div id="card-element"></div>
+               <div id="card-errors" role="alert"></div>
+         </div>
+       </div>
+
+       <div class="actions">
+         <%= submit_tag "Subscribe", class: "button primary" %>
+       </div>
+  <% end %>
+<% end %>
+
+<% content_for :javascript do %>
+  <script src="https://js.stripe.com/v3/"></script>
+  <script>
+       document.addEventListener('DOMContentLoaded', function() {
+         var stripe = Stripe('<%= Rails.configuration.stripe[:publishable_key] %>');
+         var elements = stripe.elements();
+         var style = {
+               base: {
+                 fontSize: '16px',
+                 color: '#32325d',
+               }
+         };
+         var card = elements.create('card', {style: style, currency: 'aud'});
+         
+         var supportTypeSelect = document.querySelector('.support-type-select');
+         var paymentFields = document.getElementById('payment-fields');
+         
+         function togglePaymentFields() {
+               if (supportTypeSelect.value === 'one_time' || supportTypeSelect.value === 'ongoing') {
+                 paymentFields.style.display = 'block';
+                 card.mount('#card-element');
+               } else {
+                 paymentFields.style.display = 'none';
+                 card.unmount();
+               }
+         }
+
+         // Initial toggle of payment fields
+         togglePaymentFields();
+         
+         supportTypeSelect.addEventListener('change', togglePaymentFields);
+
+         card.addEventListener('change', function(event) {
+               var displayError = document.getElementById('card-errors');
+               if (event.error) {
+                 displayError.textContent = event.error.message;
+               } else {
+                 displayError.textContent = '';
+               }
+         });
+
+         var form = document.getElementById('payment-form');
+         form.addEventListener('submit', function(event) {
+               event.preventDefault();
+               
+               if (supportTypeSelect.value === 'one_time' || supportTypeSelect.value === 'ongoing') {
+                 stripe.createToken(card, {currency: 'aud'}).then(function(result) {
+                       if (result.error) {
+                         var errorElement = document.getElementById('card-errors');
+                         errorElement.textContent = result.error.message;
+                       } else {
+                         stripeTokenHandler(result.token);
+                       }
+                 });
+               } else {
+                 form.submit();
+               }
+         });
+
+         function stripeTokenHandler(token) {
+               var hiddenInput = document.createElement('input');
+               hiddenInput.setAttribute('type', 'hidden');
+               hiddenInput.setAttribute('name', 'stripeToken');
+               hiddenInput.setAttribute('value', token.id);
+               form.appendChild(hiddenInput);
+               form.submit();
+         }
+
+         // Format the payment amount input with AU$ prefix
+         var paymentAmountInput = document.getElementById('payment_amount');
+         if (paymentAmountInput) {
+               paymentAmountInput.addEventListener('input', function(e) {
+                 var cursorPosition = e.target.selectionStart;
+                 var value = e.target.value.replace(/[^0-9.]/g, '');
+                 
+                 if (value !== '') {
+                       var floatValue = parseFloat(value);
+                       if (!isNaN(floatValue)) {
+                         var formattedValue = 'AU$' + floatValue.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+                         e.target.value = formattedValue;
+                         
+                         // Adjust cursor position
+                         var newPosition = cursorPosition + (formattedValue.length - value.length);
+                         e.target.setSelectionRange(newPosition, newPosition);
+                       }
+                 } else {
+                       e.target.value = '';
+                 }
+               });
+
+               paymentAmountInput.addEventListener('focus', function(e) {
+                 if (e.target.value === '') {
+                       e.target.value = 'AU$';
+                 }
+               });
+
+               paymentAmountInput.addEventListener('blur', function(e) {
+                 if (e.target.value === 'AU$') {
+                       e.target.value = '';
+                 }
+               });
+         }
+       });
+  </script>
+<% end %>
+
+<%= render template: 'layouts/user_page_template' %>
\ No newline at end of file
diff --git a/app/views/welcome_mailer/welcome_email.html.erb b/app/views/welcome_mailer/welcome_email.html.erb
new file mode 100644 (file)
index 0000000..fc3a395
--- /dev/null
@@ -0,0 +1,13 @@
+<h1>Welcome to mind reader, <%= @user.first_name %>,</h1>
+
+<p>Your membership here is greatly appreciated.</p>
+
+<% if @paid %>
+  <p>I deeply appreciate your financial support! As a <%= @subscription_type %> subscriber, you have access to bookmark digest emails and occasional premium updates from me. They’ll come to you right here – in your inbox – if you said you’d like to receive them.</p>
+<% else %>
+  <p>Thank you for joining mind reader as a <%= @subscription_type %> member.</p>
+  <p>Your support of my work is much appreciated, and it’s wonderful you’re now part of the community. You can also upgrade to a paid subscription, one time donation, or just a free lifetime solidarity member (yes, free!) and gain access to premium features, including bookmark digests and occasional special updates by visiting <a href="https://mndrdr.org/subscriptions/new">this page</a>.</p>
+<% end %>
+
+<p>My thanks again, comrade.<br>
+Aidan.</p>
\ No newline at end of file
diff --git a/app/views/welcome_mailer/welcome_email.text.erb b/app/views/welcome_mailer/welcome_email.text.erb
new file mode 100644 (file)
index 0000000..f7fc4fc
--- /dev/null
@@ -0,0 +1,12 @@
+Welcome to mind reader, <%= @user.first_name %>,
+
+Your membership here is greatly appreciated.
+
+<% if @paid %>
+I deeply appreciate your financial support! As a <%= @subscription_type %> subscriber, you have access to bookmark digest emails and occasional premium updates from me. They’ll come to you right here – in your inbox – if you said you’d like to receive them.
+<% else %>
+Thank you for joining as a <%= @subscription_type %> member. Your support of my work is much appreciated. Note you can also upgrade to a paid subscription or one time donation to access premium features, including bookmark digests and occasional special updates!
+<% end %>
+
+My thanks again, comrade.
+Aidan.
\ No newline at end of file
index 3f95c9fa36c92861fe6f9f1e401ee93119fc7846..31b16e519c204739932c8d29bd3eb06026f2d96d 100644 (file)
@@ -75,6 +75,9 @@ Rails.application.configure do
 
   # Raise error when a before_action's only/except options reference missing actions.
   config.action_controller.raise_on_missing_callback_actions = true
+  
+  # Turn of captcha stuff for localhost
+  config.hcaptcha_enabled = false
 
   # Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
   # config.generators.apply_rubocop_autocorrect_after_generate!
diff --git a/config/initializers/stripe.rb b/config/initializers/stripe.rb
new file mode 100644 (file)
index 0000000..948b8e8
--- /dev/null
@@ -0,0 +1,8 @@
+
+Rails.configuration.stripe = {
+  publishable_key: ENV['STRIPE_PUBLISHABLE_KEY'],
+  secret_key: ENV['STRIPE_SECRET_KEY'],
+  currency: 'aud'
+}
+
+Stripe.api_key = Rails.configuration.stripe[:secret_key]
\ No newline at end of file
index 2715b99bcca5fafe14c77c3ba62b50594f5e6c09..22328501893beae1f53eb8fcec288cff3564a9e4 100644 (file)
@@ -1,5 +1,4 @@
 Rails.application.routes.draw do
-  
   namespace :api do
     namespace :v1 do
       match 'api', to: 'api#handle_request', via: [:get, :post]
@@ -11,12 +10,20 @@ Rails.application.routes.draw do
     end
   end
   
+  resources :mailing_lists, only: [:index] do
+    collection do
+      post 'subscribe'
+      delete 'unsubscribe'
+      post 'sync_status'
+    end
+  end
+  resources :subscriptions, only: [:new, :create, :index]
   resources :pages
   get 'importer', to: 'posts#importer'
   get 'export', to: 'posts#export'
   post 'import', to: 'posts#import'
   resources :api_keys
-  devise_for :users, controllers: { registrations: 'users/registrations' }
+  devise_for :users, controllers: { registrations: 'users/registrations', confirmations: 'users/confirmations' }
   resources :posts
   get '/feed', to: 'pubview#rss', as: 'rss', defaults: { format: 'rss' }
   get '/feed/dispatches', to: 'pubview#dispatches_rss', as: 'dispatches_rss', defaults: { format: 'rss' }
diff --git a/db/migrate/20241008003544_add_subscription_fields_to_users.rb b/db/migrate/20241008003544_add_subscription_fields_to_users.rb
new file mode 100644 (file)
index 0000000..9fea78d
--- /dev/null
@@ -0,0 +1,10 @@
+class AddSubscriptionFieldsToUsers < ActiveRecord::Migration[7.2]
+  def change
+    add_column :users, :subscribe_to_newsletter, :boolean, default: false
+    add_column :users, :stripe_customer_id, :string
+    add_column :users, :subscription_status, :string
+    add_column :users, :last_payment_at, :datetime
+    add_column :users, :payment_amount, :decimal, precision: 10, scale: 2
+    add_column :users, :buttondown_status, :string, default: 'unactivated'
+  end
+end
diff --git a/db/migrate/20241008005649_add_subscription_type_to_users.rb b/db/migrate/20241008005649_add_subscription_type_to_users.rb
new file mode 100644 (file)
index 0000000..866ba3b
--- /dev/null
@@ -0,0 +1,5 @@
+class AddSubscriptionTypeToUsers < ActiveRecord::Migration[7.2]
+  def change
+       add_column :users, :subscription_type, :string
+  end
+end
diff --git a/db/migrate/20241008010447_add_support_type_to_users.rb b/db/migrate/20241008010447_add_support_type_to_users.rb
new file mode 100644 (file)
index 0000000..cc42ca7
--- /dev/null
@@ -0,0 +1,5 @@
+class AddSupportTypeToUsers < ActiveRecord::Migration[7.2]
+  def change
+       add_column :users, :support_type, :string
+  end
+end
index f4a8b333b5a0bc187706ba3cae5a59173e943e45..8275001a33c864e058072a9fab3640af4a4aa466 100644 (file)
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema[7.2].define(version: 2024_10_07_220924) do
+ActiveRecord::Schema[7.2].define(version: 2024_10_08_010447) do
   create_table "api_keys", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
     t.string "key"
     t.datetime "created_at", null: false
@@ -61,6 +61,14 @@ ActiveRecord::Schema[7.2].define(version: 2024_10_07_220924) do
     t.integer "failed_attempts", default: 0
     t.string "unlock_token"
     t.datetime "locked_at"
+    t.boolean "subscribe_to_newsletter", default: false
+    t.string "stripe_customer_id"
+    t.string "subscription_status"
+    t.datetime "last_payment_at"
+    t.decimal "payment_amount", precision: 10, scale: 2
+    t.string "buttondown_status", default: "unactivated"
+    t.string "subscription_type"
+    t.string "support_type"
     t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
     t.index ["email"], name: "index_users_on_email", unique: true
     t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
diff --git a/test/controllers/mailing_lists_controller_test.rb b/test/controllers/mailing_lists_controller_test.rb
new file mode 100644 (file)
index 0000000..6b69c78
--- /dev/null
@@ -0,0 +1,18 @@
+require "test_helper"
+
+class MailingListsControllerTest < ActionDispatch::IntegrationTest
+  test "should get index" do
+    get mailing_lists_index_url
+    assert_response :success
+  end
+
+  test "should get edit" do
+    get mailing_lists_edit_url
+    assert_response :success
+  end
+
+  test "should get update" do
+    get mailing_lists_update_url
+    assert_response :success
+  end
+end
diff --git a/test/controllers/subscriptions_controller_test.rb b/test/controllers/subscriptions_controller_test.rb
new file mode 100644 (file)
index 0000000..3958a5a
--- /dev/null
@@ -0,0 +1,18 @@
+require "test_helper"
+
+class SubscriptionsControllerTest < ActionDispatch::IntegrationTest
+  test "should get new" do
+    get subscriptions_new_url
+    assert_response :success
+  end
+
+  test "should get create" do
+    get subscriptions_create_url
+    assert_response :success
+  end
+
+  test "should get view" do
+    get subscriptions_view_url
+    assert_response :success
+  end
+end
diff --git a/test/mailers/admin_mailer_test.rb b/test/mailers/admin_mailer_test.rb
new file mode 100644 (file)
index 0000000..43f15c3
--- /dev/null
@@ -0,0 +1,19 @@
+require "test_helper"
+
+class AdminMailerTest < ActionMailer::TestCase
+  test "new_paid_member" do
+    mail = AdminMailer.new_paid_member
+    assert_equal "New paid member", mail.subject
+    assert_equal [ "[email protected]" ], mail.to
+    assert_equal [ "[email protected]" ], mail.from
+    assert_match "Hi", mail.body.encoded
+  end
+
+  test "new_non_financial_member" do
+    mail = AdminMailer.new_non_financial_member
+    assert_equal "New non financial member", mail.subject
+    assert_equal [ "[email protected]" ], mail.to
+    assert_equal [ "[email protected]" ], mail.from
+    assert_match "Hi", mail.body.encoded
+  end
+end
diff --git a/test/mailers/previews/admin_mailer_preview.rb b/test/mailers/previews/admin_mailer_preview.rb
new file mode 100644 (file)
index 0000000..a04596f
--- /dev/null
@@ -0,0 +1,12 @@
+# Preview all emails at http://localhost:3000/rails/mailers/admin_mailer
+class AdminMailerPreview < ActionMailer::Preview
+  # Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_paid_member
+  def new_paid_member
+    AdminMailer.new_paid_member
+  end
+
+  # Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_non_financial_member
+  def new_non_financial_member
+    AdminMailer.new_non_financial_member
+  end
+end
diff --git a/test/mailers/previews/welcome_mailer_preview.rb b/test/mailers/previews/welcome_mailer_preview.rb
new file mode 100644 (file)
index 0000000..1b5a5a6
--- /dev/null
@@ -0,0 +1,7 @@
+# Preview all emails at http://localhost:3000/rails/mailers/welcome_mailer
+class WelcomeMailerPreview < ActionMailer::Preview
+  # Preview this email at http://localhost:3000/rails/mailers/welcome_mailer/welcome_email
+  def welcome_email
+    WelcomeMailer.welcome_email
+  end
+end
diff --git a/test/mailers/welcome_mailer_test.rb b/test/mailers/welcome_mailer_test.rb
new file mode 100644 (file)
index 0000000..0c5ce68
--- /dev/null
@@ -0,0 +1,11 @@
+require "test_helper"
+
+class WelcomeMailerTest < ActionMailer::TestCase
+  test "welcome_email" do
+    mail = WelcomeMailer.welcome_email
+    assert_equal "Welcome email", mail.subject
+    assert_equal [ "[email protected]" ], mail.to
+    assert_equal [ "[email protected]" ], mail.from
+    assert_match "Hi", mail.body.encoded
+  end
+end