A => manage.py +15 -0
@@ 0,0 1,15 @@ 
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "taksa.settings")
+    try:
+        from django.core.management import execute_from_command_line
+    except ImportError as exc:
+        raise ImportError(
+            "Couldn't import Django. Are you sure it's installed and "
+            "available on your PYTHONPATH environment variable? Did you "
+            "forget to activate a virtual environment?"
+        ) from exc
+    execute_from_command_line(sys.argv)

          
A => static/css/custom.css +14 -0
@@ 0,0 1,14 @@ 
+/* Style Overiding */
+
+html,body {
+	font-family: Laksaman, sans-serif;
+	background-color: #eeeeec;
+}
+
+.monospace {
+	font-family: 'Roboto Mono', monospace;
+}
+
+.card, .button, .button.button-small {
+	background-color: #fbfbfb;
+}

          
A => static/css/font.css +40 -0
@@ 0,0 1,40 @@ 
+@font-face {
+    font-family: "Laksaman";
+    src: url("/static/font/Laksaman.woff") format('woff');
+}
+
+@font-face {
+    font-family: "Laksaman";
+    src: url("/static/font/Laksaman-Bold.woff") format('woff');
+    font-weight: bold;
+}
+
+@font-face {
+    font-family: "Laksaman";
+    src: url("/static/font/Laksaman-Italic.woff") format('woff');
+    font-style: italic;
+}
+
+@font-face {
+    font-family: "Laksaman";
+    src: url("/static/font/Laksaman-BoldItalic.woff") format('woff');
+    font-weight: bold;
+    font-style: italic;
+}
+
+/* latin-ext */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(/static/font/RobotoMono-Latin-ext.woff2) format('woff2');
+  unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: local('Roboto Mono'), local('RobotoMono-Regular'), url(/static/font/RobotoMono-Latin.woff2) format('woff2');
+  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
+}
  No newline at end of file

          
A => static/css/normalize.css +427 -0
@@ 0,0 1,427 @@ 
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ *    user zoom.
+ */
+
+html {
+  font-family: sans-serif; /* 1 */
+  -ms-text-size-adjust: 100%; /* 2 */
+  -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+  margin: 0;
+}
+
+/* HTML5 display definitions
+   ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+  display: inline-block; /* 1 */
+  vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+  display: none;
+}
+
+/* Links
+   ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+  background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+  outline: 0;
+}
+
+/* Text-level semantics
+   ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+  font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+  font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+  background: #ff0;
+  color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+  font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+/* Embedded content
+   ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+  border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+/* Grouping content
+   ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+  margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+  overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+/* Forms
+   ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ *    Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit; /* 1 */
+  font: inherit; /* 2 */
+  margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+  overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+  text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ *    and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ *    `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button; /* 2 */
+  cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+  line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+  box-sizing: border-box; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ *    (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+  -webkit-appearance: textfield; /* 1 */
+  -moz-box-sizing: content-box;
+  -webkit-box-sizing: content-box; /* 2 */
+  box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+  border: 0; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+  overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+  font-weight: bold;
+}
+
+/* Tables
+   ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+td,
+th {
+  padding: 0;
+}
  No newline at end of file

          
A => static/css/skeleton-ext.css +237 -0
@@ 0,0 1,237 @@ 
+/* Skeleton Framework Extended */
+
+.xs-size-text {
+	font-size: 0.6rem;
+}
+
+.s-size-text {
+	font-size: 0.8rem;
+}
+
+.m-size-text {
+	font-size: 1.0rem;
+}
+
+.l-size-text {
+	font-size: 1.2rem;
+}
+
+.xl-size-text {
+	font-size: 1.4rem;
+}
+
+.underline {
+	text-decoration: underline;
+}
+
+.vtable table,thead,tbody {
+	display: inline-block;
+	white-space : nowrap;
+	overflow: hidden;
+}
+
+.vtable table {
+	width: 100%;
+}
+
+.vtable th {
+	text-align: right;
+	padding-right: 5px;
+}
+
+.vtable td {
+	text-align: left;
+	word-wrap: break-word;
+}
+
+.red-text {
+	color: red;
+}
+
+.green-text {
+	color: green;
+}
+
+.blue-text {
+	color: blue;
+}
+
+.white-text {
+	color: white;
+}
+
+.cyan-text {
+	color: cyan;
+}
+
+.magenta-text {
+	color: magenta;
+}
+
+.yellow-text {
+	color: yellow;
+}
+
+.black-text {
+	color: black;
+}
+
+.nowrap-text {
+    white-space: nowrap;
+    word-break: keep-all;
+}
+
+.bold-text {
+    font-weight: bold !important;
+}
+
+.button.button-logout,
+button.button-logout {
+	border: 1px solid #c00000;
+	color: #7c0000;
+}
+
+.button.button-logout:hover,
+button.button-logout:hover {
+	border: 1px solid #ff0000;
+	color: #ff0000;
+}
+
+.button.button-login,
+button.button-login {
+	border: 1px solid #008000;
+	color: #005000;
+}
+
+.button.button-login:hover,
+button.button-login:hover {
+	border: 1px solid #00b000;
+	color: #008000;
+}
+
+.button.button-home,
+button.button-home {
+	border: 1px solid #d0007a;
+	color: #d0007a;
+}
+
+.button.button-home:hover,
+button.button-home:hover {
+	border: 1px solid #f1008d;
+	color: #f1008d;
+}
+
+.button.button-home-primary,
+button.button-home-primary {
+	border: 1px solid #eb008a;
+	color: #ffffff;
+	background-color: #eb008a;
+	-webkit-transition: background-color 0.2s;
+	transition: background-color 0.2s;
+}
+
+.button.button-home-primary:hover,
+button.button-home-primary:hover {
+	border: 1px solid #ca0077;
+	color: #ffffff;
+	background-color: #ca0077;
+}
+
+.button.button-small,
+button.button-small {
+	display: inline-block;
+	height: 2.1rem;
+	margin-bottom: 0.5rem;
+	padding: 0 1.0rem;
+	color: #555;
+	text-align: center;
+	font-size: 0.75rem;
+	font-weight: 600;
+	line-height: 2.0rem;
+	letter-spacing: 0.1rem;
+	text-transform: uppercase;
+	text-decoration: none;
+	white-space: nowrap;
+	background-color: transparent;
+	border-radius: 3 px;
+	border: 1px solid #BBB;
+	cursor: pointer;
+	-webkit-transition: border 0.2s;
+	transition: border 0.2s;
+}
+
+.button.button-small:hover,
+button.button-small:hover,
+.button.button-small:focus,
+button.button-small:focus {
+	color: #333;
+	border-color: #888;
+	outline: 0;
+}
+
+.button.button-small.button-primary,
+button.button-small.button-primary {
+	border: 1px solid #555753;
+	color: #FFF;
+	background-color: #888a85;
+	-webkit-transition: background-color 0.2s;
+	transition: background-color 0.2s;
+}
+
+.button.button-small.button-primary:hover,
+button.button-small.button-primary:hover,
+.button.button-small.button-primary:focus,
+button.button-small.button-primary:focus {
+	color: #FFF;
+	background-color: #555753;
+	border-color: #2e3436;
+}
+
+@media screen and (min-width: 560px) {
+	[class*='column'] ~ [class*='column'] {
+		margin-top: 0;
+	}
+	.one-tenth[class*='column'] {
+        width: 9.9999999999%;
+    }
+	.one-ninth[class*='column'] {
+        width: 11.1111111111%;
+    }
+	.right-offset-by-one[class*='column'] {
+		margin-right: 8.3333333333%;
+	}
+	.right-offset-by-two[class*='column'] {
+		margin-right: 16.6666666666%;
+	}
+	.right-offset-by-three[class*='column'],
+	.right-offset-by-one-quarter[class*='column'] {
+		margin-right: 24.9999999999%;
+	}
+	.right-offset-by-four[class*='column'],
+	.right-offset-by-one-third[class*='column'] {
+		margin-right: 33.3333333332%;
+	}
+	.right-offset-by-five[class*='column'] {
+		margin-right: 41.6666666665%;
+	}
+	.right-offset-by-six[class*='column'],
+	.right-offset-by-one-half[class*='column'] {
+		margin-right: 49.9999999998%;
+	}
+	.right-offset-by-seven[class*='column'] {
+		margin-right: 58.3333333331%;
+	}
+	.right-offset-by-eight[class*='column'],
+	.right-offset-by-two-thirds[class*='column'] {
+		margin-right: 66.6666666664%;
+	}
+	.right-offset-by-nine[class*='column'] {
+		margin-right: 74.9999999997%;
+	}
+	.right-offset-by-ten[class*='column'] {
+		margin-right: 83.333333333%;
+	}
+	.right-offset-by-eleven[class*='column'] {
+		margin-right: 91.6666666663%;
+	}
+}

          
A => static/css/skeleton.css +1204 -0
@@ 0,0 1,1204 @@ 
+/*! skeleton-framework | 1.1.1 | MIT | 5/12/2016 */
+/* Table of contents
+- Base Styles
+- Grid
+- Typography
+- Links
+- Buttons
+- Forms
+- Lists
+- Code
+- Tables
+- Spacing
+- Utilities
+- Clearing
+- Media Queries
+*/
+
+html {
+  font-size: 1em;
+  box-sizing: border-box;
+}
+
+*,
+*::before,
+*::after {
+  box-sizing: inherit;
+}
+
+body {
+  background-color: #fff;
+  font-size: 1rem;
+  line-height: 1.6rem;
+  font-weight: 400;
+  font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  color: #222;
+}
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  width: 100%;
+  max-width: 1200px;
+  padding-left: 0.5rem;
+  padding-right: 0.5rem;
+}
+
+.container-fluid {
+  margin-right: auto;
+  margin-left: auto;
+  width: 100%;
+  padding-left: 0.5rem;
+  padding-right: 0.5rem;
+}
+
+.row {
+  margin-left: -0.5rem;
+  margin-right: -0.5rem;
+}
+
+.row::before,
+.row::after {
+  content: ' ';
+  display: table;
+}
+
+.row::after {
+  clear: both;
+}
+
+[class*='column'] {
+  float: left;
+  width: 100%;
+  min-height: 1px;
+  padding-left: 0.5rem;
+  padding-right: 0.5rem;
+}
+
+.xs-one[class*='column'] {
+  width: 8.3333333333%;
+}
+
+.xs-two[class*='column'] {
+  width: 16.6666666666%;
+}
+
+.xs-three[class*='column'],
+.xs-one-quarter[class*='column'] {
+  width: 24.9999999999%;
+}
+
+.xs-four[class*='column'],
+.xs-one-third[class*='column'] {
+  width: 33.3333333332%;
+}
+
+.xs-five[class*='column'] {
+  width: 41.6666666665%;
+}
+
+.xs-six[class*='column'],
+.xs-one-half[class*='column'] {
+  width: 49.9999999998%;
+}
+
+.xs-seven[class*='column'] {
+  width: 58.3333333331%;
+}
+
+.xs-eight[class*='column'],
+.xs-two-thirds[class*='column'] {
+  width: 66.6666666664%;
+}
+
+.xs-nine[class*='column'] {
+  width: 74.9999999997%;
+}
+
+.xs-ten[class*='column'] {
+  width: 83.333333333%;
+}
+
+.xs-eleven[class*='column'] {
+  width: 91.6666666663%;
+}
+
+.xs-twelve[class*='column'] {
+  width: 99.9999999996%;
+}
+
+[class*='xs-'][class*='column'] ~ [class*='xs-'][class*='column'] {
+  margin-top: 0;
+}
+
+@media screen and (min-width: 560px) {
+  [class*='column'] ~ [class*='column'] {
+    margin-top: 0;
+  }
+  .one[class*='column'] {
+    width: 8.3333333333%;
+  }
+  .two[class*='column'] {
+    width: 16.6666666666%;
+  }
+  .three[class*='column'],
+  .one-quarter[class*='column'] {
+    width: 24.9999999999%;
+  }
+  .four[class*='column'],
+  .one-third[class*='column'] {
+    width: 33.3333333332%;
+  }
+  .five[class*='column'] {
+    width: 41.6666666665%;
+  }
+  .six[class*='column'],
+  .one-half[class*='column'] {
+    width: 49.9999999998%;
+  }
+  .seven[class*='column'] {
+    width: 58.3333333331%;
+  }
+  .eight[class*='column'],
+  .two-thirds[class*='column'] {
+    width: 66.6666666664%;
+  }
+  .nine[class*='column'] {
+    width: 74.9999999997%;
+  }
+  .ten[class*='column'] {
+    width: 83.333333333%;
+  }
+  .eleven[class*='column'] {
+    width: 91.6666666663%;
+  }
+  .twelve[class*='column'] {
+    width: 99.9999999996%;
+  }
+  .offset-by-one[class*='column'] {
+    margin-left: 8.3333333333%;
+  }
+  .offset-by-two[class*='column'] {
+    margin-left: 16.6666666666%;
+  }
+  .offset-by-three[class*='column'],
+  .offset-by-one-quarter[class*='column'] {
+    margin-left: 24.9999999999%;
+  }
+  .offset-by-four[class*='column'],
+  .offset-by-one-third[class*='column'] {
+    margin-left: 33.3333333332%;
+  }
+  .offset-by-five[class*='column'] {
+    margin-left: 41.6666666665%;
+  }
+  .offset-by-six[class*='column'],
+  .offset-by-one-half[class*='column'] {
+    margin-left: 49.9999999998%;
+  }
+  .offset-by-seven[class*='column'] {
+    margin-left: 58.3333333331%;
+  }
+  .offset-by-eight[class*='column'],
+  .offset-by-two-thirds[class*='column'] {
+    margin-left: 66.6666666664%;
+  }
+  .offset-by-nine[class*='column'] {
+    margin-left: 74.9999999997%;
+  }
+  .offset-by-ten[class*='column'] {
+    margin-left: 83.333333333%;
+  }
+  .offset-by-eleven[class*='column'] {
+    margin-left: 91.6666666663%;
+  }
+  .sm-one[class*='column'] {
+    width: 8.3333333333%;
+  }
+  .sm-two[class*='column'] {
+    width: 16.6666666666%;
+  }
+  .sm-three[class*='column'],
+  .sm-one-quarter[class*='column'] {
+    width: 24.9999999999%;
+  }
+  .sm-four[class*='column'],
+  .sm-one-third[class*='column'] {
+    width: 33.3333333332%;
+  }
+  .sm-five[class*='column'] {
+    width: 41.6666666665%;
+  }
+  .sm-six[class*='column'],
+  .sm-one-half[class*='column'] {
+    width: 49.9999999998%;
+  }
+  .sm-seven[class*='column'] {
+    width: 58.3333333331%;
+  }
+  .sm-eight[class*='column'],
+  .sm-two-thirds[class*='column'] {
+    width: 66.6666666664%;
+  }
+  .sm-nine[class*='column'] {
+    width: 74.9999999997%;
+  }
+  .sm-ten[class*='column'] {
+    width: 83.333333333%;
+  }
+  .sm-eleven[class*='column'] {
+    width: 91.6666666663%;
+  }
+  .sm-twelve[class*='column'] {
+    width: 99.9999999996%;
+  }
+  .sm-offset-by-one[class*='column'] {
+    margin-left: 8.3333333333%;
+  }
+  .sm-offset-by-two[class*='column'] {
+    margin-left: 16.6666666666%;
+  }
+  .sm-offset-by-three[class*='column'],
+  .sm-offset-by-one-quarter[class*='column'] {
+    margin-left: 24.9999999999%;
+  }
+  .sm-offset-by-four[class*='column'],
+  .sm-offset-by-one-third[class*='column'] {
+    margin-left: 33.3333333332%;
+  }
+  .sm-offset-by-five[class*='column'] {
+    margin-left: 41.6666666665%;
+  }
+  .sm-offset-by-six[class*='column'],
+  .sm-offset-by-one-half[class*='column'] {
+    margin-left: 49.9999999998%;
+  }
+  .sm-offset-by-seven[class*='column'] {
+    margin-left: 58.3333333331%;
+  }
+  .sm-offset-by-eight[class*='column'],
+  .sm-offset-by-two-thirds[class*='column'] {
+    margin-left: 66.6666666664%;
+  }
+  .sm-offset-by-nine[class*='column'] {
+    margin-left: 74.9999999997%;
+  }
+  .sm-offset-by-ten[class*='column'] {
+    margin-left: 83.333333333%;
+  }
+  .sm-offset-by-eleven[class*='column'] {
+    margin-left: 91.6666666663%;
+  }
+}
+
+@media screen and (min-width: 720px) {
+  .md-one[class*='column'] {
+    width: 8.3333333333%;
+  }
+  .md-two[class*='column'] {
+    width: 16.6666666666%;
+  }
+  .md-three[class*='column'],
+  .md-one-quarter[class*='column'] {
+    width: 24.9999999999%;
+  }
+  .md-four[class*='column'],
+  .md-one-third[class*='column'] {
+    width: 33.3333333332%;
+  }
+  .md-five[class*='column'] {
+    width: 41.6666666665%;
+  }
+  .md-six[class*='column'],
+  .md-one-half[class*='column'] {
+    width: 49.9999999998%;
+  }
+  .md-seven[class*='column'] {
+    width: 58.3333333331%;
+  }
+  .md-eight[class*='column'],
+  .md-two-thirds[class*='column'] {
+    width: 66.6666666664%;
+  }
+  .md-nine[class*='column'] {
+    width: 74.9999999997%;
+  }
+  .md-ten[class*='column'] {
+    width: 83.333333333%;
+  }
+  .md-eleven[class*='column'] {
+    width: 91.6666666663%;
+  }
+  .md-twelve[class*='column'] {
+    width: 99.9999999996%;
+  }
+  .md-offset-by-one[class*='column'] {
+    margin-left: 8.3333333333%;
+  }
+  .md-offset-by-two[class*='column'] {
+    margin-left: 16.6666666666%;
+  }
+  .md-offset-by-three[class*='column'],
+  .md-offset-by-one-quarter[class*='column'] {
+    margin-left: 24.9999999999%;
+  }
+  .md-offset-by-four[class*='column'],
+  .md-offset-by-one-third[class*='column'] {
+    margin-left: 33.3333333332%;
+  }
+  .md-offset-by-five[class*='column'] {
+    margin-left: 41.6666666665%;
+  }
+  .md-offset-by-six[class*='column'],
+  .md-offset-by-one-half[class*='column'] {
+    margin-left: 49.9999999998%;
+  }
+  .md-offset-by-seven[class*='column'] {
+    margin-left: 58.3333333331%;
+  }
+  .md-offset-by-eight[class*='column'],
+  .md-offset-by-two-thirds[class*='column'] {
+    margin-left: 66.6666666664%;
+  }
+  .md-offset-by-nine[class*='column'] {
+    margin-left: 74.9999999997%;
+  }
+  .md-offset-by-ten[class*='column'] {
+    margin-left: 83.333333333%;
+  }
+  .md-offset-by-eleven[class*='column'] {
+    margin-left: 91.6666666663%;
+  }
+}
+
+@media screen and (min-width: 960px) {
+  .lg-one[class*='column'] {
+    width: 8.3333333333%;
+  }
+  .lg-two[class*='column'] {
+    width: 16.6666666666%;
+  }
+  .lg-three[class*='column'],
+  .lg-one-quarter[class*='column'] {
+    width: 24.9999999999%;
+  }
+  .lg-four[class*='column'],
+  .lg-one-third[class*='column'] {
+    width: 33.3333333332%;
+  }
+  .lg-five[class*='column'] {
+    width: 41.6666666665%;
+  }
+  .lg-six[class*='column'],
+  .lg-one-half[class*='column'] {
+    width: 49.9999999998%;
+  }
+  .lg-seven[class*='column'] {
+    width: 58.3333333331%;
+  }
+  .lg-eight[class*='column'],
+  .lg-two-thirds[class*='column'] {
+    width: 66.6666666664%;
+  }
+  .lg-nine[class*='column'] {
+    width: 74.9999999997%;
+  }
+  .lg-ten[class*='column'] {
+    width: 83.333333333%;
+  }
+  .lg-eleven[class*='column'] {
+    width: 91.6666666663%;
+  }
+  .lg-twelve[class*='column'] {
+    width: 99.9999999996%;
+  }
+  .lg-offset-by-one[class*='column'] {
+    margin-left: 8.3333333333%
+  }
+  .lg-offset-by-two[class*='column'] {
+    margin-left: 16.6666666666%
+  }
+  .lg-offset-by-three[class*='column'],
+  .lg-offset-by-one-quarter[class*='column'] {
+    margin-left: 24.9999999999%;
+  }
+  .lg-offset-by-four[class*='column'],
+  .lg-offset-by-one-third[class*='column'] {
+    margin-left: 33.3333333332%;
+  }
+  .lg-offset-by-five[class*='column'] {
+    margin-left: 41.6666666665%;
+  }
+  .lg-offset-by-six[class*='column'],
+  .lg-offset-by-one-half[class*='column'] {
+    margin-left: 49.9999999998%;
+  }
+  .lg-offset-by-seven[class*='column'] {
+    margin-left: 58.3333333331%;
+  }
+  .lg-offset-by-eight[class*='column'],
+  .lg-offset-by-two-thirds[class*='column'] {
+    margin-left: 66.6666666664%;
+  }
+  .lg-offset-by-nine[class*='column'] {
+    margin-left: 74.9999999997%;
+  }
+  .lg-offset-by-ten[class*='column'] {
+    margin-left: 83.333333333%;
+  }
+  .lg-offset-by-eleven[class*='column'] {
+    margin-left: 91.6666666663%;
+  }
+}
+
+/* Base Typo
+ ------------------------------------------------- */
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 0;
+  margin-bottom: 2rem;
+  font-weight: 300;
+}
+
+h1 {
+  font-size: 3.6rem;
+  line-height: 1.2;
+  letter-spacing: -0.1rem;
+}
+
+h2 {
+  font-size: 3.0rem;
+  line-height: 1.25;
+  letter-spacing: -0.1rem;
+}
+
+h3 {
+  font-size: 2.4rem;
+  line-height: 1.3;
+  letter-spacing: -0.1rem;
+}
+
+h4 {
+  font-size: 1.8rem;
+  line-height: 1.35;
+  letter-spacing: -0.08rem;
+}
+
+h5 {
+  font-size: 1.5rem;
+  line-height: 1.5;
+  letter-spacing: -0.05rem;
+}
+
+h6 {
+  font-size: 1.2rem;
+  line-height: 1.6;
+  letter-spacing: 0;
+}
+
+/* Larger than phablet */
+
+@media (min-width: 560px) {
+  h1 {
+    font-size: 3.6rem;
+  }
+  h2 {
+    font-size: 3.0rem;
+  }
+  h3 {
+    font-size: 2.4rem;
+  }
+  h4 {
+    font-size: 1.8rem;
+  }
+  h5 {
+    font-size: 1.5rem;
+  }
+  h6 {
+    font-size: 1.2rem;
+  }
+}
+
+p {
+  margin-top: 0;
+}
+
+/* Links
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+a {
+  color: #1EAEDB;
+}
+
+a:hover {
+  color: #0FA0CE;
+}
+
+/* Colors
+–––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+.text-primary {
+ color: #1EAEDB
+}
+
+.text-success {
+  color: #2ecc71
+}
+
+.text-danger {
+  color: #e74c3c
+}
+
+.button,
+button,
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+  display: inline-block;
+  height: 2.5rem;
+  padding: 0 1.9rem;
+  color: #555;
+  text-align: center;
+  font-size: 0.7rem;
+  font-weight: 600;
+  line-height: 2.5rem;
+  letter-spacing: 0.1rem;
+  text-transform: uppercase;
+  text-decoration: none;
+  white-space: nowrap;
+  background-color: transparent;
+  border-radius: 4px;
+  border: 1px solid #BBB;
+  cursor: pointer;
+  -webkit-transition: border 0.2s;
+  transition: border 0.2s;
+}
+
+.button:hover,
+button:hover,
+input[type="submit"]:hover,
+input[type="reset"]:hover,
+input[type="button"]:hover,
+.button:focus,
+button:focus,
+input[type="submit"]:focus,
+input[type="reset"]:focus,
+input[type="button"]:focus {
+  color: #333;
+  border-color: #888;
+  outline: 0;
+}
+
+.button:active,
+button:active,
+input[type="submit"]:active,
+input[type="reset"]:active,
+input[type="button"]:active {
+  color: #222;
+  border-color: #222;
+}
+
+.button:disabled,
+.button:disabled:hover,
+button[disabled],
+.button[disabled],
+.button-primary[disabled],
+.button-success[disabled],
+.button-danger[disabled],
+input[type="submit"][disabled],
+input[type="reset"][disabled],
+input[type="button"][disabled] {
+  border: 1px solid #E3E3E3;
+  color: #888;
+  cursor: not-allowed;
+}
+
+.button.button-primary,
+button.button-primary,
+input[type="submit"].button-primary,
+input[type="reset"].button-primary,
+input[type="button"].button-primary {
+  border: 1px solid #33C3F0;
+  color: #FFF;
+  background-color: #33C3F0;
+  -webkit-transition: background-color 0.2s;
+  transition: background-color 0.2s;
+}
+
+.button.button-primary:hover,
+button.button-primary:hover,
+input[type="submit"].button-primary:hover,
+input[type="reset"].button-primary:hover,
+input[type="button"].button-primary:hover,
+.button.button-primary:focus,
+button.button-primary:focus,
+input[type="submit"].button-primary:focus,
+input[type="reset"].button-primary:focus,
+input[type="button"].button-primary:focus {
+  color: #FFF;
+  background-color: #1EAEDB;
+  border-color: #1EAEDB;
+}
+
+.button.button-primary:active,
+button.button-primary:active,
+input[type="submit"].button-primary:active,
+input[type="reset"].button-primary:active,
+input[type="button"].button-primary:active {
+  color: #FFF;
+  background-color: #157b9b;
+  border-color: #157b9b;
+}
+
+.button.button-primary:disabled,
+button.button-primary:disabled,
+input[type="submit"].button-primary:disabled,
+input[type="reset"].button-primary:disabled,
+input[type="button"].button-primary:disabled {
+  color: #FFF;
+  cursor: not-allowed;
+  background-color: #7CD9F8;
+  border-color: #7CD9F8;
+}
+
+.button.button-success,
+button.button-success,
+input[type="submit"].button-success,
+input[type="reset"].button-success,
+input[type="button"].button-success {
+  border: 1px solid #2ecc71;
+  color: #FFF;
+  background-color: #2ecc71;
+  -webkit-transition: background-color 0.2s;
+  transition: background-color 0.2s;
+}
+
+.button.button-success:hover,
+button.button-success:hover,
+input[type="submit"].button-success:hover,
+input[type="reset"].button-success:hover,
+input[type="button"].button-success:hover,
+.button.button-success:focus,
+button.button-success:focus,
+input[type="submit"].button-success:focus,
+input[type="reset"].button-success:focus,
+input[type="button"].button-success:focus {
+  color: #FFF;
+  background-color: #27ae60;
+  border-color: #27ae60;
+}
+
+.button.button-success:active,
+button.button-success:active,
+input[type="submit"].button-success:active,
+input[type="reset"].button-success:active,
+input[type="button"].button-success:active {
+  color: #FFF;
+  background-color: #2ecc71;
+  border-color: #2ecc71;
+}
+
+.button.button-success:disabled,
+button.button-success:disabled,
+input[type="submit"].button-success:disabled,
+input[type="reset"].button-success:disabled,
+input[type="button"].button-success:disabled {
+  color: #FFF;
+  cursor: not-allowed;
+  background-color: #82e3aa;
+  border-color: #82e3aa;
+}
+
+.button.button-danger,
+button.button-danger,
+input[type="submit"].button-danger,
+input[type="reset"].button-danger,
+input[type="button"].button-danger {
+  border: 1px solid #e74c3c;
+  color: #FFF;
+  background-color: #e74c3c;
+  -webkit-transition: background-color 0.2s;
+  transition: background-color 0.2s;
+}
+
+.button.button-danger:hover,
+button.button-danger:hover,
+input[type="submit"].button-danger:hover,
+input[type="reset"].button-danger:hover,
+input[type="button"].button-danger:hover,
+.button.button-danger:focus,
+button.button-danger:focus,
+input[type="submit"].button-danger:focus,
+input[type="reset"].button-danger:focus,
+input[type="button"].button-danger:focus {
+  color: #FFF;
+  background-color: #c0392b;
+  border-color: #c0392b;
+}
+
+.button.button-danger:active,
+button.button-danger:active,
+input[type="submit"].button-danger:active,
+input[type="reset"].button-danger:active,
+input[type="button"].button-danger:active {
+  color: #FFF;
+  background-color: #e74c3c;
+  border-color: #e74c3c;
+}
+
+.button.button-danger:disabled,
+button.button-danger:disabled,
+input[type="submit"].button-danger:disabled,
+input[type="reset"].button-danger:disabled,
+input[type="button"].button-danger:disabled {
+  color: #FFF;
+  cursor: not-allowed;
+  background-color: #ee8377;
+  border-color: #ee8377;
+}
+
+input[type="email"],
+input[type="number"],
+input[type="date"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+textarea,
+select {
+  padding: 0.4rem 0.6rem;
+  background-color: #FFF;
+  border: 1px solid #D1D1D1;
+  border-radius: 4px;
+  box-shadow: none;
+  -webkit-transition: border 0.2s;
+  transition: border 0.2s;
+}
+
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+select:not([size]),
+textarea:not([rows]) {
+  height: 2.5rem;
+}
+
+/* Removes awkward default styles on some inputs for iOS */
+
+input[type="email"],
+input[type="number"],
+input[type="date"],
+input[type="search"],
+input[type="text"],
+input[type="tel"],
+input[type="url"],
+input[type="password"],
+input[type="button"],
+input[type="submit"],
+textarea {
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
+
+textarea {
+  min-height: 4rem;
+  padding-top: 0.4rem;
+  padding-bottom: 0.4rem;
+  resize: vertical;
+}
+
+input[type="email"]:focus,
+input[type="number"]:focus,
+input[type="date"]:focus,
+input[type="search"]:focus,
+input[type="text"]:focus,
+input[type="tel"]:focus,
+input[type="url"]:focus,
+input[type="password"]:focus,
+textarea:focus,
+select:focus {
+  border: 1px solid #33C3F0;
+  outline: 0;
+}
+
+.has-error,
+.has-error:focus {
+  border: 1px solid #e74c3c !important;
+  outline: 0;
+}
+
+.has-success,
+.has-success:focus {
+  border: 1px solid #2ecc71 !important;
+  outline: 0;
+}
+
+label,
+legend {
+  display: block;
+  margin-bottom: 0.5rem;
+  font-weight: 600;
+}
+
+fieldset {
+  padding: 0;
+  border-width: 0;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+  display: inline;
+}
+
+label > .label-body {
+  display: inline-block;
+  margin-left: 0.5rem;
+  font-weight: normal;
+}
+
+ul {
+  list-style: circle inside;
+}
+
+ol {
+  list-style: decimal inside;
+}
+
+ol,
+ul {
+  padding-left: 0;
+  margin-top: 0;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin: 1.5rem 0 1.5rem 3rem;
+  font-size: 90%;
+}
+
+li {
+  margin-bottom: 1rem;
+}
+
+/* Cards */
+
+.card {
+  border: 1px solid #E1E1E1;
+  padding: 15px 25px;
+  border-radius: 4px;
+  box-shadow: 1px 1px 1px #E1E1E1;
+  min-height: 160px;
+  margin-bottom: 1rem;
+}
+
+.card h1,
+.card h2,
+.card h3,
+.card h4,
+.card h5,
+.card h6,
+.card p {
+  margin-bottom:1.2rem;
+}
+
+a.card {
+  display: block;
+  color: #757575;
+  text-decoration: none;
+  -webkit-transition: color .3s, border-color .3s, -webkit-transform .3s;
+  transition: color .3s, border-color .3s, -webkit-transform .3s;
+  transition: color .3s, transform .3s, border-color .3s;
+  transition: color .3s, transform .3s, border-color .3s, -webkit-transform .3s;
+}
+
+a.card:hover,
+a.card:active {
+  color: black;
+  border-color: #8A8A8A;
+  -webkit-transform: translateX(-2px) translateY(-2px);
+          transform: translateX(-2px) translateY(-2px);
+}
+
+code {
+  padding: 0.2rem 0.5rem;
+  margin: 0 0.2rem;
+  font-size: 90%;
+  white-space: nowrap;
+  background: #F1F1F1;
+  border: 1px solid #E1E1E1;
+  border-radius: 4px;
+}
+
+pre > code {
+  display: block;
+  padding: 1rem 1.5rem;
+  white-space: pre;
+  overflow-x: auto;
+}
+
+@media (max-width: 560px) {
+  pre > code {
+    white-space: nowrap;
+  }
+}
+
+.alert {
+  width: 100%;
+  border-radius: 4px;
+  border: 1px solid #000;
+  color: #000;
+  background-color: #FFF;
+  padding: 10px 15px;
+}
+
+.alert.alert-primary {
+  border: 1px solid #33C3F0;
+  color: #FFF;
+  background-color: #33C3F0;
+}
+
+.alert.alert-success {
+  border: 1px solid #2ecc71;
+  color: #FFF;
+  background-color: #2ecc71;
+}
+
+.alert.alert-danger {
+  border: 1px solid #e74c3c;
+  color: #FFF;
+  background-color: #e74c3c;
+}
+
+.table-responsive {
+    overflow-x: auto;
+}
+
+.table-responsive th,
+.table-responsive td {
+  white-space: nowrap;
+}
+
+table {
+  border-collapse: collapse;
+  -webkit-overflow-scrolling: touch;
+}
+
+th,
+td {
+  padding: 0.75rem 1rem;
+}
+
+th {
+  text-align: left;
+}
+
+td {
+  border-bottom: 1px solid #E1E1E1;
+}
+
+th:first-child,
+td:first-child {
+  padding-left: 0;
+}
+
+th:last-child,
+td:last-child {
+  padding-right: 0;
+}
+
+tr th {
+    border-bottom: 1px solid #000;
+}
+
+@media (min-width: 560px) {
+  th:first-child,
+  td:first-child {
+    padding-left: 1rem;
+  }
+}
+
+button,
+.button {
+  margin-bottom: 1rem;
+}
+
+input,
+textarea,
+select,
+fieldset {
+  margin-bottom: 1.5rem;
+}
+
+pre,
+blockquote,
+dl,
+figure,
+table,
+p,
+ul,
+ol,
+form {
+  margin-bottom: 2.5rem;
+}
+
+.alert {
+  margin-bottom: 1rem;
+}
+
+.u-full-width {
+  width: 100%;
+}
+
+.u-max-full-width {
+  max-width: 100%;
+}
+
+/* Floats */
+
+.u-pull-right {
+  float: right;
+}
+
+.u-pull-left {
+  float: left;
+}
+
+.u-cf {
+  content: "";
+  display: table;
+  clear: both;
+}
+
+/* Positioning */
+
+.u-center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/**
+ * Note:
+ *
+ * Nest this class inside something with `position: relative` to have
+ * your element centered relative to its containing element.
+ *
+ * Use this class without nesting it to have your element centered relative
+ * to the viewport.
+ */
+
+.u-center-abs {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translateY(-50%) translateX(-50%);
+          transform: translateY(-50%) translateX(-50%);
+}
+
+/* Type */
+
+.u-text-center {
+  text-align: center !important;
+}
+
+.u-text-right {
+  text-align: right !important;
+}
+
+.u-text-left {
+  text-align: left !important;
+}
+
+.u-text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+/* Peek a boo */
+
+.u-hide {
+  display: none !important;
+}
+
+.u-show {
+  display: block !important;
+}
+
+.u-invisible {
+  visibility: hidden !important;
+}
+
+.u-visible {
+  visibility: visible !important;
+}
+
+/* Misc */
+
+.u-img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+
+/* Misc */
+
+hr {
+  margin-top: 3rem;
+  margin-bottom: 3.5rem;
+  border-width: 0;
+  border-top: 1px solid #E1E1E1;
+}
+
+/* Clearing */
+
+.container:after,
+.row:after {
+  content: "";
+  display: table;
+  clear: both;
+}
+
+/*****
+* Media Queries
+*
+* Note: The best way to structure the use of media queries is to create the
+* queries near the relevant code. For example, if you wanted to change the
+* styles for buttons on small devices, paste the mobile query code up in the
+* buttons section and style it there.
+*****/
+
+@media (min-width: 400px) {
+  /* Larger than mobile */
+}
+
+@media (min-width: 560px) {
+  /* Larger than phablet (also point when grid becomes active) */
+}
+
+@media (min-width: 720px) {
+  /* Larger than tablet */
+}
+
+@media (min-width: 960px) {
+  /* Larger than desktop */
+}
+
+@media (min-width: 1200px) {
+  /* Larger than Desktop HD */
+}

          
A => static/css/skeleton.min.css +1 -0
@@ 0,0 1,1 @@ 
+/*! skeleton-framework | 1.1.1 | MIT | 5/12/2016 */.container,.container-fluid{margin-right:auto;margin-left:auto}.container,.container-fluid,[class*=column]{width:100%;padding-left:.5rem;padding-right:.5rem}h1,h2,h3{letter-spacing:-.1rem}[class*=xs-][class*=column]~[class*=xs-][class*=column],ol,p,ul{margin-top:0}.table-responsive,pre>code{overflow-x:auto}html{font-size:1em;box-sizing:border-box}*,::after,::before{box-sizing:inherit}body{background-color:#fff;font-size:1rem;line-height:1.6rem;font-weight:400;font-family:Raleway,HelveticaNeue,"Helvetica Neue",Helvetica,Arial,sans-serif;color:#222}.container{max-width:1200px}.row{margin-left:-.5rem;margin-right:-.5rem}.row::after,.row::before{content:' ';display:table}.container:after,.row:after,.u-cf{content:"";clear:both}.row::after{clear:both}[class*=column]{float:left;min-height:1px}.xs-one[class*=column]{width:8.3333333333%}.xs-two[class*=column]{width:16.6666666666%}.xs-one-quarter[class*=column],.xs-three[class*=column]{width:24.9999999999%}.xs-four[class*=column],.xs-one-third[class*=column]{width:33.3333333332%}.xs-five[class*=column]{width:41.6666666665%}.xs-one-half[class*=column],.xs-six[class*=column]{width:49.9999999998%}.xs-seven[class*=column]{width:58.3333333331%}.xs-eight[class*=column],.xs-two-thirds[class*=column]{width:66.6666666664%}.xs-nine[class*=column]{width:74.9999999997%}.xs-ten[class*=column]{width:83.333333333%}.xs-eleven[class*=column]{width:91.6666666663%}.xs-twelve[class*=column]{width:99.9999999996%}@media screen and (min-width:560px){[class*=column]~[class*=column]{margin-top:0}.one[class*=column]{width:8.3333333333%}.two[class*=column]{width:16.6666666666%}.one-quarter[class*=column],.three[class*=column]{width:24.9999999999%}.four[class*=column],.one-third[class*=column]{width:33.3333333332%}.five[class*=column]{width:41.6666666665%}.one-half[class*=column],.six[class*=column]{width:49.9999999998%}.seven[class*=column]{width:58.3333333331%}.eight[class*=column],.two-thirds[class*=column]{width:66.6666666664%}.nine[class*=column]{width:74.9999999997%}.ten[class*=column]{width:83.333333333%}.eleven[class*=column]{width:91.6666666663%}.twelve[class*=column]{width:99.9999999996%}.offset-by-one[class*=column]{margin-left:8.3333333333%}.offset-by-two[class*=column]{margin-left:16.6666666666%}.offset-by-one-quarter[class*=column],.offset-by-three[class*=column]{margin-left:24.9999999999%}.offset-by-four[class*=column],.offset-by-one-third[class*=column]{margin-left:33.3333333332%}.offset-by-five[class*=column]{margin-left:41.6666666665%}.offset-by-one-half[class*=column],.offset-by-six[class*=column]{margin-left:49.9999999998%}.offset-by-seven[class*=column]{margin-left:58.3333333331%}.offset-by-eight[class*=column],.offset-by-two-thirds[class*=column]{margin-left:66.6666666664%}.offset-by-nine[class*=column]{margin-left:74.9999999997%}.offset-by-ten[class*=column]{margin-left:83.333333333%}.offset-by-eleven[class*=column]{margin-left:91.6666666663%}.sm-one[class*=column]{width:8.3333333333%}.sm-two[class*=column]{width:16.6666666666%}.sm-one-quarter[class*=column],.sm-three[class*=column]{width:24.9999999999%}.sm-four[class*=column],.sm-one-third[class*=column]{width:33.3333333332%}.sm-five[class*=column]{width:41.6666666665%}.sm-one-half[class*=column],.sm-six[class*=column]{width:49.9999999998%}.sm-seven[class*=column]{width:58.3333333331%}.sm-eight[class*=column],.sm-two-thirds[class*=column]{width:66.6666666664%}.sm-nine[class*=column]{width:74.9999999997%}.sm-ten[class*=column]{width:83.333333333%}.sm-eleven[class*=column]{width:91.6666666663%}.sm-twelve[class*=column]{width:99.9999999996%}.sm-offset-by-one[class*=column]{margin-left:8.3333333333%}.sm-offset-by-two[class*=column]{margin-left:16.6666666666%}.sm-offset-by-one-quarter[class*=column],.sm-offset-by-three[class*=column]{margin-left:24.9999999999%}.sm-offset-by-four[class*=column],.sm-offset-by-one-third[class*=column]{margin-left:33.3333333332%}.sm-offset-by-five[class*=column]{margin-left:41.6666666665%}.sm-offset-by-one-half[class*=column],.sm-offset-by-six[class*=column]{margin-left:49.9999999998%}.sm-offset-by-seven[class*=column]{margin-left:58.3333333331%}.sm-offset-by-eight[class*=column],.sm-offset-by-two-thirds[class*=column]{margin-left:66.6666666664%}.sm-offset-by-nine[class*=column]{margin-left:74.9999999997%}.sm-offset-by-ten[class*=column]{margin-left:83.333333333%}.sm-offset-by-eleven[class*=column]{margin-left:91.6666666663%}}@media screen and (min-width:720px){.md-one[class*=column]{width:8.3333333333%}.md-two[class*=column]{width:16.6666666666%}.md-one-quarter[class*=column],.md-three[class*=column]{width:24.9999999999%}.md-four[class*=column],.md-one-third[class*=column]{width:33.3333333332%}.md-five[class*=column]{width:41.6666666665%}.md-one-half[class*=column],.md-six[class*=column]{width:49.9999999998%}.md-seven[class*=column]{width:58.3333333331%}.md-eight[class*=column],.md-two-thirds[class*=column]{width:66.6666666664%}.md-nine[class*=column]{width:74.9999999997%}.md-ten[class*=column]{width:83.333333333%}.md-eleven[class*=column]{width:91.6666666663%}.md-twelve[class*=column]{width:99.9999999996%}.md-offset-by-one[class*=column]{margin-left:8.3333333333%}.md-offset-by-two[class*=column]{margin-left:16.6666666666%}.md-offset-by-one-quarter[class*=column],.md-offset-by-three[class*=column]{margin-left:24.9999999999%}.md-offset-by-four[class*=column],.md-offset-by-one-third[class*=column]{margin-left:33.3333333332%}.md-offset-by-five[class*=column]{margin-left:41.6666666665%}.md-offset-by-one-half[class*=column],.md-offset-by-six[class*=column]{margin-left:49.9999999998%}.md-offset-by-seven[class*=column]{margin-left:58.3333333331%}.md-offset-by-eight[class*=column],.md-offset-by-two-thirds[class*=column]{margin-left:66.6666666664%}.md-offset-by-nine[class*=column]{margin-left:74.9999999997%}.md-offset-by-ten[class*=column]{margin-left:83.333333333%}.md-offset-by-eleven[class*=column]{margin-left:91.6666666663%}}@media screen and (min-width:960px){.lg-one[class*=column]{width:8.3333333333%}.lg-two[class*=column]{width:16.6666666666%}.lg-one-quarter[class*=column],.lg-three[class*=column]{width:24.9999999999%}.lg-four[class*=column],.lg-one-third[class*=column]{width:33.3333333332%}.lg-five[class*=column]{width:41.6666666665%}.lg-one-half[class*=column],.lg-six[class*=column]{width:49.9999999998%}.lg-seven[class*=column]{width:58.3333333331%}.lg-eight[class*=column],.lg-two-thirds[class*=column]{width:66.6666666664%}.lg-nine[class*=column]{width:74.9999999997%}.lg-ten[class*=column]{width:83.333333333%}.lg-eleven[class*=column]{width:91.6666666663%}.lg-twelve[class*=column]{width:99.9999999996%}.lg-offset-by-one[class*=column]{margin-left:8.3333333333%}.lg-offset-by-two[class*=column]{margin-left:16.6666666666%}.lg-offset-by-one-quarter[class*=column],.lg-offset-by-three[class*=column]{margin-left:24.9999999999%}.lg-offset-by-four[class*=column],.lg-offset-by-one-third[class*=column]{margin-left:33.3333333332%}.lg-offset-by-five[class*=column]{margin-left:41.6666666665%}.lg-offset-by-one-half[class*=column],.lg-offset-by-six[class*=column]{margin-left:49.9999999998%}.lg-offset-by-seven[class*=column]{margin-left:58.3333333331%}.lg-offset-by-eight[class*=column],.lg-offset-by-two-thirds[class*=column]{margin-left:66.6666666664%}.lg-offset-by-nine[class*=column]{margin-left:74.9999999997%}.lg-offset-by-ten[class*=column]{margin-left:83.333333333%}.lg-offset-by-eleven[class*=column]{margin-left:91.6666666663%}}.alert,.u-full-width{width:100%}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:2rem;font-weight:300}h1{font-size:3.6rem;line-height:1.2}h2{font-size:3rem;line-height:1.25}h3{font-size:2.4rem;line-height:1.3}h4{font-size:1.8rem;line-height:1.35;letter-spacing:-.08rem}h5{font-size:1.5rem;line-height:1.5;letter-spacing:-.05rem}h6{font-size:1.2rem;line-height:1.6;letter-spacing:0}@media (min-width:560px){h1{font-size:3.6rem}h2{font-size:3rem}h3{font-size:2.4rem}h4{font-size:1.8rem}h5{font-size:1.5rem}h6{font-size:1.2rem}}.text-primary,a{color:#1EAEDB}a:hover{color:#0FA0CE}.text-success{color:#2ecc71}.text-danger{color:#e74c3c}.button,button,input[type=submit],input[type=reset],input[type=button]{display:inline-block;height:2.5rem;padding:0 1.9rem;color:#555;text-align:center;font-size:.7rem;font-weight:600;line-height:2.5rem;letter-spacing:.1rem;text-transform:uppercase;text-decoration:none;white-space:nowrap;background-color:transparent;border-radius:4px;border:1px solid #BBB;cursor:pointer;-webkit-transition:border .2s;transition:border .2s}.button:focus,.button:hover,button:focus,button:hover,input[type=submit]:focus,input[type=submit]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=button]:focus,input[type=button]:hover{color:#333;border-color:#888;outline:0}.button:active,button:active,input[type=submit]:active,input[type=reset]:active,input[type=button]:active{color:#222;border-color:#222}.button-danger[disabled],.button-primary[disabled],.button-success[disabled],.button:disabled,.button:disabled:hover,.button[disabled],button[disabled],input[type=submit][disabled],input[type=reset][disabled],input[type=button][disabled]{border:1px solid #E3E3E3;color:#888;cursor:not-allowed}.button.button-primary,button.button-primary,input[type=submit].button-primary,input[type=reset].button-primary,input[type=button].button-primary{border:1px solid #33C3F0;color:#FFF;background-color:#33C3F0;-webkit-transition:background-color .2s;transition:background-color .2s}.button.button-primary:focus,.button.button-primary:hover,button.button-primary:focus,button.button-primary:hover,input[type=submit].button-primary:focus,input[type=submit].button-primary:hover,input[type=reset].button-primary:focus,input[type=reset].button-primary:hover,input[type=button].button-primary:focus,input[type=button].button-primary:hover{color:#FFF;background-color:#1EAEDB;border-color:#1EAEDB}.button.button-primary:active,button.button-primary:active,input[type=submit].button-primary:active,input[type=reset].button-primary:active,input[type=button].button-primary:active{color:#FFF;background-color:#157b9b;border-color:#157b9b}.button.button-primary:disabled,button.button-primary:disabled,input[type=submit].button-primary:disabled,input[type=reset].button-primary:disabled,input[type=button].button-primary:disabled{color:#FFF;cursor:not-allowed;background-color:#7CD9F8;border-color:#7CD9F8}.button.button-success,button.button-success,input[type=submit].button-success,input[type=reset].button-success,input[type=button].button-success{border:1px solid #2ecc71;color:#FFF;background-color:#2ecc71;-webkit-transition:background-color .2s;transition:background-color .2s}.button.button-success:focus,.button.button-success:hover,button.button-success:focus,button.button-success:hover,input[type=submit].button-success:focus,input[type=submit].button-success:hover,input[type=reset].button-success:focus,input[type=reset].button-success:hover,input[type=button].button-success:focus,input[type=button].button-success:hover{color:#FFF;background-color:#27ae60;border-color:#27ae60}.button.button-success:active,button.button-success:active,input[type=submit].button-success:active,input[type=reset].button-success:active,input[type=button].button-success:active{color:#FFF;background-color:#2ecc71;border-color:#2ecc71}.button.button-success:disabled,button.button-success:disabled,input[type=submit].button-success:disabled,input[type=reset].button-success:disabled,input[type=button].button-success:disabled{color:#FFF;cursor:not-allowed;background-color:#82e3aa;border-color:#82e3aa}.button.button-danger,button.button-danger,input[type=submit].button-danger,input[type=reset].button-danger,input[type=button].button-danger{border:1px solid #e74c3c;color:#FFF;background-color:#e74c3c;-webkit-transition:background-color .2s;transition:background-color .2s}.button.button-danger:focus,.button.button-danger:hover,button.button-danger:focus,button.button-danger:hover,input[type=submit].button-danger:focus,input[type=submit].button-danger:hover,input[type=reset].button-danger:focus,input[type=reset].button-danger:hover,input[type=button].button-danger:focus,input[type=button].button-danger:hover{color:#FFF;background-color:#c0392b;border-color:#c0392b}.button.button-danger:active,button.button-danger:active,input[type=submit].button-danger:active,input[type=reset].button-danger:active,input[type=button].button-danger:active{color:#FFF;background-color:#e74c3c;border-color:#e74c3c}.button.button-danger:disabled,button.button-danger:disabled,input[type=submit].button-danger:disabled,input[type=reset].button-danger:disabled,input[type=button].button-danger:disabled{color:#FFF;cursor:not-allowed;background-color:#ee8377;border-color:#ee8377}input[type=number],input[type=date],input[type=search],input[type=text],input[type=tel],input[type=url],input[type=password],input[type=email],select,textarea{padding:.4rem .6rem;background-color:#FFF;border:1px solid #D1D1D1;border-radius:4px;box-shadow:none;-webkit-transition:border .2s;transition:border .2s}input[type=number],input[type=search],input[type=text],input[type=tel],input[type=url],input[type=password],input[type=email],select:not([size]),textarea:not([rows]){height:2.5rem}input[type=number],input[type=date],input[type=search],input[type=text],input[type=tel],input[type=url],input[type=password],input[type=submit],input[type=button],input[type=email],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none}textarea{min-height:4rem;padding-top:.4rem;padding-bottom:.4rem;resize:vertical}input[type=number]:focus,input[type=date]:focus,input[type=search]:focus,input[type=text]:focus,input[type=tel]:focus,input[type=url]:focus,input[type=password]:focus,input[type=email]:focus,select:focus,textarea:focus{border:1px solid #33C3F0;outline:0}.has-error,.has-error:focus{border:1px solid #e74c3c!important;outline:0}.has-success,.has-success:focus{border:1px solid #2ecc71!important;outline:0}label,legend{display:block;margin-bottom:.5rem;font-weight:600}fieldset{padding:0;border-width:0}input[type=checkbox],input[type=radio]{display:inline}label>.label-body{display:inline-block;margin-left:.5rem;font-weight:400}ul{list-style:circle inside}ol{list-style:decimal inside}ol,ul{padding-left:0}ol ol,ol ul,ul ol,ul ul{margin:1.5rem 0 1.5rem 3rem;font-size:90%}.card,li{margin-bottom:1rem}.card{border:1px solid #E1E1E1;padding:15px 25px;border-radius:4px;box-shadow:1px 1px 1px #E1E1E1;min-height:160px}.card h1,.card h2,.card h3,.card h4,.card h5,.card h6,.card p{margin-bottom:1.2rem}a.card{display:block;color:#757575;text-decoration:none;-webkit-transition:color .3s,border-color .3s,-webkit-transform .3s;transition:color .3s,border-color .3s,-webkit-transform .3s;transition:color .3s,transform .3s,border-color .3s;transition:color .3s,transform .3s,border-color .3s,-webkit-transform .3s}a.card:active,a.card:hover{color:#000;border-color:#8A8A8A;-webkit-transform:translateX(-2px) translateY(-2px);transform:translateX(-2px) translateY(-2px)}code{padding:.2rem .5rem;margin:0 .2rem;font-size:90%;white-space:nowrap;background:#F1F1F1;border:1px solid #E1E1E1;border-radius:4px}pre>code{display:block;padding:1rem 1.5rem;white-space:pre}@media (max-width:560px){pre>code{white-space:nowrap}}.alert{border-radius:4px;border:1px solid #000;color:#000;background-color:#FFF;padding:10px 15px}.alert.alert-primary{border:1px solid #33C3F0;color:#FFF;background-color:#33C3F0}.alert.alert-success{border:1px solid #2ecc71;color:#FFF;background-color:#2ecc71}.alert.alert-danger{border:1px solid #e74c3c;color:#FFF;background-color:#e74c3c}.table-responsive td,.table-responsive th{white-space:nowrap}table{border-collapse:collapse;-webkit-overflow-scrolling:touch}td,th{padding:.75rem 1rem}th{text-align:left}td{border-bottom:1px solid #E1E1E1}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}tr th{border-bottom:1px solid #000}@media (min-width:560px){td:first-child,th:first-child{padding-left:1rem}}.button,button{margin-bottom:1rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}.alert{margin-bottom:1rem}.u-max-full-width{max-width:100%}.u-pull-right{float:right}.u-pull-left{float:left}.u-cf{display:table}.u-center-block{display:block;margin-left:auto;margin-right:auto}.u-center-abs{position:absolute;top:50%;left:50%;-webkit-transform:translateY(-50%) translateX(-50%);transform:translateY(-50%) translateX(-50%)}.u-text-center{text-align:center!important}.u-text-right{text-align:right!important}.u-text-left{text-align:left!important}.u-text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.u-hide{display:none!important}.u-show{display:block!important}.u-invisible{visibility:hidden!important}.u-visible{visibility:visible!important}.u-img-responsive{display:block;max-width:100%;height:auto}hr{margin-top:3rem;margin-bottom:3.5rem;border-width:0;border-top:1px solid #E1E1E1}.container:after,.row:after{display:table}

          
A => static/css/tooltip.css +26 -0
@@ 0,0 1,26 @@ 
+/* Tooltip container */
+.tooltip {
+    position: relative;
+    display: inline-block;
+    border-bottom: 1px dotted black; /* If you want dots under the hoverable text */
+}
+
+/* Tooltip text */
+.tooltip .tooltiptext {
+    visibility: hidden;
+    width: 120px;
+    background-color: black;
+    color: #fff;
+    text-align: center;
+    padding: 5px 0;
+    border-radius: 6px;
+ 
+    /* Position the tooltip text - see examples below! */
+    position: absolute;
+    z-index: 1;
+}
+
+/* Show the tooltip text when you mouse over the tooltip container */
+.tooltip:hover .tooltiptext {
+    visibility: visible;
+}
  No newline at end of file

          
A => static/font/Laksaman-Bold.woff +0 -0

        
A => static/font/Laksaman-BoldItalic.woff +0 -0

        
A => static/font/Laksaman-Italic.woff +0 -0

        
A => static/font/Laksaman.woff +0 -0

        
A => static/font/RobotoMono-Latin-ext.woff2 +0 -0

        
A => static/font/RobotoMono-Latin.woff2 +0 -0

        
A => static/img/favicon.ico +0 -0

        
A => static/js/timer.js +22 -0
@@ 0,0 1,22 @@ 
+function startTimer(duration, display, next) {
+	var timer = duration, minutes, seconds;
+	var end =setInterval(function () {
+		minutes = parseInt(timer / 60, 10)
+		seconds = parseInt(timer % 60, 10);
+
+		minutes = minutes < 10 ? "0" + minutes : minutes;
+		seconds = seconds < 10 ? "0" + seconds : seconds;
+
+		if (timer > 60) {
+			display.textContent = "(" + minutes + ":" + seconds + ")";
+		} else {
+			display.textContent = "(" + seconds + ")";
+		}
+		display.style = "inline";
+
+		if (--timer <= 0) {
+			window.location = next;
+			clearInterval(end);
+		}
+	}, 1000);
+}
  No newline at end of file

          
A => taksa/__init__.py +98 -0
@@ 0,0 1,98 @@ 
+from collections import deque
+from copy import copy
+
+
+class Taksa:
+    WEEK_DAYS = ('Sunday', 'Monday', 'Tuesday', 'Wednesday_day',
+                 'Saturday', 'Thursday', 'Wednesday_night', 'Friday')
+    TITLES = ('บริวาร', 'อายุ', 'เดช', 'ศรี', 'มูละ', 'อุตสาหะ', 'มนตรี', 'กาลกิณี')
+    GROUPS = (
+        ('อ', 'ะ', 'า', 'ิ', 'ี', 'ุ', 'ู', 'เ', 'แ', 'โ', 'ไ', 'ใ'),
+        ('ก', 'ข', 'ค', 'ฆ', 'ง'),
+        ('จ', 'ฉ', 'ช', 'ฌ', 'ญ'),
+        ('ฎ', 'ฏ', 'ฐ', 'ฑ', 'ฒ', 'ณ'),
+        ('ด', 'ต', 'ถ', 'ท', 'ธ', 'น'),
+        ('บ', 'ป', 'ผ', 'ฝ', 'พ', 'ฟ', 'ภ', 'ม'),
+        ('ย', 'ร', 'ล', 'ว'),
+        ('ศ', 'ษ', 'ส', 'ห', 'ฬ', 'ฮ'),
+    )
+    FRONT_VOWELS = ('เ', 'แ', 'โ', 'ไ', 'ใ')
+
+    def __init__(self, name):
+        self.name = name
+    
+    def __check_week_day(self, week_day):
+        if week_day not in self.WEEK_DAYS:
+            raise ValueError(
+                '`week_day` must be one of [%s].' % ','.join(
+                    self.WEEK_DAYS
+                )
+            )
+
+    def __list_groups(self, week_day):
+        self.__check_week_day(week_day)
+        week_index = self.WEEK_DAYS.index(week_day)
+        groups = deque(copy(self.GROUPS))
+        if week_index:
+            groups.rotate(week_index * -1)
+        return dict(zip(self.TITLES, groups))
+        
+    def check_name(self, week_day):
+        self.__check_week_day(week_day)
+        groups = self.__list_groups(week_day)
+        titles = []
+        for n in self.name:
+            for title in groups.keys():
+                if n in groups[title]:
+                    if ('อ' in groups[title]) and (n != 'อ'):
+                        n = 'อ' + n if n not in self.FRONT_VOWELS else n + 'อ'
+                    titles.append((n, title))
+        return dict(titles)
+
+    def check_name_weekly(self):
+        return {
+            week_day: self.check_name(week_day) for week_day in self.WEEK_DAYS
+        }
+
+
+class Numero:
+    CHARVALUES = {
+        1: 'ajsกดถทภาำฤุ่',
+        2: 'bktขชงบปเแู้',
+        3: 'cluฆตฑฒ๋',
+        4: 'dmvคธญรษะโัิ',
+        5: 'enwฉฌณนมหฎฮฬึ',
+        6: 'foxจลวอใ',
+        7: 'gpyซศสีื๊',
+        8: 'hqzผฝพฟย็',
+        9: 'irฏฐไ์',
+    }
+    EFFECTS = {
+        'ให้คุณ': [2, 4, 5, 6, 9, 14, 15, 23, 24, 36, 41, 42, 45, 46, 50, 51,
+                 54, 55, 56, 59, 60, 63, 64, 65, 90, 95, 99, 100, 104, 105],
+        'ปานกลาง': [32, 40, 44, 79, 97, 89, 98],
+        'กำพร้า': [16, 61, 17, 71, 18, 81, 19, 91, 20, 106, 107, 108, 109],
+        'เสียหาย': [13, 31, 23, 32, 46, 64, 67, 76, 68, 86]
+    }
+
+    def __init__(self, name):
+        self.name = name
+
+    def __calculate(self):
+        summary = 0
+        for n in self.name:
+            for num in self.CHARVALUES.keys():
+                if n.lower() in self.CHARVALUES[num]:
+                    summary += num
+        return summary
+
+    def get_effect(self):
+        summary = self.__calculate()
+        for effect in self.EFFECTS.keys():
+            if summary in self.EFFECTS[effect]:
+                return {'summary':summary, 'effect':effect}
+        return {'summary':summary, 'effect':'-'}
+
+
+class TaksaNumero(Taksa, Numero):
+    pass

          
A => taksa/settings.py +122 -0
@@ 0,0 1,122 @@ 
+"""
+Django settings for taksa project.
+
+Generated by 'django-admin startproject' using Django 2.0.4.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.0/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '20bo3fmk$f1b(zbe!89b!ap3mn%s%8-iu#hrdcg3b4h)342v+o'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'webui',
+]
+
+MIDDLEWARE = [
+    'django.middleware.security.SecurityMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'taksa.urls'
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [],
+        'APP_DIRS': True,
+        'OPTIONS': {
+            'context_processors': [
+                'django.template.context_processors.debug',
+                'django.template.context_processors.request',
+                'django.contrib.auth.context_processors.auth',
+                'django.contrib.messages.context_processors.messages',
+            ],
+        },
+    },
+]
+
+WSGI_APPLICATION = 'taksa.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+    }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+    {
+        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+    },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/2.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/2.0/howto/static-files/
+
+STATIC_URL = '/static/'
+STATICFILES_DIRS = ['static']

          
A => taksa/urls.py +31 -0
@@ 0,0 1,31 @@ 
+"""taksa URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+    https://docs.djangoproject.com/en/2.0/topics/http/urls/
+Examples:
+Function views
+    1. Add an import:  from my_app import views
+    2. Add a URL to urlpatterns:  path('', views.home, name='home')
+Class-based views
+    1. Add an import:  from other_app.views import Home
+    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
+Including another URLconf
+    1. Import the include() function: from django.urls import include, path
+    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
+"""
+from django.conf.urls import url
+from django.contrib import admin
+from django.contrib.staticfiles import views as static_views
+from django.urls import path
+from functools import partial
+from webui import views
+
+urlpatterns = [
+    path('admin/', admin.site.urls),
+    url(r'^$', views.main, name='main')
+]
+
+insecured_static_serve = partial(static_views.serve, insecure=True)
+urlpatterns += [
+    url(r'^static/(?P<path>.*)$', insecured_static_serve),
+]

          
A => taksa/wsgi.py +16 -0
@@ 0,0 1,16 @@ 
+"""
+WSGI config for taksa project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "taksa.settings")
+
+application = get_wsgi_application()

          
A => webui/__init__.py +0 -0

        
A => webui/admin.py +3 -0
@@ 0,0 1,3 @@ 
+from django.contrib import admin
+
+# Register your models here.

          
A => webui/apps.py +5 -0
@@ 0,0 1,5 @@ 
+from django.apps import AppConfig
+
+
+class WebuiConfig(AppConfig):
+    name = 'webui'

          
A => webui/migrations/__init__.py +0 -0

        
A => webui/models.py +3 -0
@@ 0,0 1,3 @@ 
+from django.db import models
+
+# Create your models here.

          
A => webui/templates/base.html +36 -0
@@ 0,0 1,36 @@ 
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="UTF-8">
+	<title>Taksa Numerology{% if title %} : {{title}}{% endif %}</title>
+	<meta name="description" content="{{description}}">
+	<meta name="author" content="{{author}}">
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+{% if debug %}
+	<link rel="stylesheet" href="/static/css/skeleton.css">
+{% else %}
+	<link rel="stylesheet" href="/static/css/skeleton.min.css">
+{% endif %}
+	<link rel="stylesheet" href="/static/css/skeleton-ext.css">
+	<link rel="stylesheet" href="/static/css/normalize.css">
+	<link rel="stylesheet" href="/static/css/font.css">
+	<link rel="stylesheet" href="/static/css/custom.css">
+	<link rel="stylesheet" href="/static/css/tooltip.css">
+	<link rel="icon" href="/static/img/favicon.ico">
+{% block head %}{% endblock %}
+</head>
+<body class="s-size-text">
+	<div>
+	</div>
+	<div class="container">
+		<div class="row">
+			<div class="columns">&nbsp;</div>
+		</div>
+		<div class="row">
+			<div class="columns">
+			{% block body %}{% endblock %}
+			</div>
+		</div>
+	</div>
+</body>
+</html>

          
A => webui/templates/main.html +186 -0
@@ 0,0 1,186 @@ 
+{% extends "base.html" %}
+
+{% block body %}
+<div class="card columns">
+	<div class="alert u-text-center">
+		<strong>ตั้งชื่อตามหลักทักษาและเลขศาสตร์</strong>
+	</div>
+<table class="u-full-width u-text-center">
+<thead class="u-full-width">
+<tr class="columns u-full-width">
+<th class="one-ninth column u-text-center">ชื่อ/เลข</th>
+<th class="one-ninth column u-text-center">อาทิตย์</th>
+<th class="one-ninth column u-text-center">จันทร์</th>
+<th class="one-ninth column u-text-center">อังคาร</th>
+<th class="one-ninth column u-text-center">พุธ (กลางวัน)</th>
+<th class="one-ninth column u-text-center">พุธ (กลางคืน)</th>
+<th class="one-ninth column u-text-center">พฤหัสบดี</th>
+<th class="one-ninth column u-text-center">ศุกร์</th>
+<th class="one-ninth column u-text-center">เสาร์</th>
+</tr>
+</thead>
+<tbody class="u-full-width">
+{% for name in names %}
+<tr class="columns u-full-width">
+    <td class="one-ninth column">{{name.name}} {{name.numero.summary}} ({{name.numero.effect}})</td>
+    <td class="one-ninth column tooltip">
+    {% if name.Sunday %}
+        {{name.name}}
+        {% for k, v in name.Sunday.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Sunday.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Sunday.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+    <td class="one-ninth column tooltip">
+    {% if name.Monday %}
+        {{name.name}}
+        {% for k, v in name.Monday.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Monday.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Monday.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+    <td class="one-ninth column tooltip">
+    {% if name.Tuesday %}
+        {{name.name}}
+        {% for k, v in name.Tuesday.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Tuesday.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Tuesday.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+    <td class="one-ninth column tooltip">
+    {% if name.Wednesday_day %}
+        {{name.name}}
+        {% for k, v in name.Wednesday_day.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Wednesday_day.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Wednesday_day.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+    <td class="one-ninth column tooltip">
+    {% if name.Wednesday_night %}
+        {{name.name}}
+        {% for k, v in name.Wednesday_night.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Wednesday_night.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Wednesday_night.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+    <td class="one-ninth column tooltip">
+    {% if name.Thursday %}
+        {{name.name}}
+        {% for k, v in name.Thursday.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Thursday.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Thursday.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+    <td class="one-ninth column tooltip">
+    {% if name.Friday %}
+        {{name.name}}
+        {% for k, v in name.Friday.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Friday.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Friday.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+    <td class="one-ninth column tooltip">
+    {% if name.Saturday %}
+        {{name.name}}
+        {% for k, v in name.Saturday.first %}
+            ({{v}})
+        {% endfor %}
+        <div class="tooltiptext">
+        {% for k, v in name.Saturday.first %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+        {% for k, v in name.Saturday.rest %}
+            {{k}}:{{v}}<br/>
+        {% endfor %}
+         </div>
+    {% else %}
+        &nbsp;
+    {% endif %}
+    </td>
+</tr>
+{% endfor %}
+{% for space in foot_spaces %}
+<tr><td colspan="9">&nbsp;</td></tr>
+{% endfor %}
+</tbody>
+</table>
+</div>
+<div class="card columns">
+	<form action="{% url 'main' %}" method="post">
+	{% csrf_token %}
+	<textarea class="columns" name="names" rows="5"></textarea>
+	<div class="columns">&nbsp;</div>
+	<input class="columns" type="submit" value="ตรวจสอบ"/>
+	</form>
+</div>
+{% endblock %}

          
A => webui/tests.py +3 -0
@@ 0,0 1,3 @@ 
+from django.test import TestCase
+
+# Create your tests here.

          
A => webui/views.py +36 -0
@@ 0,0 1,36 @@ 
+from django.shortcuts import render
+from taksa import TaksaNumero
+
+
+# Create your views here.
+def main(request):
+    context = dict()
+    context['title'] = ''
+    context['user'] = request.user
+    if request.method == 'POST':
+        names = request.POST.get('names')
+        context['names'] = list()
+        max_name_length = 0
+        for name in names.split('\n'):
+            if len(name) > max_name_length:
+                max_name_length = len(name)
+            tn = TaksaNumero(name)
+            weekly = tn.check_name_weekly()
+            weekly_data = dict()
+            for day in weekly:
+                weekly_data[day] = dict()
+                items = [
+                    (c, weekly[day][c])
+                    for c in weekly[day]
+                    if 'กาลกิณี' not in weekly[day].values()
+                ]
+                if items:
+                    weekly_data[day]['first'] = items[0:1]
+                    weekly_data[day]['rest'] = items[1:]
+                else:
+                    weekly_data[day] = None
+            data = {'name':tn.name, 'numero':tn.get_effect()}
+            data.update(weekly_data)
+            context['names'].append(data)
+            context['foot_spaces'] = range(max_name_length)
+    return render(request, 'main.html', context)